From 1093b3ecf0eed359fb273a37d9084d00d8f6f4f0 Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Thu, 22 Mar 2007 10:42:41 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'merge_31_head_src'. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Sprout from master 2006-09-21 09:53:05 UTC Jan Pospíšil 'dualreg (work in progress)' Cherrypick from master 2006-03-19 11:42:48 UTC Jiří Sitera 'Install guide (Latex) with first version of LB-JP interaction description.': org.glite.jp.client/doc/README.jpimporter org.glite.jp.client/examples/jpps_upload_files.c org.glite.jp.index/src/bones_server.c org.glite.jp.index/src/common_server.c org.glite.jp.index/src/ws_is_typeref.h org.glite.jp.index/src/ws_typemap.h org.glite.jp.primary/src/backend.h org.glite.jp.ws-interface/src/JobProvenanceIS.xml org.glite.jp/build.xml org.glite.jp/doc/install-guide/JP-install-guide.tex Cherrypick from master 2006-03-31 13:27:41 UTC Jiří Sitera 'Added first version of overview and IS CLI description': org.glite.jp/doc/users-quide/JP-users-guide.tex Cherrypick from glite-jp_branch_1_3_0_RC31 2006-09-21 11:58:42 UTC Aleš Křenek 'restored': org.glite.jp/doc/install-guide/LB-JP-interaction-guide.tex org.glite.jp/doc/install-guide/glite_installation_guide_LB.doc org.glite.jp/doc/testplan.tex org.glite.jp/examples/pch06/align.sh org.glite.jp/examples/pch06/align_warp org.glite.jp/examples/pch06/cheat.pl org.glite.jp/examples/pch06/convert org.glite.jp/examples/pch06/convert.sh org.glite.jp/examples/pch06/delegates.xml org.glite.jp/examples/pch06/dump1 org.glite.jp/examples/pch06/dump2 org.glite.jp/examples/pch06/dump3 org.glite.jp/examples/pch06/dump4 org.glite.jp/examples/pch06/pch06.jdl-template org.glite.jp/examples/pch06/pch06.jdl-template2 org.glite.jp/examples/pch06/pch06.runme org.glite.jp/examples/pch06/pch06.runme2 org.glite.jp/examples/pch06/pgmtoppm org.glite.jp/examples/pch06/pgmtoppm.sh org.glite.jp/examples/pch06/pnmtojpeg org.glite.jp/examples/pch06/pnmtojpeg.sh org.glite.jp/examples/pch06/reslice org.glite.jp/examples/pch06/reslice.sh org.glite.jp/examples/pch06/scanheader org.glite.jp/examples/pch06/slicer org.glite.jp/examples/pch06/slicer.sh org.glite.jp/examples/pch06/softmean org.glite.jp/examples/pch06/softmean.sh org.glite.jp/project/dependencies.properties org.glite.jp/project/version.properties Cherrypick from glite-jp-index_branch_1_2_0_RC31 2006-09-21 11:55:00 UTC Aleš Křenek 'push version': org.glite.jp.index/Makefile org.glite.jp.index/examples/jpis-client.c org.glite.jp.index/examples/jpis-test.c org.glite.jp.index/examples/pch06/pch.pm org.glite.jp.index/examples/pch06/query1.pl org.glite.jp.index/examples/pch06/query2.pl org.glite.jp.index/examples/pch06/query3.pl org.glite.jp.index/examples/pch06/query4.pl org.glite.jp.index/examples/pch06/query5.pl org.glite.jp.index/examples/pch06/query6.pl org.glite.jp.index/examples/query-tests/authz.out org.glite.jp.index/examples/query-tests/complex_query.out org.glite.jp.index/examples/query-tests/run-test.sh org.glite.jp.index/examples/query-tests/simple_query.out org.glite.jp.index/project/version.properties org.glite.jp.index/src/common.c org.glite.jp.index/src/common.h org.glite.jp.index/src/conf.c org.glite.jp.index/src/soap_ops.c org.glite.jp.index/src/ws_is_typeref.c Cherrypick from glite-lb-server_branch_1_4_3_RC31_2 2007-03-21 12:27:42 UTC František Dvořák 'Small code cleanup (due to gSoap compatibility changes).': org.glite.lb.server/Makefile org.glite.lb.server/config/startup org.glite.lb.server/examples/ws_joblog.c org.glite.lb.server/examples/ws_jobstat.c org.glite.lb.server/examples/ws_query_ex.c org.glite.lb.server/interface/job-record.xsd org.glite.lb.server/project/version.properties org.glite.lb.server/src/bkserverd.c org.glite.lb.server/src/jobstat.c org.glite.lb.server/src/lb_plugin.c org.glite.lb.server/src/query.c org.glite.lb.server/src/ws_fault.c org.glite.lb.server/src/ws_query.c org.glite.lb.server/src/ws_typeref.c.T org.glite.lb.server/src/ws_typeref.h org.glite.lb.server/test/test_soap_conv.cpp Cherrypick from glite-security-gsoap-plugin_branch_1_4_0 2007-03-21 12:18:11 UTC František Dvořák 'New feature needed for JP, build fix with gSoap 2.7.0f.': org.glite.security.gsoap-plugin/Makefile org.glite.security.gsoap-plugin/build.xml org.glite.security.gsoap-plugin/interface/glite_gscompat.h org.glite.security.gsoap-plugin/project/version.properties org.glite.security.gsoap-plugin/src/glite_gsplugin.c org.glite.security.gsoap-plugin/src/glite_gss.c org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.c org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.h org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.c org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.h org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.c org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.h Cherrypick from glite-jp-primary_branch_1_2_0_RC31 2006-09-21 11:55:59 UTC Aleš Křenek 'push version': org.glite.jp.primary/Makefile org.glite.jp.primary/examples/dag-deps.c org.glite.jp.primary/project/configure.properties.xml org.glite.jp.primary/project/version.properties org.glite.jp.primary/src/attrs.c org.glite.jp.primary/src/authz.c org.glite.jp.primary/src/bones_server.c org.glite.jp.primary/src/new_ftp_backend.c org.glite.jp.primary/src/soap_ops.c Cherrypick from glite-lb-logger_branch_1_3_3_RC31_2 2007-03-22 10:42:39 UTC Aleš Křenek 'push version': org.glite.lb.logger/Makefile org.glite.lb.logger/project/version.properties org.glite.lb.logger/src/event_store.c org.glite.lb.logger/src/il_error.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/send_event.c Cherrypick from glite-lb-client_branch_2_2_3_RC31_2 2007-03-22 09:49:11 UTC Aleš Křenek 'missing declaration': org.glite.lb.client/Makefile org.glite.lb.client/build.xml org.glite.lb.client/examples/gen_begin org.glite.lb.client/examples/job_status.c org.glite.lb.client/project/configure.properties.xml org.glite.lb.client/project/version.properties org.glite.lb.client/src/prod_proto.c Cherrypick from glite-jp-client_branch_1_1_0_RC31 2006-09-21 11:56:53 UTC Aleš Křenek 'push version': org.glite.jp.client/config/startup org.glite.jp.client/examples/glite-jp-importer.sh org.glite.jp.client/project/version.properties org.glite.jp.client/src/jpimporter.c Cherrypick from glite-lb-common_branch_4_0_0_RC31_2 2007-03-22 10:28:14 UTC Aleš Křenek 'push version': org.glite.lb.common/Makefile org.glite.lb.common/build.xml org.glite.lb.common/project/version.properties org.glite.lb.common/src/log_msg.c Cherrypick from glite-jp-common_branch_1_2_0_RC31 2006-09-21 11:53:20 UTC Aleš Křenek 'push version': org.glite.jp.common/interface/known_attr.h org.glite.jp.common/interface/types.h org.glite.jp.common/project/version.properties Cherrypick from glite-lb-client-interface_branch_2_2_1_RC31_2 2007-03-01 16:01:03 UTC František Dvořák 'Call make doc explicitly from make install.': org.glite.lb.client-interface/Makefile org.glite.lb.client-interface/doc/C.dox org.glite.lb.client-interface/doc/CPP.dox Cherrypick from glite-lb-server-bones_branch_2_2_2_RC31_2 2007-03-02 13:30:09 UTC František Dvořák 'Cleanup.': org.glite.lb.server-bones/Makefile org.glite.lb.server-bones/project/version.properties org.glite.lb.server-bones/src/srvbones.c Cherrypick from glite-lb-ws-interface_branch_2_2_1_RC31_2 2007-03-12 15:07:56 UTC Aleš Křenek 'push age': org.glite.lb.ws-interface/Makefile org.glite.lb.ws-interface/project/version.properties org.glite.lb.ws-interface/src/doc.xml Cherrypick from glite-lb-utils_branch_1_1_1_RC31_2 2007-03-15 13:12:24 UTC Aleš Křenek 'push age': org.glite.lb.utils/Makefile org.glite.lb.utils/project/version.properties Cherrypick from glite-jp-ws-interface_branch_1_2_0_RC31 2007-03-21 18:53:44 UTC František Dvořák 'Detect not compatible clients (based on gSoap < 2.7.9b when using 2.7.9b)': org.glite.jp.ws-interface/src/ws_fault.c Cherrypick from glite-lb-proxy_branch_1_3_3_RC31_2 2006-11-21 17:47:33 UTC Aleš Křenek 'push version': org.glite.lb.proxy/project/version.properties Delete: org.glite.deployment.jpis/build.xml org.glite.deployment.jpis/config/scripts/glite-jpis-config.py org.glite.deployment.jpis/config/templates/glite-jpis.cfg.xml org.glite.deployment.jpis/project/build.number org.glite.deployment.jpis/project/build.properties org.glite.deployment.jpis/project/glite-jp.sdf.xml.template org.glite.deployment.jpis/project/glite-jpis.sdf.xml.template org.glite.deployment.jpis/project/lxscript-rpm.xsl org.glite.deployment.jpis/project/lxscript-tgz.xsl org.glite.deployment.jpis/project/properties.xml org.glite.deployment.jpis/project/quattor-template.xsl org.glite.deployment.jpis/project/version.properties org.glite.deployment.jpps/build.xml org.glite.deployment.jpps/config/scripts/glite-jpps-config.py org.glite.deployment.jpps/config/templates/glite-jpps.cfg.xml org.glite.deployment.jpps/project/build.number org.glite.deployment.jpps/project/build.properties org.glite.deployment.jpps/project/glite-jpps.sdf.xml.template org.glite.deployment.jpps/project/lxscript-rpm.xsl org.glite.deployment.jpps/project/lxscript-tgz.xsl org.glite.deployment.jpps/project/properties.xml org.glite.deployment.jpps/project/quattor-template.xsl org.glite.deployment.jpps/project/version.properties org.glite.deployment.lb/.cvsignore org.glite.deployment.lb/CHANGELOG org.glite.deployment.lb/LICENSE org.glite.deployment.lb/build.xml org.glite.deployment.lb/config/scripts/glite-lb-config.py org.glite.deployment.lb/config/templates/glite-lb.cfg.xml org.glite.deployment.lb/doc/release_notes/release_notes.doc org.glite.deployment.lb/doc/release_notes/release_notes.html org.glite.deployment.lb/doc/release_notes/release_notes.pdf org.glite.deployment.lb/project/.cvsignore org.glite.deployment.lb/project/build.number org.glite.deployment.lb/project/build.properties org.glite.deployment.lb/project/glite-lb.sdf.xml.template org.glite.deployment.lb/project/lxscript-rpm.xsl org.glite.deployment.lb/project/lxscript-tgz.xsl org.glite.deployment.lb/project/properties.xml org.glite.deployment.lb/project/quattor-template.xsl org.glite.deployment.lb/project/version.properties org.glite.jp.index/config/glite-jpis-config.xml org.glite.jp.primary/src/ftp_backend.c org.glite.lb-utils.context/.cvsignore org.glite.lb-utils.context/LICENSE org.glite.lb-utils.context/build.xml org.glite.lb-utils.context/project/build.number org.glite.lb-utils.context/project/build.properties org.glite.lb-utils.context/project/configure.properties.xml org.glite.lb-utils.context/project/properties.xml org.glite.lb-utils.context/project/version.properties org.glite.lb-utils.db/.cvsignore org.glite.lb-utils.db/LICENSE org.glite.lb-utils.db/Makefile org.glite.lb-utils.db/build.xml org.glite.lb-utils.db/examples/db_test.c org.glite.lb-utils.db/interface/db.h org.glite.lb-utils.db/project/build.number org.glite.lb-utils.db/project/build.properties org.glite.lb-utils.db/project/configure.properties.xml org.glite.lb-utils.db/project/properties.xml org.glite.lb-utils.db/project/tar_exclude org.glite.lb-utils.db/project/version.properties org.glite.lb-utils.db/src/db.c org.glite.lb-utils.jobid/.cvsignore org.glite.lb-utils.jobid/LICENSE org.glite.lb-utils.jobid/Makefile org.glite.lb-utils.jobid/build.xml org.glite.lb-utils.jobid/interface/cjobid.h org.glite.lb-utils.jobid/interface/strmd5.h org.glite.lb-utils.jobid/project/build.number org.glite.lb-utils.jobid/project/build.properties org.glite.lb-utils.jobid/project/configure.properties.xml org.glite.lb-utils.jobid/project/properties.xml org.glite.lb-utils.jobid/project/tar_exclude org.glite.lb-utils.jobid/project/version.properties org.glite.lb-utils.jobid/src/cjobid.c org.glite.lb-utils.jobid/src/strmd5.c org.glite.lb-utils.server-bones/.cvsignore org.glite.lb-utils.server-bones/LICENSE org.glite.lb-utils.server-bones/build.xml org.glite.lb-utils.server-bones/project/build.number org.glite.lb-utils.server-bones/project/build.properties org.glite.lb-utils.server-bones/project/configure.properties.xml org.glite.lb-utils.server-bones/project/properties.xml org.glite.lb-utils.server-bones/project/version.properties org.glite.lb-utils.trio/.cvsignore org.glite.lb-utils.trio/LICENSE org.glite.lb-utils.trio/Makefile org.glite.lb-utils.trio/build.xml org.glite.lb-utils.trio/interface/escape.h org.glite.lb-utils.trio/interface/trio.h org.glite.lb-utils.trio/project/build.number org.glite.lb-utils.trio/project/build.properties org.glite.lb-utils.trio/project/configure.properties.xml org.glite.lb-utils.trio/project/properties.xml org.glite.lb-utils.trio/project/version.properties org.glite.lb-utils.trio/src/escape.c org.glite.lb-utils.trio/src/strio.c org.glite.lb-utils.trio/src/strio.h org.glite.lb-utils.trio/src/trio.c org.glite.lb-utils.trio/src/triop.h org.glite.lb-utils.trio/test/trio_test.cpp org.glite.lb-utils/.cvsignore org.glite.lb-utils/LICENSE org.glite.lb-utils/build.xml org.glite.lb-utils/project/build.number org.glite.lb-utils/project/build.properties org.glite.lb-utils/project/dependencies.properties org.glite.lb-utils/project/glite.lb-utils.csf.xml org.glite.lb-utils/project/properties.xml org.glite.lb-utils/project/taskdefs.xml org.glite.lb-utils/project/version.properties org.glite.lb/.cvsignore org.glite.lb/LICENSE org.glite.lb/build.xml 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/copyright.tex org.glite.lb/doc/frontmatter.tex 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/doc/perftest.tex org.glite.lb/doc/testplan.tex 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/MultiStruct.pm org.glite.lb/project/StructField.pm org.glite.lb/project/at3 org.glite.lb/project/build.number org.glite.lb/project/build.properties org.glite.lb/project/dependencies.properties org.glite.lb/project/events.T org.glite.lb/project/glite.lb.csf.xml org.glite.lb/project/properties.xml org.glite.lb/project/run-workspace org.glite.lb/project/status.T org.glite.lb/project/taskdefs.xml org.glite.lb/project/types.T org.glite.lb/project/version.properties org.glite.security.proxyrenewal/.cvsignore org.glite.security.proxyrenewal/LICENSE org.glite.security.proxyrenewal/Makefile org.glite.security.proxyrenewal/build.xml org.glite.security.proxyrenewal/config/startup org.glite.security.proxyrenewal/examples/renew_core.c org.glite.security.proxyrenewal/interface/renewal.h org.glite.security.proxyrenewal/interface/renewal_core.h org.glite.security.proxyrenewal/project/build.number org.glite.security.proxyrenewal/project/build.properties org.glite.security.proxyrenewal/project/configure.properties.xml org.glite.security.proxyrenewal/project/properties.xml org.glite.security.proxyrenewal/project/tar_exclude org.glite.security.proxyrenewal/project/taskdefs.xml org.glite.security.proxyrenewal/project/version.properties org.glite.security.proxyrenewal/src/api.c org.glite.security.proxyrenewal/src/client.c org.glite.security.proxyrenewal/src/commands.c org.glite.security.proxyrenewal/src/common.c org.glite.security.proxyrenewal/src/renew.c org.glite.security.proxyrenewal/src/renewal_core.c org.glite.security.proxyrenewal/src/renewal_locl.h org.glite.security.proxyrenewal/src/renewd.c org.glite.security.proxyrenewal/src/renewd_locl.h org.glite.security.proxyrenewal/src/voms.c org.glite.wms-utils.exception/.cvsignore org.glite.wms-utils.exception/LICENSE org.glite.wms-utils.exception/Makefile.am org.glite.wms-utils.exception/bootstrap org.glite.wms-utils.exception/build.xml org.glite.wms-utils.exception/configure.ac org.glite.wms-utils.exception/interface/Makefile.am org.glite.wms-utils.exception/interface/glite/wmsutils/exception/Exception.h org.glite.wms-utils.exception/interface/glite/wmsutils/exception/exception_codes.h org.glite.wms-utils.exception/project/build.number org.glite.wms-utils.exception/project/build.properties org.glite.wms-utils.exception/project/configure.properties.xml org.glite.wms-utils.exception/project/properties.xml org.glite.wms-utils.exception/project/version.properties org.glite.wms-utils.exception/src/Exception.cpp org.glite.wms-utils.exception/src/Makefile.am org.glite.wms-utils.exception/test/Makefile.am org.glite.wms-utils.exception/test/exception_cu_main.cpp org.glite.wms-utils.exception/test/exception_cu_suite.cpp org.glite.wms-utils.exception/test/exception_cu_suite.h org.glite.wms-utils.jobid/.cvsignore org.glite.wms-utils.jobid/LICENSE org.glite.wms-utils.jobid/Makefile.am org.glite.wms-utils.jobid/bootstrap org.glite.wms-utils.jobid/build.xml org.glite.wms-utils.jobid/configure.ac org.glite.wms-utils.jobid/examples/Makefile.am org.glite.wms-utils.jobid/examples/testjobid.c org.glite.wms-utils.jobid/interface/Makefile.am org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobId.h org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobIdExceptions.h org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/cjobid.h org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/manipulation.h org.glite.wms-utils.jobid/project/build.number org.glite.wms-utils.jobid/project/build.properties org.glite.wms-utils.jobid/project/configure.properties.xml org.glite.wms-utils.jobid/project/properties.xml org.glite.wms-utils.jobid/project/version.properties org.glite.wms-utils.jobid/src/Makefile.am org.glite.wms-utils.jobid/src/jobid/JobId.cpp org.glite.wms-utils.jobid/src/jobid/JobIdExceptions.cpp org.glite.wms-utils.jobid/src/jobid/Makefile.am org.glite.wms-utils.jobid/src/jobid/cjobid.c org.glite.wms-utils.jobid/src/jobid/manipulation.cpp org.glite.wms-utils.jobid/src/jobid/strmd5.c org.glite.wms-utils.jobid/src/jobid/strmd5.h org.glite.wms-utils.jobid/test/Makefile.am org.glite.wms-utils.jobid/test/jobid_cu_main.cpp org.glite.wms-utils.jobid/test/jobid_cu_suite.cpp org.glite.wms-utils.jobid/test/jobid_cu_suite.h org.glite.wms-utils.jobid/test/manipulation_cu_main.cpp org.glite.wms-utils.jobid/test/manipulation_cu_suite.cpp org.glite.wms-utils.jobid/test/manipulation_cu_suite.h org.gridsite.core/.cvsignore org.gridsite.core/CHANGES org.gridsite.core/INSTALL org.gridsite.core/LICENSE org.gridsite.core/README org.gridsite.core/VERSION org.gridsite.core/build.xml org.gridsite.core/doc/README.htcp-bin org.gridsite.core/doc/build-apache2.sh org.gridsite.core/doc/delegation-1.1.0.wsdl org.gridsite.core/doc/findproxyfile.1 org.gridsite.core/doc/fuse.spec org.gridsite.core/doc/gridsite-delegation.8 org.gridsite.core/doc/gsexec.8 org.gridsite.core/doc/htcp.1 org.gridsite.core/doc/htfind.1 org.gridsite.core/doc/htll.1 org.gridsite.core/doc/htls.1 org.gridsite.core/doc/htmkdir.1 org.gridsite.core/doc/htmv.1 org.gridsite.core/doc/htping.1 org.gridsite.core/doc/htproxydestroy.1 org.gridsite.core/doc/htproxyput.1 org.gridsite.core/doc/htproxyrenew.1 org.gridsite.core/doc/htproxytime.1 org.gridsite.core/doc/htproxyunixtime.1 org.gridsite.core/doc/htrm.1 org.gridsite.core/doc/httpd-fileserver.conf org.gridsite.core/doc/httpd-webserver.conf org.gridsite.core/doc/index.html org.gridsite.core/doc/mod_gridsite.8 org.gridsite.core/doc/urlencode.1 org.gridsite.core/interface/gridsite-gacl.h org.gridsite.core/interface/gridsite.h org.gridsite.core/project/build.number org.gridsite.core/project/build.properties org.gridsite.core/project/configure.properties.xml org.gridsite.core/project/dependencies.properties org.gridsite.core/project/gridsite.core.csf.xml org.gridsite.core/project/properties.xml org.gridsite.core/project/taskdefs.xml org.gridsite.core/project/version.properties org.gridsite.core/src/Doxyfile org.gridsite.core/src/Makefile org.gridsite.core/src/delegation.h org.gridsite.core/src/doxygen.css org.gridsite.core/src/doxyheader.html org.gridsite.core/src/findproxyfile.c org.gridsite.core/src/gaclexample.c org.gridsite.core/src/gridsite-copy.c org.gridsite.core/src/grst-delegation.c org.gridsite.core/src/grst_admin.h org.gridsite.core/src/grst_admin_file.c org.gridsite.core/src/grst_admin_gacl.c org.gridsite.core/src/grst_admin_main.c org.gridsite.core/src/grst_asn1.c org.gridsite.core/src/grst_err.c org.gridsite.core/src/grst_gacl.c org.gridsite.core/src/grst_htcp.c org.gridsite.core/src/grst_http.c org.gridsite.core/src/grst_x509.c org.gridsite.core/src/grst_xacml.c org.gridsite.core/src/gsexec.c org.gridsite.core/src/gsexec.h org.gridsite.core/src/htcp.c org.gridsite.core/src/htproxyput.c org.gridsite.core/src/make-gridsite-spec org.gridsite.core/src/mod_gridsite.c org.gridsite.core/src/mod_ssl-private.h org.gridsite.core/src/roffit org.gridsite.core/src/showx509exts.c org.gridsite.core/src/slashgrid.c org.gridsite.core/src/slashgrid.init org.gridsite.core/src/urlencode.c org.gridsite.core/src/xacmlexample.c --- org.glite.deployment.jpis/build.xml | 94 - .../config/scripts/glite-jpis-config.py | 492 - .../config/templates/glite-jpis.cfg.xml | 92 - org.glite.deployment.jpis/project/build.number | 2 - org.glite.deployment.jpis/project/build.properties | 0 .../project/glite-jp.sdf.xml.template | 117 - .../project/glite-jpis.sdf.xml.template | 117 - org.glite.deployment.jpis/project/lxscript-rpm.xsl | 336 - org.glite.deployment.jpis/project/lxscript-tgz.xsl | 62 - org.glite.deployment.jpis/project/properties.xml | 63 - .../project/quattor-template.xsl | 64 - .../project/version.properties | 4 - org.glite.deployment.jpps/build.xml | 94 - .../config/scripts/glite-jpps-config.py | 500 - .../config/templates/glite-jpps.cfg.xml | 93 - org.glite.deployment.jpps/project/build.number | 2 - org.glite.deployment.jpps/project/build.properties | 0 .../project/glite-jpps.sdf.xml.template | 127 - org.glite.deployment.jpps/project/lxscript-rpm.xsl | 336 - org.glite.deployment.jpps/project/lxscript-tgz.xsl | 62 - org.glite.deployment.jpps/project/properties.xml | 63 - .../project/quattor-template.xsl | 64 - .../project/version.properties | 4 - org.glite.deployment.lb/.cvsignore | 1 - org.glite.deployment.lb/CHANGELOG | 40 - org.glite.deployment.lb/LICENSE | 69 - org.glite.deployment.lb/build.xml | 110 - .../config/scripts/glite-lb-config.py | 574 - .../config/templates/glite-lb.cfg.xml | 73 - .../doc/release_notes/release_notes.doc | Bin 192512 -> 0 bytes .../doc/release_notes/release_notes.html | 2712 ---- .../doc/release_notes/release_notes.pdf | Bin 157326 -> 0 bytes org.glite.deployment.lb/project/.cvsignore | 1 - org.glite.deployment.lb/project/build.number | 2 - org.glite.deployment.lb/project/build.properties | 0 .../project/glite-lb.sdf.xml.template | 157 - org.glite.deployment.lb/project/lxscript-rpm.xsl | 336 - org.glite.deployment.lb/project/lxscript-tgz.xsl | 62 - org.glite.deployment.lb/project/properties.xml | 73 - .../project/quattor-template.xsl | 64 - org.glite.deployment.lb/project/version.properties | 4 - org.glite.jp.client/config/startup | 7 +- org.glite.jp.client/doc/README.jpimporter | 1 - org.glite.jp.client/examples/glite-jp-importer.sh | 35 +- org.glite.jp.client/examples/jpps_upload_files.c | 9 +- org.glite.jp.client/project/version.properties | 2 +- org.glite.jp.client/src/jpimporter.c | 215 +- org.glite.jp.common/interface/known_attr.h | 5 + org.glite.jp.common/interface/types.h | 1 + org.glite.jp.common/project/version.properties | 2 +- org.glite.jp.index/Makefile | 16 +- org.glite.jp.index/config/glite-jpis-config.xml | 48 - org.glite.jp.index/examples/jpis-test.c | 2 +- org.glite.jp.index/examples/pch06/pch.pm | 219 + org.glite.jp.index/examples/pch06/query1.pl | 116 + org.glite.jp.index/examples/pch06/query2.pl | 125 + org.glite.jp.index/examples/pch06/query3.pl | 123 + org.glite.jp.index/examples/pch06/query4.pl | 104 + org.glite.jp.index/examples/pch06/query5.pl | 134 + org.glite.jp.index/examples/pch06/query6.pl | 133 + org.glite.jp.index/examples/query-tests/authz.out | 1 - .../examples/query-tests/complex_query.out | 21 +- .../examples/query-tests/run-test.sh | 30 +- .../examples/query-tests/simple_query.out | 12 +- org.glite.jp.index/project/version.properties | 2 +- org.glite.jp.index/src/bones_server.c | 12 +- org.glite.jp.index/src/common_server.c | 19 +- org.glite.jp.index/src/conf.c | 240 +- org.glite.jp.index/src/soap_ops.c | 90 +- org.glite.jp.index/src/ws_is_typeref.c | 77 +- org.glite.jp.index/src/ws_is_typeref.h | 3 - org.glite.jp.index/src/ws_typemap.h | 1 - org.glite.jp.primary/Makefile | 24 +- org.glite.jp.primary/examples/dag-deps.c | 215 + .../project/configure.properties.xml | 5 + org.glite.jp.primary/project/version.properties | 2 +- org.glite.jp.primary/src/attrs.c | 13 + org.glite.jp.primary/src/authz.c | 9 +- org.glite.jp.primary/src/backend.h | 2 - org.glite.jp.primary/src/bones_server.c | 5 +- org.glite.jp.primary/src/ftp_backend.c | 1744 --- org.glite.jp.primary/src/new_ftp_backend.c | 5 +- org.glite.jp.primary/src/soap_ops.c | 53 +- org.glite.jp.ws-interface/src/JobProvenanceIS.xml | 20 - org.glite.jp.ws-interface/src/ws_fault.c | 125 + org.glite.jp/build.xml | 15 +- .../doc/install-guide/JP-install-guide.tex | 107 + .../doc/install-guide/LB-JP-interaction-guide.tex | 18 +- .../install-guide/glite_installation_guide_LB.doc | Bin 309760 -> 174080 bytes org.glite.jp/doc/testplan.tex | 161 +- org.glite.jp/doc/users-quide/JP-users-guide.tex | 206 +- org.glite.jp/examples/pch06/align.sh | 60 + org.glite.jp/examples/pch06/align_warp | Bin 0 -> 374675 bytes org.glite.jp/examples/pch06/cheat.pl | 201 + org.glite.jp/examples/pch06/convert | Bin 0 -> 3965946 bytes org.glite.jp/examples/pch06/convert.sh | 46 + org.glite.jp/examples/pch06/delegates.xml | 120 + org.glite.jp/examples/pch06/dump1 | 312 + org.glite.jp/examples/pch06/dump2 | 312 + org.glite.jp/examples/pch06/dump3 | 144 + org.glite.jp/examples/pch06/dump4 | 312 + org.glite.jp/examples/pch06/pch06.jdl-template | 108 + org.glite.jp/examples/pch06/pch06.jdl-template2 | 127 + org.glite.jp/examples/pch06/pch06.runme | 15 + org.glite.jp/examples/pch06/pch06.runme2 | 15 + org.glite.jp/examples/pch06/pgmtoppm | Bin 0 -> 4964 bytes org.glite.jp/examples/pch06/pgmtoppm.sh | 46 + org.glite.jp/examples/pch06/pnmtojpeg | Bin 0 -> 14784 bytes org.glite.jp/examples/pch06/pnmtojpeg.sh | 47 + org.glite.jp/examples/pch06/reslice | Bin 0 -> 385289 bytes org.glite.jp/examples/pch06/reslice.sh | 52 + org.glite.jp/examples/pch06/scanheader | Bin 0 -> 56023 bytes org.glite.jp/examples/pch06/slicer | Bin 0 -> 1754395 bytes org.glite.jp/examples/pch06/slicer.sh | 50 + org.glite.jp/examples/pch06/softmean | Bin 0 -> 101126 bytes org.glite.jp/examples/pch06/softmean.sh | 62 + org.glite.jp/project/dependencies.properties | 16 +- org.glite.jp/project/version.properties | 2 +- org.glite.lb-utils.context/.cvsignore | 2 - org.glite.lb-utils.context/LICENSE | 69 - org.glite.lb-utils.context/build.xml | 122 - org.glite.lb-utils.context/project/build.number | 1 - .../project/build.properties | 0 .../project/configure.properties.xml | 37 - org.glite.lb-utils.context/project/properties.xml | 73 - .../project/version.properties | 2 - org.glite.lb-utils.db/.cvsignore | 5 - org.glite.lb-utils.db/LICENSE | 69 - org.glite.lb-utils.db/Makefile | 128 - org.glite.lb-utils.db/build.xml | 126 - org.glite.lb-utils.db/examples/db_test.c | 192 - org.glite.lb-utils.db/interface/db.h | 322 - org.glite.lb-utils.db/project/build.number | 1 - org.glite.lb-utils.db/project/build.properties | 3 - .../project/configure.properties.xml | 81 - org.glite.lb-utils.db/project/properties.xml | 73 - org.glite.lb-utils.db/project/tar_exclude | 10 - org.glite.lb-utils.db/project/version.properties | 2 - org.glite.lb-utils.db/src/db.c | 1031 -- org.glite.lb-utils.jobid/.cvsignore | 2 - org.glite.lb-utils.jobid/LICENSE | 69 - org.glite.lb-utils.jobid/Makefile | 98 - org.glite.lb-utils.jobid/build.xml | 129 - org.glite.lb-utils.jobid/interface/cjobid.h | 109 - org.glite.lb-utils.jobid/interface/strmd5.h | 30 - org.glite.lb-utils.jobid/project/build.number | 1 - org.glite.lb-utils.jobid/project/build.properties | 4 - .../project/configure.properties.xml | 63 - org.glite.lb-utils.jobid/project/properties.xml | 73 - org.glite.lb-utils.jobid/project/tar_exclude | 10 - .../project/version.properties | 2 - org.glite.lb-utils.jobid/src/cjobid.c | 260 - org.glite.lb-utils.jobid/src/strmd5.c | 122 - org.glite.lb-utils.server-bones/.cvsignore | 2 - org.glite.lb-utils.server-bones/LICENSE | 69 - org.glite.lb-utils.server-bones/build.xml | 122 - .../project/build.number | 1 - .../project/build.properties | 0 .../project/configure.properties.xml | 37 - .../project/properties.xml | 73 - .../project/version.properties | 2 - org.glite.lb-utils.trio/.cvsignore | 2 - org.glite.lb-utils.trio/LICENSE | 69 - org.glite.lb-utils.trio/Makefile | 114 - org.glite.lb-utils.trio/build.xml | 126 - org.glite.lb-utils.trio/interface/escape.h | 59 - org.glite.lb-utils.trio/interface/trio.h | 187 - org.glite.lb-utils.trio/project/build.number | 1 - org.glite.lb-utils.trio/project/build.properties | 4 - .../project/configure.properties.xml | 59 - org.glite.lb-utils.trio/project/properties.xml | 73 - org.glite.lb-utils.trio/project/version.properties | 2 - org.glite.lb-utils.trio/src/escape.c | 224 - org.glite.lb-utils.trio/src/strio.c | 581 - org.glite.lb-utils.trio/src/strio.h | 227 - org.glite.lb-utils.trio/src/trio.c | 5706 -------- org.glite.lb-utils.trio/src/triop.h | 138 - org.glite.lb-utils.trio/test/trio_test.cpp | 85 - org.glite.lb-utils/.cvsignore | 1 - org.glite.lb-utils/LICENSE | 69 - org.glite.lb-utils/build.xml | 303 - org.glite.lb-utils/project/build.number | 1 - org.glite.lb-utils/project/build.properties | 0 org.glite.lb-utils/project/dependencies.properties | 13 - org.glite.lb-utils/project/glite.lb-utils.csf.xml | 218 - org.glite.lb-utils/project/properties.xml | 64 - org.glite.lb-utils/project/taskdefs.xml | 38 - org.glite.lb-utils/project/version.properties | 2 - org.glite.lb.client-interface/Makefile | 9 +- org.glite.lb.client-interface/doc/C.dox | 19 + org.glite.lb.client-interface/doc/CPP.dox | 16 + org.glite.lb.client/Makefile | 39 +- org.glite.lb.client/build.xml | 4 + org.glite.lb.client/examples/gen_begin | 2 +- org.glite.lb.client/examples/job_status.c | 11 +- .../project/configure.properties.xml | 5 +- org.glite.lb.client/project/version.properties | 4 +- org.glite.lb.client/src/prod_proto.c | 43 +- org.glite.lb.common/Makefile | 30 +- org.glite.lb.common/build.xml | 4 + org.glite.lb.common/project/version.properties | 4 +- org.glite.lb.common/src/log_msg.c | 24 +- org.glite.lb.logger/Makefile | 15 +- org.glite.lb.logger/project/version.properties | 4 +- org.glite.lb.logger/src/event_store.c | 116 +- org.glite.lb.logger/src/il_error.c | 2 + org.glite.lb.logger/src/interlogd.c | 8 +- org.glite.lb.logger/src/interlogd.h | 1 + org.glite.lb.logger/src/logd.c | 13 +- org.glite.lb.logger/src/send_event.c | 7 +- org.glite.lb.proxy/project/version.properties | 2 +- org.glite.lb.server-bones/Makefile | 7 - .../project/version.properties | 4 +- org.glite.lb.server-bones/src/srvbones.c | 9 +- org.glite.lb.server/Makefile | 12 +- org.glite.lb.server/config/startup | 20 +- org.glite.lb.server/examples/ws_joblog.c | 11 +- org.glite.lb.server/examples/ws_jobstat.c | 26 +- org.glite.lb.server/examples/ws_query_ex.c | 20 +- org.glite.lb.server/interface/job-record.xsd | 3 + org.glite.lb.server/project/version.properties | 4 +- org.glite.lb.server/src/bkserverd.c | 36 +- org.glite.lb.server/src/jobstat.c | 8 +- org.glite.lb.server/src/lb_plugin.c | 324 +- org.glite.lb.server/src/query.c | 6 +- org.glite.lb.server/src/ws_fault.c | 49 +- org.glite.lb.server/src/ws_query.c | 11 +- org.glite.lb.server/src/ws_typeref.c.T | 215 +- org.glite.lb.server/src/ws_typeref.h | 12 +- org.glite.lb.server/test/test_soap_conv.cpp | 4 +- org.glite.lb.utils/Makefile | 2 +- org.glite.lb.utils/project/version.properties | 2 +- org.glite.lb.ws-interface/Makefile | 9 +- .../project/version.properties | 2 +- org.glite.lb.ws-interface/src/doc.xml | 5 +- org.glite.lb/.cvsignore | 2 - org.glite.lb/LICENSE | 69 - org.glite.lb/build.xml | 590 - org.glite.lb/deployment/README | 2 - org.glite.lb/deployment/deploy_all.diff | 454 - org.glite.lb/deployment/deploy_jp.diff | 222 - org.glite.lb/deployment/deploy_lb.diff | 281 - org.glite.lb/doc/README.lb4vdt | 16 - org.glite.lb/doc/copyright.tex | 24 - org.glite.lb/doc/frontmatter.tex | 41 - org.glite.lb/doc/perf_clear_proxy | 1 - org.glite.lb/doc/perf_purge | 1 - org.glite.lb/doc/perf_reg_jobs | 1 - org.glite.lb/doc/perf_results/il_sci_09062006.txt | 63 - .../doc/perf_results/il_sci_09062006_01.txt | 129 - org.glite.lb/doc/perf_results/il_sci_12062006.txt | 65 - .../doc/perf_results/ll_michal_21062006.txt | 20 - .../perf_results/proxy2serv_umbar2sci_22062006.txt | 20 - .../perf_results/proxy2serv_umbar2sci_23062006.txt | 25 - .../doc/perf_results/proxy_sci_09062006.txt | 21 - org.glite.lb/doc/perf_run_interlogd | 1 - org.glite.lb/doc/perf_run_proxy | 1 - org.glite.lb/doc/perf_run_server | 1 - org.glite.lb/doc/perf_run_test | 1 - org.glite.lb/doc/perftest.tex | 524 - org.glite.lb/doc/testplan.tex | 300 - org.glite.lb/lb4vdt/LB_install.sh | 113 - org.glite.lb/lb4vdt/Makefile.inc | 63 - .../lb4vdt/scripts/org.gridsite.core.build | 11 - org.glite.lb/project/MultiStruct.pm | 191 - org.glite.lb/project/StructField.pm | 116 - org.glite.lb/project/at3 | 93 - org.glite.lb/project/build.number | 2 - org.glite.lb/project/build.properties | 1 - org.glite.lb/project/dependencies.properties | 20 - org.glite.lb/project/events.T | 201 - org.glite.lb/project/glite.lb.csf.xml | 398 - org.glite.lb/project/properties.xml | 55 - org.glite.lb/project/run-workspace | 10 - org.glite.lb/project/status.T | 86 - org.glite.lb/project/taskdefs.xml | 32 - org.glite.lb/project/types.T | 127 - org.glite.lb/project/version.properties | 3 - org.glite.security.gsoap-plugin/Makefile | 38 +- org.glite.security.gsoap-plugin/build.xml | 11 +- .../interface/glite_gscompat.h | 78 + .../project/version.properties | 4 +- .../src/glite_gsplugin.c | 16 +- org.glite.security.gsoap-plugin/src/glite_gss.c | 35 + .../src/stdsoap2_2.7.0f.c | 12026 ++++++++++++++++ .../src/stdsoap2_2.7.0f.h | 1885 +++ .../src/stdsoap2_2.7.6b.c | 13101 +++++++++++++++++ .../src/stdsoap2_2.7.6b.h | 2053 +++ .../src/stdsoap2_2.7.9b.c | 14172 +++++++++++++++++++ .../src/stdsoap2_2.7.9b.h | 2166 +++ org.glite.security.proxyrenewal/.cvsignore | 1 - org.glite.security.proxyrenewal/LICENSE | 69 - org.glite.security.proxyrenewal/Makefile | 167 - org.glite.security.proxyrenewal/build.xml | 128 - org.glite.security.proxyrenewal/config/startup | 80 - .../examples/renew_core.c | 63 - .../interface/renewal.h | 173 - .../interface/renewal_core.h | 62 - .../project/build.number | 1 - .../project/build.properties | 0 .../project/configure.properties.xml | 60 - .../project/properties.xml | 62 - .../project/tar_exclude | 10 - .../project/taskdefs.xml | 4 - .../project/version.properties | 2 - org.glite.security.proxyrenewal/src/api.c | 550 - org.glite.security.proxyrenewal/src/client.c | 111 - org.glite.security.proxyrenewal/src/commands.c | 1256 -- org.glite.security.proxyrenewal/src/common.c | 322 - org.glite.security.proxyrenewal/src/renew.c | 256 - org.glite.security.proxyrenewal/src/renewal_core.c | 283 - org.glite.security.proxyrenewal/src/renewal_locl.h | 148 - org.glite.security.proxyrenewal/src/renewd.c | 609 - org.glite.security.proxyrenewal/src/renewd_locl.h | 82 - org.glite.security.proxyrenewal/src/voms.c | 356 - org.glite.wms-utils.exception/.cvsignore | 1 - org.glite.wms-utils.exception/LICENSE | 69 - org.glite.wms-utils.exception/Makefile.am | 67 - org.glite.wms-utils.exception/bootstrap | 9 - org.glite.wms-utils.exception/build.xml | 104 - org.glite.wms-utils.exception/configure.ac | 127 - .../interface/Makefile.am | 14 - .../interface/glite/wmsutils/exception/Exception.h | 138 - .../glite/wmsutils/exception/exception_codes.h | 41 - org.glite.wms-utils.exception/project/build.number | 2 - .../project/build.properties | 2 - .../project/configure.properties.xml | 9 - .../project/properties.xml | 83 - .../project/version.properties | 2 - org.glite.wms-utils.exception/src/Exception.cpp | 124 - org.glite.wms-utils.exception/src/Makefile.am | 17 - org.glite.wms-utils.exception/test/Makefile.am | 33 - .../test/exception_cu_main.cpp | 33 - .../test/exception_cu_suite.cpp | 56 - .../test/exception_cu_suite.h | 29 - org.glite.wms-utils.jobid/.cvsignore | 2 - org.glite.wms-utils.jobid/LICENSE | 69 - org.glite.wms-utils.jobid/Makefile.am | 69 - org.glite.wms-utils.jobid/bootstrap | 9 - org.glite.wms-utils.jobid/build.xml | 104 - org.glite.wms-utils.jobid/configure.ac | 147 - org.glite.wms-utils.jobid/examples/Makefile.am | 28 - org.glite.wms-utils.jobid/examples/testjobid.c | 33 - org.glite.wms-utils.jobid/interface/Makefile.am | 16 - .../interface/glite/wmsutils/jobid/JobId.h | 126 - .../glite/wmsutils/jobid/JobIdExceptions.h | 80 - .../interface/glite/wmsutils/jobid/cjobid.h | 109 - .../interface/glite/wmsutils/jobid/manipulation.h | 24 - org.glite.wms-utils.jobid/project/build.number | 2 - org.glite.wms-utils.jobid/project/build.properties | 2 - .../project/configure.properties.xml | 9 - org.glite.wms-utils.jobid/project/properties.xml | 86 - .../project/version.properties | 2 - org.glite.wms-utils.jobid/src/Makefile.am | 12 - org.glite.wms-utils.jobid/src/jobid/JobId.cpp | 183 - .../src/jobid/JobIdExceptions.cpp | 58 - org.glite.wms-utils.jobid/src/jobid/Makefile.am | 30 - org.glite.wms-utils.jobid/src/jobid/cjobid.c | 258 - .../src/jobid/manipulation.cpp | 180 - org.glite.wms-utils.jobid/src/jobid/strmd5.c | 118 - org.glite.wms-utils.jobid/src/jobid/strmd5.h | 28 - org.glite.wms-utils.jobid/test/Makefile.am | 48 - org.glite.wms-utils.jobid/test/jobid_cu_main.cpp | 33 - org.glite.wms-utils.jobid/test/jobid_cu_suite.cpp | 102 - org.glite.wms-utils.jobid/test/jobid_cu_suite.h | 34 - .../test/manipulation_cu_main.cpp | 33 - .../test/manipulation_cu_suite.cpp | 34 - .../test/manipulation_cu_suite.h | 29 - org.gridsite.core/.cvsignore | 1 - org.gridsite.core/CHANGES | 355 - org.gridsite.core/INSTALL | 37 - org.gridsite.core/LICENSE | 47 - org.gridsite.core/README | 6 - org.gridsite.core/VERSION | 4 - org.gridsite.core/build.xml | 294 - org.gridsite.core/doc/README.htcp-bin | 13 - org.gridsite.core/doc/build-apache2.sh | 79 - org.gridsite.core/doc/delegation-1.1.0.wsdl | 459 - org.gridsite.core/doc/findproxyfile.1 | 63 - org.gridsite.core/doc/fuse.spec | 139 - org.gridsite.core/doc/gridsite-delegation.8 | 19 - org.gridsite.core/doc/gsexec.8 | 134 - org.gridsite.core/doc/htcp.1 | 200 - org.gridsite.core/doc/htfind.1 | 1 - org.gridsite.core/doc/htll.1 | 1 - org.gridsite.core/doc/htls.1 | 1 - org.gridsite.core/doc/htmkdir.1 | 1 - org.gridsite.core/doc/htmv.1 | 1 - org.gridsite.core/doc/htping.1 | 1 - org.gridsite.core/doc/htproxydestroy.1 | 1 - org.gridsite.core/doc/htproxyput.1 | 109 - org.gridsite.core/doc/htproxyrenew.1 | 1 - org.gridsite.core/doc/htproxytime.1 | 1 - org.gridsite.core/doc/htproxyunixtime.1 | 1 - org.gridsite.core/doc/htrm.1 | 1 - org.gridsite.core/doc/httpd-fileserver.conf | 155 - org.gridsite.core/doc/httpd-webserver.conf | 226 - org.gridsite.core/doc/index.html | 82 - org.gridsite.core/doc/mod_gridsite.8 | 313 - org.gridsite.core/doc/urlencode.1 | 43 - org.gridsite.core/interface/gridsite-gacl.h | 188 - org.gridsite.core/interface/gridsite.h | 379 - org.gridsite.core/project/build.number | 2 - org.gridsite.core/project/build.properties | 0 org.gridsite.core/project/configure.properties.xml | 9 - org.gridsite.core/project/dependencies.properties | 9 - org.gridsite.core/project/gridsite.core.csf.xml | 221 - org.gridsite.core/project/properties.xml | 53 - org.gridsite.core/project/taskdefs.xml | 31 - org.gridsite.core/project/version.properties | 2 - org.gridsite.core/src/Doxyfile | 993 -- org.gridsite.core/src/Makefile | 480 - org.gridsite.core/src/delegation.h | 86 - org.gridsite.core/src/doxygen.css | 49 - org.gridsite.core/src/doxyheader.html | 1 - org.gridsite.core/src/findproxyfile.c | 122 - org.gridsite.core/src/gaclexample.c | 147 - org.gridsite.core/src/gridsite-copy.c | 155 - org.gridsite.core/src/grst-delegation.c | 347 - org.gridsite.core/src/grst_admin.h | 57 - org.gridsite.core/src/grst_admin_file.c | 1571 -- org.gridsite.core/src/grst_admin_gacl.c | 981 -- org.gridsite.core/src/grst_admin_main.c | 378 - org.gridsite.core/src/grst_asn1.c | 506 - org.gridsite.core/src/grst_err.c | 41 - org.gridsite.core/src/grst_gacl.c | 1212 -- org.gridsite.core/src/grst_htcp.c | 311 - org.gridsite.core/src/grst_http.c | 443 - org.gridsite.core/src/grst_x509.c | 1854 --- org.gridsite.core/src/grst_xacml.c | 576 - org.gridsite.core/src/gsexec.c | 1104 -- org.gridsite.core/src/gsexec.h | 126 - org.gridsite.core/src/htcp.c | 2032 --- org.gridsite.core/src/htproxyput.c | 606 - org.gridsite.core/src/make-gridsite-spec | 297 - org.gridsite.core/src/mod_gridsite.c | 3432 ----- org.gridsite.core/src/mod_ssl-private.h | 106 - org.gridsite.core/src/roffit | 370 - org.gridsite.core/src/showx509exts.c | 133 - org.gridsite.core/src/slashgrid.c | 2475 ---- org.gridsite.core/src/slashgrid.init | 67 - org.gridsite.core/src/urlencode.c | 73 - org.gridsite.core/src/xacmlexample.c | 148 - 443 files changed, 50247 insertions(+), 59432 deletions(-) delete mode 100644 org.glite.deployment.jpis/build.xml delete mode 100755 org.glite.deployment.jpis/config/scripts/glite-jpis-config.py delete mode 100644 org.glite.deployment.jpis/config/templates/glite-jpis.cfg.xml delete mode 100644 org.glite.deployment.jpis/project/build.number delete mode 100644 org.glite.deployment.jpis/project/build.properties delete mode 100644 org.glite.deployment.jpis/project/glite-jp.sdf.xml.template delete mode 100644 org.glite.deployment.jpis/project/glite-jpis.sdf.xml.template delete mode 100644 org.glite.deployment.jpis/project/lxscript-rpm.xsl delete mode 100644 org.glite.deployment.jpis/project/lxscript-tgz.xsl delete mode 100644 org.glite.deployment.jpis/project/properties.xml delete mode 100644 org.glite.deployment.jpis/project/quattor-template.xsl delete mode 100644 org.glite.deployment.jpis/project/version.properties delete mode 100644 org.glite.deployment.jpps/build.xml delete mode 100755 org.glite.deployment.jpps/config/scripts/glite-jpps-config.py delete mode 100644 org.glite.deployment.jpps/config/templates/glite-jpps.cfg.xml delete mode 100644 org.glite.deployment.jpps/project/build.number delete mode 100644 org.glite.deployment.jpps/project/build.properties delete mode 100644 org.glite.deployment.jpps/project/glite-jpps.sdf.xml.template delete mode 100644 org.glite.deployment.jpps/project/lxscript-rpm.xsl delete mode 100644 org.glite.deployment.jpps/project/lxscript-tgz.xsl delete mode 100644 org.glite.deployment.jpps/project/properties.xml delete mode 100644 org.glite.deployment.jpps/project/quattor-template.xsl delete mode 100644 org.glite.deployment.jpps/project/version.properties delete mode 100644 org.glite.deployment.lb/.cvsignore delete mode 100644 org.glite.deployment.lb/CHANGELOG delete mode 100644 org.glite.deployment.lb/LICENSE delete mode 100644 org.glite.deployment.lb/build.xml delete mode 100644 org.glite.deployment.lb/config/scripts/glite-lb-config.py delete mode 100644 org.glite.deployment.lb/config/templates/glite-lb.cfg.xml delete mode 100644 org.glite.deployment.lb/doc/release_notes/release_notes.doc delete mode 100644 org.glite.deployment.lb/doc/release_notes/release_notes.html delete mode 100644 org.glite.deployment.lb/doc/release_notes/release_notes.pdf delete mode 100644 org.glite.deployment.lb/project/.cvsignore delete mode 100644 org.glite.deployment.lb/project/build.number delete mode 100644 org.glite.deployment.lb/project/build.properties delete mode 100644 org.glite.deployment.lb/project/glite-lb.sdf.xml.template delete mode 100644 org.glite.deployment.lb/project/lxscript-rpm.xsl delete mode 100644 org.glite.deployment.lb/project/lxscript-tgz.xsl delete mode 100644 org.glite.deployment.lb/project/properties.xml delete mode 100644 org.glite.deployment.lb/project/quattor-template.xsl delete mode 100644 org.glite.deployment.lb/project/version.properties delete mode 100644 org.glite.jp.index/config/glite-jpis-config.xml create mode 100644 org.glite.jp.index/examples/pch06/pch.pm create mode 100644 org.glite.jp.index/examples/pch06/query1.pl create mode 100644 org.glite.jp.index/examples/pch06/query2.pl create mode 100644 org.glite.jp.index/examples/pch06/query3.pl create mode 100644 org.glite.jp.index/examples/pch06/query4.pl create mode 100644 org.glite.jp.index/examples/pch06/query5.pl create mode 100644 org.glite.jp.index/examples/pch06/query6.pl create mode 100644 org.glite.jp.primary/examples/dag-deps.c delete mode 100644 org.glite.jp.primary/src/ftp_backend.c create mode 100644 org.glite.jp.ws-interface/src/ws_fault.c create mode 100644 org.glite.jp/doc/install-guide/JP-install-guide.tex create mode 100644 org.glite.jp/examples/pch06/align.sh create mode 100644 org.glite.jp/examples/pch06/align_warp create mode 100644 org.glite.jp/examples/pch06/cheat.pl create mode 100644 org.glite.jp/examples/pch06/convert create mode 100644 org.glite.jp/examples/pch06/convert.sh create mode 100644 org.glite.jp/examples/pch06/delegates.xml create mode 100644 org.glite.jp/examples/pch06/dump1 create mode 100644 org.glite.jp/examples/pch06/dump2 create mode 100644 org.glite.jp/examples/pch06/dump3 create mode 100644 org.glite.jp/examples/pch06/dump4 create mode 100644 org.glite.jp/examples/pch06/pch06.jdl-template create mode 100644 org.glite.jp/examples/pch06/pch06.jdl-template2 create mode 100644 org.glite.jp/examples/pch06/pch06.runme create mode 100644 org.glite.jp/examples/pch06/pch06.runme2 create mode 100644 org.glite.jp/examples/pch06/pgmtoppm create mode 100644 org.glite.jp/examples/pch06/pgmtoppm.sh create mode 100644 org.glite.jp/examples/pch06/pnmtojpeg create mode 100644 org.glite.jp/examples/pch06/pnmtojpeg.sh create mode 100644 org.glite.jp/examples/pch06/reslice create mode 100644 org.glite.jp/examples/pch06/reslice.sh create mode 100644 org.glite.jp/examples/pch06/scanheader create mode 100644 org.glite.jp/examples/pch06/slicer create mode 100644 org.glite.jp/examples/pch06/slicer.sh create mode 100644 org.glite.jp/examples/pch06/softmean create mode 100644 org.glite.jp/examples/pch06/softmean.sh delete mode 100755 org.glite.lb-utils.context/.cvsignore delete mode 100755 org.glite.lb-utils.context/LICENSE delete mode 100644 org.glite.lb-utils.context/build.xml delete mode 100644 org.glite.lb-utils.context/project/build.number delete mode 100755 org.glite.lb-utils.context/project/build.properties delete mode 100644 org.glite.lb-utils.context/project/configure.properties.xml delete mode 100644 org.glite.lb-utils.context/project/properties.xml delete mode 100755 org.glite.lb-utils.context/project/version.properties delete mode 100755 org.glite.lb-utils.db/.cvsignore delete mode 100755 org.glite.lb-utils.db/LICENSE delete mode 100644 org.glite.lb-utils.db/Makefile delete mode 100644 org.glite.lb-utils.db/build.xml delete mode 100644 org.glite.lb-utils.db/examples/db_test.c delete mode 100644 org.glite.lb-utils.db/interface/db.h delete mode 100644 org.glite.lb-utils.db/project/build.number delete mode 100755 org.glite.lb-utils.db/project/build.properties delete mode 100644 org.glite.lb-utils.db/project/configure.properties.xml delete mode 100644 org.glite.lb-utils.db/project/properties.xml delete mode 100644 org.glite.lb-utils.db/project/tar_exclude delete mode 100755 org.glite.lb-utils.db/project/version.properties delete mode 100644 org.glite.lb-utils.db/src/db.c delete mode 100755 org.glite.lb-utils.jobid/.cvsignore delete mode 100755 org.glite.lb-utils.jobid/LICENSE delete mode 100644 org.glite.lb-utils.jobid/Makefile delete mode 100644 org.glite.lb-utils.jobid/build.xml delete mode 100755 org.glite.lb-utils.jobid/interface/cjobid.h delete mode 100755 org.glite.lb-utils.jobid/interface/strmd5.h delete mode 100644 org.glite.lb-utils.jobid/project/build.number delete mode 100755 org.glite.lb-utils.jobid/project/build.properties delete mode 100644 org.glite.lb-utils.jobid/project/configure.properties.xml delete mode 100644 org.glite.lb-utils.jobid/project/properties.xml delete mode 100644 org.glite.lb-utils.jobid/project/tar_exclude delete mode 100755 org.glite.lb-utils.jobid/project/version.properties delete mode 100755 org.glite.lb-utils.jobid/src/cjobid.c delete mode 100755 org.glite.lb-utils.jobid/src/strmd5.c delete mode 100755 org.glite.lb-utils.server-bones/.cvsignore delete mode 100755 org.glite.lb-utils.server-bones/LICENSE delete mode 100644 org.glite.lb-utils.server-bones/build.xml delete mode 100644 org.glite.lb-utils.server-bones/project/build.number delete mode 100755 org.glite.lb-utils.server-bones/project/build.properties delete mode 100644 org.glite.lb-utils.server-bones/project/configure.properties.xml delete mode 100644 org.glite.lb-utils.server-bones/project/properties.xml delete mode 100755 org.glite.lb-utils.server-bones/project/version.properties delete mode 100755 org.glite.lb-utils.trio/.cvsignore delete mode 100755 org.glite.lb-utils.trio/LICENSE delete mode 100644 org.glite.lb-utils.trio/Makefile delete mode 100644 org.glite.lb-utils.trio/build.xml delete mode 100644 org.glite.lb-utils.trio/interface/escape.h delete mode 100644 org.glite.lb-utils.trio/interface/trio.h delete mode 100644 org.glite.lb-utils.trio/project/build.number delete mode 100755 org.glite.lb-utils.trio/project/build.properties delete mode 100644 org.glite.lb-utils.trio/project/configure.properties.xml delete mode 100644 org.glite.lb-utils.trio/project/properties.xml delete mode 100755 org.glite.lb-utils.trio/project/version.properties delete mode 100644 org.glite.lb-utils.trio/src/escape.c delete mode 100644 org.glite.lb-utils.trio/src/strio.c delete mode 100644 org.glite.lb-utils.trio/src/strio.h delete mode 100644 org.glite.lb-utils.trio/src/trio.c delete mode 100644 org.glite.lb-utils.trio/src/triop.h delete mode 100644 org.glite.lb-utils.trio/test/trio_test.cpp delete mode 100644 org.glite.lb-utils/.cvsignore delete mode 100755 org.glite.lb-utils/LICENSE delete mode 100644 org.glite.lb-utils/build.xml delete mode 100644 org.glite.lb-utils/project/build.number delete mode 100755 org.glite.lb-utils/project/build.properties delete mode 100644 org.glite.lb-utils/project/dependencies.properties delete mode 100644 org.glite.lb-utils/project/glite.lb-utils.csf.xml delete mode 100644 org.glite.lb-utils/project/properties.xml delete mode 100644 org.glite.lb-utils/project/taskdefs.xml delete mode 100755 org.glite.lb-utils/project/version.properties create mode 100644 org.glite.lb.client-interface/doc/C.dox create mode 100644 org.glite.lb.client-interface/doc/CPP.dox delete mode 100644 org.glite.lb/.cvsignore delete mode 100644 org.glite.lb/LICENSE delete mode 100755 org.glite.lb/build.xml delete mode 100644 org.glite.lb/deployment/README delete mode 100644 org.glite.lb/deployment/deploy_all.diff delete mode 100644 org.glite.lb/deployment/deploy_jp.diff delete mode 100644 org.glite.lb/deployment/deploy_lb.diff delete mode 100644 org.glite.lb/doc/README.lb4vdt delete mode 100644 org.glite.lb/doc/copyright.tex delete mode 100644 org.glite.lb/doc/frontmatter.tex delete mode 100644 org.glite.lb/doc/perf_clear_proxy delete mode 100644 org.glite.lb/doc/perf_purge delete mode 100644 org.glite.lb/doc/perf_reg_jobs delete mode 100644 org.glite.lb/doc/perf_results/il_sci_09062006.txt delete mode 100644 org.glite.lb/doc/perf_results/il_sci_09062006_01.txt delete mode 100644 org.glite.lb/doc/perf_results/il_sci_12062006.txt delete mode 100644 org.glite.lb/doc/perf_results/ll_michal_21062006.txt delete mode 100644 org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt delete mode 100644 org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt delete mode 100644 org.glite.lb/doc/perf_results/proxy_sci_09062006.txt delete mode 100644 org.glite.lb/doc/perf_run_interlogd delete mode 100644 org.glite.lb/doc/perf_run_proxy delete mode 100644 org.glite.lb/doc/perf_run_server delete mode 100644 org.glite.lb/doc/perf_run_test delete mode 100644 org.glite.lb/doc/perftest.tex delete mode 100644 org.glite.lb/doc/testplan.tex delete mode 100755 org.glite.lb/lb4vdt/LB_install.sh delete mode 100644 org.glite.lb/lb4vdt/Makefile.inc delete mode 100644 org.glite.lb/lb4vdt/scripts/org.gridsite.core.build delete mode 100644 org.glite.lb/project/MultiStruct.pm delete mode 100644 org.glite.lb/project/StructField.pm delete mode 100755 org.glite.lb/project/at3 delete mode 100644 org.glite.lb/project/build.number delete mode 100644 org.glite.lb/project/build.properties delete mode 100644 org.glite.lb/project/dependencies.properties delete mode 100644 org.glite.lb/project/events.T delete mode 100644 org.glite.lb/project/glite.lb.csf.xml delete mode 100755 org.glite.lb/project/properties.xml delete mode 100644 org.glite.lb/project/run-workspace delete mode 100644 org.glite.lb/project/status.T delete mode 100755 org.glite.lb/project/taskdefs.xml delete mode 100644 org.glite.lb/project/types.T delete mode 100644 org.glite.lb/project/version.properties create mode 100644 org.glite.security.gsoap-plugin/interface/glite_gscompat.h create mode 100644 org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.c create mode 100644 org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.h create mode 100644 org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.c create mode 100644 org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.h create mode 100644 org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.c create mode 100644 org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.h delete mode 100644 org.glite.security.proxyrenewal/.cvsignore delete mode 100644 org.glite.security.proxyrenewal/LICENSE delete mode 100644 org.glite.security.proxyrenewal/Makefile delete mode 100755 org.glite.security.proxyrenewal/build.xml delete mode 100755 org.glite.security.proxyrenewal/config/startup delete mode 100644 org.glite.security.proxyrenewal/examples/renew_core.c delete mode 100644 org.glite.security.proxyrenewal/interface/renewal.h delete mode 100644 org.glite.security.proxyrenewal/interface/renewal_core.h delete mode 100644 org.glite.security.proxyrenewal/project/build.number delete mode 100644 org.glite.security.proxyrenewal/project/build.properties delete mode 100644 org.glite.security.proxyrenewal/project/configure.properties.xml delete mode 100755 org.glite.security.proxyrenewal/project/properties.xml delete mode 100644 org.glite.security.proxyrenewal/project/tar_exclude delete mode 100755 org.glite.security.proxyrenewal/project/taskdefs.xml delete mode 100644 org.glite.security.proxyrenewal/project/version.properties delete mode 100644 org.glite.security.proxyrenewal/src/api.c delete mode 100644 org.glite.security.proxyrenewal/src/client.c delete mode 100644 org.glite.security.proxyrenewal/src/commands.c delete mode 100644 org.glite.security.proxyrenewal/src/common.c delete mode 100644 org.glite.security.proxyrenewal/src/renew.c delete mode 100644 org.glite.security.proxyrenewal/src/renewal_core.c delete mode 100644 org.glite.security.proxyrenewal/src/renewal_locl.h delete mode 100644 org.glite.security.proxyrenewal/src/renewd.c delete mode 100644 org.glite.security.proxyrenewal/src/renewd_locl.h delete mode 100644 org.glite.security.proxyrenewal/src/voms.c delete mode 100644 org.glite.wms-utils.exception/.cvsignore delete mode 100755 org.glite.wms-utils.exception/LICENSE delete mode 100755 org.glite.wms-utils.exception/Makefile.am delete mode 100755 org.glite.wms-utils.exception/bootstrap delete mode 100755 org.glite.wms-utils.exception/build.xml delete mode 100755 org.glite.wms-utils.exception/configure.ac delete mode 100755 org.glite.wms-utils.exception/interface/Makefile.am delete mode 100644 org.glite.wms-utils.exception/interface/glite/wmsutils/exception/Exception.h delete mode 100755 org.glite.wms-utils.exception/interface/glite/wmsutils/exception/exception_codes.h delete mode 100644 org.glite.wms-utils.exception/project/build.number delete mode 100755 org.glite.wms-utils.exception/project/build.properties delete mode 100644 org.glite.wms-utils.exception/project/configure.properties.xml delete mode 100755 org.glite.wms-utils.exception/project/properties.xml delete mode 100755 org.glite.wms-utils.exception/project/version.properties delete mode 100644 org.glite.wms-utils.exception/src/Exception.cpp delete mode 100755 org.glite.wms-utils.exception/src/Makefile.am delete mode 100755 org.glite.wms-utils.exception/test/Makefile.am delete mode 100644 org.glite.wms-utils.exception/test/exception_cu_main.cpp delete mode 100644 org.glite.wms-utils.exception/test/exception_cu_suite.cpp delete mode 100644 org.glite.wms-utils.exception/test/exception_cu_suite.h delete mode 100755 org.glite.wms-utils.jobid/.cvsignore delete mode 100755 org.glite.wms-utils.jobid/LICENSE delete mode 100755 org.glite.wms-utils.jobid/Makefile.am delete mode 100755 org.glite.wms-utils.jobid/bootstrap delete mode 100755 org.glite.wms-utils.jobid/build.xml delete mode 100755 org.glite.wms-utils.jobid/configure.ac delete mode 100755 org.glite.wms-utils.jobid/examples/Makefile.am delete mode 100755 org.glite.wms-utils.jobid/examples/testjobid.c delete mode 100755 org.glite.wms-utils.jobid/interface/Makefile.am delete mode 100755 org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobId.h delete mode 100755 org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobIdExceptions.h delete mode 100755 org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/cjobid.h delete mode 100755 org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/manipulation.h delete mode 100644 org.glite.wms-utils.jobid/project/build.number delete mode 100755 org.glite.wms-utils.jobid/project/build.properties delete mode 100644 org.glite.wms-utils.jobid/project/configure.properties.xml delete mode 100755 org.glite.wms-utils.jobid/project/properties.xml delete mode 100755 org.glite.wms-utils.jobid/project/version.properties delete mode 100755 org.glite.wms-utils.jobid/src/Makefile.am delete mode 100755 org.glite.wms-utils.jobid/src/jobid/JobId.cpp delete mode 100755 org.glite.wms-utils.jobid/src/jobid/JobIdExceptions.cpp delete mode 100755 org.glite.wms-utils.jobid/src/jobid/Makefile.am delete mode 100755 org.glite.wms-utils.jobid/src/jobid/cjobid.c delete mode 100755 org.glite.wms-utils.jobid/src/jobid/manipulation.cpp delete mode 100755 org.glite.wms-utils.jobid/src/jobid/strmd5.c delete mode 100755 org.glite.wms-utils.jobid/src/jobid/strmd5.h delete mode 100755 org.glite.wms-utils.jobid/test/Makefile.am delete mode 100644 org.glite.wms-utils.jobid/test/jobid_cu_main.cpp delete mode 100644 org.glite.wms-utils.jobid/test/jobid_cu_suite.cpp delete mode 100644 org.glite.wms-utils.jobid/test/jobid_cu_suite.h delete mode 100644 org.glite.wms-utils.jobid/test/manipulation_cu_main.cpp delete mode 100644 org.glite.wms-utils.jobid/test/manipulation_cu_suite.cpp delete mode 100644 org.glite.wms-utils.jobid/test/manipulation_cu_suite.h delete mode 100644 org.gridsite.core/.cvsignore delete mode 100644 org.gridsite.core/CHANGES delete mode 100644 org.gridsite.core/INSTALL delete mode 100644 org.gridsite.core/LICENSE delete mode 100644 org.gridsite.core/README delete mode 100644 org.gridsite.core/VERSION delete mode 100644 org.gridsite.core/build.xml delete mode 100644 org.gridsite.core/doc/README.htcp-bin delete mode 100644 org.gridsite.core/doc/build-apache2.sh delete mode 100644 org.gridsite.core/doc/delegation-1.1.0.wsdl delete mode 100644 org.gridsite.core/doc/findproxyfile.1 delete mode 100644 org.gridsite.core/doc/fuse.spec delete mode 100644 org.gridsite.core/doc/gridsite-delegation.8 delete mode 100644 org.gridsite.core/doc/gsexec.8 delete mode 100644 org.gridsite.core/doc/htcp.1 delete mode 100644 org.gridsite.core/doc/htfind.1 delete mode 100644 org.gridsite.core/doc/htll.1 delete mode 100644 org.gridsite.core/doc/htls.1 delete mode 100644 org.gridsite.core/doc/htmkdir.1 delete mode 100644 org.gridsite.core/doc/htmv.1 delete mode 100644 org.gridsite.core/doc/htping.1 delete mode 100644 org.gridsite.core/doc/htproxydestroy.1 delete mode 100644 org.gridsite.core/doc/htproxyput.1 delete mode 100644 org.gridsite.core/doc/htproxyrenew.1 delete mode 100644 org.gridsite.core/doc/htproxytime.1 delete mode 100644 org.gridsite.core/doc/htproxyunixtime.1 delete mode 100644 org.gridsite.core/doc/htrm.1 delete mode 100644 org.gridsite.core/doc/httpd-fileserver.conf delete mode 100644 org.gridsite.core/doc/httpd-webserver.conf delete mode 100644 org.gridsite.core/doc/index.html delete mode 100644 org.gridsite.core/doc/mod_gridsite.8 delete mode 100644 org.gridsite.core/doc/urlencode.1 delete mode 100644 org.gridsite.core/interface/gridsite-gacl.h delete mode 100644 org.gridsite.core/interface/gridsite.h delete mode 100644 org.gridsite.core/project/build.number delete mode 100644 org.gridsite.core/project/build.properties delete mode 100644 org.gridsite.core/project/configure.properties.xml delete mode 100644 org.gridsite.core/project/dependencies.properties delete mode 100644 org.gridsite.core/project/gridsite.core.csf.xml delete mode 100644 org.gridsite.core/project/properties.xml delete mode 100644 org.gridsite.core/project/taskdefs.xml delete mode 100644 org.gridsite.core/project/version.properties delete mode 100644 org.gridsite.core/src/Doxyfile delete mode 100644 org.gridsite.core/src/Makefile delete mode 100644 org.gridsite.core/src/delegation.h delete mode 100644 org.gridsite.core/src/doxygen.css delete mode 100644 org.gridsite.core/src/doxyheader.html delete mode 100644 org.gridsite.core/src/findproxyfile.c delete mode 100644 org.gridsite.core/src/gaclexample.c delete mode 100644 org.gridsite.core/src/gridsite-copy.c delete mode 100644 org.gridsite.core/src/grst-delegation.c delete mode 100644 org.gridsite.core/src/grst_admin.h delete mode 100644 org.gridsite.core/src/grst_admin_file.c delete mode 100644 org.gridsite.core/src/grst_admin_gacl.c delete mode 100644 org.gridsite.core/src/grst_admin_main.c delete mode 100644 org.gridsite.core/src/grst_asn1.c delete mode 100644 org.gridsite.core/src/grst_err.c delete mode 100644 org.gridsite.core/src/grst_gacl.c delete mode 100644 org.gridsite.core/src/grst_htcp.c delete mode 100644 org.gridsite.core/src/grst_http.c delete mode 100644 org.gridsite.core/src/grst_x509.c delete mode 100644 org.gridsite.core/src/grst_xacml.c delete mode 100644 org.gridsite.core/src/gsexec.c delete mode 100644 org.gridsite.core/src/gsexec.h delete mode 100644 org.gridsite.core/src/htcp.c delete mode 100644 org.gridsite.core/src/htproxyput.c delete mode 100755 org.gridsite.core/src/make-gridsite-spec delete mode 100644 org.gridsite.core/src/mod_gridsite.c delete mode 100644 org.gridsite.core/src/mod_ssl-private.h delete mode 100755 org.gridsite.core/src/roffit delete mode 100644 org.gridsite.core/src/showx509exts.c delete mode 100644 org.gridsite.core/src/slashgrid.c delete mode 100755 org.gridsite.core/src/slashgrid.init delete mode 100644 org.gridsite.core/src/urlencode.c delete mode 100644 org.gridsite.core/src/xacmlexample.c diff --git a/org.glite.deployment.jpis/build.xml b/org.glite.deployment.jpis/build.xml deleted file mode 100644 index c2bf066..0000000 --- a/org.glite.deployment.jpis/build.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpis/config/scripts/glite-jpis-config.py b/org.glite.deployment.jpis/config/scripts/glite-jpis-config.py deleted file mode 100755 index eb75155..0000000 --- a/org.glite.deployment.jpis/config/scripts/glite-jpis-config.py +++ /dev/null @@ -1,492 +0,0 @@ -#!/usr/bin/env python -################################################################################ -# -# Copyright (c) Members of the EGEE Collaboration. 2004. -# See http://eu-egee.org/partners/ for details on the copyright holders. -# For license conditions see the license file or http://eu-egee.org/license.html -# -################################################################################ -# glite-jpis-config v. 1.0.0 -# -# Post-installation script for configuring the gLite Job Provenance Servers -# Robert Harakaly < mmulac@cern.ch > -# -# Version info: $Id$ -# -# Usage: python glite-jpis-config [-c|-v|-h|--help] -# -c, --checkconf print configuration -# -v, --version print version -# -h,--help print usage info -# --configure configure the service -# --start start the service -# --stop stop the service -# --status show service status -# -# Return codes: 0 - Ok -# 1 - Configuration failed -# -################################################################################ - -import os,string,pwd -import sys, posix, getopt,time - -sys.path.append(".") -from gLiteInstallerLib import gLib -from gLiteInstallerLib import ConfigParams -import mysql as MySQL - -# Set global variables here -global params # all config values from the XML file - -class glite_jpis: - - def __init__(self): - self.mysql = MySQL.Mysql() - self.verbose = 0 - self.version = "1.0.0" - self.name = "glite-jpis" - self.friendly_name = "gLite Job Provenance Index Server" - - #------------------------------------------------------------------------------- - # Banner - #------------------------------------------------------------------------------- - - def banner(self): - - print "\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - print "Configuring the %s" % self.friendly_name - print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" - - #------------------------------------------------------------------------------- - # Copyright - #------------------------------------------------------------------------------- - - def copyright(self): - - print '\nCopyright (c) Members of the EGEE Collaboration. 2004' - print 'See http://eu-egee.org/partners/ for details on the copyright holders' - print 'For license conditions see the license file or http://eu-egee.org/license.html' - - #------------------------------------------------------------------------------- - # Version - #------------------------------------------------------------------------------- - - def showVersion(self): - - print '\n%s-config v. %s\n' % (self.name,self.version) - - #------------------------------------------------------------------------------- - # Usage - #------------------------------------------------------------------------------- - - def usage(self,msg = ""): - - if msg: - print "\n%s" % (msg) - - self.copyright() - self.showVersion() - - print """Usage: \n -Edit the configuration file %s.cfg.xml in -%s/etc.config/templates\n -save it as %s/etc/config/%s.cfg.xml -and run the script as follows\n -python %s-config [OPTION...]""" % (self.name, os.environ['GLITE_LOCATION'], \ - os.environ['GLITE_LOCATION'], self.name, self.name) - - print ' -c, --checkconf print the service configuration' - print ' -v, --version print the version of the configuration script' - print ' -h, --help print this usage information' - print ' --configure configure the service' - print ' --start start the service' - print ' --stop stop the service' - print ' --status check service status' - print '\n' - - #------------------------------------------------------------------------------- - # All the configuration code goes here - #------------------------------------------------------------------------------- - - def start(self): - - self.mysql.start() - time.sleep(5) - - if not os.path.exists('/tmp/mysql.sock'): - os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock') - - #------------------------------------------------------------------- - # Start Index Server - #------------------------------------------------------------------- - - pid = glib.getPID('indexd') - if pid != 0: - print 'The gLite JP Index Server service is already running. Restarting...' - os.system('%s/etc/init.d/glite-jp-indexd stop' % os.environ['GLITE_LOCATION']) - else: - print 'Starting the gLite JP Index Server service...' - - os.system('%s/etc/init.d/glite-jp-indexd start' % os.environ['GLITE_LOCATION']) - - pid = glib.getPID('indexd') - - if (pid != 0): - print "The gLite JP Index Server service has been started ", - glib.printOkMessage() - else: - glib.printErrorMessage("Could not start the gLite JP Index Server service") - glib.printErrorMessage("Please verify and re-run the script "), - glib.printFailedMessage() - return 1 - - return 0 - - def stop(self): - - error_level = 0 - - #------------------------------------------------------------------- - # Stop Index Server - #------------------------------------------------------------------- - - pid = glib.getPID('indexd') - if (pid != 0): - os.system('%s/etc/init.d/glite-jp-indexd stop' % os.environ['GLITE_LOCATION']) - - pid = glib.getPID('indexd') - if (pid != 0): - print 'Could not stop the JP Index Server service ', - glib.printFailedMessage() - error_level = 1 - else: - print 'JP Index Server service has been stopped ', - glib.printOkMessage() - - #------------------------------------------------------------------- - # MySQL - #------------------------------------------------------------------- - - self.mysql.stop() - - return error_level - - def status(self): - - error_level = 0 - - retval = os.system('%s/etc/init.d/glite-jp-indexd status' % os.environ['GLITE_LOCATION']) - if retval != 0: - error_level = 1 - - return error_level - - def configure(self): - - #-------------------------------------------------------- - # Installs the Security Utilities - #-------------------------------------------------------- - - if os.system("python %s/glite-security-utils-config.py --subservice" % glib.getScriptPath()): - print "\nConfiguring gLite Security Utilities ", - glib.printFailedMessage() - else: - print "\nConfiguring gLite Security Utilities ", - glib.printOkMessage() - - # Create the GLITE_USER if it doesn't exists - print "\nCreating/Verifying the GLITE_USER account %s" % os.environ['GLITE_USER'] - (uid,gid) = glib.get_user_info(os.environ['GLITE_USER']) - glib.check_dir(os.environ['GLITE_LOCATION_VAR'],0755, uid, gid) - jpis_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path'] - glib.check_dir(jpis_cert_path ,0755, uid, gid) - glib.printOkMessage() - - # Create all directories needed - glib.check_dir(os.environ['GLITE_CERT_DIR']) - print "\nVerify CA certificates directory ", - glib.printOkMessage() - - # Copy certificates - print "\nCopy host certificates to GLITE_USER home directory as service certificates", - os.system("cp %s %s %s/" % (params['host.certificate.file'], params['host.key.file'], jpis_cert_path)) - os.chown("%s/hostcert.pem" % jpis_cert_path, uid,gid) - os.chmod("%s/hostcert.pem" % jpis_cert_path, 0644) - os.chown("%s/hostkey.pem" % jpis_cert_path, uid,gid) - os.chmod("%s/hostkey.pem" % jpis_cert_path, 0400) - glib.printOkMessage() - - #-------------------------------------------------------- - # Configure MySQL - #-------------------------------------------------------- - - # Set mysql parameters - #self.mysql.setConfiguration('client','max_allowed_packet',params['mysql.max_allowed_packet']) - self.mysql.setConfiguration('mysqld','max_allowed_packet',params['mysql.max_allowed_packet']) - - # start MySQL - self.mysql.stop() - time.sleep(5) - self.mysql.start() - - if not os.path.exists('/tmp/mysql.sock'): - os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock') - - # ------------------------------------------------------------ - # Check password of MySQL - # ------------------------------------------------------------ - - self.mysql_root_password = params['mysql.root.password'] - if not params.has_key('set.mysql.root.password'): - params['set.mysql.root.password'] = 'false' - setempty = params['set.mysql.root.password'] - if self.mysql.checkMySQLConfiguration(self.mysql_root_password,setempty): - return 1 - - # Create the MySQL database - print "\nCreate/Verify the %s database" % params['jpis.database.name'] - - # Check if database exists - if self.mysql.existsDB(params['jpis.database.name'],self.mysql_root_password) != 0: - # Create database - print ('\n==> Creating MySQL %s database\n' % params['jpis.database.name']) - - if os.path.exists('/bin/rm /tmp/mysql_ct'): - os.remove('/tmp/mysql_ct') - - file = open('/tmp/mysql_ct', 'w') - - self.mysql.add_user(params['jpis.database.name'],params['jpis.database.username'],"",self.mysql_root_password) - text = ['USE %s;\n' % params['jpis.database.name'], - '\. %s/etc/glite-jp-index-dbsetup.sql\n' % os.environ['GLITE_LOCATION']] - - file.writelines(text) - file.close() - os.system('/usr/bin/mysql -p%s < /tmp/mysql_ct' % self.mysql_root_password) - os.system('/bin/rm /tmp/mysql_ct') - - #Starting and stopping the database before the index creation - self.mysql.stop() - time.sleep(5) - self.mysql.start() - - else: - print "\n==> MySQL database %s already exist\n" % params['jpis.database.name'] - - self.mysql.stop() - - return 0 - -#------------------------------------------------------------------------------- -# Set all environment variables -#------------------------------------------------------------------------------- - -def loadDefaults(params): - - params['GLITE_LOCATION'] = "/opt/glite" - params['mysql.root.password'] = "" - params['mysql.max_allowed_packet'] = "17" - params['jpis.serviceName'] = 'JP IS Server service at %s' % glib.fq_hostname - params['jpis.serviceType'] = 'org.glite.jp.index' - params['jpis.statusScript'] = '%s/etc/init.d/glite-jp-indexd status' % params['GLITE_LOCATION'] - params['jpis.endpoint'] = 'not available' - -def set_env(): - - # gLite - glib.export('GLITE_LOCATION'); - glib.export('GLITE_LOCATION_VAR'); - if not os.path.exists(os.environ['GLITE_LOCATION_VAR']): - os.mkdir(os.environ['GLITE_LOCATION_VAR'],0755) - glib.export('GLITE_LOCATION_LOG'); - if not os.path.exists(os.environ['GLITE_LOCATION_LOG']): - os.mkdir(os.environ['GLITE_LOCATION_LOG'],0755) - glib.export('GLITE_LOCATION_TMP'); - if not os.path.exists(os.environ['GLITE_LOCATION_TMP']): - os.mkdir(os.environ['GLITE_LOCATION_TMP'],0755) - - if not params.has_key('glite.user.group'): - params['glite.user.group'] = '' - (uid,gid) = glib.add_user(params['glite.user.name'],params['glite.user.group']) - glib.export('GLITE_USER',params['glite.user.name']) - jpis_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path'] - glib.export('GLITE_HOST_CERT',"%s/hostcert.pem" % jpis_cert_path) - glib.export('GLITE_HOST_KEY',"%s/hostkey.pem" % jpis_cert_path) - glib.export('GLITE_CERT_DIR',params['ca.certificates.dir']) - - glib.export('GLOBUS_LOCATION',params['GLOBUS_LOCATION']) - glib.export('GPT_LOCATION',params['GPT_LOCATION']) - - glib.export('JAVA_HOME') - - # bin and lib paths - glib.addEnvPath("PATH","/usr/bin/:%s/bin:%s/bin:%s/externals/bin:%s/bin" \ - % (os.environ['JAVA_HOME'],os.environ['GLOBUS_LOCATION'],os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])) - glib.addEnvPath("LD_LIBRARY_PATH","/usr/lib:%s/lib:%s/externals/lib:%s/lib" % (os.environ['GLOBUS_LOCATION'], os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])) - - # Perl - glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION'])) - - # JP IS configuration - glib.export('GLITE_JPIS_PS',params['jpis.ps']) - glib.export('GLITE_JPIS_DEBUG',params['jpis.debug']) - glib.export('GLITE_JPIS_QT',params['jpis.qt']) - glib.export('GLITE_JPIS_AUTH',params['jpis.auth']) - glib.export('GLITE_JPIS_DB',"%s/@localhost:%s" % (params['jpis.database.username'], params['jpis.database.name']) ) - glib.export('GLITE_JPIS_PORT',params['jpis.port']) - glib.export('GLITE_JPIS_PIDFILE',params['jpis.pid.file']) - glib.export('GLITE_JPIS_LOGFILE',params['jpis.log.file']) - - # Set environment - glib.setUserEnv() - -#------------------------------------------------------------------------------- -# Main program begins here -#------------------------------------------------------------------------------- - -if __name__ == '__main__': - - # The script must be run as root - if not os.geteuid()==0: - print '"\nThis script must be run as root\n' - sys.exit(1) - - # Get an instance of the ConfigParams class - params = ConfigParams() - - # Get an instance of the library class - glib = gLib() - - # Load parameters - loadDefaults(params) - try: - opts, args = glib.getopt(sys.argv[1:], '', ['siteconfig=']) - for o, a in opts: - if o == "--siteconfig": - params['site.config.url'] = a - break - except getopt.GetoptError: - pass - if glib.loadConfiguration("%s/../glite-jpis.cfg.xml" % glib.getScriptPath(),params): - print "An error occurred while configuring the service" - sys.exit(1) - - verbose = 0 - if params.has_key('glite.installer.verbose'): - if params['glite.installer.verbose'] == "true": - verbose = 1 - glib.verbose = verbose - - # Set up the environment - set_env() - - - # Instantiate the service classes - service = glite_jpis() - service.verbose = verbose - - # Command line opts if any - try: - opts, args = glib.getopt(sys.argv[1:], 'chv', ['checkconf', 'help', 'version','configure','stop','start','status','siteconfig=']) - except getopt.GetoptError: - service.usage(msg = "Unknown options(s)") - sys.exit(1) - - if len(opts) == 0: - service.usage() - sys.exit(0) - - # Check cli options - for o, a in opts: - if o in ("-h", "--help"): - service.usage() - sys.exit(0) - if o in ("-v", "--version"): - service.showVersion() - sys.exit(0) - if o in ("-c", "--checkconf"): - service.copyright() - service.showVersion() - glib.print_params(params) - sys.exit(0) - - if o == "--configure": - - - # Check certificates - if params.has_key('glite.installer.checkcerts'): - if params['glite.installer.checkcerts'] == "true": - if glib.check_certs(params) != 0: - print "An error occurred while configuring the %s service" \ - % service.friendly_name - sys.exit(1) - - # Print configuration parameters - if verbose: - glib.print_params(params) - - service.copyright() - service.showVersion() - service.banner() - - # Stop all services - glib.printInfoMessage("\n\nStopping all running JP IS services...") - service.stop() - - # Configure the service - return_result = service.configure() - - if return_result == 0: - - # Stop all services - glib.printInfoMessage("\n\nStopping all running JP IS services...") - service.stop() - - print "\n\nThe %s configuration was successfully completed\n" % service.friendly_name - print "You can now start the service using the --start option of this script\n\n" - glib.registerService() - - sys.exit(0) - - elif return_result == 2: - - # Stop all services - glib.printInfoMessage("\n\nStopping all running JP IS services...") - service.stop() - - print "\n\nThe %s configuration was completed,\n" % service.friendly_name - print "but warnings were issued. Please revise them and re-run the script\n" - print "or configure JP IS manually\n" - - sys.exit(2) - - else: - print "\n\nAn unrecoverable error occurred while configuring the %s" \ - % service.friendly_name - - sys.exit(1) - - if o in ("start", "--start"): - # Start the service - if service.start() == 0: - print "\n\nThe %s was successfully started " % service.friendly_name, - glib.printOkMessage() - sys.exit(0) - else: - print "\n\nAn error occurred while starting the %s " % service.friendly_name, - glib.printFailedMessage() - sys.exit(1) - - if o in ("stop", "--stop"): - # Stop the service - if service.stop() == 0: - print "\n\nThe %s was successfully stopped " % service.friendly_name, - glib.printOkMessage() - sys.exit(0) - else: - print "\n\nAn unrecoverable error occurred while stopping the %s " % service.friendly_name, - glib.printFailedMessage() - sys.exit(1) - if o == "--status": - sys.exit(service.status()) - diff --git a/org.glite.deployment.jpis/config/templates/glite-jpis.cfg.xml b/org.glite.deployment.jpis/config/templates/glite-jpis.cfg.xml deleted file mode 100644 index cd56a80..0000000 --- a/org.glite.deployment.jpis/config/templates/glite-jpis.cfg.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpis/project/build.number b/org.glite.deployment.jpis/project/build.number deleted file mode 100644 index 58569c4..0000000 --- a/org.glite.deployment.jpis/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Apr 13 09:36:57 CEST 2005 -module.build=232 diff --git a/org.glite.deployment.jpis/project/build.properties b/org.glite.deployment.jpis/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.deployment.jpis/project/glite-jp.sdf.xml.template b/org.glite.deployment.jpis/project/glite-jp.sdf.xml.template deleted file mode 100644 index d27cdec..0000000 --- a/org.glite.deployment.jpis/project/glite-jp.sdf.xml.template +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpis/project/glite-jpis.sdf.xml.template b/org.glite.deployment.jpis/project/glite-jpis.sdf.xml.template deleted file mode 100644 index d27cdec..0000000 --- a/org.glite.deployment.jpis/project/glite-jpis.sdf.xml.template +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpis/project/lxscript-rpm.xsl b/org.glite.deployment.jpis/project/lxscript-rpm.xsl deleted file mode 100644 index 7b6c6e3..0000000 --- a/org.glite.deployment.jpis/project/lxscript-rpm.xsl +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - -#!/bin/sh - -# Copyright (c) Members of the EGEE Collaboration. 2004 -# See http://eu-egee.org/partners/ for details on the copyright holders -# For license conditions see the license file or http://eu-egee.org/license.html - -# glite-jpis_installer v. -# -# The glite-jpis_installer installs the gLite Job Provenance Index Server -# -# Usage: glite-jpis_installer [-u|-v|--help] -# -u uninstall -# -v print version -# --help print script usage info -# Return codes: 0 - Ok -# 1 - if a file could not be downloaded - -############################################################################### - -#Parse the RPMLIST to strip out the RPMS that are already installed -function parseRPMList() -{ - newRPMLIST="" - localRPMLIST=`rpm -qa` - for i in $RPMLIST - do - g=`echo $i | sed -e 's/\.i386\.rpm//g'` - g=`echo $g | sed -e 's/\.noarch\.rpm//g'` - if [ -z "`echo $localRPMLIST | grep $g`" ]; then - newRPMLIST="${newRPMLIST} $i" - else - echo "$i is already installed. It will be skipped." - fi - done - - RPMLIST=$newRPMLIST -} - -#Parse the SCRIPTLIST to execute all scripts -function parseScriptList() -{ - for i in $SCRIPTLIST - do - if [ "$INSTALL" = "true" ]; then - $i - else - $i -u - fi - done -} - -#Downloads and install the module RPMS -function install() -{ - - INSTALL=true - version - echo - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, downloading the gLite Job Provenance Index Server... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - - mkdir -p glite-jpis - cd glite-jpis - - # Download global dependencies - - - true - - - - - - # Download scripts from repository - - - true - - - - - # Download dependencies RPMS from repository - - - true - - - - # Download RPMS from repository - - - true - - - - - - # Download and install subservices - parseScriptList - - - # Install all RPMS - echo - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, installing the gLite Job Provenance Index Server... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - parseRPMList - if [ ! -z "$RPMLIST" ]; then - rpm -Uvh $RPMLIST - rpm_return=$? - else - echo All required RPMS are already installed - rpm_return=0 - fi - if [ "$rpm_return" == "0" ]; then - echo - echo Done! - echo - echo Before using the gLite JP, please create or update the configuration - echo files /opt/glite/etc/config/glite-jpis.cfg.xml - echo and /opt/glite/etc/config/glite-global.cfg.xml - echo and run the configuration script - echo /opt/glite/etc/config/scripts/glite-jpis-config.py. - echo A template is provided in - echo /opt/glite/etc/config/templates/glite-jpis.cfg.xml - echo Alternatively site configuration files can be used - else - echo - echo An error occurred while installing the JP RPMS. - echo Most likely one or more of the RPMS to be installed require - echo additional dependencies or are older than already installed packages. - echo Please refer to the rpm error message above for more details. - fi - echo - echo For more information refer to the gLite Installation and User Guides - echo or to the gLite web site \(http:\/\/www.glite.org\) - echo Please report problems and comments to the gLite Team at - echo glite-bugs@cern.ch - - cd .. -} - -############################################################################### -function uninstall() -{ - version - - # Global dependencies - - - false - - - - - - # dependencies RPMS from repository - - - false - - - - # RPMS from repository - - - false - - - - - - # Uninstall all RPMS - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, uninstalling the gLite Job Provenance Index Server... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - rpm -ev $RPMLIST - if [ "$?" == "0" ]; then - echo - echo Done! - else - echo - echo An error occurred while removing the JP RPMS. - echo Most likely one or more of the RPMS to be removed have - echo dependent packages. - echo Please refer to the rpm error message above for more details. - fi -} - -############################################################################### -function usage() -{ - echo - echo Copyright \(c\) Members of the EGEE Collaboration. 2004 - echo See http://eu-egee.org/partners/ for details on the copyright holders - echo For license conditions see the license file or http://eu-egee.org/license.html - echo - echo glite-jpis_installer v. - echo - echo The glite-jpis_installer installs the gLite Job Provenance Index Server - echo - echo Usage: glite-jpis_installer \[-u\|-v\|--help\] - echo -u uninstall - echo -v print version - echo --help print script usage info - echo - echo Return codes: - echo 0 - Ok - echo 1 - if a file could not be downloaded - echo -} - -############################################################################### -function version -{ - echo - echo Copyright \(c\) Members of the EGEE Collaboration. 2004 - echo See http://eu-egee.org/partners/ for details on the copyright holders - echo For license conditions see the license file or http://eu-egee.org/license.html - echo - echo glite-jpis_installer v. - echo -} - - -RPMLIST= - -############################################################################### -# Main - -while getopts uvh opt -do - case $opt in - 'u') uninstall - exit 0 - ;; - 'v') version - exit 0 - ;; - 'h') usage - exit 0 - ;; - esac -done - -install - -exit 0 - - - - - _installer.sh - - -wget -N -nv -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -chmod u+x -SCRIPTLIST="$SCRIPTLIST ./" - - -SCRIPTLISTUn="$SCRIPTLISTUn ./ -u " - - - - - - - - --..rpm - -- - - -wget -N -nv -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -RPMLIST="$RPMLIST " - - -RPMLIST="$RPMLIST " - - - - - - - --..rpm - -- - - -wget -N -nv /RPMS/ -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -RPMLIST="$RPMLIST " - - -RPMLIST="$RPMLIST " - - - - - diff --git a/org.glite.deployment.jpis/project/lxscript-tgz.xsl b/org.glite.deployment.jpis/project/lxscript-tgz.xsl deleted file mode 100644 index 8b1e0c0..0000000 --- a/org.glite.deployment.jpis/project/lxscript-tgz.xsl +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - -#!/bin/sh -# -# glite-jpis_tgz_installer -# usage: glite-jpis_tgz_installer [-u] -# -u uninstall -# -# glite-jpis_tgz_installer installs the gLite Deployment Unit from biniary tarballs -# - -PREFIX=/opt/glite - -############################################################################### -# Download global dependencies - - - -############################################################################### - - -############################################################################### -# Download dependencies RPMS from repository - - - -############################################################################### -# Download RPMS from repository - - - -############################################################################### - - - - - - --..rpm -wget - - - - -_bin.tar.gz -wget i386/tgz/ -tar -xzf $PREFIX - - - diff --git a/org.glite.deployment.jpis/project/properties.xml b/org.glite.deployment.jpis/project/properties.xml deleted file mode 100644 index 072dd67..0000000 --- a/org.glite.deployment.jpis/project/properties.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpis/project/quattor-template.xsl b/org.glite.deployment.jpis/project/quattor-template.xsl deleted file mode 100644 index d960582..0000000 --- a/org.glite.deployment.jpis/project/quattor-template.xsl +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - -template pro_software_glite_jpis; - -# -# Copyright (c) Members of the EGEE Collaboration. 2004 -# See http://eu-egee.org/partners/ for details on the copyright holders -# For license conditions see the license file or http://eu-egee.org/license.html -# -# glite-jpis Quattor template v. -# - -## CAs - -include pro_software_glite_CA; - - - -# Global dependencies - - - - - - -# dependencies - - - - -# RPMS - - - - - -include pro_software_; - - - - - - - -"/software/packages"=pkg_repl("","-",""); - - - -"/software/packages"=pkg_repl("","-",""); - - - diff --git a/org.glite.deployment.jpis/project/version.properties b/org.glite.deployment.jpis/project/version.properties deleted file mode 100644 index 809be8c..0000000 --- a/org.glite.deployment.jpis/project/version.properties +++ /dev/null @@ -1,4 +0,0 @@ - -module.version = 2.2.0 -module.age = 2 - diff --git a/org.glite.deployment.jpps/build.xml b/org.glite.deployment.jpps/build.xml deleted file mode 100644 index c2bf066..0000000 --- a/org.glite.deployment.jpps/build.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpps/config/scripts/glite-jpps-config.py b/org.glite.deployment.jpps/config/scripts/glite-jpps-config.py deleted file mode 100755 index 3612d6b..0000000 --- a/org.glite.deployment.jpps/config/scripts/glite-jpps-config.py +++ /dev/null @@ -1,500 +0,0 @@ -#!/usr/bin/env python -################################################################################ -# -# Copyright (c) Members of the EGEE Collaboration. 2004. -# See http://eu-egee.org/partners/ for details on the copyright holders. -# For license conditions see the license file or http://eu-egee.org/license.html -# -################################################################################ -# glite-jpps-config v. 1.0.0 -# -# Post-installation script for configuring the gLite Job Provenance Servers -# Robert Harakaly < mmulac@cern.ch > -# -# Version info: $Id$ -# -# Usage: python glite-jpps-config [-c|-v|-h|--help] -# -c, --checkconf print configuration -# -v, --version print version -# -h,--help print usage info -# --configure configure the service -# --start start the service -# --stop stop the service -# --status show service status -# -# Return codes: 0 - Ok -# 1 - Configuration failed -# -################################################################################ - -import os,string,pwd -import sys, posix, getopt,time - -sys.path.append(".") -from gLiteInstallerLib import gLib -from gLiteInstallerLib import ConfigParams -import mysql as MySQL - -# Set global variables here -global params # all config values from the XML file - -class glite_jpps: - - def __init__(self): - self.mysql = MySQL.Mysql() - self.verbose = 0 - self.version = "1.0.0" - self.name = "glite-jpps" - self.friendly_name = "gLite Job Provenance Primary Storage" - - #------------------------------------------------------------------------------- - # Banner - #------------------------------------------------------------------------------- - - def banner(self): - - print "\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - print "Configuring the %s" % self.friendly_name - print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" - - #------------------------------------------------------------------------------- - # Copyright - #------------------------------------------------------------------------------- - - def copyright(self): - - print '\nCopyright (c) Members of the EGEE Collaboration. 2004' - print 'See http://eu-egee.org/partners/ for details on the copyright holders' - print 'For license conditions see the license file or http://eu-egee.org/license.html' - - #------------------------------------------------------------------------------- - # Version - #------------------------------------------------------------------------------- - - def showVersion(self): - - print '\n%s-config v. %s\n' % (self.name,self.version) - - #------------------------------------------------------------------------------- - # Usage - #------------------------------------------------------------------------------- - - def usage(self,msg = ""): - - if msg: - print "\n%s" % (msg) - - self.copyright() - self.showVersion() - - print """Usage: \n -Edit the configuration file %s.cfg.xml in -%s/etc.config/templates\n -save it as %s/etc/config/%s.cfg.xml -and run the script as follows\n -python %s-config [OPTION...]""" % (self.name, os.environ['GLITE_LOCATION'], \ - os.environ['GLITE_LOCATION'], self.name, self.name) - - print ' -c, --checkconf print the service configuration' - print ' -v, --version print the version of the configuration script' - print ' -h, --help print this usage information' - print ' --configure configure the service' - print ' --start start the service' - print ' --stop stop the service' - print ' --status check service status' - print '\n' - - #------------------------------------------------------------------------------- - # All the configuration code goes here - #------------------------------------------------------------------------------- - - def start(self): - - self.mysql.start() - time.sleep(5) - - if not os.path.exists('/tmp/mysql.sock'): - os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock') - - #------------------------------------------------------------------- - # Start Primary Storage - #------------------------------------------------------------------- - - pid = glib.getPID('primarystoraged') - if pid != 0: - print 'The gLite JP Primary Storage service is already running. Restarting...' - os.system('%s/etc/init.d/glite-jp-primary stop' % os.environ['GLITE_LOCATION']) - else: - print 'Starting the gLite JP Primary Storage service...' - - os.system('%s/etc/init.d/glite-jp-primary start' % os.environ['GLITE_LOCATION']) - - pid = glib.getPID('primarystoraged') - - if (pid != 0): - print "The gLite JP Primary Storage service has been started ", - glib.printOkMessage() - else: - glib.printErrorMessage("Could not start the gLite JP Primary Storage service") - glib.printErrorMessage("Please verify and re-run the script "), - glib.printFailedMessage() - return 1 - - return 0 - - def stop(self): - - error_level = 0 - - #------------------------------------------------------------------- - # Stop Primary Storage - #------------------------------------------------------------------- - - pid = glib.getPID('primarystoraged') - if (pid != 0): - os.system('%s/etc/init.d/glite-jp-primary stop' % os.environ['GLITE_LOCATION']) - - pid = glib.getPID('primarystoraged') - if (pid != 0): - print 'Could not stop the JP Primary Storage service ', - glib.printFailedMessage() - error_level = 1 - else: - print 'JP Primary Storage service has been stopped ', - glib.printOkMessage() - - #------------------------------------------------------------------- - # MySQL - #------------------------------------------------------------------- - - self.mysql.stop() - - return error_level - - def status(self): - - error_level = 0 - - retval = os.system('%s/etc/init.d/glite-jp-primary status' % os.environ['GLITE_LOCATION']) - if retval != 0: - error_level = 1 - - return error_level - - def configure(self): - - #-------------------------------------------------------- - # Installs the Security Utilities - #-------------------------------------------------------- - - if os.system("python %s/glite-security-utils-config.py --subservice" % glib.getScriptPath()): - print "\nConfiguring gLite Security Utilities ", - glib.printFailedMessage() - else: - print "\nConfiguring gLite Security Utilities ", - glib.printOkMessage() - - # Create the GLITE_USER if it doesn't exists - print "\nCreating/Verifying the GLITE_USER account %s" % os.environ['GLITE_USER'] - (uid,gid) = glib.get_user_info(os.environ['GLITE_USER']) - glib.check_dir(os.environ['GLITE_LOCATION_VAR'],0755, uid, gid) - jpps_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path'] - glib.check_dir(jpps_cert_path ,0755, uid, gid) - glib.printOkMessage() - - # Create all directories needed - glib.check_dir(os.environ['GLITE_CERT_DIR']) - print "\nVerify CA certificates directory ", - glib.printOkMessage() - - # Copy certificates - print "\nCopy host certificates to GLITE_USER home directory as service certificates", - os.system("cp %s %s %s/" % (params['host.certificate.file'], params['host.key.file'], jpps_cert_path)) - os.chown("%s/hostcert.pem" % jpps_cert_path, uid,gid) - os.chmod("%s/hostcert.pem" % jpps_cert_path, 0644) - os.chown("%s/hostkey.pem" % jpps_cert_path, uid,gid) - os.chmod("%s/hostkey.pem" % jpps_cert_path, 0400) - glib.printOkMessage() - - #-------------------------------------------------------- - # Configure MySQL - #-------------------------------------------------------- - - # Set mysql parameters - #self.mysql.setConfiguration('client','max_allowed_packet',params['mysql.max_allowed_packet']) - self.mysql.setConfiguration('mysqld','max_allowed_packet',params['mysql.max_allowed_packet']) - - # start MySQL - self.mysql.stop() - time.sleep(5) - self.mysql.start() - - if not os.path.exists('/tmp/mysql.sock'): - os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock') - - # ------------------------------------------------------------ - # Check password of MySQL - # ------------------------------------------------------------ - - self.mysql_root_password = params['mysql.root.password'] - if not params.has_key('set.mysql.root.password'): - params['set.mysql.root.password'] = 'false' - setempty = params['set.mysql.root.password'] - if self.mysql.checkMySQLConfiguration(self.mysql_root_password,setempty): - return 1 - - # Create the MySQL database - print "\nCreate/Verify the %s database" % params['jpps.database.name'] - - # Check if database exists - if self.mysql.existsDB(params['jpps.database.name'],self.mysql_root_password) != 0: - # Create database - print ('\n==> Creating MySQL %s database\n' % params['jpps.database.name']) - - if os.path.exists('/bin/rm /tmp/mysql_ct'): - os.remove('/tmp/mysql_ct') - - file = open('/tmp/mysql_ct', 'w') - - self.mysql.add_user(params['jpps.database.name'],params['jpps.database.username'],"",self.mysql_root_password) - text = ['USE %s;\n' % params['jpps.database.name'], - '\. %s/etc/glite-jp-primary-dbsetup.sql\n' % os.environ['GLITE_LOCATION']] - - file.writelines(text) - file.close() - os.system('/usr/bin/mysql -p%s < /tmp/mysql_ct' % self.mysql_root_password) - os.system('/bin/rm /tmp/mysql_ct') - - #Starting and stopping the database before the index creation - self.mysql.stop() - time.sleep(5) - self.mysql.start() - - else: - print "\n==> MySQL database %s already exist\n" % params['jpps.database.name'] - - self.mysql.stop() - - return 0 - -#------------------------------------------------------------------------------- -# Set all environment variables -#------------------------------------------------------------------------------- - -def loadDefaults(params): - - params['GLITE_LOCATION'] = "/opt/glite" - params['mysql.root.password'] = "" - params['mysql.max_allowed_packet'] = "17" - params['jpps.serviceName'] = 'JP PS Server service at %s' % glib.fq_hostname - params['jpps.serviceType'] = 'org.glite.jp.primary' - params['jpps.statusScript'] = '%s/etc/init.d/glite-jp-primary status' % params['GLITE_LOCATION'] - params['jpps.endpoint'] = 'not available' - -def set_env(): - - # gLite - glib.export('GLITE_LOCATION'); - glib.export('GLITE_LOCATION_VAR'); - if not os.path.exists(os.environ['GLITE_LOCATION_VAR']): - os.mkdir(os.environ['GLITE_LOCATION_VAR'],0755) - glib.export('GLITE_LOCATION_LOG'); - if not os.path.exists(os.environ['GLITE_LOCATION_LOG']): - os.mkdir(os.environ['GLITE_LOCATION_LOG'],0755) - glib.export('GLITE_LOCATION_TMP'); - if not os.path.exists(os.environ['GLITE_LOCATION_TMP']): - os.mkdir(os.environ['GLITE_LOCATION_TMP'],0755) - - if not params.has_key('glite.user.group'): - params['glite.user.group'] = '' - (uid,gid) = glib.add_user(params['glite.user.name'],params['glite.user.group']) - glib.export('GLITE_USER',params['glite.user.name']) - jpps_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path'] - glib.export('GLITE_HOST_CERT',"%s/hostcert.pem" % jpps_cert_path) - glib.export('GLITE_HOST_KEY',"%s/hostkey.pem" % jpps_cert_path) - glib.export('GLITE_CERT_DIR',params['ca.certificates.dir']) - - glib.export('GLOBUS_LOCATION',params['GLOBUS_LOCATION']) - glib.export('GPT_LOCATION',params['GPT_LOCATION']) - - glib.export('JAVA_HOME') - - # bin and lib paths - glib.addEnvPath("PATH","/usr/bin/:%s/bin:%s/bin:%s/externals/bin:%s/bin" \ - % (os.environ['JAVA_HOME'],os.environ['GLOBUS_LOCATION'],os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])) - glib.addEnvPath("LD_LIBRARY_PATH","/usr/lib:%s/lib:%s/externals/lib:%s/lib" % (os.environ['GLOBUS_LOCATION'], os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])) - - # Perl - glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION'])) - - # JP PS configuration - glib.export('GLITE_JP_PRIMARY_PEERS',params['jpps.peers']) - glib.export('GLITE_JP_PRIMARY_FTP_PORT',params['jpps.ftp.port']) - glib.export('GLITE_JP_PRIMARY_INTERNAL',params['jpps.internal']) - if not os.path.exists(os.environ['GLITE_JP_PRIMARY_INTERNAL']): - os.mkdir(os.environ['GLITE_JP_PRIMARY_INTERNAL'],0755) - import socket - glib.export('GLITE_JP_PRIMARY_EXTERNAL',"gsiftp://%s:%s%s" % (socket.getfqdn(socket.gethostname()), params['jpps.ftp.port'], params['jpps.internal']) ) - if not os.path.exists(params['jpps.internal']): - os.mkdir(params['jpps.internal'],0755) - #glite_setenv.sh does not like variables with spaces, - #and su don't like variables with " - #glib.export('GLITE_JP_DEBUG',params['jpps.debug']) - os.environ['GLITE_JP_DEBUG']='%s' % params['jpps.debug'] - glib.export('GLITE_JP_PRIMARY_PORT',params['jpps.port']) - glib.export('GLITE_JP_PRIMARY_DBCS',"%s/@localhost:%s" % (params['jpps.database.username'], params['jpps.database.name']) ) - glib.export('GLITE_JP_PRIMARY_PIDFILE',params['jpps.pid.file']) - - # Set environment - glib.setUserEnv() - -#------------------------------------------------------------------------------- -# Main program begins here -#------------------------------------------------------------------------------- - -if __name__ == '__main__': - - # The script must be run as root - if not os.geteuid()==0: - print '"\nThis script must be run as root\n' - sys.exit(1) - - # Get an instance of the ConfigParams class - params = ConfigParams() - - # Get an instance of the library class - glib = gLib() - - # Load parameters - loadDefaults(params) - try: - opts, args = glib.getopt(sys.argv[1:], '', ['siteconfig=']) - for o, a in opts: - if o == "--siteconfig": - params['site.config.url'] = a - break - except getopt.GetoptError: - pass - if glib.loadConfiguration("%s/../glite-jpps.cfg.xml" % glib.getScriptPath(),params): - print "An error occurred while configuring the service" - sys.exit(1) - - verbose = 0 - if params.has_key('glite.installer.verbose'): - if params['glite.installer.verbose'] == "true": - verbose = 1 - glib.verbose = verbose - - # Set up the environment - set_env() - - - # Instantiate the service classes - service = glite_jpps() - service.verbose = verbose - - # Command line opts if any - try: - opts, args = glib.getopt(sys.argv[1:], 'chv', ['checkconf', 'help', 'version','configure','stop','start','status','siteconfig=']) - except getopt.GetoptError: - service.usage(msg = "Unknown options(s)") - sys.exit(1) - - if len(opts) == 0: - service.usage() - sys.exit(0) - - # Check cli options - for o, a in opts: - if o in ("-h", "--help"): - service.usage() - sys.exit(0) - if o in ("-v", "--version"): - service.showVersion() - sys.exit(0) - if o in ("-c", "--checkconf"): - service.copyright() - service.showVersion() - glib.print_params(params) - sys.exit(0) - - if o == "--configure": - - - # Check certificates - if params.has_key('glite.installer.checkcerts'): - if params['glite.installer.checkcerts'] == "true": - if glib.check_certs(params) != 0: - print "An error occurred while configuring the %s service" \ - % service.friendly_name - sys.exit(1) - - # Print configuration parameters - if verbose: - glib.print_params(params) - - service.copyright() - service.showVersion() - service.banner() - - # Stop all services - glib.printInfoMessage("\n\nStopping all running JP PS services...") - service.stop() - - # Configure the service - return_result = service.configure() - - if return_result == 0: - - # Stop all services - glib.printInfoMessage("\n\nStopping all running JP PS services...") - service.stop() - - print "\n\nThe %s configuration was successfully completed\n" % service.friendly_name - print "You can now start the service using the --start option of this script\n\n" - glib.registerService() - - sys.exit(0) - - elif return_result == 2: - - # Stop all services - glib.printInfoMessage("\n\nStopping all running JP PS services...") - service.stop() - - print "\n\nThe %s configuration was completed,\n" % service.friendly_name - print "but warnings were issued. Please revise them and re-run the script\n" - print "or configure JP PS manually\n" - - sys.exit(2) - - else: - print "\n\nAn unrecoverable error occurred while configuring the %s" \ - % service.friendly_name - - sys.exit(1) - - if o in ("start", "--start"): - # Start the service - if service.start() == 0: - print "\n\nThe %s was successfully started " % service.friendly_name, - glib.printOkMessage() - sys.exit(0) - else: - print "\n\nAn error occurred while starting the %s " % service.friendly_name, - glib.printFailedMessage() - sys.exit(1) - - if o in ("stop", "--stop"): - # Stop the service - if service.stop() == 0: - print "\n\nThe %s was successfully stopped " % service.friendly_name, - glib.printOkMessage() - sys.exit(0) - else: - print "\n\nAn unrecoverable error occurred while stopping the %s " % service.friendly_name, - glib.printFailedMessage() - sys.exit(1) - if o == "--status": - sys.exit(service.status()) - diff --git a/org.glite.deployment.jpps/config/templates/glite-jpps.cfg.xml b/org.glite.deployment.jpps/config/templates/glite-jpps.cfg.xml deleted file mode 100644 index ef13a02..0000000 --- a/org.glite.deployment.jpps/config/templates/glite-jpps.cfg.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpps/project/build.number b/org.glite.deployment.jpps/project/build.number deleted file mode 100644 index 58569c4..0000000 --- a/org.glite.deployment.jpps/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Apr 13 09:36:57 CEST 2005 -module.build=232 diff --git a/org.glite.deployment.jpps/project/build.properties b/org.glite.deployment.jpps/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.deployment.jpps/project/glite-jpps.sdf.xml.template b/org.glite.deployment.jpps/project/glite-jpps.sdf.xml.template deleted file mode 100644 index ec2b692..0000000 --- a/org.glite.deployment.jpps/project/glite-jpps.sdf.xml.template +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpps/project/lxscript-rpm.xsl b/org.glite.deployment.jpps/project/lxscript-rpm.xsl deleted file mode 100644 index c9bec9a..0000000 --- a/org.glite.deployment.jpps/project/lxscript-rpm.xsl +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - -#!/bin/sh - -# Copyright (c) Members of the EGEE Collaboration. 2004 -# See http://eu-egee.org/partners/ for details on the copyright holders -# For license conditions see the license file or http://eu-egee.org/license.html - -# glite-jpps_installer v. -# -# The glite-jpps_installer installs the gLite Job Provenance Primary Storage -# -# Usage: glite-jpps_installer [-u|-v|--help] -# -u uninstall -# -v print version -# --help print script usage info -# Return codes: 0 - Ok -# 1 - if a file could not be downloaded - -############################################################################### - -#Parse the RPMLIST to strip out the RPMS that are already installed -function parseRPMList() -{ - newRPMLIST="" - localRPMLIST=`rpm -qa` - for i in $RPMLIST - do - g=`echo $i | sed -e 's/\.i386\.rpm//g'` - g=`echo $g | sed -e 's/\.noarch\.rpm//g'` - if [ -z "`echo $localRPMLIST | grep $g`" ]; then - newRPMLIST="${newRPMLIST} $i" - else - echo "$i is already installed. It will be skipped." - fi - done - - RPMLIST=$newRPMLIST -} - -#Parse the SCRIPTLIST to execute all scripts -function parseScriptList() -{ - for i in $SCRIPTLIST - do - if [ "$INSTALL" = "true" ]; then - $i - else - $i -u - fi - done -} - -#Downloads and install the module RPMS -function install() -{ - - INSTALL=true - version - echo - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, downloading the gLite Job Provenance Primary Storage... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - - mkdir -p glite-jpps - cd glite-jpps - - # Download global dependencies - - - true - - - - - - # Download scripts from repository - - - true - - - - - # Download dependencies RPMS from repository - - - true - - - - # Download RPMS from repository - - - true - - - - - - # Download and install subservices - parseScriptList - - - # Install all RPMS - echo - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, installing the gLite Job Provenance Primary Storage... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - parseRPMList - if [ ! -z "$RPMLIST" ]; then - rpm -Uvh $RPMLIST - rpm_return=$? - else - echo All required RPMS are already installed - rpm_return=0 - fi - if [ "$rpm_return" == "0" ]; then - echo - echo Done! - echo - echo Before using the gLite JP PS, please create or update the configuration - echo files /opt/glite/etc/config/glite-jpps.cfg.xml - echo and /opt/glite/etc/config/glite-global.cfg.xml - echo and run the configuration script - echo /opt/glite/etc/config/scripts/glite-jpps-config.py. - echo A template is provided in - echo /opt/glite/etc/config/templates/glite-jpps.cfg.xml - echo Alternatively site configuration files can be used - else - echo - echo An error occurred while installing the JP PS RPMS. - echo Most likely one or more of the RPMS to be installed require - echo additional dependencies or are older than already installed packages. - echo Please refer to the rpm error message above for more details. - fi - echo - echo For more information refer to the gLite Installation and User Guides - echo or to the gLite web site \(http:\/\/www.glite.org\) - echo Please report problems and comments to the gLite Team at - echo glite-bugs@cern.ch - - cd .. -} - -############################################################################### -function uninstall() -{ - version - - # Global dependencies - - - false - - - - - - # dependencies RPMS from repository - - - false - - - - # RPMS from repository - - - false - - - - - - # Uninstall all RPMS - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, uninstalling the gLite Job Provenance Primary Storage... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - rpm -ev $RPMLIST - if [ "$?" == "0" ]; then - echo - echo Done! - else - echo - echo An error occurred while removing the JP PS RPMS. - echo Most likely one or more of the RPMS to be removed have - echo dependent packages. - echo Please refer to the rpm error message above for more details. - fi -} - -############################################################################### -function usage() -{ - echo - echo Copyright \(c\) Members of the EGEE Collaboration. 2004 - echo See http://eu-egee.org/partners/ for details on the copyright holders - echo For license conditions see the license file or http://eu-egee.org/license.html - echo - echo glite-jpps_installer v. - echo - echo The glite-jpps_installer installs the gLite Job Provenance Primary Storage - echo - echo Usage: glite-jpps_installer \[-u\|-v\|--help\] - echo -u uninstall - echo -v print version - echo --help print script usage info - echo - echo Return codes: - echo 0 - Ok - echo 1 - if a file could not be downloaded - echo -} - -############################################################################### -function version -{ - echo - echo Copyright \(c\) Members of the EGEE Collaboration. 2004 - echo See http://eu-egee.org/partners/ for details on the copyright holders - echo For license conditions see the license file or http://eu-egee.org/license.html - echo - echo glite-jpps_installer v. - echo -} - - -RPMLIST= - -############################################################################### -# Main - -while getopts uvh opt -do - case $opt in - 'u') uninstall - exit 0 - ;; - 'v') version - exit 0 - ;; - 'h') usage - exit 0 - ;; - esac -done - -install - -exit 0 - - - - - _installer.sh - - -wget -N -nv -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -chmod u+x -SCRIPTLIST="$SCRIPTLIST ./" - - -SCRIPTLISTUn="$SCRIPTLISTUn ./ -u " - - - - - - - - --..rpm - -- - - -wget -N -nv -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -RPMLIST="$RPMLIST " - - -RPMLIST="$RPMLIST " - - - - - - - --..rpm - -- - - -wget -N -nv /RPMS/ -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -RPMLIST="$RPMLIST " - - -RPMLIST="$RPMLIST " - - - - - diff --git a/org.glite.deployment.jpps/project/lxscript-tgz.xsl b/org.glite.deployment.jpps/project/lxscript-tgz.xsl deleted file mode 100644 index 4589cf6..0000000 --- a/org.glite.deployment.jpps/project/lxscript-tgz.xsl +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - -#!/bin/sh -# -# glite-jpps_tgz_installer -# usage: glite-jpps_tgz_installer [-u] -# -u uninstall -# -# glite-jpps_tgz_installer installs the gLite Deployment Unit from biniary tarballs -# - -PREFIX=/opt/glite - -############################################################################### -# Download global dependencies - - - -############################################################################### - - -############################################################################### -# Download dependencies RPMS from repository - - - -############################################################################### -# Download RPMS from repository - - - -############################################################################### - - - - - - --..rpm -wget - - - - -_bin.tar.gz -wget i386/tgz/ -tar -xzf $PREFIX - - - diff --git a/org.glite.deployment.jpps/project/properties.xml b/org.glite.deployment.jpps/project/properties.xml deleted file mode 100644 index 41d9f99..0000000 --- a/org.glite.deployment.jpps/project/properties.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.jpps/project/quattor-template.xsl b/org.glite.deployment.jpps/project/quattor-template.xsl deleted file mode 100644 index d4dc67b..0000000 --- a/org.glite.deployment.jpps/project/quattor-template.xsl +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - -template pro_software_glite_jpps; - -# -# Copyright (c) Members of the EGEE Collaboration. 2004 -# See http://eu-egee.org/partners/ for details on the copyright holders -# For license conditions see the license file or http://eu-egee.org/license.html -# -# glite-jpps Quattor template v. -# - -## CAs - -include pro_software_glite_CA; - - - -# Global dependencies - - - - - - -# dependencies - - - - -# RPMS - - - - - -include pro_software_; - - - - - - - -"/software/packages"=pkg_repl("","-",""); - - - -"/software/packages"=pkg_repl("","-",""); - - - diff --git a/org.glite.deployment.jpps/project/version.properties b/org.glite.deployment.jpps/project/version.properties deleted file mode 100644 index 809be8c..0000000 --- a/org.glite.deployment.jpps/project/version.properties +++ /dev/null @@ -1,4 +0,0 @@ - -module.version = 2.2.0 -module.age = 2 - diff --git a/org.glite.deployment.lb/.cvsignore b/org.glite.deployment.lb/.cvsignore deleted file mode 100644 index 3a4edf6..0000000 --- a/org.glite.deployment.lb/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project diff --git a/org.glite.deployment.lb/CHANGELOG b/org.glite.deployment.lb/CHANGELOG deleted file mode 100644 index 882b0d8..0000000 --- a/org.glite.deployment.lb/CHANGELOG +++ /dev/null @@ -1,40 +0,0 @@ -DATE: 13-03-2006 16:20 -[flammer] Increased version to 2.3.0 after branching. - -DATE: 13-03-2006 16:15 -[flammer] Merge of HEAD with branch 2.1.0 -[flammer] Increased version to 2.2.0 - -DATE: 04-12-2005 21:15 -[dimeglio] Added configuration parameter for setting mysql max_allowed_packet - -DATE: 23-11-2005 23:50 -[dimeglio] Use ConfigParams class -[dimeglio] Removed servietool instabce config params, put instance creation in script - -DATE: 08-07-2005 15:20 -[dimeglio] Merged from branch 1.2.2 - -DATE: 25-05-2005 20:00 -[dimeglio] Merged from branch 1.2.2 - -DATE: 21-03-2005 17:21 -[dimeglio] Implemented status method - -DATE: 21-03-2005 00:32 -[dimeglio] Added PERL5LIB env var - -DATE: 17-03-2005 17:33 -[gdiez] Stopping and starting the database before the index creation (just after the database is created and the user granted) - -DATE: 09-03-2005 23:05 -[dimeglio] Moved creation of indices inside database creation (if database - exists indices are not recreated) - -DATE: 02-03-2005 11:05 -[dimeglio] Started CHANGELOG -[dimeglio] Fixed formatting, improved display of message using glib.printXxxMessage functions -[dimeglio] Fixed some problems when starting/stopping services -[dimeglio] GLITE_USER parameter not exposed anymore in config file, use same user parameters - as WMS to allow installation on same node -[dimeglio] Increased module version number to 1.2.0 \ No newline at end of file diff --git a/org.glite.deployment.lb/LICENSE b/org.glite.deployment.lb/LICENSE deleted file mode 100644 index 259a91f..0000000 --- a/org.glite.deployment.lb/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.deployment.lb/build.xml b/org.glite.deployment.lb/build.xml deleted file mode 100644 index 874c661..0000000 --- a/org.glite.deployment.lb/build.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.lb/config/scripts/glite-lb-config.py b/org.glite.deployment.lb/config/scripts/glite-lb-config.py deleted file mode 100644 index c0158ea..0000000 --- a/org.glite.deployment.lb/config/scripts/glite-lb-config.py +++ /dev/null @@ -1,574 +0,0 @@ -#!/usr/bin/env python -################################################################################ -# -# Copyright (c) Members of the EGEE Collaboration. 2004. -# See http://eu-egee.org/partners/ for details on the copyright holders. -# For license conditions see the license file or http://eu-egee.org/license.html -# -################################################################################ -# glite-lb-config v. 2.3.0 -# -# Post-installation script for configuring the gLite Logging and Bookkeping Server -# Robert Harakaly < robert.harakaly@cern.ch > -# Diana Bosio -# Leanne Guy -# -# Version info: $Id$ -# -# Usage: python glite-lb-config [-c|-v|-h|--help] -# -c, --checkconf print configuration -# -v, --version print version -# -h,--help print usage info -# --configure configure the service -# --start start the service -# --stop stop the service -# --status show service status -# -# Return codes: 0 - Ok -# 1 - Configuration failed -# -################################################################################ - -import os,string,pwd -import sys, posix, getopt,time - -sys.path.append(".") -from gLiteInstallerLib import gLib -from gLiteInstallerLib import ConfigParams -from gliteRgmaServicetool import gliteRgmaServicetoolInstance -from gliteRgmaServicetool import gliteRgmaServicetool -import mysql as MySQL - -# Set global variables here -global params # all config values from the XML file -global rgmaServicetool - -class glite_lb: - - def __init__(self): - self.mysql = MySQL.Mysql() - self.verbose = 0 - self.version = "2.3.0" - self.name = "glite-lb" - self.friendly_name = "gLite Logging and Bookkeeping" - - #------------------------------------------------------------------------------- - # Banner - #------------------------------------------------------------------------------- - - def banner(self): - - print "\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - print "Configuring the %s" % self.friendly_name - print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n" - - #------------------------------------------------------------------------------- - # Copyright - #------------------------------------------------------------------------------- - - def copyright(self): - - print '\nCopyright (c) Members of the EGEE Collaboration. 2004' - print 'See http://eu-egee.org/partners/ for details on the copyright holders' - print 'For license conditions see the license file or http://eu-egee.org/license.html' - - #------------------------------------------------------------------------------- - # Version - #------------------------------------------------------------------------------- - - def showVersion(self): - - print '\n%s-config v. %s\n' % (self.name,self.version) - - #------------------------------------------------------------------------------- - # Usage - #------------------------------------------------------------------------------- - - def usage(self,msg = ""): - - if msg: - print "\n%s" % (msg) - - self.copyright() - self.showVersion() - - print """Usage: \n -Edit the configuration file %s.cfg.xml in -%s/etc.config/templates\n -save it as %s/etc/config/%s.cfg.xml -and run the script as follows\n -python %s-config [OPTION...]""" % (self.name, os.environ['GLITE_LOCATION'], \ - os.environ['GLITE_LOCATION'], self.name, self.name) - - print ' -c, --checkconf print the service configuration' - print ' -v, --version print the version of the configuration script' - print ' -h, --help print this usage information' - print ' --configure configure the service' - print ' --start start the service' - print ' --stop stop the service' - print ' --status check service status' - print '\n' - - #------------------------------------------------------------------------------- - # All the configuration code goes here - #------------------------------------------------------------------------------- - - def start(self): - - self.mysql.start() - time.sleep(5) - - if not os.path.exists('/tmp/mysql.sock'): - os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock') - - pid = glib.getPID('bkserverd') - if pid != 0: - print 'The gLite LB Server service is already running. Restarting...' - os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION']) - else: - print 'Starting the gLite LB Server service...' - - os.system('%s/etc/init.d/glite-lb-bkserverd start' % os.environ['GLITE_LOCATION']) - - pid = glib.getPID('bkserverd') - - if (pid != 0): - print "The gLite LB Server service has been started ", - glib.printOkMessage() - else: - glib.printErrorMessage("Could not start the gLite LB Server service") - glib.printErrorMessage("Please verify and re-run the script "), - glib.printFailedMessage() - return 1 - - #------------------------------------------------------------------- - # Start Servicetool - #------------------------------------------------------------------- - - if params['rgma.servicetool.activate'] == "true": - - errorcode = rgmaServicetool.start() - if (errorcode != 0): - return 1 - - return 0 - - def stop(self): - - error_level = 0 - - pid = glib.getPID('bkserverd') - if (pid != 0): - os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION']) - - pid = glib.getPID('bkserverd') - if (pid != 0): - print 'Could not stop the LB Server service ', - glib.printFailedMessage() - error_level = 1 - else: - print 'The LB Server service has been stopped ', - glib.printOkMessage() - - #------------------------------------------------------------------- - # MySQL - #------------------------------------------------------------------- - - self.mysql.stop() - - #------------------------------------------------------------------- - # Servicetool - #------------------------------------------------------------------- - - if params['rgma.servicetool.activate'] == "true": - - if rgmaServicetool.stop(): - error_level = 1 - - return error_level - - def status(self): - - error_level = 0 - - retval = os.system('%s/etc/init.d/glite-lb-bkserverd status' % os.environ['GLITE_LOCATION']) - if retval != 0: - error_level = 1 - - #------------------------------------------------------------------- - # Servicetool - #------------------------------------------------------------------- - - if params['rgma.servicetool.activate'] == "true": - - if rgmaServicetool.status() != 0: - error_level = 1 - - return error_level - - def configure(self): - - #-------------------------------------------------------- - # Installs the Security Utilities - #-------------------------------------------------------- - - if os.system("python %s/glite-security-utils-config.py --subservice" % glib.getScriptPath()): - print "\nConfiguring gLite Security Utilities ", - glib.printFailedMessage() - else: - print "\nConfiguring gLite Security Utilities ", - glib.printOkMessage() - - # Create the GLITE_USER if it doesn't exists - print "\nCreating/Verifying the GLITE_USER account %s" % os.environ['GLITE_USER'] - (uid,gid) = glib.get_user_info(os.environ['GLITE_USER']) - glib.check_dir(os.environ['GLITE_LOCATION_VAR'],0755, uid, gid) - lb_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path'] - glib.check_dir(lb_cert_path ,0755, uid, gid) - glib.printOkMessage() - - # Create all directories needed - glib.check_dir(os.environ['GLITE_CERT_DIR']) - print "\nVerify CA certificates directory ", - glib.printOkMessage() - - # Copy certificates - print "\nCopy host certificates to GLITE_USER home directory as service certificates", - os.system("cp %s %s %s/" % (params['host.certificate.file'], params['host.key.file'], lb_cert_path)) - os.chown("%s/hostcert.pem" % lb_cert_path, uid,gid) - os.chmod("%s/hostcert.pem" % lb_cert_path, 0644) - os.chown("%s/hostkey.pem" % lb_cert_path, uid,gid) - os.chmod("%s/hostkey.pem" % lb_cert_path, 0400) - glib.printOkMessage() - - #-------------------------------------------------------- - # Configure MySQL - #-------------------------------------------------------- - - # Set mysql parameters - #self.mysql.setConfiguration('mysql','loose-max_allowed_packet',params['mysql.max_allowed_packet']) - self.mysql.setConfiguration('mysqld','max_allowed_packet',params['mysql.max_allowed_packet']) - - # start MySQL - self.mysql.stop() - time.sleep(5) - self.mysql.start() - - if not os.path.exists('/tmp/mysql.sock'): - os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock') - - # ------------------------------------------------------------ - # Check password of MySQL - # ------------------------------------------------------------ - - self.mysql_root_password = params['mysql.root.password'] - if not params.has_key('set.mysql.root.password'): - params['set.mysql.root.password'] = 'false' - setempty = params['set.mysql.root.password'] - if self.mysql.checkMySQLConfiguration(self.mysql_root_password,setempty): - return 1 - - # Create the MySQL database - print "\nCreate/Verify the %s database" % params['lb.database.name'] - - # Check if database exists - if self.mysql.existsDB(params['lb.database.name'],self.mysql_root_password) != 0: - # Create database - print ('\n==> Creating MySQL %s database\n' % params['lb.database.name']) - - if os.path.exists('/bin/rm /tmp/mysql_ct'): - os.remove('/tmp/mysql_ct') - - file = open('/tmp/mysql_ct', 'w') - - self.mysql.add_user(params['lb.database.name'],params['lb.database.username'],"",self.mysql_root_password) - text = ['USE %s;\n' % params['lb.database.name'], - '\. %s/etc/glite-lb-dbsetup.sql\n' % os.environ['GLITE_LOCATION']] - - file.writelines(text) - file.close() - os.system('/usr/bin/mysql -p%s < /tmp/mysql_ct' % self.mysql_root_password) - os.system('/bin/rm /tmp/mysql_ct') - - #Starting and stopping the database before the index creation - self.mysql.stop() - time.sleep(5) - self.mysql.start() - - #Creating the indexes - print 'Creating the index configuration file %s/etc/glite-lb-index.conf ' % os.environ['GLITE_LOCATION'], - path = "%s/etc/glite-lb-index.conf" % os.environ['GLITE_LOCATION'] - pathBak = "%s/etc/glite-lb-index.conf.bak" % os.environ['GLITE_LOCATION'] - - if os.path.exists(pathBak): - os.remove(pathBak) - if os.path.exists(path): - os.rename(path,pathBak) - file = open(path, 'w') - file.write("[\n") - file.write(" JobIndices = {\n") - for index in params['lb.index.list']: - file.write(" [ type = \"system\"; name = \"%s\" ],\n" % index) - file.write(" }\n") - file.write("]\n") - file.close() - glib.printOkMessage() - - print "Running glite-lb-bkindex ", - if os.system('%s/bin/glite-lb-bkindex -r %s/etc/glite-lb-index.conf' % (os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])): - glib.printFailedMessage() - return 1 - else: - glib.printOkMessage() - - else: - print "\n==> MySQL database %s already exist\n" % params['lb.database.name'] - - self.mysql.stop() - - #------------------------------------------------------------------- - # RGMA servicetool: configure servicetool - #------------------------------------------------------------------- - - if params['rgma.servicetool.activate'] == "true": - - # Instantiate the rgma-servicetool class - rgmaServicetool = gliteRgmaServicetool() - rgmaServicetool.verbose = self.verbose - - # Create Local Logger instance - serviceId = "%s_%s" % (glib.fq_hostname, params['lbserver.serviceType']) - servicetoolInstance = gliteRgmaServicetoolInstance(glib, serviceId) - - # set params - servicetoolInstance.setServiceName(params['lbserver.serviceName']) - servicetoolInstance.setServiceType(params['lbserver.serviceType']) - servicetoolInstance.setServiceVersion(self.version) - servicetoolInstance.setStatusScript(params['lbserver.statusScript']) - servicetoolInstance.setEndpoint(params['lbserver.endpoint']) - - # add instance to the gLite configuration - if servicetoolInstance.add() == 1: - return 1 - - # Configure servicetool - if rgmaServicetool.configure(glib): - # error in configuring servicetool - return 1 - - return 0 - -#------------------------------------------------------------------------------- -# Set all environment variables -#------------------------------------------------------------------------------- - -def loadDefaults(params): - - params['GLITE_LOCATION'] = "/opt/glite" - params['mysql.root.password'] = "" - params['lb.database.name'] = "lbserver20" - params['lb.database.username'] = "lbserver" - params['mysql.max_allowed_packet'] = "17" - - params['lbserver.serviceName'] = 'LB Server service at %s' % glib.fq_hostname - params['lbserver.serviceType'] = 'org.glite.lb.server' - params['lbserver.statusScript'] = '%s/etc/init.d/glite-lb-bkserverd status' % params['GLITE_LOCATION'] - params['lbserver.endpoint'] = 'not available' - -def set_env(): - - # gLite - glib.export('GLITE_LOCATION'); - glib.export('GLITE_LOCATION_VAR'); - if not os.path.exists(os.environ['GLITE_LOCATION_VAR']): - os.mkdir(os.environ['GLITE_LOCATION_VAR'],0755) - glib.export('GLITE_LOCATION_LOG'); - if not os.path.exists(os.environ['GLITE_LOCATION_LOG']): - os.mkdir(os.environ['GLITE_LOCATION_LOG'],0755) - glib.export('GLITE_LOCATION_TMP'); - if not os.path.exists(os.environ['GLITE_LOCATION_TMP']): - os.mkdir(os.environ['GLITE_LOCATION_TMP'],0755) - - if not params.has_key('glite.user.group'): - params['glite.user.group'] = '' - (uid,gid) = glib.add_user(params['glite.user.name'],params['glite.user.group']) - glib.export('GLITE_USER',params['glite.user.name']) - lb_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path'] - glib.export('GLITE_HOST_CERT',"%s/hostcert.pem" % lb_cert_path) - glib.export('GLITE_HOST_KEY',"%s/hostkey.pem" % lb_cert_path) - glib.export('GLITE_CERT_DIR',params['ca.certificates.dir']) - - glib.export('GLOBUS_LOCATION',params['GLOBUS_LOCATION']) - glib.export('GPT_LOCATION',params['GPT_LOCATION']) - - glib.export('JAVA_HOME') - - # bin and lib paths - glib.addEnvPath("PATH","/usr/bin/:%s/bin:%s/bin:%s/externals/bin:%s/bin" \ - % (os.environ['JAVA_HOME'],os.environ['GLOBUS_LOCATION'],os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])) - glib.addEnvPath("LD_LIBRARY_PATH","/usr/lib:%s/lib:%s/externals/lib:%s/lib" % (os.environ['GLOBUS_LOCATION'], os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])) - - # Perl - glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION'])) - - # Set environment - glib.setUserEnv() - -#------------------------------------------------------------------------------- -# Main program begins here -#------------------------------------------------------------------------------- - -if __name__ == '__main__': - - # The script must be run as root - if not os.geteuid()==0: - print '"\nThis script must be run as root\n' - sys.exit(1) - - # Get an instance of the ConfigParams class - params = ConfigParams() - - # Get an instance of the library class - glib = gLib() - - # Load parameters - loadDefaults(params) - try: - opts, args = glib.getopt(sys.argv[1:], '', ['siteconfig=']) - for o, a in opts: - if o == "--siteconfig": - params['site.config.url'] = a - break - except getopt.GetoptError: - pass - if glib.loadConfiguration(["%s/../glite-lb.cfg.xml" % glib.getScriptPath(), \ - "%s/../glite-rgma-servicetool.cfg.xml" % glib.getScriptPath()],params): - print "An error occurred while configuring the service" - sys.exit(1) - - verbose = 0 - if params.has_key('glite.installer.verbose'): - if params['glite.installer.verbose'] == "true": - verbose = 1 - glib.verbose = verbose - - # Set up the environment - set_env() - - # Instantiate the service classes - service = glite_lb() - service.verbose = verbose - # Instantiate the rgma servicetool class - rgmaServicetool = gliteRgmaServicetool() - rgmaServicetool.verbose = verbose - - # Command line opts if any - try: - opts, args = glib.getopt(sys.argv[1:], 'chv', ['checkconf', 'help', 'version','configure','stop','start','status','siteconfig=']) - except getopt.GetoptError: - service.usage(msg = "Unknown options(s)") - sys.exit(1) - - if len(opts) == 0: - service.usage() - sys.exit(0) - - # Check cli options - for o, a in opts: - - if o in ("-h", "--help"): - service.usage() - sys.exit(0) - - if o in ("-v", "--version"): - service.showVersion() - sys.exit(0) - - if o in ("-c", "--checkconf"): - service.copyright() - service.showVersion() - glib.print_params(params) - print - rgmaServicetool.showServices() - sys.exit(0) - - if o == "--configure": - - # Check certificates - if params.has_key('glite.installer.checkcerts'): - if params['glite.installer.checkcerts'] == "true": - if glib.check_certs(params) != 0: - print "An error occurred while configuring the %s service" \ - % service.friendly_name - sys.exit(1) - - # Print configuration parameters - if verbose: - glib.print_params(params) - - service.copyright() - service.showVersion() - service.banner() - - # Stop all services - glib.printInfoMessage("\n\nStopping all running LB services...") - service.stop() - - # Configure the service - return_result = service.configure() - - if return_result == 0: - - # Stop all services - glib.printInfoMessage("\n\nStopping all running LB services...") - service.stop() - - print "\n\nThe %s configuration was successfully completed\n" % service.friendly_name - print "You can now start the service using the --start option of this script\n\n" - glib.registerService() - - sys.exit(0) - - elif return_result == 2: - - # Stop all services - glib.printInfoMessage("\n\nStopping all running LB services...") - service.stop() - - print "\n\nThe %s configuration was completed,\n" % service.friendly_name - print "but warnings were issued. Please revise them and re-run the script\n" - print "or configure LB manually\n" - - sys.exit(2) - - else: - print "\n\nAn unrecoverable error occurred while configuring the %s" \ - % service.friendly_name - - sys.exit(1) - - if o in ("start", "--start"): - # Start the service - if service.start() == 0: - print "\n\nThe %s was successfully started " % service.friendly_name, - glib.printOkMessage() - sys.exit(0) - else: - print "\n\nAn error occurred while starting the %s " % service.friendly_name, - glib.printFailedMessage() - sys.exit(1) - - if o in ("stop", "--stop"): - # Stop the service - if service.stop() == 0: - print "\n\nThe %s was successfully stopped " % service.friendly_name, - glib.printOkMessage() - sys.exit(0) - else: - print "\n\nAn unrecoverable error occurred while stopping the %s " % service.friendly_name, - glib.printFailedMessage() - sys.exit(1) - - if o == "--status": - sys.exit(service.status()) - diff --git a/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml b/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml deleted file mode 100644 index 4e11e33..0000000 --- a/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - owner - location - destination - - - - - - diff --git a/org.glite.deployment.lb/doc/release_notes/release_notes.doc b/org.glite.deployment.lb/doc/release_notes/release_notes.doc deleted file mode 100644 index 2ad2d4d1bf359419707777ee266496f87aa65f73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192512 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 diff --git a/org.glite.deployment.lb/doc/release_notes/release_notes.html b/org.glite.deployment.lb/doc/release_notes/release_notes.html deleted file mode 100644 index 01ee3f4..0000000 --- a/org.glite.deployment.lb/doc/release_notes/release_notes.html +++ /dev/null @@ -1,2712 +0,0 @@ - - - - - -gLite LB Server Release Notes - - - - - - -
- -

gLite Logging & Bookkeeping Server

- -

1. Release Description

- -

This release contains the gLite Logging & Bookkeeping -Server module v. 2.1.1. The following sections provide additional information about -the release content, the module dependencies, the know bugs and issues and a -list of bugs closed since the previous release. For information about -installing and using the gLite Logging & Bookkeeping Server, please refer -to the gLite Installation and User Guides.

- -

2. Changes in this release

- -

2.1. Changes in functionality

- -

There are no functional changes in this -release.

- -

2.2. Changes in Configuration

- -

The following new parameters have been -added to the glite-lb.cfg.xml file:

- -

 

- - - - - - - - - - - - - - - - - - - - - - -
-

Parameter name

-
-

Default value

-
-

Description

-
-

rgma.servicetool.activate

-
-

true

-
-

Turn on/off servicetool for the node.

-

[Example: true ] [Type: 'boolean']

-
-

set.mysql.root.password

-
-

false

-
-

If this parameter is true, then the root - password of the mysql database is set to the value specified in - mysql.root.password if it not yet set. This parameter has       no effect if - the database root password is already set. It can be used to ease automated installation - and configuration of the service, if mysql is not managed in some other way.

-

[Example: false][Type: boolean]

-
-

mysql.max_allowed_packet

-
-

17

-
-

This parameter allows to set the - max_allowed_packet parameter in the mysql configuration file /etc/my.cnf. The - default recommended value for the LB server is 17MB.

-

[Example: 17][Type: Integer][Unit: MB]

-
- -

 

- -

The R-GMA Service Publisher (aka R-GMA -servicetool) parameters are now automatically handled by the configuration -script and do not need to be explicitly set anymore in the configuration file. -The parameters can be set in the configuration file to override the default -values.

- -

 

- -

3. Release contents

- -

3.1. Glite sub-deployment modules

- -

The gLite Logging and Bookkeeping module requires the -following sub-modules:

- -

 

- -

-          -gLite Security Utilities

- -

-          -gLite R-GMA Servicetool

- -

 

- -

The sub-modules are automatically installed with the LB -module. For more information about these sub-modules please refer to the -specific release notes and installation instructions.

- -

3.2. Glite RPMS

- -

The gLite Logging & Bookkeeping Server v. 2.1.1 is -composed of the following gLite components:

- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Component name

-
-

Description

-
-

Version

-
-

File

-
-

glite-config

-
-

gLite configuration scripts

-
-

1.6.22

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-config-1.6.22-1.noarch.rpm

-
-

glite-jp-common

-
-

 

-
-

1.1.0

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-common-1.1.0-1.i386.rpm

-
-

glite-jp-primary

-
-

 

-
-

1.1.1

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-primary-1.1.1-1.i386.rpm

-
-

glite-jp-server-common

-
-

 

-
-

1.0.0

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-server-common-1.0.0-1.i386.rpm

-
-

glite-jp-ws-interface

-
-

 

-
-

1.1.0

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-ws-interface-1.1.0-0.i386.rpm

-
-

glite-lb-client-interface

-
-

L&B client library header files

-
-

2.1.0

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-client-interface-2.1.0-1.i386.rpm

-
-

glite-lb-config

-
-

gLite LB Configuration files

-
-

2.1.1

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-config-2.1.1-1.i386.rpm

-
-

glite-lb-common

-
-

L&B common subroutines library

-
-

3.0.1

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-common-3.0.1-1.i386.rpm

-
-

glite-lb-logger

-
-

L&B local logger

-
-

1.2.1

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-logger-1.2.1-1.i386.rpm

-
-

glite-lb-server

-
-

L&B bookkeeping server

-
-

1.3.3

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-server-1.3.3-1.i386.rpm

-
-

glite-lb-server-bones

-
-

L&B server bones

-
-

2.1.1

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-server-bones-2.1.1-1.i386.rpm

-
-

glite-lb-ws-interface

-
-

 

-
-

2.1.0

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-ws-interface-2.1.0-1.i386.rpm

-
-

glite-rgma-servicetool-config

-
-

gLite R-GMA servicetool installation

-
-

5.2.2

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-rgma-servicetool-config-5.2.2-1.noarch.rpm

-
-

glite-security-gsoap-plugin

-
-

gSOAP plugin and gss libraries

-
-

1.2.1

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-security-gsoap-plugin-1.2.1-0.i386.rpm

-
-

glite-security-utils-config

-
-

gLite Security Utilities configuration files

-
-

1.2.1

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-security-utils-config-1.2.1-1.noarch.rpm

-
-

glite-security-voms-api-c

-
-

 

-
-

1.6.10

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-security-voms-api-c-1.6.10-0.i386.rpm

-
-

glite-wms-utils-exception

-
-

 

-
-

1.0.3

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.3-1.i386.rpm

-
-

glite-wms-utils-jobid

-
-

 

-
-

1.0.2

-
-

http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.2-1.i386.rpm

-
- -

4. Dependencies

- -

The gLite Logging & Bookkeeping Server v. 2.1.1 module -has the following dependencies:

- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Component name

-
-

Description

-
-

Version

-
-

RPM file name

-
-

c-ares

-
-

A library that performs asynchronous DNS operations

-
-

1.3.0

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/c-ares-1.3.0-1.slc3.i386.rpm

-
-

gpt

-
-

The Grid Packaging Toolkit (GPT)

-
-

VDT1.2.2rh9

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.2rh9-1.i386.rpm

-
-

gridsite

-
-

GridSite

-
-

1.1.15

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gridsite-1.1.15-1.i386.rpm

-
-

j2re

-
-

Java JRE

-
-

1.4.2

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/j2re-1_4_2_08-linux-i586.rpm

-
-

myproxy

-
-

Credential repository for the Grid.

-
-

1.14

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-1.14-EGEE.i386.rpm

-
-

MySQL-client

-
-

MySQL - Client

-
-

4.1.11

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-4.1.11-0.i386.rpm

-
-

MySQL-server

-
-

MySQL

-
-

4.1.11

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-4.1.11-0.i386.rpm

-
-

perl-Expect.pm

-
-

Expect.pm module for perl (./id/A/AU/AUSCHUTZ)

-
-

1.01

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/perl-Expect.pm-1.01-9.i386.rpm

-
-

vdt_globus_essentials

-
-

Virtual Data Toolkit

-
-

VDT1.2.2rh9

-
-

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.2rh9-1.i386.rpm

-
- -

 

- -

5. Known bugs and issues

- -

This -release has the following bugs and issues. Bug numbers refer to the gLite Bug -Tracking system database hosted on the CERN Savannah system at Hhttps://savannah.cern.ch/bugs/?group=jra1mdwH .

- -

 

- -
    -
  • There is an infinite loop during - the initialization of the LB_Events data structure
  • -
  • No removal procedure is provided - with this release apart from the removal of the RPMS. Any account, group - or other resource created during the module configuration must be manually - cleaned.
  • -
- -

 

- -

Known open bugs:

- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Bug number

-
-

Description

-
-

 

-
-

 #7324

-
-

lb-bkserver is running with no - pid

-
-

 

-
-

 #9701

-
-

erroneous rpath in several - shared objects

-
-

 

-
-

 #9777

-
-

unable to get logging-info -2 - info for 1000 jobs

-
-

 

-
-

 #10781

-
-

Missing the timestamps of - 'Scheduled' and 'Running' status

-
-

 

-
-

 #11535

-
-

Job submission extremely slow

-
-

 

-
-

 #13418

-
-

problem in computing status (of - resubmitted jobs)

-
-

 

-
-

 #13492

-
-

Job State Information Log File

-
-

 

-
-

 #13832

-
-

Default mysql configuration - imposes unnecessary limits on LB server

-
-

 

-
-

 #13879

-
-

Some data do not propagate from - lbproxy to bkserver...

-
-

 

-
-

 #13929

-
-

The glite-lb-bkserverd has - wrong default for var directory

-
-

 

-
-

 #13951

-
-

lb proxy sends garbage response - on error

-
-

 

-
-

 #13988

-
-

Failed to start - glite-lb-locallogger on glite 1.4.1

-
-

 

-
-

 #14247

-
-

No events are found querying LB - for events satisfying jobid and source instance

-
-

 

-
-

 #14339

-
-

Wrong computing state when - proxy expires

-
-

 

-
- -

 

- -

Bugs fixed in this or previous releases, but not yet officially -tested:

- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Bug number

-
-

Description

-
-

 

-
-

 #7307

-
-

lb config script does _not_ fail - if mysql root password is set

-
-

 

-
-

 #7305

-
-

lb.database.username paramenter in - config file

-
-

 

-
-

 #7300

-
-

update of the lb instructions at - the end of the installer script

-
-

 

-
-

 #7053

-
-

LB configuration fails if the - mysql root pwd is set

-
-

 

-
-

 #13928

-
-

org.glite.lb.server depends on - full VOMS package instead of individual APIs packages

-
-

 

-
-

 #13048

-
-

interlogger does not handle errors - from bookkeeping server

-
-

 

-
-

 #12648

-
-

The memory usage of one LB process - keeps growing

-
-

 

-
-

 #11387

-
-

LBProxy SIGSEGV

-
-

 

-
-

 #11050

-
-

Too heavy locallogger retry - strategy

-
-

 

-
-

 #9183

-
-

Broken connections in LB contect - connection pool

-
-

 

-
-

 #9135

-
-

The interlogd has problem sending - event to the LB server

-
-

 

-
-

 #8630

-
-

EDG_WL_* variables in LB library

-
-

 

-
-

 #7910

-
-

Duplicate apostroph in MySQL calls

-
-

 

-
-

 #11509

-
-

glite-lb-config.py overwrites - HOSTNAME_org.glite.wms.workloadmanager.service with the wrong WMS version

-
-

 

-
-

 #10686

-
-

MySQL library fails on hostnames - containing dashes

-
-

 

-
- -

 

- -

6. Bugs closed since last release

- -

This -release fixes the following bugs and issues. Bug numbers refer to the gLite Bug -Tracking system database hosted on the CERN Savannah system at Hhttps://savannah.cern.ch/bugs/?group=jra1mdwH  

- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Bug number

-
-

Description

-
-

 

-
-

 #6722

-
-

glite-job-status -all doesn't - work

-
-

 

-
-

 #7237

-
-

Intermittent errors with job - submission

-
-

 

-
-

 #9148

-
-

Job stays 'Submitted' forever

-
-

 

-
-

 #10730

-
-

Error on glite-job-submit

-
-

 

-
- -

 

- -
- - - - diff --git a/org.glite.deployment.lb/doc/release_notes/release_notes.pdf b/org.glite.deployment.lb/doc/release_notes/release_notes.pdf deleted file mode 100644 index c512e91ddfd865b103c95e44d4642062ba7b9b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157326 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š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 Sa^rAhUhZ}4w2gFlx&If#fv92t diff --git a/org.glite.deployment.lb/project/.cvsignore b/org.glite.deployment.lb/project/.cvsignore deleted file mode 100644 index caf4eaa..0000000 --- a/org.glite.deployment.lb/project/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -glite-lb.sdf.xml diff --git a/org.glite.deployment.lb/project/build.number b/org.glite.deployment.lb/project/build.number deleted file mode 100644 index 306b97f..0000000 --- a/org.glite.deployment.lb/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 13 07:52:27 CET 2006 -module.build=0326 diff --git a/org.glite.deployment.lb/project/build.properties b/org.glite.deployment.lb/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.deployment.lb/project/glite-lb.sdf.xml.template b/org.glite.deployment.lb/project/glite-lb.sdf.xml.template deleted file mode 100644 index 48d94a7..0000000 --- a/org.glite.deployment.lb/project/glite-lb.sdf.xml.template +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.lb/project/lxscript-rpm.xsl b/org.glite.deployment.lb/project/lxscript-rpm.xsl deleted file mode 100644 index c661ad7..0000000 --- a/org.glite.deployment.lb/project/lxscript-rpm.xsl +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - -#!/bin/sh - -# Copyright (c) Members of the EGEE Collaboration. 2004 -# See http://eu-egee.org/partners/ for details on the copyright holders -# For license conditions see the license file or http://eu-egee.org/license.html - -# glite-lb_installer v. -# -# The glite-lb_installer installs the gLite Logging and Bookkeeping Server -# -# Usage: glite-lb_installer [-u|-v|--help] -# -u uninstall -# -v print version -# --help print script usage info -# Return codes: 0 - Ok -# 1 - if a file could not be downloaded - -############################################################################### - -#Parse the RPMLIST to strip out the RPMS that are already installed -function parseRPMList() -{ - newRPMLIST="" - localRPMLIST=`rpm -qa` - for i in $RPMLIST - do - g=`echo $i | sed -e 's/\.i386\.rpm//g'` - g=`echo $g | sed -e 's/\.noarch\.rpm//g'` - if [ -z "`echo $localRPMLIST | grep $g`" ]; then - newRPMLIST="${newRPMLIST} $i" - else - echo "$i is already installed. It will be skipped." - fi - done - - RPMLIST=$newRPMLIST -} - -#Parse the SCRIPTLIST to execute all scripts -function parseScriptList() -{ - for i in $SCRIPTLIST - do - if [ "$INSTALL" = "true" ]; then - $i - else - $i -u - fi - done -} - -#Downloads and install the module RPMS -function install() -{ - - INSTALL=true - version - echo - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, downloading the gLite Logging and Bookkeeping Server... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - - mkdir -p glite-lb - cd glite-lb - - # Download global dependencies - - - true - - - - - - # Download scripts from repository - - - true - - - - - # Download dependencies RPMS from repository - - - true - - - - # Download RPMS from repository - - - true - - - - - - # Download and install subservices - parseScriptList - - - # Install all RPMS - echo - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, installing the gLite Logging and Bookkeeping Server... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - parseRPMList - if [ ! -z "$RPMLIST" ]; then - rpm -Uvh $RPMLIST - rpm_return=$? - else - echo All required RPMS are already installed - rpm_return=0 - fi - if [ "$rpm_return" == "0" ]; then - echo - echo Done! - echo - echo Before using the gLite LB, please create or update the configuration - echo files /opt/glite/etc/config/glite-lb.cfg.xml - echo and /opt/glite/etc/config/glite-global.cfg.xml - echo and run the configuration script - echo /opt/glite/etc/config/scripts/glite-lb-config.py. - echo A template is provided in - echo /opt/glite/etc/config/templates/glite-lb.cfg.xml - echo Alternatively site configuration files can be used - else - echo - echo An error occurred while installing the LB RPMS. - echo Most likely one or more of the RPMS to be installed require - echo additional dependencies or are older than already installed packages. - echo Please refer to the rpm error message above for more details. - fi - echo - echo For more information refer to the gLite Installation and User Guides - echo or to the gLite web site \(http:\/\/www.glite.org\) - echo Please report problems and comments to the gLite Team at - echo glite-bugs@cern.ch - - cd .. -} - -############################################################################### -function uninstall() -{ - version - - # Global dependencies - - - false - - - - - - # dependencies RPMS from repository - - - false - - - - # RPMS from repository - - - false - - - - - - # Uninstall all RPMS - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo x Please wait, uninstalling the gLite Logging and Bookkeeping Server... x - echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - echo - rpm -ev $RPMLIST - if [ "$?" == "0" ]; then - echo - echo Done! - else - echo - echo An error occurred while removing the LB RPMS. - echo Most likely one or more of the RPMS to be removed have - echo dependent packages. - echo Please refer to the rpm error message above for more details. - fi -} - -############################################################################### -function usage() -{ - echo - echo Copyright \(c\) Members of the EGEE Collaboration. 2004 - echo See http://eu-egee.org/partners/ for details on the copyright holders - echo For license conditions see the license file or http://eu-egee.org/license.html - echo - echo glite-lb_installer v. - echo - echo The glite-lb_installer installs the gLite Logging and Bookkeeping Server - echo - echo Usage: glite-lb_installer \[-u\|-v\|--help\] - echo -u uninstall - echo -v print version - echo --help print script usage info - echo - echo Return codes: - echo 0 - Ok - echo 1 - if a file could not be downloaded - echo -} - -############################################################################### -function version -{ - echo - echo Copyright \(c\) Members of the EGEE Collaboration. 2004 - echo See http://eu-egee.org/partners/ for details on the copyright holders - echo For license conditions see the license file or http://eu-egee.org/license.html - echo - echo glite-lb_installer v. - echo -} - - -RPMLIST= - -############################################################################### -# Main - -while getopts uvh opt -do - case $opt in - 'u') uninstall - exit 0 - ;; - 'v') version - exit 0 - ;; - 'h') usage - exit 0 - ;; - esac -done - -install - -exit 0 - - - - - _installer.sh - - -wget -N -nv -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -chmod u+x -SCRIPTLIST="$SCRIPTLIST ./" - - -SCRIPTLISTUn="$SCRIPTLISTUn ./ -u " - - - - - - - - --..rpm - -- - - -wget -N -nv -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -RPMLIST="$RPMLIST " - - -RPMLIST="$RPMLIST " - - - - - - - --..rpm - -- - - -wget -N -nv /RPMS/ -if [ ! -f "" ] -then - echo - echo ERROR: could not be downloaded! - exit 1 -fi -RPMLIST="$RPMLIST " - - -RPMLIST="$RPMLIST " - - - - - diff --git a/org.glite.deployment.lb/project/lxscript-tgz.xsl b/org.glite.deployment.lb/project/lxscript-tgz.xsl deleted file mode 100644 index 5b55e40..0000000 --- a/org.glite.deployment.lb/project/lxscript-tgz.xsl +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - -#!/bin/sh -# -# glite-lb_tgz_installer -# usage: glite-lb_tgz_installer [-u] -# -u uninstall -# -# glite-lb_tgz_installer installs the gLite Deployment Unit from biniary tarballs -# - -PREFIX=/opt/glite - -############################################################################### -# Download global dependencies - - - -############################################################################### - - -############################################################################### -# Download dependencies RPMS from repository - - - -############################################################################### -# Download RPMS from repository - - - -############################################################################### - - - - - - --..rpm -wget - - - - -_bin.tar.gz -wget i386/tgz/ -tar -xzf $PREFIX - - - diff --git a/org.glite.deployment.lb/project/properties.xml b/org.glite.deployment.lb/project/properties.xml deleted file mode 100644 index ef87369..0000000 --- a/org.glite.deployment.lb/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.deployment.lb/project/quattor-template.xsl b/org.glite.deployment.lb/project/quattor-template.xsl deleted file mode 100644 index 74f841d..0000000 --- a/org.glite.deployment.lb/project/quattor-template.xsl +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - -template pro_software_glite_lb; - -# -# Copyright (c) Members of the EGEE Collaboration. 2004 -# See http://eu-egee.org/partners/ for details on the copyright holders -# For license conditions see the license file or http://eu-egee.org/license.html -# -# glite-lb Quattor template v. -# - -## CAs - -include pro_software_glite_CA; - - - -# Global dependencies - - - - - - -# dependencies - - - - -# RPMS - - - - - -include pro_software_; - - - - - - - -"/software/packages"=pkg_repl("","-",""); - - - -"/software/packages"=pkg_repl("","-",""); - - - diff --git a/org.glite.deployment.lb/project/version.properties b/org.glite.deployment.lb/project/version.properties deleted file mode 100644 index bb1d337..0000000 --- a/org.glite.deployment.lb/project/version.properties +++ /dev/null @@ -1,4 +0,0 @@ - -module.version = 2.3.0 -module.age = 0 - \ No newline at end of file diff --git a/org.glite.jp.client/config/startup b/org.glite.jp.client/config/startup index 6e498fd..0c2c9a0 100755 --- a/org.glite.jp.client/config/startup +++ b/org.glite.jp.client/config/startup @@ -41,11 +41,14 @@ start() jpdump_maildir="--dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR " [ -d "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] || mkdir "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" [ -n "$GLITE_LB_EXPORT_JPPS" ] && jpps="--jpps $GLITE_LB_EXPORT_JPPS " - [ -n "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] && sandbox_maildir="--sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR " + if [ -n "$GLITE_LB_EXPORT_JOBSDIR_KEEP" ]; then + keep_jobs="--store ${GLITE_LB_EXPORT_JOBSDIR_KEEP} " + [ -d $GLITE_LB_EXPORT_JOBSDIR_KEEP ] || mkdir -p $GLITE_LB_EXPORT_JOBSDIR_KEEP + fi echo -n Starting glite-jp-importer ... su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-jp-importer \ - -i $pidfile $jpreg_maildir $jpdump_maildir $jpps $sandbox_maildir $creds" \ + -i $pidfile $jpreg_maildir $jpdump_maildir $jpps $keep_jobs $creds" \ && echo " done" || echo " FAILED" } diff --git a/org.glite.jp.client/doc/README.jpimporter b/org.glite.jp.client/doc/README.jpimporter index 3e8bb2d..5041ca6 100644 --- a/org.glite.jp.client/doc/README.jpimporter +++ b/org.glite.jp.client/doc/README.jpimporter @@ -49,7 +49,6 @@ jpimporter daemon usage: glite-jp-importer [option] messages. -d, --dump-mdir path to the 'LB maildir' subtree for LB dumps This directory is scanned for the file upload msgs. - -s, --sandbox-mdir path to the 'LB maildir' subtree for input/output sandboxes -i, --pidfile file to store master pid -t, --poll maildir polling interval (in seconds) Specifies the time interval for which the process diff --git a/org.glite.jp.client/examples/glite-jp-importer.sh b/org.glite.jp.client/examples/glite-jp-importer.sh index ef94018..0be7205 100644 --- a/org.glite.jp.client/examples/glite-jp-importer.sh +++ b/org.glite.jp.client/examples/glite-jp-importer.sh @@ -21,11 +21,9 @@ if [ -z "$GLITE_LB_EXPORT_JPPS" ]; then echo "Please specify the Job Provanance Primary Storage server." exit 1 fi -# bookkeeping server -if [ -z "$GLITE_LB_EXPORT_BKSERVER" ]; then - echo "Please specify the Book Keeping server." - exit 1 -fi +# book keeping server +GLITE_LB_SERVER_PORT=${GLITE_LB_SERVER_PORT:-9000} +GLITE_LB_EXPORT_BKSERVER=${GLITE_LB_EXPORT_BKSERVER:-localhost:$GLITE_LB_SERVER_PORT} # certificates if [ -z "$X509_USER_CERT" -o -z "$X509_USER_KEY" ]; then echo "Please set X509_USER_CERT and X509_USER_KEY." @@ -41,27 +39,30 @@ if [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ]; then GLITE_LB_EXPORT_JPREG_MAILDIR=/tmp/jpreg echo "GLITE_LB_EXPORT_JPREG_MAILDIR not specified (-J arguent of the bkserver), used $GLITE_LB_EXPORT_JPREG_MAILDIR" fi +# pidfile +[ -n "$GLITE_JP_IMPORTER_PIDFILE" ] && pidfile="-i $GLITE_JP_IMPORTER_PIDFILE " CERT_ARGS="-c $X509_USER_CERT -k $X509_USER_KEY" GLITE_LB_EXPORT_JPDUMP_MAILDIR=${GLITE_LB_EXPORT_JPDUMP_MAILDIR:-/tmp/jpdump} -GLITE_LB_EXPORT_DUMPDIR_OLD=${GLITE_LB_EXPORT_DUMPDIR_OLD:-$GLITE_LB_EXPORT_DUMPDIR.old} -GLITE_LB_EXPORT_EXPORTDIR=${GLITE_LB_EXPORT_EXPORTDIR:-/tmp/lbexport} -GLITE_LB_EXPORT_SANDBOX_MAILDIR=${GLITE_LB_EXPORT_SANDBOX_MAILDIR:-/tmp/jpsandbox} +GLITE_LB_EXPORT_JOBSDIR=${GLITE_LB_EXPORT_JOBSDIR:-/tmp/lbexport} PREFIX=${PREFIX:-`dirname $0`/..} LOGDIR=$GLITE_LOCATION_VAR -GLITE_LB_EXPORT_PURGE_ARGS=${GLITE_LB_EXPORT_PURGE_ARGS:--a 1h -c 1h -n 1h -o 1d} +GLITE_LB_EXPORT_PURGE_ARGS=${GLITE_LB_EXPORT_PURGE_ARGS:---cleared 2d --aborted 2w --cancelled 2w --other 2m} [ -d $GLITE_LB_EXPORT_JPDUMP_MAILDIR ] || mkdir -p $GLITE_LB_EXPORT_JPDUMP_MAILDIR [ -d $GLITE_LB_EXPORT_DUMPDIR ] || mkdir -p $GLITE_LB_EXPORT_DUMPDIR -[ -d $GLITE_LB_EXPORT_DUMPDIR_OLD ] || mkdir -p $GLITE_LB_EXPORT_DUMPDIR_OLD -[ -d $GLITE_LB_EXPORT_EXPORTDIR ] || mkdir -p $GLITE_LB_EXPORT_EXPORTDIR -[ -d $GLITE_LB_EXPORT_SANDBOX_MAILDIR ] || mkdir -p $GLITE_LB_EXPORT_SANDBOX_MAILDIR +[ -n "$GLITE_LB_EXPORT_DUMPDIR_KEEP" -a ! -d $GLITE_LB_EXPORT_DUMPDIR_KEEP ] && mkdir -p $GLITE_LB_EXPORT_DUMPDIR_KEEP +[ -d $GLITE_LB_EXPORT_JOBSDIR ] || mkdir -p $GLITE_LB_EXPORT_JOBSDIR +if [ -n "$GLITE_LB_EXPORT_JOBSDIR_KEEP" ]; then + keep_jobs="--store ${GLITE_LB_EXPORT_JOBSDIR_KEEP} " + [ -d $GLITE_LB_EXPORT_JOBSDIR_KEEP ] || mkdir -p $GLITE_LB_EXPORT_JOBSDIR_KEEP +fi [ -d $LOGDIR ] || mkdir -p $LOGDIR echo "Using cert args $CERT_ARGS" -$PREFIX/bin/glite-jp-importer --reg-mdir $GLITE_LB_EXPORT_JPREG_MAILDIR --dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR $CERT_ARGS --sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR -g --jpps $GLITE_LB_EXPORT_JPPS $pidfile$keep_jobs> $LOGDIR/jp-importer.log 2>&1 & +$PREFIX/bin/glite-jp-importer --reg-mdir $GLITE_LB_EXPORT_JPREG_MAILDIR --dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR $CERT_ARGS -g --jpps $GLITE_LB_EXPORT_JPPS $pidfile$keep_jobs> $LOGDIR/jp-importer.log 2>&1 & JP_PID=$! trap "kill $JP_PID; exit 0" SIGINT @@ -70,8 +71,12 @@ while [ 1 ]; do for file in $GLITE_LB_EXPORT_DUMPDIR/*; do if [ -s $file ]; then - $PREFIX/sbin/glite-lb-lb_dump_exporter -d $file -s $GLITE_LB_EXPORT_EXPORTDIR -m $GLITE_LB_EXPORT_JPDUMP_MAILDIR - mv $file $GLITE_LB_EXPORT_DUMPDIR_OLD + $PREFIX/sbin/glite-lb-lb_dump_exporter -d $file -s $GLITE_LB_EXPORT_JOBSDIR -m $GLITE_LB_EXPORT_JPDUMP_MAILDIR + if [ -n "$GLITE_LB_EXPORT_DUMPDIR_KEEP" ]; then + mv $file $GLITE_LB_EXPORT_DUMPDIR_KEEP + else + rm $file + fi else rm $file fi diff --git a/org.glite.jp.client/examples/jpps_upload_files.c b/org.glite.jp.client/examples/jpps_upload_files.c index f33b656..3e5da0b 100644 --- a/org.glite.jp.client/examples/jpps_upload_files.c +++ b/org.glite.jp.client/examples/jpps_upload_files.c @@ -23,8 +23,8 @@ int main(int argc, char **argv) { glite_jpcl_context_t ctx; char **files, - *jobid = NULL, - *proxy = NULL, + *jobid, + *proxy, *lbmd = NULL, *jpps = NULL; int i, j; @@ -46,11 +46,6 @@ int main(int argc, char **argv) if ( i >= argc ) { usage(); return 1; } - if ( !proxy && !(proxy = getenv("X509_USER_PROXY")) ) { - perror("-p or X509_USER_PROXY must be set!\n"); - return 1; - } - if ( !(files = calloc(argc-i+1, sizeof(*files))) ) { perror("calloc()"); return 1; diff --git a/org.glite.jp.client/project/version.properties b/org.glite.jp.client/project/version.properties index 08e9de3..c31be1e 100644 --- a/org.glite.jp.client/project/version.properties +++ b/org.glite.jp.client/project/version.properties @@ -1,2 +1,2 @@ -module.version=1.1.0 +module.version=1.1.2 module.age=0 diff --git a/org.glite.jp.client/src/jpimporter.c b/org.glite.jp.client/src/jpimporter.c index 71173e5..b18cb31 100644 --- a/org.glite.jp.client/src/jpimporter.c +++ b/org.glite.jp.client/src/jpimporter.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "glite/lb/lb_maildir.h" #include "glite/security/glite_gsplugin.h" @@ -51,10 +52,6 @@ typedef struct { #define GLITE_DUMP_IMPORTER_MDIR "/tmp/jpdump" #endif -#ifndef GLITE_SANDBOX_IMPORTER_MDIR -#define GLITE_SANDBOX_IMPORTER_MDIR "/tmp/jpsandbox" -#endif - #ifndef GLITE_JPPS #define GLITE_JPPS "http://localhost:8901" #endif @@ -62,23 +59,23 @@ typedef struct { #define MAX_REG_CONNS 500 -static int debug = 0; -static int die = 0; -static int child_died = 0; -static int poll = 2; -static char *name; -static char *jpps = GLITE_JPPS; -static char reg_mdir[PATH_MAX] = GLITE_REG_IMPORTER_MDIR; -static char dump_mdir[PATH_MAX] = GLITE_DUMP_IMPORTER_MDIR; -static char sandbox_mdir[PATH_MAX] = GLITE_SANDBOX_IMPORTER_MDIR; -static struct soap *soap; - -static time_t cert_mtime; -static char *server_cert = NULL, - *server_key = NULL, - *cadir = NULL; +static int debug = 0; +static int die = 0; +static int child_died = 0; +static int poll = 2; +static char *name; +static char *jpps = GLITE_JPPS; +static char reg_mdir[PATH_MAX] = GLITE_REG_IMPORTER_MDIR; +static char dump_mdir[PATH_MAX] = GLITE_DUMP_IMPORTER_MDIR; +static char *store = NULL; +static struct soap *soap; + +static time_t cert_mtime; +static char *server_cert = NULL, + *server_key = NULL, + *cadir; static gss_cred_id_t mycred = GSS_C_NO_CREDENTIAL; -static char *mysubj; +static char *mysubj; static struct option opts[] = { @@ -90,13 +87,13 @@ static struct option opts[] = { { "jpps", 1, NULL, 'p'}, { "reg-mdir", 1, NULL, 'r'}, { "dump-mdir", 1, NULL, 'd'}, - { "sandbox-mdir",1, NULL, 's'}, { "pidfile", 1, NULL, 'i'}, { "poll", 1, NULL, 't'}, + { "store", 1, NULL, 's'}, { NULL, 0, NULL, 0} }; -static const char *get_opt_string = "hgp:r:d:s:i:t:c:k:C:"; +static const char *get_opt_string = "hgp:r:d:i:t:c:k:C:"; static void usage(char *me) { @@ -109,9 +106,9 @@ static void usage(char *me) "\t-p, --jpps JP primary service server\n" "\t-r, --reg-mdir path to the 'LB maildir' subtree for registrations\n" "\t-d, --dump-mdir path to the 'LB maildir' subtree for LB dumps\n" - "\t-s, --sandbox-mdir path to the 'LB maildir' subtree for input/output sandboxes\n" "\t-i, --pidfile file to store master pid\n" "\t-t, --poll maildir polling interval (in seconds)\n", + "\t-s, --store keep uploaded jobs in this directory\n", me); } @@ -130,7 +127,6 @@ static int slave(int (*)(void), const char *); static int check_soap_fault(struct soap *, int); static int reg_importer(void); static int dump_importer(void); -static int sandbox_importer(void); static int parse_msg(char *, msg_pattern_t []); static int gftp_put_file(const char *, int); @@ -140,12 +136,13 @@ int main(int argc, char *argv[]) { edg_wll_GssStatus gss_code; struct sigaction sa; - sigset_t sset; - FILE *fpid; - pid_t reg_pid, dump_pid, sandbox_pid; - int opt; - char *name, - pidfile[PATH_MAX] = GLITE_JPIMPORTER_PIDFILE; + sigset_t sset; + FILE *fpid; + pid_t reg_pid, dump_pid; + int opt; + char *name, + pidfile[PATH_MAX] = GLITE_JPIMPORTER_PIDFILE; + glite_gsplugin_Context plugin_ctx; @@ -164,9 +161,9 @@ int main(int argc, char *argv[]) case 'C': cadir = optarg; break; case 'p': jpps = optarg; break; case 't': poll = atoi(optarg); break; + case 's': store = optarg; break; case 'r': strcpy(reg_mdir, optarg); break; case 'd': strcpy(dump_mdir, optarg); break; - case 's': strcpy(sandbox_mdir, optarg); break; case 'i': strcpy(pidfile, optarg); break; case '?': usage(name); return 1; } @@ -195,7 +192,12 @@ int main(int argc, char *argv[]) edg_wll_MaildirInit(reg_mdir); edg_wll_MaildirInit(dump_mdir); - edg_wll_MaildirInit(sandbox_mdir); + if (store && *store) { + if (mkdir(store, 0750) != 0 && errno != EEXIST) { + fprintf(stderr, "Can't create directory %s: %s\n", store, strerror(errno)); + store = NULL; + } + } if ( !debug ) { if ( daemon(1,0) == -1 ) { perror("deamon()"); exit(1); } @@ -265,10 +267,6 @@ int main(int argc, char *argv[]) perror("starting dump importer slave"); exit(1); } - if ( (sandbox_pid = slave(sandbox_importer, "sandbox-imp")) < 0 ) { - perror("starting sandbox importer slave"); - exit(1); - } while ( !die ) { @@ -299,17 +297,7 @@ int main(int argc, char *argv[]) exit(1); } dprintf(("[master] dump importer slave restarted [%d]\n", dump_pid)); - } else if ( pid == sandbox_pid ) { - dprintf(("[master] sandbox importer slave died [%d]\n", pid)); - if (!debug) syslog(LOG_INFO, "sandbox importer slave died [%d]\n", die); - if ( (sandbox_pid = slave(sandbox_importer, "sandbox-imp")) < 0 ) { - perror("starting sandbox importer slave"); - kill(0, SIGINT); - exit(1); - } - dprintf(("[master] sandbox importer slave restarted [%d]\n", sandbox_pid)); } - } } child_died = 0; @@ -330,9 +318,9 @@ int main(int argc, char *argv[]) static int slave(int (*fn)(void), const char *nm) { struct sigaction sa; - sigset_t sset; - int pid, - conn_cnt = 0; + sigset_t sset; + int pid, + conn_cnt = 0; if ( (pid = fork()) ) return pid; @@ -424,7 +412,9 @@ static int dump_importer(void) static int readnew = 1; char *msg = NULL, *fname = NULL, - *aux; + *aux, + *bname; + char fspec[PATH_MAX]; int ret; int fhnd; msg_pattern_t tab[] = { @@ -440,13 +430,13 @@ static int dump_importer(void) if ( readnew ) ret = edg_wll_MaildirTransStart(dump_mdir, &msg, &fname); - else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, &msg, &fname); + else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, (time_t)600, &msg, &fname); if ( !ret ) { - readnew = ~readnew; + readnew = !readnew; if ( readnew ) ret = edg_wll_MaildirTransStart(dump_mdir, &msg, &fname); - else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, &msg, &fname); + else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, (time_t)600, &msg, &fname); if ( !ret ) { - readnew = ~readnew; + readnew = !readnew; return 0; } } @@ -474,10 +464,13 @@ static int dump_importer(void) dprintf(("[%s] Importing LB dump file '%s'\n", name, tab[_file].val)); if ( !debug ) syslog(LOG_INFO, "Importing LB dump file '%s'\n", msg); ret = soap_call___jpsrv__StartUpload(soap, tab[_jpps].val?:jpps, "", &su_in, &su_out); - ret = check_soap_fault(soap, ret); - /* XXX: grrrrrrr! test it!!!*/ -// if ( (ret = check_soap_fault(soap, ret)) ) break; + if ( (ret = check_soap_fault(soap, ret)) ) break; dprintf(("[%s] Destination: %s\n\tCommit before: %s\n", name, su_out.destination, ctime(&su_out.commitBefore))); + if (su_out.destination == NULL) { + dprintf(("[%s] StartUpload returned NULL destination\n", name)); + if ( !debug ) syslog(LOG_ERR, "StartUpload returned NULL destination"); + break; + } if ( (fhnd = open(tab[_file].val, O_RDONLY)) < 0 ) { dprintf(("[%s] Can't open dump file: %s\n", name, tab[_file].val)); @@ -492,101 +485,23 @@ static int dump_importer(void) ret = soap_call___jpsrv__CommitUpload(soap, tab[_jpps].val?:jpps, "", &cu_in, &empty); if ( (ret = check_soap_fault(soap, ret)) ) break; dprintf(("[%s] Dump upload succesfull\n", name)); - } while (0); - - edg_wll_MaildirTransEnd(dump_mdir, fname, ret? LBMD_TRANS_FAILED_RETRY: LBMD_TRANS_OK); - free(fname); - free(msg); - - return 1; -} - - - -static int sandbox_importer(void) -{ - struct _jpelem__StartUpload su_in; - struct _jpelem__StartUploadResponse su_out; - struct _jpelem__CommitUpload cu_in; - struct _jpelem__CommitUploadResponse empty; - static int readnew = 1; - char *msg = NULL, - *fname = NULL, - *aux; - int ret; - int fhnd; - msg_pattern_t tab[] = { - {"jobid", NULL}, - {"file", NULL}, - {"jpps", NULL}, - {"proxy", NULL}, - {NULL, NULL}}; - -#define _job 0 -#define _file 1 -#define _jpps 2 -#define _proxy 3 - - - if ( readnew ) ret = edg_wll_MaildirTransStart(sandbox_mdir, &msg, &fname); - else ret = edg_wll_MaildirRetryTransStart(sandbox_mdir, (time_t)60, &msg, &fname); - if ( !ret ) { - readnew = ~readnew; - if ( readnew ) ret = edg_wll_MaildirTransStart(sandbox_mdir, &msg, &fname); - else ret = edg_wll_MaildirRetryTransStart(sandbox_mdir, (time_t)60, &msg, &fname); - if ( !ret ) { - readnew = ~readnew; - return 0; - } - } - - if ( ret < 0 ) { - dprintf(("[%s] edg_wll_MaildirTransStart: %s (%s)\n", name, strerror(errno), lbm_errdesc)); - if ( !debug ) syslog(LOG_ERR, "edg_wll_MaildirTransStart: %s (%s)", strerror(errno), lbm_errdesc); - return -1; - } - - dprintf(("[%s] sandbox JP import request received\n", name)); - if ( !debug ) syslog(LOG_INFO, "sandbox JP import request received"); - - ret = 0; - if ( parse_msg(msg, tab) < 0 ) { - dprintf(("[%s] Wrong format of message!\n", name)); - if ( !debug ) syslog(LOG_ERR, "Wrong format of message"); - ret = 0; - } else do { - su_in.job = tab[_job].val; - // XXX: defined in org.glite.jp.primary/src/builtin_plugins.h - // shloud use symbolic const... - // do not distinquish between ibs and obs now - su_in.class_ = "urn:org.glite.jp.primary:isb"; - su_in.name = NULL; - su_in.commitBefore = 1000 + time(NULL); - su_in.contentType = "tar/lb"; - dprintf(("[%s] Importing LB sandbox tar file '%s'\n", name, tab[_file].val)); - if ( !debug ) syslog(LOG_INFO, "Importing LB sandbox tar file '%s'\n", msg); - ret = soap_call___jpsrv__StartUpload(soap, tab[_jpps].val?:jpps, "", &su_in, &su_out); - ret = check_soap_fault(soap, ret); - /* XXX: grrrrrrr! test it!!!*/ -// if ( (ret = check_soap_fault(soap, ret)) ) break; - dprintf(("[%s] Destination: %s\n\tCommit before: %s\n", name, su_out.destination, ctime(&su_out.commitBefore))); - - if ( (fhnd = open(tab[_file].val, O_RDONLY)) < 0 ) { - dprintf(("[%s] Can't open sandbox tar file: %s\n", name, tab[_file].val)); - if ( !debug ) syslog(LOG_ERR, "Can't open sandbox tar file: %s", tab[_file].val); - ret = 1; - break; + if (store && *store) { + bname = strdup(tab[_file].val); + snprintf(fspec, sizeof fspec, "%s/%s", store, basename(bname)); + free(bname); + if (rename(tab[_file].val, fspec) != 0) + fprintf(stderr, "moving %s to %s failed: %s\n", tab[_file].val, fspec, strerror(errno)); + else + dprintf(("[%s] moving %s to %s OK\n", name, tab[_file].val, fspec)); + } else { + if (unlink(tab[_file].val) != 0) + fprintf(stderr, "removing %s failed: %s\n", tab[_file].val, strerror(errno)); + else + dprintf(("[%s] %s removed\n", name, tab[_file].val)); } - if ( (ret = gftp_put_file(su_out.destination, fhnd)) ) break; - close(fhnd); - dprintf(("[%s] File sent, commiting the upload\n", name)); - cu_in.destination = su_out.destination; - ret = soap_call___jpsrv__CommitUpload(soap, tab[_jpps].val?:jpps, "", &cu_in, &empty); - if ( (ret = check_soap_fault(soap, ret)) ) break; - dprintf(("[%s] Dump upload succesfull\n", name)); } while (0); - edg_wll_MaildirTransEnd(sandbox_mdir, fname, ret? LBMD_TRANS_FAILED_RETRY: LBMD_TRANS_OK); + edg_wll_MaildirTransEnd(dump_mdir, fname, ret? LBMD_TRANS_FAILED_RETRY: LBMD_TRANS_OK); free(fname); free(msg); @@ -594,7 +509,6 @@ static int sandbox_importer(void) } - static int check_soap_fault(struct soap *soap, int err) { struct SOAP_ENV__Detail *detail; @@ -764,6 +678,7 @@ static int gftp_put_file(const char *url, int fhnd) globus_cond_init(&gCond, GLOBUS_NULL); gDone = GLOBUS_FALSE; + gError = GLOBUS_FALSE; /* do the op */ if ( globus_ftp_client_put( diff --git a/org.glite.jp.common/interface/known_attr.h b/org.glite.jp.common/interface/known_attr.h index d53c792..fafeb82 100644 --- a/org.glite.jp.common/interface/known_attr.h +++ b/org.glite.jp.common/interface/known_attr.h @@ -3,6 +3,7 @@ /** Namespace of JP system attributes */ #define GLITE_JP_SYSTEM_NS "http://egee.cesnet.cz/en/Schema/JP/System" +#define GLITE_JP_WORKFLOW_NS "http://egee.cesnet.cz/en/Schema/JP/Workflow" /** Job owner, as specified with RegisterJob JPPS operation */ #define GLITE_JP_ATTR_OWNER GLITE_JP_SYSTEM_NS ":owner" @@ -14,6 +15,10 @@ * Should be almost the same time as registration with LB. */ #define GLITE_JP_ATTR_REGTIME GLITE_JP_SYSTEM_NS ":regtime" +/** Workflow node relationships. */ +#define GLITE_JP_ATTR_WF_ANCESTOR GLITE_JP_WORKFLOW_NS ":ancestor" +#define GLITE_JP_ATTR_WF_SUCCESSOR GLITE_JP_WORKFLOW_NS ":successor" + /** Attributes derived from LB system data * \see jp_job_attrs.h */ diff --git a/org.glite.jp.common/interface/types.h b/org.glite.jp.common/interface/types.h index e86d4c9..e4208c1 100644 --- a/org.glite.jp.common/interface/types.h +++ b/org.glite.jp.common/interface/types.h @@ -22,6 +22,7 @@ typedef struct _glite_jp_context { void *dbhandle; char **trusted_peers; char *myURL; + int noauth; } *glite_jp_context_t; typedef enum { diff --git a/org.glite.jp.common/project/version.properties b/org.glite.jp.common/project/version.properties index 46eb5a1..bcf5d00 100644 --- a/org.glite.jp.common/project/version.properties +++ b/org.glite.jp.common/project/version.properties @@ -1,2 +1,2 @@ -module.version=1.2.0 +module.version=1.2.1 module.age=1 diff --git a/org.glite.jp.index/Makefile b/org.glite.jp.index/Makefile index 87a7776..0886580 100644 --- a/org.glite.jp.index/Makefile +++ b/org.glite.jp.index/Makefile @@ -22,7 +22,7 @@ CC=gcc -include Makefile.inc -VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/examples/query-tests:${top_srcdir}/tests:${top_srcdir}/test:${top_srcdir}/project:${top_srcdir}/doc:${jpproject}:${stagedir}/interface +VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/project:${top_srcdir}/doc:${jpproject}:${stagedir}/interface GLOBUS_LIBS:=-L${globus_prefix}/lib \ -lglobus_common_${nothrflavour} \ @@ -60,11 +60,11 @@ ps_prefix:=jpps_ SRCS:= conf.c bones_server.c soap_ops.c soap_ps_calls.c \ ws_ps_typeref.c ws_is_typeref.c db_ops.c context.c common_server.c \ - ${is_prefix}Server.c ${is_prefix}C.c\ - ${ps_prefix}ClientLib.c + ${is_prefix}ServerLib.c \ + ${ps_prefix}ClientLib.c ${ps_prefix}C.c -EXA_TEST_SRCS:=jpis-test.c ${is_prefix}C.c ${is_prefix}Client.c context.c db_ops.c conf.c ws_is_typeref.c -EXA_DB_SRCS:=jpis-db-internal.c db_ops.c conf.c context.c ws_is_typeref.c +EXA_TEST_SRCS:=jpis-test.c ${is_prefix}C.c ${is_prefix}Client.c context.c db_ops.c conf.c +EXA_DB_SRCS:=jpis-db-internal.c db_ops.c conf.c context.c EXA_CLIENT_SRCS:=jpis-client.c common.c \ ${is_client_prefix}C.c ${is_client_prefix}Client.c # ${is_prefix}C.c @@ -97,7 +97,9 @@ glite-jpis-client: ${EXA_CLIENT_OBJS} ${LINK} -o $@ $+ ${GSOAPLIB} copy_tests: ${test} ${test_files} - -for i in $?; do cp $$i ${top_srcdir}/build; done + +${test} ${test_files}: + for i in $@; do cp ${top_srcdir}/examples/query-tests/$$i ${top_srcdir}/build; done JobProvenanceIS.xh: JobProvenanceIS.wsdl JobProvenanceTypes.wsdl typemap.dat cp ${stagedir}/interface/JobProvenanceTypes.wsdl . @@ -170,7 +172,6 @@ install: ${INSTALL} -m 755 ${examples} ${PREFIX}/examples ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-jp-indexd ${INSTALL} -m 755 ${top_srcdir}/config/glite-jp-index-dbsetup.sql ${PREFIX}/etc - ${INSTALL} -m 755 ${top_srcdir}/config/glite-jpis-config.xml ${PREFIX}/etc ${INSTALL} -m 644 ${top_srcdir}/doc/README ${HTMLS} ${PREFIX}/share/doc/${package}-${version} ${INSTALL} -m 644 ${MANS1} ${PREFIX}/share/man/man1 ${INSTALL} -m 644 ${MANS8} ${PREFIX}/share/man/man8 @@ -199,7 +200,6 @@ ws_ps_typeref.o: ws_ps_typeref.c jpis_H.h ws_typemap.h ws_ps_typeref.h ws_is_typeref.o: ws_is_typeref.c jpis_H.h ws_typemap.h ws_is_typeref.h comon_server.o: common_server.c common_server.h jpis-client.o: jpis-client.c ${is_client_prefix}H.h soap_version.h -conf.o: conf.c ${is_prefix}H.h soap_version.h %.1: %.sgml docbook2man $< diff --git a/org.glite.jp.index/config/glite-jpis-config.xml b/org.glite.jp.index/config/glite-jpis-config.xml deleted file mode 100644 index 176a470..0000000 --- a/org.glite.jp.index/config/glite-jpis-config.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - http://egee.cesnet.cz/en/Schema/JP/System:owner - http://egee.cesnet.cz/en/Schema/JP/System:jobId - http://egee.cesnet.cz/en/Schema/JP/System:regtime - http://egee.cesnet.cz/en/Schema/LB/Attributes:user - http://egee.cesnet.cz/en/Schema/LB/Attributes:aTag - http://egee.cesnet.cz/en/Schema/LB/Attributes:eNodes - http://egee.cesnet.cz/en/Schema/LB/Attributes:RB - http://egee.cesnet.cz/en/Schema/LB/Attributes:CE - http://egee.cesnet.cz/en/Schema/LB/Attributes:UIHost - http://egee.cesnet.cz/en/Schema/LB/Attributes:CPUTime - http://egee.cesnet.cz/en/Schema/LB/Attributes:NProc - http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus - http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDate - http://egee.cesnet.cz/en/Schema/LB/Attributes:retryCount - http://egee.cesnet.cz/en/Schema/LB/Attributes:jobType - http://egee.cesnet.cz/en/Schema/LB/Attributes:nsubjobs - http://egee.cesnet.cz/en/Schema/LB/Attributes:lastStatusHistory - http://egee.cesnet.cz/en/Schema/LB/Attributes:fullStatusHistory - - - - http://egee.cesnet.cz/en/Schema/JP/System:owner - http://egee.cesnet.cz/en/Schema/JP/System:jobId - http://egee.cesnet.cz/en/Schema/LB/Attributes:user - http://egee.cesnet.cz/en/Schema/LB/Attributes:CE - - - - - - - https://localhost:8901 - - - http://egee.cesnet.cz/en/Schema/JP/System:owner - EQUAL - - /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac - - - 1 - 1 - - diff --git a/org.glite.jp.index/examples/jpis-test.c b/org.glite.jp.index/examples/jpis-test.c index b0a2783..ef926dd 100644 --- a/org.glite.jp.index/examples/jpis-test.c +++ b/org.glite.jp.index/examples/jpis-test.c @@ -47,7 +47,7 @@ int main(int argc,char *argv[]) glite_jp_init_context(&ctx); - glite_jp_get_conf(0, NULL, NULL, &conf); + glite_jp_get_conf(argc, argv, NULL, &conf); if (default_server) strcpy(server, default_server); else snprintf(server, sizeof(server), "http://localhost:%s", conf->port ? conf->port : GLITE_JPIS_DEFAULT_PORT_STR); printf("JP index server: %s\n", server); diff --git a/org.glite.jp.index/examples/pch06/pch.pm b/org.glite.jp.index/examples/pch06/pch.pm new file mode 100644 index 0000000..e8bf688 --- /dev/null +++ b/org.glite.jp.index/examples/pch06/pch.pm @@ -0,0 +1,219 @@ +# +# Job Provenance queries wrapper (Primary and Index queries) +# +# $debug - trace calls +# $err - error status from last query +# + +package pch; + +use strict; +use warnings; +use XML::Twig; +use Data::Dumper; + +our $lbattr='http://egee.cesnet.cz/en/Schema/LB/Attributes'; +our $jpsys='http://egee.cesnet.cz/en/Schema/JP/System'; +our $jpwf='http://egee.cesnet.cz/en/Schema/JP/Workflow'; +our $jplbtag='http://egee.cesnet.cz/en/WSDL/jp-lbtag'; + +our @view_attributes=("$pch::jplbtag:IPAW_STAGE", "$pch::jplbtag:IPAW_PROGRAM", "$pch::jplbtag:IPAW_PARAM", "$pch::jplbtag:IPAW_INPUT", "$pch::jplbtag:IPAW_OUTPUT", "$pch::lbattr:CE", "$pch::lbattr:parent", "$pch::lbattr:host", "$pch::jpsys:regtime"); + + +our $debug = 0; +our $err = 0; + +my $jpis_client_program = "./glite-jpis-client"; +my $jpps_client_program = "./glite-jp-primary-test"; +my @default_is_attributes = ( + "http://egee.cesnet.cz/en/Schema/JP/System:owner", + "http://egee.cesnet.cz/en/Schema/JP/System:jobId", + "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus", + "http://egee.cesnet.cz/en/Schema/LB/Attributes:user", + "http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_PROGRAM", + "http://egee.cesnet.cz/en/Schema/JP/Workflow:ancestor" +); +my @isquery = ( +' + +', +' +' +); + + +my @jobs; + + +# +# query to Job Provenance Index Server +# +sub isquery { + my ($server, $queries, $attributes) = @_; + my ($s, @jobs); + my $args = ''; + my @attributes; + my $fh; + + $err = 0; + if ($attributes) { @attributes = @$attributes; } + else { @attributes = @default_is_attributes; } + + $s = $isquery[0]; + foreach my $query (@$queries) { + my @query = @$query; + my $i = 1; + $s .= "\n"; + $s .= "\t$query[0]\n"; + while ($i <= $#query) { + my @record = @{$query[$i]}; + $s .= "\t\n"; + $s .= "\t\t$record[0]\n"; + $s .= "\t\t$record[1]\n"; + $s .= "\t\t$record[2]\n" if ($record[2]); + $s .= "\t\n"; + $i++; + } + $s .= "\n"; + } + + foreach my $attribute (@attributes) { + $s .= "$attribute\n"; + } + $s .= $isquery[1]; + + $args .= "-i $server " if ($server); + $args .= '-q -'; + + if ($debug) { + print STDERR "calling 'echo '$s' | $jpis_client_program $args |'\n"; + } + if (!open($fh, "echo '$s' | $jpis_client_program $args |")) { + print STDERR "Can't execute '$jpis_client_program $args'\n"; + $err = 1; + return (); + } + @jobs = parse_is($fh); +# print STDERR <$fh>; print STDERR "\n"; + close $fh; + if ($?) { + print STDERR "Error returned from $jpis_client_program $args\n"; + $err = 1; + return (); + } + + return @jobs; +} + + +sub parse_is { + my ($fh) = @_; + my $twig; + + @jobs = (); + + $twig = new XML::Twig(TwigHandlers => { jobs => \&jobs_handler }); + if (!$twig->safe_parse($fh)) { $err = 1; return (); } + else { return @jobs; } +} + + +sub jobs_handler { + my($twig, $xmljobs)= @_; + my (%attributes, $xmljobid, $xmlattribute, %job); + %attributes = (); + + $xmljobid = $xmljobs->first_child('jobid'); + die "No jobid on '".$xmljobs->text."'" if (!$xmljobid); + $job{jobid} = $xmljobid->text; + + $xmlattribute = $xmljobs->first_child('attributes'); + while ($xmlattribute) { + my ($xmlname, $xmlvalue); + my @values = (); + my %attribute = (); + + $xmlname = $xmlattribute->first_child('name'); + die "No name on '".$xmlattribute->text."'" if (!$xmlname); +#print $xmljobid->text.": ".$xmlname->text.":\n"; + if (exists $attributes{$xmlname->text}) { + %attribute = %{$attributes{$xmlname->text}}; + } +#print " prev attr: ".Dumper(%attribute)."\n"; + if (exists $attribute{value}) { + @values = @{$attribute{value}}; + } +#print " prev values: ".Dumper(@values)."\n"; + $xmlvalue = $xmlattribute->first_child('value'); + while ($xmlvalue) { +#print " to add: ".$xmlvalue->text."\n"; + push @values, $xmlvalue->text; + $xmlvalue = $xmlvalue->next_sibling('value'); + } + @{$attribute{value}} = @values; +#print " new values: ".Dumper($attribute{value})."\n"; + $attribute{timestamp} = $xmlattribute->first_child('timestamp')->text; + $xmlattribute = $xmlattribute->next_sibling('attributes'); + + $attributes{$xmlname->text} = \%attribute; + } + $job{attributes} = \%attributes; + + push @jobs, \%job; +} + +# +# query to Job Provenance Primary Storage +# ==> array of string +# +sub psquery { + my ($server, $jobid, $attribute) = @_; + my $args = ''; + my @attrs = (); + my $fh; + + $err = 0; + $args .= "-s $server " if ($server); + $args .= "GetJobAttr $jobid $attribute"; + if ($debug) { + print STDERR "calling '$jpps_client_program $args |'\n"; + } + if (!open($fh, "$jpps_client_program $args |")) { + print STDERR "Can't execute '$jpps_client_program $args'\n"; + $err = 1; + return (); + } + @attrs = parse_ps($fh); + close $fh; + if ($?) { + print STDERR "Error returned from $jpps_client_program $args\n"; + $err = 1; + return (); + } + + return @attrs; +} + + +sub parse_ps { + my ($fh) = @_; + my @attrs = (); + my $attr; + + while (<$fh>) { + chomp; + next if (!$_); + next if (/^OK$/); + next if (/^Attribute values:$/); +# print STDERR "$_\n"; + $attr = $_; + $attr =~ s/\t*//; + $attr =~ s/\t.*//; + push @attrs, $attr; + } + + return @attrs; +} + + +1; diff --git a/org.glite.jp.index/examples/pch06/query1.pl b/org.glite.jp.index/examples/pch06/query1.pl new file mode 100644 index 0000000..9b155b1 --- /dev/null +++ b/org.glite.jp.index/examples/pch06/query1.pl @@ -0,0 +1,116 @@ +#! /usr/bin/perl + +# +# 1. query: +# +# Find the process that led to Atlas X Graphic / everything that caused Atlas X +# Graphic to be as it is. This should tell us the new brain images from which +# the averaged atlas was generated, the warping performed etc. +# +# call: +# ./query1.pl OUTPUT_FILE_NAME 2>/dev/null +# + +use strict; +use pch; +use Data::Dumper; + +my $ps='https://skurut1.cesnet.cz:8901'; +my $is='https://skurut1.cesnet.cz:8902'; + +my @according_jobs = (); # sequencially jobid list +my %according_jobs = (); # hash jobid list +my $according_count = 0; +my $output; + + +if ($#ARGV + 1 != 1) { + print STDERR "Usage: $0 OUTPUT_FILE\n"; + exit 1 +} +$output = $ARGV[0]; + +# debug calls +$pch::debug = 0; +my $debug = 0; + +# +# find out processes with given output +# +my @jobs = pch::isquery($is, [ + ["$pch::jplbtag:IPAW_OUTPUT", ['EQUAL', "$output"]], +], ["$pch::jpsys:jobId", "$pch::jpwf:ancestor"]); +print Dumper(@jobs) if ($debug); +die "...so exit on error" if ($pch::err); + +# +# initial set from index server +# +foreach my $job (@jobs) { + my %job = %$job; + my %attributes = %{$job{attributes}}; + + if (!exists $according_jobs{$job{jobid}}) { + push @according_jobs, $job{jobid}; + $according_jobs{$job{jobid}} = 1; + } +} +undef @jobs; + + +# +# collect all jobids (tree browsing) +# +# better implementation will be: using children attribute on LB:parent +# +$according_count = 0; +foreach my $jobid (@according_jobs) { + my @attrs; + + print "Handling $jobid (position $according_count)\n" if ($debug); + @attrs = pch::psquery($ps, $jobid, "$pch::jpwf:ancestor"); + + for my $anc_jobid (@attrs) { + print "Considered: $anc_jobid\n" if ($debug); + if (!exists $according_jobs{$anc_jobid}) { + $according_jobs{$anc_jobid} = 1; + push @according_jobs, $anc_jobid; + print "Added $anc_jobid to $#according_jobs\n" if ($debug); + } + else { + print "Already existing $anc_jobid\n" if ($debug); + } + } + $according_count++; +} + +foreach my $jobid (@according_jobs) { + my @attrs2 = pch::psquery($ps, $jobid, "$pch::jplbtag:IPAW_STAGE"); + $according_jobs{$jobid} = $attrs2[0]; +} + +# +# queries on result set +# +print "Results\n"; +print "=======\n"; +print "\n"; +foreach my $jobid (sort { $according_jobs{$b} <=> $according_jobs{$a} } keys %according_jobs) { + print "jobid $jobid:\n"; + + # query & output all desired atributes + foreach my $attr (@pch::view_attributes) { + my @attrs; + my $attr_name = $attr; $attr_name =~ s/.*://; + + @attrs = pch::psquery($ps, $jobid, $attr); + print " attr $attr_name: "; + if ($attr eq "$pch::jpsys:regtime") { + print gmtime(@attrs[0])." (".join(", ", @attrs).")\n"; + } else { + print join(", ", @attrs)."\n"; + } + } + + print "\n"; +} diff --git a/org.glite.jp.index/examples/pch06/query2.pl b/org.glite.jp.index/examples/pch06/query2.pl new file mode 100644 index 0000000..e189b59 --- /dev/null +++ b/org.glite.jp.index/examples/pch06/query2.pl @@ -0,0 +1,125 @@ +#! /usr/bin/perl + +# +# 2. query: +# +# Find the process that led to Atlas X Graphic, excluding everything prior to +# the averaging of images with softmean. +# +# call: +# ./query2.pl OUTPUT_FILE_NAME 2>/dev/null +# + +use strict; +use pch; +use Data::Dumper; + +my $ps='https://skurut1.cesnet.cz:8901'; +my $is='https://skurut1.cesnet.cz:8902'; +my $program_name = "softmean"; + +my @according_jobs = (); # sequencially jobid list +my %according_jobs = (); # hash jobid list +my $according_count = 0; +my $output; + + +if ($#ARGV + 1 != 1) { + print STDERR "Usage: $0 OUTPUT_FILE\n"; + exit 1 +} +$output = $ARGV[0]; + +# debug calls +$pch::debug = 0; +my $debug = 0; + +# +# find out processes with given output +# +my @jobs = pch::isquery($is, [ + ["$pch::jplbtag:IPAW_OUTPUT", ['EQUAL', "$output"]], +], ["$pch::jpsys:jobId", "$pch::jpwf:ancestor"]); +print Dumper(@jobs) if ($debug); +die "...so exit on error" if ($pch::err); + +# +# initial set from index server +# +foreach my $job (@jobs) { + my %job = %$job; + my %attributes = %{$job{attributes}}; + + if (!exists $according_jobs{$job{jobid}}) { + push @according_jobs, $job{jobid}; + $according_jobs{$job{jobid}} = 1; + } +} +undef @jobs; + + +# +# collect all jobids (tree browsing), stop on softmean program +# +# note, the browsing tree is really needed here since we explore the workflow +# +$according_count = 0; +foreach my $jobid (@according_jobs) { + my (@attrs, @program); + + print "Handling $jobid (position $according_count)\n" if ($debug); + + # stop on given program name + @program = pch::psquery($ps, $jobid, "$pch::jplbtag:IPAW_PROGRAM"); + die "More program names of $jobid?" if ($#program > 0); + if ($program[0] eq $program_name) { + print "$jobid is $program_name, stop here\n" if $debug; + next; + } + + # else browse up + @attrs = pch::psquery($ps, $jobid, "$pch::jpwf:ancestor"); + for my $anc_jobid (@attrs) { + print "Considered: $anc_jobid\n" if ($debug); + if (!exists $according_jobs{$anc_jobid}) { + $according_jobs{$anc_jobid} = 1; + push @according_jobs, $anc_jobid; + print "Added $anc_jobid to $#according_jobs\n" if ($debug); + } + else { + print "Already existing $anc_jobid\n" if ($debug); + } + } + $according_count++; +} + +foreach my $jobid (@according_jobs) { + my @attrs2 = pch::psquery($ps, $jobid, "$pch::jplbtag:IPAW_STAGE"); + $according_jobs{$jobid} = $attrs2[0]; +} + +# +# queries on result set +# +print "Results\n"; +print "=======\n"; +print "\n"; +foreach my $jobid (sort { $according_jobs{$b} <=> $according_jobs{$a} } keys %according_jobs) { + print "jobid $jobid:\n"; + + # query & output all desired atributes + foreach my $attr (@pch::view_attributes) { + my @attrs; + my $attr_name = $attr; $attr_name =~ s/.*://; + + @attrs = pch::psquery($ps, $jobid, $attr); + print " attr $attr_name: "; + if ($attr eq "$pch::jpsys:regtime") { + print gmtime(@attrs[0])." (".join(", ", @attrs).")\n"; + } else { + print join(", ", @attrs)."\n"; + } + } + + print "\n"; +} diff --git a/org.glite.jp.index/examples/pch06/query3.pl b/org.glite.jp.index/examples/pch06/query3.pl new file mode 100644 index 0000000..7182679 --- /dev/null +++ b/org.glite.jp.index/examples/pch06/query3.pl @@ -0,0 +1,123 @@ +#! /usr/bin/perl + +# +# 3. query: +# +# Find the Stage 3, 4 and 5 details of the process that led to Atlas X Graphic. +# +# call: +# ./query3.pl OUTPUT_FILE_NAME 2>/dev/null +# + +use strict; +use pch; +use Data::Dumper; + +my $ps='https://skurut1.cesnet.cz:8901'; +my $is='https://skurut1.cesnet.cz:8902'; +my @attributes = ("$pch::jpsys:jobId", "$pch::jpwf:ancestor", @pch::view_attributes); + +my @according_jobs = (); # sequencially jobid list +my %according_jobs = (); # hash jobid list +my $according_count = 0; +my $output; + + +if ($#ARGV + 1 != 1) { + print STDERR "Usage: $0 OUTPUT_FILE\n"; + exit 1 +} +$output = $ARGV[0]; + +# debug calls +$pch::debug = 0; +my $debug = 0; + +# +# find out processes with given output +# +my @jobs = pch::isquery($is, [ + ["$pch::jplbtag:IPAW_OUTPUT", ['EQUAL', "$output"]], +], \@attributes); +die "...so exit on error" if ($pch::err); +print Dumper(@jobs) if ($debug); + +# +# initial set from index server +# +foreach my $job (@jobs) { + my %job = %$job; + my %attributes = %{$job{attributes}}; + + if (!exists $according_jobs{$job{jobid}}) { + push @according_jobs, $job{jobid}; + $according_jobs{$job{jobid}} = \%job; + } +} +undef @jobs; + + +# +# collect all jobs (tree browsing) +# +$according_count = 0; +foreach my $jobid (@according_jobs) { + my @ancs; + + print "Handling $jobid (position $according_count)\n" if ($debug); + @ancs = pch::isquery($is, [["$pch::jpwf:successor", ['EQUAL', "$jobid"]]], \@attributes); + die "...so exit on error" if ($pch::err); + + for my $anc (@ancs) { + my %anc = %$anc; + print "Considered: $anc{jobid}\n" if ($debug); + if (!exists $according_jobs{$anc{jobid}}) { + $according_jobs{$anc{jobid}} = \%anc; + push @according_jobs, $anc{jobid}; + print "Added $anc{jobid} to $#according_jobs\n" if ($debug); + } + else { + print "Already existing $anc{jobid}\n" if ($debug); + } + } + $according_count++; +} + + +# +# queries on result set +# +print "Results\n"; +print "=======\n"; +print "\n"; +foreach my $jobid (sort { $according_jobs{$b}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] <=> $according_jobs{$a}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] } keys %according_jobs) { + my %job = %{$according_jobs{$jobid}}; + my %attributes = %{$job{attributes}}; + my $stage = $attributes{"$pch::jplbtag:IPAW_STAGE"}{value}[0]; + + if ( $stage == 3 || $stage == 4 || $stage == 5) { + print "jobid $jobid:\n"; + + # query & output all desired atributes + foreach my $attr (@pch::view_attributes) { + my $attr_name = $attr; $attr_name =~ s/.*://; + + print " attr $attr_name: "; + if (exists $attributes{$attr}) { + my %attr = %{$attributes{$attr}}; + + if ($attr eq "$pch::jpsys:regtime") { + print gmtime($attr{value}[0])." (".join(", ", @{$attr{value}}).")\n"; + } else { + print join(", ", @{$attr{value}})."\n"; + } + } else { + print "N/A\n"; + } + } + + print "\n"; + } else { + print "(ignored $jobid with stage $stage)\n" if $debug; + } +} diff --git a/org.glite.jp.index/examples/pch06/query4.pl b/org.glite.jp.index/examples/pch06/query4.pl new file mode 100644 index 0000000..467c2fd --- /dev/null +++ b/org.glite.jp.index/examples/pch06/query4.pl @@ -0,0 +1,104 @@ +#! /usr/bin/perl + +# +# 4. query: +# +# Find all invocations of procedure align_warp using a twelfth order nonlinear +# 1365 parameter model (see model menu describing possible values of parameter +# "-m 12" of align_warp) that ran on a Monday. +# +# call: +# ./query4.pl 2>/dev/null +# + +use strict; +use pch; +use Data::Dumper; + +my $ps='https://skurut1.cesnet.cz:8901'; +my $is='https://skurut1.cesnet.cz:8902'; +my $program_name='align_warp'; +my $program_params='-m 12'; +my $runday=1; +#my $runday=4; +my @attributes = ("$pch::jpsys:jobId", @pch::view_attributes); + +my %according_jobs = (); # hash jobid list +my $according_count = 0; + + +# debug calls +$pch::debug = 0; +my $debug = 0; + +# +# find out processes with given name ant parameters +# +my @jobs = pch::isquery($is, [ + ["$pch::jplbtag:IPAW_PROGRAM", ['EQUAL', "$program_name"]], + ["$pch::jplbtag:IPAW_PARAM", ['EQUAL', "$program_params"]], +], \@attributes); +print Dumper(@jobs) if ($debug); +die "...so exit on error" if ($pch::err); + + +# +# check found all jobs +# +$according_count = 0; +foreach my $job (@jobs) { + my %job = %$job; + my @time; + + print "Handling $job{jobid} ($according_count.)\n" if ($debug); + + @time =@{ $job{attributes}{"$pch::jpsys:regtime"}{value}}; + my @timesep = gmtime($time[0]); + if ($timesep[6] == $runday) { + if (!exists $according_jobs{$job{jobid}}) { + $according_jobs{$job{jobid}} = \%job; + print "Added $job{jobid}\n" if $debug; + } else { + print "Already existing $job{jobid}\n" if $debug; + } + } else { + print "Job $job{jobid} ran at day $timesep[6] (0=Sun, ...): ".gmtime($time[0])."\n" if $debug; + } + + $according_count++; +} +undef @jobs; + + +# +# print the result set +# +print "Results\n"; +print "=======\n"; +print "\n"; +foreach my $jobid (sort { $according_jobs{$b}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] <=> $according_jobs{$a}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] } keys %according_jobs) { + my %job = %{$according_jobs{$jobid}}; + my %attributes = %{$job{attributes}}; + + print "jobid $jobid:\n"; + + # output all desired atributes + foreach my $attr (@pch::view_attributes) { + my $attr_name = $attr; $attr_name =~ s/.*://; + + print " attr $attr_name: "; + if (exists $attributes{$attr}) { + my %attr = %{$attributes{$attr}}; + + if ($attr eq "$pch::jpsys:regtime") { + print gmtime($attr{value}[0])." (".join(", ", @{$attr{value}}).")\n"; + } else { + print join(", ", @{$attr{value}})."\n"; + } + } else { + print "N/A\n"; + } + } + + print "\n"; +} diff --git a/org.glite.jp.index/examples/pch06/query5.pl b/org.glite.jp.index/examples/pch06/query5.pl new file mode 100644 index 0000000..c9f05b7 --- /dev/null +++ b/org.glite.jp.index/examples/pch06/query5.pl @@ -0,0 +1,134 @@ +#! /usr/bin/perl + +# +# 5. query: +# +# Find all Atlas Graphic images outputted from workflows where at least one of +# the input Anatomy Headers had an entry global maximum=4095. The contents of +# a header file can be extracted as text using the scanheader AIR utility. +# +# call: +# ./query5.pl 2>/dev/null +# + +use strict; +use pch; +use Data::Dumper; + +my $ps='https://skurut1.cesnet.cz:8901'; +my $is='https://skurut1.cesnet.cz:8902'; +my $program_name='align_warp'; +my $end_program_name='convert'; +my $header="GLOBAL_MAXIMUM=4095"; # test for exact equal (scripts already prepared it) + +my @according_jobs = (); # sequencially jobid list +my %according_jobs = (); # hash jobid list +my $according_count = 0; + + +# debug calls +$pch::debug = 0; +my $debug = 0; + +# +# find out processes with given name and parameters +# +my @jobs = pch::isquery($is, [ + ["$pch::jplbtag:IPAW_PROGRAM", ['EQUAL', "$program_name"]], + ["$pch::jplbtag:IPAW_HEADER", ['EQUAL', "$header"]], +], \@pch::view_attributes); +print Dumper(@jobs) if ($debug); +die "...so exit on error" if ($pch::err); + +# +# initial set of DAGs from index server +# +foreach my $job (@jobs) { + my %job = %$job; + my %attributes = %{$job{attributes}}; + my $dagjobid = $attributes{"$pch::lbattr:parent"}{value}[0]; + + print "Consider DAG $dagjobid\n" if $debug; + if (!exists $according_jobs{$dagjobid}) { + %job = (); + push @according_jobs, $dagjobid; + # query to primary storage when searching by jobid + $job{jobid} = $dagjobid; + foreach my $attr (@pch::view_attributes) { + my @value; + + @value = pch::psquery($ps, $dagjobid, $attr); + if (defined @value) { @{$job{attributes}{$attr}{value}} = @value; } + } + $according_jobs{$dagjobid} = \%job; + print "Added DAG $dagjobid\n" if $debug; + } +} +undef @jobs; + + +# +# collect all jobs (tree browsing down) +# +$according_count = 0; +foreach my $jobid (@according_jobs) { + my @succs; + + print "Handling $jobid (position $according_count)\n" if ($debug); + + if ($according_jobs{$jobid}{attributes}{"$pch::IPAW_PROGRAM"}{value}[0] eq $end_program_name) { + print "It's $end_program_name\n" if $debug; + next; + } + + @succs = pch::isquery($is, [["$pch::jpwf:ancestor", ['EQUAL', "$jobid"]]], \@pch::view_attributes); + die "...so exit on error" if ($pch::err); + + for my $succ (@succs) { + my %succ = %$succ; + print "Considered: $succ{jobid}\n" if ($debug); + if (!exists $according_jobs{$succ{jobid}}) { + $according_jobs{$succ{jobid}} = \%succ; + push @according_jobs, $succ{jobid}; + print "Added $succ{jobid} to $#according_jobs\n" if ($debug); + } + else { + print "Already existing $succ{jobid}\n" if ($debug); + } + } + $according_count++; +} + + +# +# print the result set +# +print "Results\n"; +print "=======\n"; +print "\n"; +foreach my $jobid (sort { $according_jobs{$b}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] <=> $according_jobs{$a}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] } keys %according_jobs) { + my %job = %{$according_jobs{$jobid}}; + my %attributes = %{$job{attributes}}; + + print "jobid $jobid:\n"; + + # output all desired atributes + foreach my $attr (@pch::view_attributes) { + my $attr_name = $attr; $attr_name =~ s/.*://; + + print " attr $attr_name: "; + if (exists $attributes{$attr}) { + my %attr = %{$attributes{$attr}}; + + if ($attr eq "$pch::jpsys:regtime") { + print gmtime($attr{value}[0])." (".join(", ", @{$attr{value}}).")\n"; + } else { + print join(", ", @{$attr{value}})."\n"; + } + } else { + print "N/A\n"; + } + } + + print "\n"; +} diff --git a/org.glite.jp.index/examples/pch06/query6.pl b/org.glite.jp.index/examples/pch06/query6.pl new file mode 100644 index 0000000..21521e8 --- /dev/null +++ b/org.glite.jp.index/examples/pch06/query6.pl @@ -0,0 +1,133 @@ +#! /usr/bin/perl + +# +# 6. query: +# +# Find all output averaged images of softmean (average) procedures, where the +# warped images taken as input were align_warped using a twelfth order +# nonlinear 1365 parameter model, i.e. "where softmean was preceded in the +# workflow, directly or indirectly, by an align_warp procedure with argument +# -m 12. +# +# call: +# ./query6.pl 2>/dev/null +# + +use strict; +use pch; +use Data::Dumper; + +my $ps='https://skurut1.cesnet.cz:8901'; +my $is='https://skurut1.cesnet.cz:8902'; +my $program_name='align_warp'; +my $program_param='-m 12'; +my $end_program_name='softmean'; + +#my %jobs = (); # just information cache +my @workflow_jobs = (); # sequencially jobid list +my %workflow_jobs = (); # hash jobid list +my @according_jobs = (); # sequencially jobid list +my %according_jobs = (); # hash jobid list +my $workflow_count = 0; + + +# debug calls +$pch::debug = 0; +my $debug = 0; + +# +# find out processes with given name and parameters +# +my @jobs = pch::isquery($is, [ + ["$pch::jplbtag:IPAW_PROGRAM", ['EQUAL', "$program_name"]], + ["$pch::jplbtag:IPAW_PARAM", ['EQUAL', "$program_param"]], +], ["$pch::jpwf:successor", @pch::view_attributes]); +print Dumper(@jobs) if ($debug); +die "...so exit on error" if ($pch::err); + +# +# initial set of starting jobs from index server +# (root jobs) +# +foreach my $job (@jobs) { + my %job = %$job; + my %attributes = %{$job{attributes}}; + my $jobid = $job{jobid}; + + if (!exists $workflow_jobs{$jobid}) { + push @workflow_jobs, $jobid; + $workflow_jobs{$jobid} = \%job; + } +} +undef @jobs; + + +# +# collect all jobs (tree browsing down) +# +$workflow_count = 0; +foreach my $jobid (@workflow_jobs) { + my @succs; + + print "Handling $jobid (position $workflow_count)\n" if ($debug); + print " progname: ".$workflow_jobs{$jobid}{attributes}{"$pch::jplbtag:IPAW_PROGRAM"}{value}[0]."\n" if ($debug); + + if ($workflow_jobs{$jobid}{attributes}{"$pch::jplbtag:IPAW_PROGRAM"}{value}[0] eq $end_program_name) { + print "It's $end_program_name, adding\n" if $debug; + $according_jobs{$jobid} = \%{$workflow_jobs{$jobid}}; + next; + } + + @succs = pch::isquery($is, [["$pch::jpwf:ancestor", ['EQUAL', "$jobid"]]], \@pch::view_attributes); + die "...so exit on error" if ($pch::err); + + for my $succ (@succs) { + my %succ = %$succ; + print "Considered: $succ{jobid}\n" if ($debug); + if (!exists $workflow_jobs{$succ{jobid}}) { + $workflow_jobs{$succ{jobid}} = \%succ; + push @workflow_jobs, $succ{jobid}; + print "Added $succ{jobid} to $#workflow_jobs\n" if ($debug); + } + else { + print "Already existing $succ{jobid}\n" if ($debug); + } + } + $workflow_count++; +} +undef @workflow_jobs; +undef %workflow_jobs; + + +# +# print the result set +# +print "Results\n"; +print "=======\n"; +print "\n"; +foreach my $jobid (sort { $according_jobs{$b}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] <=> $according_jobs{$a}{attributes}{"$pch::jplbtag:IPAW_STAGE"}{value}[0] } keys %according_jobs) { + my %job = %{$according_jobs{$jobid}}; + my %attributes = %{$job{attributes}}; + + print "jobid $jobid:\n"; + + # output all desired atributes + foreach my $attr (@pch::view_attributes) { + my $attr_name = $attr; $attr_name =~ s/.*://; + + print " attr $attr_name: "; + if (exists $attributes{$attr}) { + my %attr = %{$attributes{$attr}}; + + if ($attr eq "$pch::jpsys:regtime") { + print gmtime($attr{value}[0])." (".join(", ", @{$attr{value}}).")\n"; + } else { + print join(", ", @{$attr{value}})."\n"; + } + } else { + print "N/A\n"; + } + } + + print "\n"; +} diff --git a/org.glite.jp.index/examples/query-tests/authz.out b/org.glite.jp.index/examples/query-tests/authz.out index 18e2d30..21458e0 100644 --- a/org.glite.jp.index/examples/query-tests/authz.out +++ b/org.glite.jp.index/examples/query-tests/authz.out @@ -10,5 +10,4 @@ Attributes: http://egee.cesnet.cz/en/Schema/LB/Attributes:user OK -Result 0 jobs: \ No newline at end of file diff --git a/org.glite.jp.index/examples/query-tests/complex_query.out b/org.glite.jp.index/examples/query-tests/complex_query.out index 65e14e9..bc11975 100644 --- a/org.glite.jp.index/examples/query-tests/complex_query.out +++ b/org.glite.jp.index/examples/query-tests/complex_query.out @@ -13,23 +13,4 @@ Attributes: http://egee.cesnet.cz/en/Schema/LB/Attributes:user OK -Result 2 jobs: - jobid = https://localhost:7846/pokus1, owner = (null) - http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus - value = Done - origin = 0, (null) - time = Thu Jan 1 01:00:00 1970 - http://egee.cesnet.cz/en/Schema/LB/Attributes:user - value = CertSubj - origin = 0, (null) - time = Thu Jan 1 01:00:00 1970 - jobid = https://localhost:7846/pokus2, owner = (null) - http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus - value = Ready - origin = 0, (null) - time = Thu Jan 1 01:00:00 1970 - http://egee.cesnet.cz/en/Schema/LB/Attributes:user - value = CertSubj - origin = 0, (null) - time = Thu Jan 1 01:00:00 1970 -https://localhost:7846/pokus1http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDone1970-01-01T00:00:00ZSYSTEMhttp://egee.cesnet.cz/en/Schema/LB/Attributes:userCertSubj1970-01-01T00:00:00ZSYSTEMhttp://localhost:8901https://localhost:7846/pokus2http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusReady1970-01-01T00:00:00ZSYSTEMhttp://egee.cesnet.cz/en/Schema/LB/Attributes:userCertSubj1970-01-01T00:00:00ZSYSTEMhttp://localhost:8901 \ No newline at end of file +https://localhost:7846/pokus1/O=CESNET/O=Masaryk University/CN=Milos Mulachttp://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDone1969-12-31T23:00:00ZSYSTEMhttp://egee.cesnet.cz/en/Schema/LB/Attributes:userCertSubj1969-12-31T23:00:00ZSYSTEMhttp://localhost:8901https://localhost:7846/pokus2OwnerNamehttp://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusReady1969-12-31T23:00:00ZSYSTEMhttp://egee.cesnet.cz/en/Schema/LB/Attributes:userCertSubj1969-12-31T23:00:00ZSYSTEMhttp://localhost:8901 \ No newline at end of file diff --git a/org.glite.jp.index/examples/query-tests/run-test.sh b/org.glite.jp.index/examples/query-tests/run-test.sh index e8fda6d..2e27c08 100755 --- a/org.glite.jp.index/examples/query-tests/run-test.sh +++ b/org.glite.jp.index/examples/query-tests/run-test.sh @@ -59,7 +59,7 @@ init() { # handle the configuration ARGS="-u ${GLITE_JPIS_TEST_ROOT_USER:-root}" - [ -z "$GLITE_JPIS_TEST_ROOT_PASSWORD" ] || ARGS="-p ${GLITE_JPIS_TEST_ROOT_PASSWORD} $ARGS" + [ -z "$GLITE_JPIS_TEST_ROOT_PASSWORD" ] || ARGS="--password=${GLITE_JPIS_TEST_ROOT_PASSWORD} $ARGS" GLITE_JPIS_TEST_PORT=${GLITE_JPIS_TEST_PORT:-"10000"} GLITE_JPIS_TEST_PIDFILE=${GLITE_JPIS_TEST_PIDFILE:-"/tmp/glite-jp-indexd.pid"} GLITE_JPIS_TEST_LOGFILE=${GLITE_JPIS_TEST_LOGFILE:-"/tmp/glite-jp-indexd.log"} @@ -80,7 +80,7 @@ create_db() { if [ "x$need_new_db" = "x1" ]; then mysqladmin -f $ARGS drop $DB_NAME > /dev/null 2>&1 mysqladmin -f $ARGS create $DB_NAME && \ - mysql $ARGS -e 'GRANT ALL on $DB_NAME.* to jpis@localhost' && \ + mysql $ARGS -e "GRANT ALL on $DB_NAME.* to jpis@localhost" && \ mysql -u $DB_USER $DB_NAME < $GLITE_LOCATION/etc/glite-jp-index-dbsetup.sql || exit 1 db_created="1" fi @@ -142,7 +142,7 @@ kill_is() { run_test_query() { X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \ - $GLITE_LOCATION/examples/glite-jpis-client -q $1 \ + $GLITE_LOCATION/examples/glite-jpis-client -f xml -q $1 \ -i http://localhost:$GLITE_JPIS_TEST_PORT &>/tmp/result DIFF=`diff --ignore-matching-lines="query: using JPIS" $2 /tmp/result` if [ -z "$DIFF" -a "$?" -eq "0" ] ; then @@ -151,11 +151,17 @@ run_test_query() { else echo "FAILED!" echo - echo "Expected result:" + echo "Expected result (using query $1):" + echo ------------------------------------------------------------------------------ cat $2 + echo + echo --------------------------------------------------------------------------------------------------- + echo echo "Obtained result (in /tmp/result):" + echo --------------------------------- cat /tmp/result echo + echo --------------------------------------------------------------------------------------------------- drop_db; kill_is; exit 1 @@ -165,9 +171,7 @@ run_test_query() { run_test_feed() { # run the example numok=`X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT}\ - GLITE_JPIS_DB=$GLITE_JPIS_TEST_DB \ - GLITE_JPIS_PORT=$GLITE_JPIS_TEST_PORT \ - $GLITE_LOCATION/examples/glite-jpis-test 2>/dev/null| grep "OK" | wc -l` + $GLITE_LOCATION/examples/glite-jpis-test -p $GLITE_JPIS_TEST_PORT -m $GLITE_JPIS_TEST_DB ` if [ "$numok" -eq "2" ]; then echo OK. else @@ -187,16 +191,16 @@ echo echo -n "Simple query test.... " create_db; run_is "-n"; -import_db $GLITE_LOCATION/examples/dump1.sql; -run_test_query $GLITE_LOCATION/examples/simple_query.in $GLITE_LOCATION/examples/simple_query.out; +import_db $GLITE_LOCATION/examples/query-tests/dump1.sql; +run_test_query $GLITE_LOCATION/examples/query-tests/simple_query.in $GLITE_LOCATION/examples/query-tests/simple_query.out; drop_db; kill_is; echo -n "Complex query test... " create_db; run_is "-n"; -import_db $GLITE_LOCATION/examples/dump1.sql; -run_test_query $GLITE_LOCATION/examples/complex_query.in $GLITE_LOCATION/examples/complex_query.out; +import_db $GLITE_LOCATION/examples/query-tests/dump1.sql; +run_test_query $GLITE_LOCATION/examples/query-tests/complex_query.in $GLITE_LOCATION/examples/query-tests/complex_query.out; drop_db; kill_is; @@ -210,8 +214,8 @@ kill_is; echo -n "Authz test........... " create_db; run_is; -import_db $GLITE_LOCATION/examples/dump1.sql; -run_test_query $GLITE_LOCATION/examples/simple_query.in $GLITE_LOCATION/examples/authz.out; +import_db $GLITE_LOCATION/examples/query-tests/dump1.sql; +run_test_query $GLITE_LOCATION/examples/query-tests/simple_query.in $GLITE_LOCATION/examples/query-tests/authz.out; drop_db; kill_is; diff --git a/org.glite.jp.index/examples/query-tests/simple_query.out b/org.glite.jp.index/examples/query-tests/simple_query.out index f63adf2..c3edb73 100644 --- a/org.glite.jp.index/examples/query-tests/simple_query.out +++ b/org.glite.jp.index/examples/query-tests/simple_query.out @@ -10,14 +10,4 @@ Attributes: http://egee.cesnet.cz/en/Schema/LB/Attributes:user OK -Result 1 jobs: - jobid = https://localhost:7846/pokus2, owner = (null) - http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus - value = Ready - origin = 0, (null) - time = Thu Jan 1 01:00:00 1970 - http://egee.cesnet.cz/en/Schema/LB/Attributes:user - value = CertSubj - origin = 0, (null) - time = Thu Jan 1 01:00:00 1970 -https://localhost:7846/pokus2http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusReady1970-01-01T00:00:00ZSYSTEMhttp://egee.cesnet.cz/en/Schema/LB/Attributes:userCertSubj1970-01-01T00:00:00ZSYSTEMhttp://localhost:8901 \ No newline at end of file +https://localhost:7846/pokus2OwnerNamehttp://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusReady1969-12-31T23:00:00ZSYSTEMhttp://egee.cesnet.cz/en/Schema/LB/Attributes:userCertSubj1969-12-31T23:00:00ZSYSTEMhttp://localhost:8901 \ No newline at end of file diff --git a/org.glite.jp.index/project/version.properties b/org.glite.jp.index/project/version.properties index 46eb5a1..80cbe6b 100644 --- a/org.glite.jp.index/project/version.properties +++ b/org.glite.jp.index/project/version.properties @@ -1,2 +1,2 @@ -module.version=1.2.0 +module.version=1.2.2 module.age=1 diff --git a/org.glite.jp.index/src/bones_server.c b/org.glite.jp.index/src/bones_server.c index 71cdf6f..e5ae981 100644 --- a/org.glite.jp.index/src/bones_server.c +++ b/org.glite.jp.index/src/bones_server.c @@ -77,15 +77,16 @@ int main(int argc, char *argv[]) int one = 1,i; edg_wll_GssStatus gss_code; struct sockaddr_in a; + char *config_file; glite_jpis_context_t isctx; glite_jp_init_context(&ctx); - if (glite_jp_get_conf(argc, argv, NULL, &conf)) { - glite_jp_free_context(ctx); - exit(1); - } + /* Read config options/file */ + // XXX: need add something meaningfull to src/conf.c ! + config_file = NULL; + glite_jp_get_conf(argc, argv, config_file, &conf); glite_jpis_init_context(&isctx, ctx, conf); /* connect to DB */ @@ -184,6 +185,7 @@ int main(int argc, char *argv[]) /* for dbg - one slave OK */ glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT,1); glite_srvbones_run(data_init,&stab,1 /* XXX: entries in stab */,debug); + glite_jpis_free_db(isctx); glite_jp_free_conf(conf); glite_jpis_free_context(isctx); @@ -365,7 +367,7 @@ int request(int conn,struct timeval *to,void *data) } glite_jp_run_deferred(ctx); - return ENOTCONN; + return 0; } static int reject(int conn) diff --git a/org.glite.jp.index/src/common_server.c b/org.glite.jp.index/src/common_server.c index a815293..63052b4 100644 --- a/org.glite.jp.index/src/common_server.c +++ b/org.glite.jp.index/src/common_server.c @@ -40,12 +40,12 @@ int glite_jpis_daemonize(const char *servername, const char *custom_pidfile, con if (!custom_pidfile) { asprintf(&pidfile, "%s/%s.pid", geteuid() == 0 ? "/var/run" : getenv("HOME"), servername); } else { - pidfile = strdup(custom_pidfile); + pidfile = NULL; } // printf("pidfile: %s\n", pidfile ? pidfile : custom_pidfile); setpgrp(); /* needs for signalling */ master = getpid(); - fpid = fopen(pidfile,"r"); + fpid = fopen(pidfile ? pidfile : custom_pidfile,"r"); if ( fpid ) { opid = -1; @@ -60,16 +60,13 @@ int glite_jpis_daemonize(const char *servername, const char *custom_pidfile, con else if (errno != ESRCH) { perror("kill()"); return 0; } } fclose(fpid); - } else if (errno != ENOENT) { perror(pidfile); free(pidfile); return 0; } - - if (((fpid = fopen(pidfile, "w")) == NULL) || - (fprintf(fpid, "%d", getpid()) <= 0) || - (fclose(fpid) != 0)) { - perror(pidfile); - free(pidfile); - return 0; - } + } else if (errno != ENOENT) { perror(pidfile ? pidfile : custom_pidfile); free(pidfile); return 0; } + fpid = fopen(pidfile ? pidfile : custom_pidfile, "w"); + if (!fpid) { perror(pidfile ? pidfile : custom_pidfile); free(pidfile); return 0; } free(pidfile); + fprintf(fpid, "%d", getpid()); + fclose(fpid); + return 1; } diff --git a/org.glite.jp.index/src/conf.c b/org.glite.jp.index/src/conf.c index 27ee84a..2c58c2c 100644 --- a/org.glite.jp.index/src/conf.c +++ b/org.glite.jp.index/src/conf.c @@ -14,17 +14,12 @@ #include #include "conf.h" #include "db_ops.h" -#include "ws_is_typeref.h" -#include -#include "soap_version.h" -#include "jpis_H.h" -extern SOAP_NMAC struct Namespace jpis__namespaces[]; - -static const char *get_opt_string = "dq:c:k:C:V:nm:p:i:o:x:"; +static const char *get_opt_string = "s:dq:c:k:C:V:nm:p:i:o:"; static struct option opts[] = { + {"is-server", 1, NULL, 's'}, {"debug", 0, NULL, 'd'}, {"query-type", 1, NULL, 'q'}, {"cert", 1, NULL, 'c'}, @@ -36,16 +31,15 @@ static struct option opts[] = { {"port", 1, NULL, 'p'}, {"pidfile", 1, NULL, 'i'}, {"logfile", 1, NULL, 'o'}, - {"config", 1, NULL, 'x'}, {NULL, 0, NULL, 0} }; -static int read_conf(glite_jp_is_conf *conf, char *conf_file); -static int dump_conf(void); + static void usage(char *me) { fprintf(stderr,"usage: %s [option]\n" + "\t-s, --ps-server\t primary storage server address (http://hostname:port)\n" "\t-d, --debug\t don't run as daemon, additional diagnostics\n" "\t-q, --query-type hist/cont/both (default history)\n" "\t-k, --key\t private key file\n" @@ -57,7 +51,6 @@ static void usage(char *me) "\t-p, --port\t port to listen\n" "\t-i, --pidfile\t file to store master pid\n" "\t-o, --logfile\t file to store logs\n" - "\t-x, --config\t file with server configuration\n" "\n" ,me); } @@ -65,7 +58,7 @@ static void usage(char *me) int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf **configuration) { - char *ps = NULL, *qt = NULL, *conf_file = NULL; + char *env, *ps = NULL, *qt = NULL;; int opt; glite_jp_is_conf *conf; @@ -74,6 +67,7 @@ int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf while ((opt = getopt_long(argc,argv,get_opt_string,opts,NULL)) != EOF) switch (opt) { + case 's': ps = optarg; break; case 'd': conf->debug = 1; break; case 'q': qt = optarg; break; case 'c': conf->server_cert = optarg; break; @@ -85,10 +79,12 @@ int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf case 'p': conf->port = optarg; break; case 'i': conf->pidfile = optarg; break; case 'o': conf->logfile = optarg; break; - case 'x': conf_file = optarg; break; default : usage(argv[0]); exit(0); break; } + if (!ps) { + fprintf(stderr,"No JP PrimaryStrorage server specified, default feeds skipped. (not fatal)\n"); + } if (!conf->cs) { fprintf(stderr,"DB contact string not specified! "\ "Using build-in default: %s \n", GLITE_JP_IS_DEFAULTCS); @@ -98,15 +94,95 @@ int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf "Using build-in default: %s \n", GLITE_JPIS_DEFAULT_PORT_STR); } - if (!conf_file) { - fprintf(stderr,"JP IS configuration file must be specified! "\ - "Exiting.\n"); - return 1; + // prefixes & attributes defined in: + // lb.server/build/jp_job_attrs.h (created when build plugin) + // jp.common/interface/known_attr.h + + conf->attrs = calloc(29, sizeof(*conf->attrs)); + conf->attrs[0] = strdup("http://egee.cesnet.cz/en/Schema/JP/System:owner"); + conf->attrs[1] = strdup("http://egee.cesnet.cz/en/Schema/JP/System:jobId"); + conf->attrs[2] = strdup("http://egee.cesnet.cz/en/Schema/JP/System:regtime"); + conf->attrs[3] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:user"); + conf->attrs[4] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:aTag"); + conf->attrs[5] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:eNodes"); + conf->attrs[6] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:RB"); + conf->attrs[7] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:CE"); + conf->attrs[8] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:UIHost"); + conf->attrs[9] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:CPUTime"); + conf->attrs[10] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:NProc"); + conf->attrs[11] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus"); + conf->attrs[12] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDate"); + conf->attrs[13] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:retryCount"); + conf->attrs[14] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:jobType"); + conf->attrs[15] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:nsubjobs"); + conf->attrs[16] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:lastStatusHistory"); + conf->attrs[17] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:fullStatusHistory"); + conf->attrs[18] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:parent"); + conf->attrs[19] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_STAGE"); + conf->attrs[20] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_PROGRAM"); + conf->attrs[21] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_INPUT"); + conf->attrs[22] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_OUTPUT"); + conf->attrs[23] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_PARAM"); + conf->attrs[24] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_HEADER"); + conf->attrs[25] = strdup("http://egee.cesnet.cz/en/Schema/JP/Workflow:ancestor"); + conf->attrs[26] = strdup("http://egee.cesnet.cz/en/Schema/JP/Workflow:successor"); + conf->attrs[27] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:host"); + + conf->indexed_attrs = calloc(12, sizeof(*conf->indexed_attrs)); + conf->indexed_attrs[0] = strdup("http://egee.cesnet.cz/en/Schema/JP/System:owner"); + conf->indexed_attrs[1] = strdup("http://egee.cesnet.cz/en/Schema/JP/System:jobId"); + conf->indexed_attrs[2] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:user"); + conf->indexed_attrs[3] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus"); + conf->indexed_attrs[4] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:UIHost"); + conf->indexed_attrs[5] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:CE"); + conf->indexed_attrs[6] = strdup("http://egee.cesnet.cz/en/Schema/LB/Attributes:RB"); + conf->indexed_attrs[7] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_PROGRAM"); + conf->indexed_attrs[8] = strdup("http://egee.cesnet.cz/en/WSDL/jp-lbtag:IPAW_OUTPUT"); + conf->indexed_attrs[9] = strdup("http://egee.cesnet.cz/en/Schema/JP/Workflow:successor"); + conf->indexed_attrs[10] = strdup("http://egee.cesnet.cz/en/Schema/JP/Workflow:ancestor"); + + // XXX: some plugin names should come here in future + conf->plugins = NULL; + + if (!ps) { + // No JP PrimaryStrorage server specified in $GLITE_JPIS_PS -> skip feeds + conf->feeds = calloc(1, sizeof(*(conf->feeds))); + *configuration = conf; + return 0; + } + + /* ask for one feed */ + conf->feeds = calloc(2, sizeof(*(conf->feeds))); + + conf->feeds[0] = calloc(1, sizeof(**(conf->feeds))); + conf->feeds[0]->PS_URL = strdup(ps); + + // all job since Epoche + conf->feeds[0]->query = calloc(2,sizeof(*conf->feeds[0]->query)); + conf->feeds[0]->query[0] = calloc(2,sizeof(**conf->feeds[0]->query)); + conf->feeds[0]->query[0][0].attr = strdup("http://egee.cesnet.cz/en/Schema/JP/System:regtime"); + conf->feeds[0]->query[0][0].op = GLITE_JP_QUERYOP_GREATER; + conf->feeds[0]->query[0][0].value = strdup("0"); + + if (qt && !strcmp(qt,"both")) { + conf->feeds[0]->history = 1; + conf->feeds[0]->continuous = 1; + } + else if ( qt && (!strcmp(qt,"continuous") || !strcmp(qt,"cont")) ) { + conf->feeds[0]->history = 0; + conf->feeds[0]->continuous = 1; + } + else if ( qt && (!strcmp(qt,"history") || !strcmp(qt,"hist")) ) { + conf->feeds[0]->history = 1; + conf->feeds[0]->continuous = 0; } else { - read_conf(conf, conf_file); + usage(argv[0]); + exit(0); } + conf->feeds[1] = NULL; + *configuration = conf; return 0; @@ -149,131 +225,3 @@ void glite_jp_lprintf(const char *source, const char *fmt, ...) { vprintf(fmt, ap); va_end(ap); } - -/* - * Reads configuration from XML conf. file - */ -static int read_conf(glite_jp_is_conf *conf, char *conf_file) -{ - struct soap soap; - struct _jpelem__ServerConfigurationResponse out; - int fd, i; - - - if ((fd = open(conf_file, 0)) < 0) { - fprintf(stderr, "error opening %s: %s\n", conf_file, strerror(errno)); - return 1; - } - - soap_init(&soap); - soap_set_namespaces(&soap, jpis__namespaces); - - soap_begin(&soap); - soap.recvfd = fd; - soap_begin_recv(&soap); - memset(&out, 0, sizeof(out)); - - if (!soap_get__jpelem__ServerConfigurationResponse(&soap, &out, "ServerConfiguration", NULL)) { - soap_end_recv(&soap); - soap_end(&soap); - return EINVAL; - } - soap_end_recv(&soap); - - if (out.__sizeattrs) { - conf->attrs = calloc(out.__sizeattrs + 1, sizeof(*conf->attrs)); - for (i=0; i < out.__sizeattrs; i++) { - conf->attrs[i] = strdup(out.attrs[i]); - } - } - if (out.__sizeindexedAttrs) { - conf->indexed_attrs = calloc(out.__sizeindexedAttrs + 1, sizeof(*conf->indexed_attrs)); - for (i=0; i < out.__sizeindexedAttrs; i++) { - conf->indexed_attrs[i] = strdup(out.indexedAttrs[i]); - } - } - if (out.__sizeplugins) { - conf->plugins = calloc(out.__sizeplugins + 1, sizeof(*conf->plugins)); - for (i=0; i < out.__sizeplugins; i++) { - conf->plugins[i] = strdup(out.plugins[i]); - } - } - if (out.__sizefeeds) { - conf->feeds = calloc(out.__sizefeeds + 1, sizeof(*conf->feeds)); - for (i=0; i < out.__sizefeeds; i++) { - conf->feeds[i] = calloc(1, sizeof(*conf->feeds[i])); - conf->feeds[i]->PS_URL=strdup(out.feeds[i]->primaryServer); - - if (out.feeds[i]->__sizecondition) { - glite_jpis_SoapToPrimaryQueryConds(&soap, out.feeds[i]->__sizecondition, - out.feeds[i]->condition, &conf->feeds[i]->query); - } - - conf->feeds[i]->history = out.feeds[0]->history; - conf->feeds[i]->continuous = out.feeds[0]->continuous; - } - } - - soap_destroy(&soap); - soap_end(&soap); - soap_done(&soap); - - return 0; -} - -/* - * Just helper function - used only once for first generation - * of XML example configuration (which was then reedited in hand) - */ -static int dump_conf(void) { - int retval; - struct _jpelem__ServerConfigurationResponse out; - struct soap soap; - - - soap_init(&soap); - soap_set_namespaces(&soap, jpis__namespaces); - - soap.sendfd = STDOUT_FILENO; - soap_begin_send(&soap); - soap_default__jpelem__ServerConfigurationResponse(&soap, &out); - - out.__sizeattrs = 2; - out.attrs = calloc(2, sizeof(*out.attrs)); - out.attrs[0] = strdup("atrr1"); - out.attrs[1] = strdup("atrr2"); - - out.__sizeindexedAttrs = 2; - out.indexedAttrs = calloc(2, sizeof(*out.indexedAttrs)); - out.indexedAttrs[0] = strdup("idxAtrr1"); - out.indexedAttrs[1] = strdup("idxAtrr2"); - - out.__sizeplugins = 2; - out.plugins = calloc(2, sizeof(*out.plugins)); - out.plugins[0] = strdup("plugin1"); - out.plugins[1] = strdup("plugin2"); - - out.__sizefeeds = 1; - out.feeds = calloc(1, sizeof(*out.feeds)); - out.feeds[0] = calloc(1, sizeof(*out.feeds[0])); - out.feeds[0]->primaryServer = strdup("PrimaryServer"); - out.feeds[0]->__sizecondition = 1; - out.feeds[0]->condition = calloc(1, sizeof(*(out.feeds[0]->condition)) ); - out.feeds[0]->condition[0] = calloc(1, sizeof(*(out.feeds[0]->condition[0])) ); - out.feeds[0]->condition[0]->attr = strdup("queryAttr"); - out.feeds[0]->condition[0]->op = jptype__queryOp__EQUAL; - out.feeds[0]->condition[0]->origin = jptype__attrOrig__SYSTEM; - out.feeds[0]->condition[0]->value = calloc(1, sizeof(*(out.feeds[0]->condition[0]->value)) ); - out.feeds[0]->condition[0]->value->string = strdup("attrValue"); - out.feeds[0]->history = 1; - out.feeds[0]->continuous = 0; - - soap_serialize__jpelem__ServerConfigurationResponse(&soap, &out); - retval = soap_put__jpelem__ServerConfigurationResponse(&soap, &out, "jpelem:ServerConfiguration", NULL); - soap_end_send(&soap); - soap_free(&soap); - soap_end(&soap); - - return retval; -} - diff --git a/org.glite.jp.index/src/soap_ops.c b/org.glite.jp.index/src/soap_ops.c index 28d4a42..d4ace40 100644 --- a/org.glite.jp.index/src/soap_ops.c +++ b/org.glite.jp.index/src/soap_ops.c @@ -249,43 +249,66 @@ static int get_jobids(struct soap *soap, glite_jpis_context_t ctx, struct _jpele qwhere = strdup(""); for (i=0; i < in->__sizeconditions; i++) { - attr_md5 = str2md5(in->conditions[i]->attr); - trio_asprintf(&qa,"%s jobs.jobid = attr_%|Ss.jobid AND (", - (i ? "AND" : ""), attr_md5); - - for (j=0; j < in->conditions[i]->__sizerecord; j++) { - if (get_op(in->conditions[i]->record[j]->op, &qop)) goto err; - add_attr_table(attr_md5, &attr_tables); +/* XXX: deal with jobIds diferently (they are not in attr_X table, but in jobs) + if (strcmp(in->conditions[i]->attr,GLITE_JP_ATTR_JOBID)) { + trio_asprintf(&qa,"%s (", (i ? "AND" : "") ); + + for (j=0; j < in->conditions[i]->__sizerecord; j++) { + if (get_op(in->conditions[i]->record[j]->op, &qop)) goto err; - if (in->conditions[i]->record[j]->value->string) { attr.name = in->conditions[i]->attr; attr.value = in->conditions[i]->record[j]->value->string; attr.binary = 0; glite_jpis_SoapToAttrOrig(soap, in->conditions[i]->origin, &(attr.origin)); - trio_asprintf(&qb,"%s%sattr_%|Ss.value %s \"%|Ss\"", + trio_asprintf(&qb,"%s%sjobs.dg_jobid %s \"%|Ss\"", qa, (j ? " OR " : ""), attr_md5, qop, glite_jp_attrval_to_db_index(ctx->jpctx, &attr, 255)); free(qop); free(qa); qa = qb; qb = NULL; + + } + else +*/ + { + attr_md5 = str2md5(in->conditions[i]->attr); + trio_asprintf(&qa,"%s jobs.jobid = attr_%|Ss.jobid AND (", + (i ? "AND" : ""), attr_md5); + + for (j=0; j < in->conditions[i]->__sizerecord; j++) { + if (get_op(in->conditions[i]->record[j]->op, &qop)) goto err; + add_attr_table(attr_md5, &attr_tables); + + if (in->conditions[i]->record[j]->value->string) { + attr.name = in->conditions[i]->attr; + attr.value = in->conditions[i]->record[j]->value->string; + attr.binary = 0; + glite_jpis_SoapToAttrOrig(soap, + in->conditions[i]->origin, &(attr.origin)); + trio_asprintf(&qb,"%s%sattr_%|Ss.value %s \"%|Ss\"", + qa, (j ? " OR " : ""), attr_md5, qop, + glite_jp_attrval_to_db_index(ctx->jpctx, &attr, 255)); + free(qop); + free(qa); qa = qb; qb = NULL; + } + else { + attr.name = in->conditions[i]->attr; + attr.value = in->conditions[i]->record[j]->value->blob->__ptr; + attr.binary = 1; + attr.size = in->conditions[i]->record[j]->value->blob->__size; + glite_jpis_SoapToAttrOrig(soap, + in->conditions[i]->origin, &(attr.origin)); + trio_asprintf(&qb,"%s %s attr_%|Ss.value %s \"%|Ss\"", + qa, (j ? "OR" : ""), attr_md5, qop, + glite_jp_attrval_to_db_index(ctx->jpctx, &attr, 255)); + free(qop); + free(qa); qa = qb; qb = NULL; + } } - else { - attr.name = in->conditions[i]->attr; - attr.value = in->conditions[i]->record[j]->value->blob->__ptr; - attr.binary = 1; - attr.size = in->conditions[i]->record[j]->value->blob->__size; - glite_jpis_SoapToAttrOrig(soap, - in->conditions[i]->origin, &(attr.origin)); - trio_asprintf(&qb,"%s %s attr_%|Ss.value %s \"%|Ss\"", - qa, (j ? "OR" : ""), attr_md5, qop, - glite_jp_attrval_to_db_index(ctx->jpctx, &attr, 255)); - free(qop); - free(qa); qa = qb; qb = NULL; - } + trio_asprintf(&qb,"%s %s)", qwhere, qa); + free(qa); qwhere = qb; qb = NULL; qa = NULL; + free(attr_md5); } - trio_asprintf(&qb,"%s %s)", qwhere, qa); - free(qa); qwhere = qb; qb = NULL; qa = NULL; - free(attr_md5); } qa = strdup(""); @@ -373,6 +396,7 @@ static int get_attr(struct soap *soap, glite_jpis_context_t ctx, char *jobid, ch glite_jp_db_stmt_t stmt; + memset(&jav,0,sizeof(jav)); jobid_md5 = str2md5(jobid); attr_md5 = str2md5(attr_name); trio_asprintf(&query,"SELECT full_value FROM attr_%|Ss WHERE jobid = \"%s\"", @@ -380,7 +404,10 @@ static int get_attr(struct soap *soap, glite_jpis_context_t ctx, char *jobid, ch free(attr_md5); free(jobid_md5); - if ((ret = glite_jp_db_execstmt(ctx->jpctx, query, &stmt)) < 0) goto err; + if ((ret = glite_jp_db_execstmt(ctx->jpctx, query, &stmt)) < 0) + // unknown attribute + // XXX: propagate the error to client + goto err; free(query); i = 0; @@ -596,14 +623,3 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__DeleteFeed( return SOAP_OK; } - -SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__ServerConfiguration( - struct soap *soap, - struct _jpelem__ServerConfiguration *in, - struct _jpelem__ServerConfigurationResponse *out) -{ - // empty, just for deserializer generation - puts(__FUNCTION__); - return SOAP_OK; -} - diff --git a/org.glite.jp.index/src/ws_is_typeref.c b/org.glite.jp.index/src/ws_is_typeref.c index c51c98c..7f2a50c 100644 --- a/org.glite.jp.index/src/ws_is_typeref.c +++ b/org.glite.jp.index/src/ws_is_typeref.c @@ -80,11 +80,11 @@ static int SoapToQueryCond( glite_jp_query_rec_t **out) { glite_jp_query_rec_t *qr; - int i; + int i; assert(in); assert(out); - qr = calloc(in->__sizerecord + 1, sizeof(*qr)); + qr = calloc(in->__sizerecord, sizeof(*qr)); for (i=0; i < in->__sizerecord; i++) { qr[i].attr = strdup(in->attr); @@ -116,7 +116,7 @@ static int SoapToQueryCond( } /** - * Translate JP index query conditions from soap to C query_rec + * Translate JP query conditions from soap to C query_rec * * \param IN Soap structure * \param OUT array of glite_jp_query_rec_t query records @@ -144,74 +144,3 @@ int glite_jpis_SoapToQueryConds( return 0; } - - -static int SoapToPrimaryQueryCond( - struct soap *soap, - struct jptype__primaryQuery *in, - glite_jp_query_rec_t **out) -{ - glite_jp_query_rec_t *qr; - - - assert(in); assert(out); - qr = calloc(2, sizeof(*qr)); - - qr[0].attr = strdup(in->attr); - glite_jpis_SoapToQueryOp(in->op, &(qr[0].op)); - - switch (qr[0].op) { - case GLITE_JP_QUERYOP_EXISTS: - break; - - case GLITE_JP_QUERYOP_WITHIN: - SoapToQueryRecordVal(soap, in->value2, &(qr[0].binary), - &(qr[0].size2), &(qr[0].value2)); - // fall through - default: - if ( SoapToQueryRecordVal(soap, in->value, &(qr[0].binary), - &(qr[0].size), &(qr[0].value)) ) { - *out = NULL; - return 1; - } - break; - } - - glite_jpis_SoapToAttrOrig(soap, in->origin, &(qr[0].origin) ); - - *out = qr; - - return 0; -} - - - -/** - * Translate JP primary query conditions from soap to C query_rec - * - * \param IN Soap structure - * \param OUT array of glite_jp_query_rec_t query records - */ -int glite_jpis_SoapToPrimaryQueryConds( - struct soap *soap, - int size, - struct jptype__primaryQuery **in, - glite_jp_query_rec_t ***out) -{ - glite_jp_query_rec_t **qr; - int i; - - assert(in); assert(out); - qr = calloc(size+1, sizeof(*qr)); - - for (i=0; i +#include + +#include +#include +#include + +#include + +#include "glite/security/glite_gsplugin.h" +#include "glite/jp/known_attr.h" + +#include "jpps_H.h" +#include "jpps_.nsmap" + +#include "jptype_map.h" + +#include "soap_version.h" +#if GSOAP_VERSION <= 20602 +#define soap_call___jpsrv__RegisterJob soap_call___ns1__RegisterJob +#define soap_call___jpsrv__StartUpload soap_call___ns1__StartUpload +#define soap_call___jpsrv__CommitUpload soap_call___ns1__CommitUpload +#define soap_call___jpsrv__RecordTag soap_call___ns1__RecordTag +#define soap_call___jpsrv__FeedIndex soap_call___ns1__FeedIndex +#define soap_call___jpsrv__FeedIndexRefresh soap_call___ns1__FeedIndexRefresh +#define soap_call___jpsrv__GetJob soap_call___ns1__GetJob +#endif + + +static void usage(const char *me) +{ + fprintf(stderr,"%s: [-s server-url] jobid\n",me); + + exit (EX_USAGE); +} + +static int check_fault(struct soap *soap,int err) { + struct SOAP_ENV__Detail *detail; + struct jptype__genericFault *f; + char *reason,indent[200] = " "; + + switch(err) { + case SOAP_OK: puts("OK"); + break; + case SOAP_FAULT: + case SOAP_SVR_FAULT: + if (soap->version == 2) { + detail = soap->fault->SOAP_ENV__Detail; + reason = soap->fault->SOAP_ENV__Reason; + } + else { + detail = soap->fault->detail; + reason = soap->fault->faultstring; + } + fputs(reason,stderr); + putc('\n',stderr); + assert(detail->__type == SOAP_TYPE__genericFault); +#if GSOAP_VERSION >=20700 + f = ((struct _genericFault *) detail->fault) +#else + f = ((struct _genericFault *) detail->value) +#endif + -> jpelem__genericFault; + + while (f) { + fprintf(stderr,"%s%s: %s (%s)\n",indent, + f->source,f->text,f->description); + f = f->reason; + strcat(indent," "); + } + return -1; + + default: soap_print_fault(soap,stderr); + return -1; + } + return 0; +} + +static const char *orig2str(enum jptype__attrOrig orig) +{ + switch (orig) { + case jptype__attrOrig__SYSTEM: return "SYSTEM"; + case jptype__attrOrig__USER: return "USER"; + case jptype__attrOrig__FILE_: return "FILE"; + default: return "unknown"; + } +} + + +int main(int argc,char *argv[]) +{ + char *server = NULL; + int opt,ret = 0,i; + struct soap *soap = soap_new(); + struct _jpelem__GetJobAttributes in; + struct _jpelem__GetJobAttributesResponse out; + char *aname = "http://egee.cesnet.cz/en/Schema/LB/Attributes:JDL"; + struct cclassad *ad; + struct { char *a,*s; } *deps = calloc(1,sizeof *deps); + int ndeps = 0; + char *dep_s,*where,*end,*tmp_a,*tmp_s,*wa,*wa_r,*ws,*ws_r; + + if (argc < 2) usage(argv[0]); + + soap_init(soap); + soap_set_namespaces(soap, jpps__namespaces); + + soap_register_plugin(soap,glite_gsplugin); + + while ((opt = getopt(argc,argv,"s:")) >= 0) switch (opt) { + case 's': server = optarg; + break; + case '?': usage(argv[0]); + } + + if (server) { + argv += 2; + argc -= 2; + } + else server = "http://localhost:8901"; + + + + in.jobid = argv[1]; + in.__sizeattributes = 1; + in.attributes = &aname; + + puts("Retrieving JDL ..."); + if ((ret = check_fault(soap,soap_call___jpsrv__GetJobAttributes(soap,server,"",&in,&out)))) + return 1; + + ad = cclassad_create(out.attrValues[0]->value->string); + if (!ad) { + fputs("Can't parse JDL\n",stderr); + return 1; + } + + // cclassad_evaluate_to_string(ad,"dependencies",&dep_s); + cclassad_evaluate_to_expr(ad,"dependencies",&dep_s); + + /* XXX: assumes syntacticly correct dependencies = { ... } */ + where = strchr(dep_s,'{'); assert(where); + where++; + + while ((where = strchr(where, '{'))) { /* 2nd level */ + for (where++; isspace(*where); where++); + + if (*where == '{') end = strchr(where, '}')+1; /* more ancestors */ + else for (end = where; !isspace(*end) && *end != ','; end++); + tmp_a = strndup(where,end - where); + where = end++; + + while(isspace(*where)) where++; + where++; /* comma */ + while(isspace(*where)) where++; + + if (*where == '{') end = strchr(where, '}')+1; /* more successors */ + else for (end = where; !isspace(*end) && *end != ','; end++); + tmp_s = strndup(where,end - where); + where = strchr(end+1,'}'); + +#define DELIM "{} ,\t\n" + for (ws = strtok_r(tmp_s,DELIM,&ws_r); ws; ws = strtok_r(NULL,DELIM,&ws_r)) + for (wa = strtok_r(tmp_a,DELIM,&wa_r); wa; wa = strtok_r(NULL,DELIM,&wa_r)) { + deps[ndeps].a = strdup(wa); + deps[ndeps].s = strdup(ws); + deps = realloc(deps, (ndeps+2) * sizeof *deps); + ndeps++; + deps[ndeps].a = deps[ndeps].s = NULL; + } + free(tmp_a); free(tmp_s); + } + + for (i=0; deps[i].a; i++) { + char attr[1000],*ja,*js; + int have_a,have_s; + + printf("node: %s -> %s\n",deps[i].a,deps[i].s); + sprintf(attr,"nodes.%s.description.edg_jobid",deps[i].a); + have_a = cclassad_evaluate_to_string(ad,attr,&ja); + + sprintf(attr,"nodes.%s.description.edg_jobid",deps[i].s); + have_s = cclassad_evaluate_to_string(ad,attr,&js); + + printf("jobid: %s -> %s\n",ja,js); + + if (have_a && have_s) { + struct _jpelem__RecordTag in; + struct _jpelem__RecordTagResponse empty; + struct jptype__tagValue tagval; + struct jptype__stringOrBlob val; + + in.jobid = ja; + in.tag = &tagval; + tagval.name = GLITE_JP_ATTR_WF_SUCCESSOR; + tagval.value = &val; + val.string = js; + val.blob = NULL; + + printf("Register successor ...\n"); + ret = check_fault(soap,soap_call___jpsrv__RecordTag(soap, server, "",&in, &empty)); + in.jobid = js; + tagval.name = GLITE_JP_ATTR_WF_ANCESTOR; + val.string = ja; + + printf("Register ancestor ...\n"); + ret = check_fault(soap,soap_call___jpsrv__RecordTag(soap, server, "",&in, &empty)); + putchar(10); + } + } + + return ret; +} diff --git a/org.glite.jp.primary/project/configure.properties.xml b/org.glite.jp.primary/project/configure.properties.xml index be55b62..57cb9e4 100644 --- a/org.glite.jp.primary/project/configure.properties.xml +++ b/org.glite.jp.primary/project/configure.properties.xml @@ -12,6 +12,10 @@ Revision history: $Log$ + Revision 1.6 2006/01/16 17:20:27 mmulac + merge from RC15 branch + - compiles + Revision 1.5.2.1 2005/11/03 17:46:53 mmulac ares to c-ares migration - use dynamic library of c-ares, instead of ares static lib @@ -68,6 +72,7 @@ nothrflavour=${with.globus.nothr.flavor} cppunit=${with.cppunit.prefix} jpproject=${subsystem.project.dir} project=${component.project.dir} +classads_prefix=${with.classads.prefix} diff --git a/org.glite.jp.primary/project/version.properties b/org.glite.jp.primary/project/version.properties index 46eb5a1..80cbe6b 100644 --- a/org.glite.jp.primary/project/version.properties +++ b/org.glite.jp.primary/project/version.properties @@ -1,2 +1,2 @@ -module.version=1.2.0 +module.version=1.2.2 module.age=1 diff --git a/org.glite.jp.primary/src/attrs.c b/org.glite.jp.primary/src/attrs.c index 044b610..7099dd1 100644 --- a/org.glite.jp.primary/src/attrs.c +++ b/org.glite.jp.primary/src/attrs.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include "glite/jp/types.h" @@ -161,10 +162,22 @@ glite_jpps_get_attrs(glite_jp_context_t ctx,const char *job,char **attr,int natt } p->ops.close(p->fpctx,ph); } + else { + char *e; + fprintf(stderr,"[%d] %s: %s\n",getpid(),known_classes[ci].class, + e = glite_jp_error_chain(ctx)); + free(e); + } } glite_jppsbe_close_file(ctx,beh); } + else { + char *e; + fprintf(stderr,"[%d] %s: %s\n",getpid(),known_classes[ci].class, + e = glite_jp_error_chain(ctx)); + free(e); + } } nout = merge_attrvals(&out,nout,meta); diff --git a/org.glite.jp.primary/src/authz.c b/org.glite.jp.primary/src/authz.c index 3ceba02..39451d4 100644 --- a/org.glite.jp.primary/src/authz.c +++ b/org.glite.jp.primary/src/authz.c @@ -31,8 +31,14 @@ int glite_jpps_authz(glite_jp_context_t ctx,int op,const char *job,const char *o case SOAP_TYPE___jpsrv__GetJobFiles: case SOAP_TYPE___jpsrv__GetJobAttributes: + case SOAP_TYPE___jpsrv__RecordTag: assert(owner); - return strcmp(owner,ctx->peer) ? glite_jp_stack_error(ctx,&err) : 0; + if (!ctx->noauth && strcmp(owner,ctx->peer)) { + err.desc = "you are not a job owner"; + glite_jp_stack_error(ctx,&err); + return 1; + } + return 0; break; default: @@ -76,3 +82,4 @@ int glite_jpps_readauth(glite_jp_context_t ctx,const char *file) fclose(f); return 0; } + diff --git a/org.glite.jp.primary/src/backend.h b/org.glite.jp.primary/src/backend.h index e3ec8a0..ad6605d 100644 --- a/org.glite.jp.primary/src/backend.h +++ b/org.glite.jp.primary/src/backend.h @@ -4,8 +4,6 @@ #include #include -#include "feed.h" - int glite_jppsbe_init( glite_jp_context_t ctx, int argc, diff --git a/org.glite.jp.primary/src/bones_server.c b/org.glite.jp.primary/src/bones_server.c index 9bfe779..dd7b4b4 100644 --- a/org.glite.jp.primary/src/bones_server.c +++ b/org.glite.jp.primary/src/bones_server.c @@ -71,7 +71,7 @@ int main(int argc, char *argv[]) b_argc = p_argc = 1; - while ((opt = getopt(argc,argv,"B:P:a:p:s:dl:i:c:k:")) != EOF) switch (opt) { + while ((opt = getopt(argc,argv,"B:P:a:p:s:dl:i:c:k:n")) != EOF) switch (opt) { case 'B': assert(b_argc < 20); if (com = strchr(optarg,',')) *com = 0; @@ -106,6 +106,7 @@ int main(int argc, char *argv[]) case 'i': strncpy(pidfile,optarg,PATH_MAX); pidfile[PATH_MAX-1] = 0; break; case 'c': server_cert = optarg; break; case 'k': server_key = optarg; break; + case 'n': ctx->noauth = 1; break; case '?': fprintf(stderr,"usage: %s: -Bb,val ... -Pplugin.so ...\n" "b is backend option\n",argv[0]); exit (1); @@ -367,7 +368,7 @@ static int request(int conn,struct timeval *to,void *data) fprintf(stderr,"[%d] %s\n",getpid(),e = glite_jp_error_chain(ctx)); free(e); } - return ENOTCONN; + return 0; } static int reject(int conn) diff --git a/org.glite.jp.primary/src/ftp_backend.c b/org.glite.jp.primary/src/ftp_backend.c deleted file mode 100644 index 8bf523b..0000000 --- a/org.glite.jp.primary/src/ftp_backend.c +++ /dev/null @@ -1,1744 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jp/types.h" -#include "glite/jp/context.h" -#include "glite/jp/strmd5.h" - -#include "tags.h" -#include "backend.h" - -#define UPLOAD_SUFFIX ".upload" -#define LOCK_SUFFIX ".lock" - -struct ftpbe_config { - char *internal_path; - char *external_path; - char *gridmap; - char *logname; -}; - -static struct ftpbe_config *config = NULL; - -struct fhandle_rec { - int fd; - int fd_append; -}; -typedef struct fhandle_rec *fhandle; - -static struct option ftpbe_opts[] = { - { "ftp-internal-path", 1, NULL, 'I' }, - { "ftp-external-path", 1, NULL, 'E' }, - { "ftp-gridmap", 1, NULL, 'G' }, - { NULL, 0, NULL, 0 } -}; - -/* obsolete */ -#if 0 -static struct { - glite_jp_fileclass_t type; - char * fname; - } class_to_fname_tab[] = { - { GLITE_JP_FILECLASS_INPUT, "input" }, - { GLITE_JP_FILECLASS_OUTPUT, "output" }, - { GLITE_JP_FILECLASS_LBLOG, "lblog" }, - { GLITE_JP_FILECLASS_TAGS, "tags" }, - { GLITE_JP_FILECLASS_UNDEF, NULL } - }; - -static char *class_to_fname(glite_jp_fileclass_t type) -{ - int i; - - for (i = 0; class_to_fname_tab[i].type != GLITE_JP_FILECLASS_UNDEF; i++) - if (type == class_to_fname_tab[i].type) - return class_to_fname_tab[i].fname; - - return NULL; -} - -static glite_jp_fileclass_t fname_to_class(char* fname) -{ - int i; - - for (i = 0; class_to_fname_tab[i].type != GLITE_JP_FILECLASS_UNDEF; i++) - if (!strcmp(fname, class_to_fname_tab[i].fname)) - return class_to_fname_tab[i].type; - - return GLITE_JP_FILECLASS_UNDEF; -} -#endif - -static int config_check( - glite_jp_context_t ctx, - struct ftpbe_config *config) -{ - return config == NULL || - config->internal_path == NULL || - config->external_path == NULL || - config->gridmap == NULL || - config->logname == NULL; - - /* XXX check reality */ -} - -static int jobid_unique_pathname(glite_jp_context_t ctx, const char *job, - char **unique, char **ju_path, int get_path) -{ - char *p; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - p = strrchr(job, '/'); - if (!p) { - err.code = EINVAL; - err.desc = "Malformed jobid"; - return glite_jp_stack_error(ctx,&err); - } - /* XXX thorough checks */ - if (!(*unique = strdup(p+1))) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - if (get_path) { - if (!(*ju_path = strdup(p+1))) { - free(*unique); - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - *(*ju_path + 10) = '\0'; - } - return 0; -} - -static int mkdirpath(const char* path, int prefixlen) -{ - char *wpath, *p; - int goout, ret; - - wpath = strdup(path); - if (!wpath) { - errno = ENOMEM; - return -1; - } - - p = wpath + prefixlen; - goout = 0; - while (!goout) { - while (*p == '/') p++; - while (*p != '/' && *p != '\0') p++; - goout = (*p == '\0'); - *p = '\0'; - ret = mkdir(wpath, S_IRUSR | S_IWUSR | S_IXUSR); - if (ret < 0 && errno != EEXIST) break; - *p = '/'; - } - free(wpath); - return goout ? 0 : ret; -} - -static long regtime_trunc(long tv_sec) -{ - return tv_sec / (86400*7); -} - -static long regtime_ceil(long tv_sec) -{ - return (tv_sec % (86400*7)) ? tv_sec/(86400*7)+1 : tv_sec/(86400*7) ; -} - -/********************************************************************************/ -int glite_jppsbe_init( - glite_jp_context_t ctx, - int argc, - char *argv[] -) -{ - glite_jp_error_t err; - int opt; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - config = (struct ftpbe_config *) calloc(1, sizeof *config); - if (!config) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - - config->logname = getlogin(); - - while ((opt = getopt_long(argc, argv, "I:E:G:", ftpbe_opts, NULL)) != EOF) { - switch (opt) { - case 'I': config->internal_path = optarg; break; - case 'E': config->external_path = optarg; break; - case 'G': config->gridmap = optarg; break; - default: break; - } - } - - if (config_check(ctx, config)) { - err.code = EINVAL; - err.desc = "Invalid FTP backend configuration"; - return glite_jp_stack_error(ctx,&err); - } - - return 0; -} - -int glite_jppsbe_init_slave( - glite_jp_context_t ctx -) -{ - /* Nothing to do */ -} - -int glite_jppsbe_register_job( - glite_jp_context_t ctx, - const char *job, - const char *owner -) -{ - glite_jp_error_t err; - char *int_dir = NULL; - char *int_fname = NULL; - char *data_dir = NULL; - char *data_fname = NULL; - char *ju = NULL; - char *ju_path = NULL; - char *ownerhash = NULL; - FILE *regfile = NULL; - struct timeval reg_tv; - long reg_tv_trunc; - struct stat statbuf; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job != NULL); - assert(owner != NULL); - - gettimeofday(®_tv, NULL); - reg_tv_trunc = regtime_trunc(reg_tv.tv_sec); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_dir, "%s/regs/%s", - config->internal_path, ju_path) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - - if (mkdirpath(int_dir, strlen(config->internal_path)) < 0 && - errno != EEXIST) { - free(int_dir); - err.code = errno; - err.desc = "Cannot mkdir jobs's reg directory"; - return glite_jp_stack_error(ctx,&err); - } - free(int_dir); - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - - if (stat(int_fname, &statbuf) < 0) { - if (errno != ENOENT) { - err.code = errno; - err.desc = "Cannot stat jobs's reg info file"; - goto error_out; - } - } else { - err.code = EEXIST; - err.desc = "Job already registered"; - goto error_out; - } - - regfile = fopen(int_fname, "w"); - if (regfile == NULL) { - err.code = errno; - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - - ownerhash = str2md5(owner); /* static buffer */ - - if (fprintf(regfile, "%d %ld.%06ld %s %s %d %s\n", 1, - (long)reg_tv.tv_sec, (long)reg_tv.tv_usec, job, - ownerhash, strlen(owner), owner) < 1 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot write jobs's reg info file"; - goto error_out; - } - if (fclose(regfile) != 0 ) { - err.code = errno; - err.desc = "Cannot close(write) jobs's reg info file"; - goto error_out; - } - - if (asprintf(&data_dir, "%s/data/%s/%d/%s", - config->internal_path, ownerhash, regtime_trunc(reg_tv.tv_sec), ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - if (asprintf(&data_fname, "%s/_info", data_dir) == -1) { - err.code = ENOMEM; - goto error_out; - } - if (mkdirpath(data_dir, strlen(config->internal_path)) < 0 && - errno != EEXIST) { - err.code = errno; - err.desc = "Cannot mkdir jobs's data directory"; - goto error_out; - } - - if (link(int_fname, data_fname) < 0) { - err.code = errno; - err.desc = "Cannot link job's reg and data info files"; - goto error_out; - } - -error_out: - free(int_fname); - free(data_fname); - if (err.code && data_dir) rmdir(data_dir); - free(data_dir); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -static int add_to_gridmap(glite_jp_context_t ctx, const char *dn) -{ - FILE *gridmap = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - gridmap = fopen(config->gridmap, "a"); - if (!gridmap) { - err.code = errno; - err.desc = "Cannot open gridmap file"; - return glite_jp_stack_error(ctx,&err); - } - if (fprintf(gridmap, "\"%s\" %s\n", dn, config->logname) < 6 || - ferror(gridmap)) { - err.code = EIO; - err.desc = "Cannot write to gridmap file"; - fclose(gridmap); - return glite_jp_stack_error(ctx,&err); - } - fclose(gridmap); - return 0; -} - -static int remove_from_gridmap(glite_jp_context_t ctx, const char *dn) -{ - FILE *gridmap = NULL; - char *temp_name = NULL; - FILE *temp_file = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - /* XXX */ - return 0; -} - -int glite_jppsbe_start_upload( - glite_jp_context_t ctx, - const char *job, - const char *class, - const char *name, /* TODO */ - const char *content_type, - char **destination_out, - time_t *commit_before_inout -) -{ - char *int_fname = NULL; - char *lock_fname = NULL; - FILE *lockfile = NULL; - FILE *regfile = NULL; - char *data_dir = NULL; - char *data_lock = NULL; - char *ju = NULL; - char *ju_path = NULL; - char *peername = NULL; - int info_version; - long reg_time; - char ownerhash[33]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job!=NULL); - assert(destination_out!=NULL); - - assert(class!=NULL); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - peername = glite_jp_peer_name(ctx); - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%*ld %*s %s ", &info_version, - ®_time, ownerhash) < 3 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - fclose(regfile); - - /* XXX authorization */ - - if (asprintf(&data_dir, "%s/data/%s/%d/%s", - config->internal_path, ownerhash, regtime_trunc(reg_time), ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - - if (asprintf(&lock_fname, "%s/%s" LOCK_SUFFIX, - data_dir, class) == -1) { - err.code = ENOMEM; - goto error_out; - } - - if (commit_before_inout != NULL) - *commit_before_inout = (time_t) LONG_MAX; /* XXX no timeout enforced */ - - lockfile = fopen(lock_fname, "w"); - if (lockfile == NULL) { - err.code = errno; - err.desc = "Cannot open uploads's lock file"; - goto error_out; - } - - if (fprintf(lockfile, "%ld %d %s\n", (long)*commit_before_inout, - peername ? peername : 0, - peername ? peername : "") < 1 || ferror(regfile)) { - fclose(lockfile); - err.code = errno; - err.desc = "Cannot write upload's lock file"; - goto error_out; - } - if (fclose(lockfile) != 0 ) { - err.code = errno; - err.desc = "Cannot close(write) upload's lock file"; - goto error_out; - } - - if (asprintf(destination_out, "%s/data/%s/%d/%s/%s" UPLOAD_SUFFIX, - config->external_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) { - err.code = ENOMEM; - goto error_out; - } - - if (add_to_gridmap(ctx, peername)) { - err.code = EIO; - err.desc = "Cannot add peer DN to ftp server authorization file"; - goto error_out; - } - -error_out: - free(int_fname); - free(data_dir); - if (err.code && data_lock) unlink(data_lock); - free(data_lock); - free(ju); free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_commit_upload( - glite_jp_context_t ctx, - const char *destination -) -{ - size_t dest_len; - size_t suff_len; - size_t extp_len; - long commit_before; - int lockpeerlen; - char *lockpeername = NULL; - char *peername = NULL; - char *dest_rw = NULL; - char *dest_rw_suff = NULL; - char *dest_rw_lock = NULL; - FILE *lockfile = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(destination != NULL); - - suff_len = strlen(UPLOAD_SUFFIX); - dest_len = strlen(destination); - extp_len = strlen(config->external_path); - - if (dest_len < suff_len || - strcmp(UPLOAD_SUFFIX, destination + (dest_len - suff_len)) || - strncmp(destination, config->external_path, extp_len)) { - err.code = EINVAL; - err.desc = "Forged destination path"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&dest_rw_suff, "%s%s", config->internal_path, - destination + extp_len) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - dest_rw = strdup(dest_rw_suff); - if (!dest_rw) { - err.code = ENOMEM; - goto error_out; - } - *(dest_rw + (strlen(dest_rw_suff) - suff_len)) = '\0'; - - if (asprintf(&dest_rw_lock, "%s" LOCK_SUFFIX, dest_rw) == -1) { - err.code = ENOMEM; - goto error_out; - } - - lockfile = fopen(dest_rw_lock, "r"); - if (lockfile == NULL) { - err.code = errno; - err.desc = "Cannot open upload's lock file"; - goto error_out; - } - if (fscanf(lockfile, "%ld %d ", &commit_before, &lockpeerlen) < 2 || ferror(lockfile)) { - fclose(lockfile); - err.code = errno; - err.desc = "Cannot read upload's lock file"; - goto error_out; - } - if (lockpeerlen) { - lockpeername = (char*) calloc(1, lockpeerlen+1); - if (!lockpeername) { - err.code = ENOMEM; - goto error_out; - } - if (fgets(lockpeername, lockpeerlen+1, lockfile) == NULL) { - fclose(lockfile); - err.code = errno; - err.desc = "Cannot read upload's lock file"; - goto error_out; - } - } - fclose(lockfile); - - peername = glite_jp_peer_name(ctx); - if (lockpeername && (!peername || strcmp(lockpeername, peername))) { - err.code = EPERM; - err.desc = "Upload started by client of different identity"; - goto error_out; - } - - if (rename(dest_rw_suff, dest_rw) < 0) { - err.code = errno; - err.desc = "Cannot move upload file to the final place"; - goto error_out; - } - - if (unlink(dest_rw_lock) < 0) { - err.code = errno; - err.desc = "Cannot unlink upload's lock file"; - goto error_out; - } - -error_out: - free(dest_rw); - free(dest_rw_suff); - free(dest_rw_lock); - free(peername); - free(lockpeername); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_destination_info( - glite_jp_context_t ctx, - const char *destination, - char **job, - char **class, - char **name -) -{ - size_t dest_len; - size_t suff_len; - size_t extp_len; - char *dest_rw = NULL; - char *dest_rw_suff = NULL; - char *dest_rw_info = NULL; - FILE *infofile = NULL; - char *classname = NULL; - char jobstr[256+1]; - glite_jp_error_t err; - - assert(destination != NULL); - assert(job != NULL); - assert(class != NULL); - assert(name != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - suff_len = strlen(UPLOAD_SUFFIX); - dest_len = strlen(destination); - extp_len = strlen(config->external_path); - - if (dest_len < suff_len || - strcmp(UPLOAD_SUFFIX, destination + (dest_len - suff_len)) || - strncmp(destination, config->external_path, extp_len)) { - err.code = EINVAL; - err.desc = "Forged destination path"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&dest_rw_suff, "%s%s", config->internal_path, - destination + extp_len) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - dest_rw = strdup(dest_rw_suff); - if (!dest_rw) { - err.code = ENOMEM; - goto error_out; - } - *(dest_rw + (strlen(dest_rw_suff) - suff_len)) = '\0'; - - classname = strrchr(dest_rw,'/'); - if (classname == NULL) { - err.code = EINVAL; - err.desc = "Forged destination path"; - goto error_out; - } - *classname++ ='\0'; - *class = strdup(classname); - -/* XXX: do we need similar check? - if (!class == GLITE_JP_FILECLASS_UNDEF) { - err.code = EINVAL; - err.desc = "Forged destination path"; - goto error_out; - } -*/ - - /* TODO: */ - *name = NULL; - - if (asprintf(&dest_rw_info, "%s/_info", dest_rw) == -1) { - err.code = ENOMEM; - goto error_out; - } - - infofile = fopen(dest_rw_info, "r"); - if (infofile == NULL) { - err.code = errno; - err.desc = "Cannot open _info file"; - goto error_out; - } - if (fscanf(infofile, "%*d %*ld.%*ld %256s ", jobstr) < 1 || ferror(infofile)) { - fclose(infofile); - err.code = errno; - err.desc = "Cannot read _info file"; - goto error_out; - } - *job = strdup(jobstr); - fclose(infofile); - -error_out: - free(dest_rw); - free(dest_rw_suff); - free(dest_rw_info); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - - -int glite_jppsbe_get_job_url( - glite_jp_context_t ctx, - const char *job, - const char *class, - const char *name, /* TODO */ - char **url_out -) -{ - FILE *regfile = NULL; - char *int_fname = NULL; - char *ju = NULL; - char *ju_path = NULL; - int info_version; - long reg_time; - char ownerhash[33]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job!=NULL); - assert(url_out != NULL); - - assert(class!=NULL); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%*ld %*s %s", &info_version, - ®_time, ownerhash) < 3 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - fclose(regfile); - - if (asprintf(url_out, "%s/data/%s/%d/%s/%s", - config->external_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) { - err.code = ENOMEM; - goto error_out; - } - -error_out: - free(int_fname); - free(ju); free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -static int get_job_fname( - glite_jp_context_t ctx, - const char *job, - const char *class, - const char *name, /* TODO */ - char **fname_out -) -{ - FILE *regfile = NULL; - char *int_fname = NULL; - char *ju = NULL; - char *ju_path = NULL; - int info_version; - long reg_time; - char ownerhash[33]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job!=NULL); - assert(fname_out != NULL); - - assert(class!=NULL); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%*ld %*s %s", &info_version, - ®_time, ownerhash) < 3 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - fclose(regfile); - - if (asprintf(fname_out, "%s/data/%s/%d/%s/%s", - config->internal_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) { - err.code = ENOMEM; - goto error_out; - } - -error_out: - free(int_fname); - free(ju); free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_open_file( - glite_jp_context_t ctx, - const char *job, - const char *class, - const char *name, /* TODO */ - int mode, - void **handle_out -) -{ - fhandle handle = NULL; - char* fname = NULL; - glite_jp_error_t err; - - assert(handle_out != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (get_job_fname(ctx, job, class, name, &fname)) { - err.code = ctx->error->code; - err.desc = "Cannot construct internal filename"; - return glite_jp_stack_error(ctx,&err); - } - - handle = (fhandle) calloc(1,sizeof(*handle)); - if (handle == NULL) { - err.code = ENOMEM; - goto error_out; - } - - handle->fd = open(fname, mode, S_IRUSR | S_IWUSR); - if (handle->fd < 0) { - err.code = errno; - err.desc = "Cannot open requested file"; - free(handle); - goto error_out; - } - handle->fd_append = open(fname, mode | O_APPEND, S_IRUSR | S_IWUSR); - if (handle->fd_append < 0) { - err.code = errno; - err.desc = "Cannot open requested file for append"; - close(handle->fd); - free(handle); - goto error_out; - } - *handle_out = (void*) handle; - -error_out: - free(fname); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_close_file( - glite_jp_context_t ctx, - void *handle -) -{ - glite_jp_error_t err; - - assert(handle != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (close(((fhandle)handle)->fd_append) < 0) { - err.code = errno; - err.desc = "Error closing file descriptor (fd_append)"; - goto error_out; - } - if (close(((fhandle)handle)->fd) < 0) { - err.code = errno; - err.desc = "Error closing file descriptor"; - goto error_out; - } - -error_out: - free(handle); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_pread( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes, - off_t offset, - ssize_t *nbytes_ret -) -{ - ssize_t ret; - glite_jp_error_t err; - - assert(handle != NULL); - assert(buf != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if ((ret = pread(((fhandle)handle)->fd, buf, nbytes, offset)) < 0) { - err.code = errno; - err.desc = "Error in pread()"; - return glite_jp_stack_error(ctx,&err); - } - *nbytes_ret = ret; - - return 0; -} - -int glite_jppsbe_pwrite( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes, - off_t offset -) -{ - glite_jp_error_t err; - - assert(handle != NULL); - assert(buf != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (pwrite(((fhandle)handle)->fd, buf, nbytes, offset) < 0) { - err.code = errno; - err.desc = "Error in pwrite()"; - return glite_jp_stack_error(ctx,&err); - } - - return 0; -} - -int glite_jppsbe_append( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes -) -{ - glite_jp_error_t err; - - assert(handle != NULL); - assert(buf != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (write(((fhandle)handle)->fd_append, buf, nbytes) < 0) { - err.code = errno; - err.desc = "Error in write()"; - return glite_jp_stack_error(ctx,&err); - } - - return 0; -} - -static int get_job_info( - glite_jp_context_t ctx, - const char *job, - char **owner, - struct timeval *tv_reg -) -{ - char *ju = NULL; - char *ju_path = NULL; - FILE *regfile = NULL; - long reg_time_sec; - long reg_time_usec; - int ownerlen = 0; - int info_version; - char *int_fname = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%ld %*s %*s %d ", &info_version, - ®_time_sec, ®_time_usec, &ownerlen) < 4 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - if (ownerlen) { - *owner = (char *) calloc(1, ownerlen+1); - if (!*owner) { - err.code = ENOMEM; - goto error_out; - } - if (fgets(*owner, ownerlen+1, regfile) == NULL) { - fclose(regfile); - free(*owner); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - } - fclose(regfile); - - tv_reg->tv_sec = reg_time_sec; - tv_reg->tv_usec = reg_time_usec; - -error_out: - free(int_fname); - free(ju); - free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -static int get_job_info_int( - glite_jp_context_t ctx, - const char *int_fname, - char **jobid, - char **owner, - struct timeval *tv_reg -) -{ - FILE *regfile = NULL; - long reg_time_sec; - long reg_time_usec; - int ownerlen = 0; - int info_version; - char jobid_buf[256]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%ld %s %*s %d ", &info_version, - ®_time_sec, ®_time_usec, jobid_buf, &ownerlen) < 5 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - *jobid = strdup(jobid_buf); - if (ownerlen) { - *owner = (char *) calloc(1, ownerlen+1); - if (!*owner) { - err.code = ENOMEM; - goto error_out; - } - if (fgets(*owner, ownerlen+1, regfile) == NULL) { - fclose(regfile); - free(*owner); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - } - fclose(regfile); - - tv_reg->tv_sec = reg_time_sec; - tv_reg->tv_usec = reg_time_usec; - -error_out: - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_get_job_metadata( - glite_jp_context_t ctx, - const char *job, - glite_jp_attrval_t attrs_inout[] -) -{ - int got_info = 0; - struct timeval tv_reg; - char *owner = NULL; - int got_tags = 0; - void *tags_handle = NULL; - glite_jp_tagval_t* tags = NULL; - int i,j; - glite_jp_error_t err; - - assert(job != NULL); - assert(attrs_inout != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - for (i = 0; attrs_inout[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (attrs_inout[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - -/* must be implemented via filetype plugin - case GLITE_JP_ATTR_TIME: -*/ - if (!got_info) { - if (get_job_info(ctx, job, &owner, &tv_reg)) { - err.code = ctx->error->code; - err.desc = "Cannot retrieve job info"; - goto error_out; - } - got_info = 1; - } - break; - -/* must be implemented via filetype plugin - case GLITE_JP_ATTR_TAG: - if (!got_tags) { - if (glite_jppsbe_open_file(ctx, job, GLITE_JP_FILECLASS_TAGS, - O_RDONLY, &tags_handle)) { - err.code = ctx->error->code; - err.desc = "Cannot open tag file"; - goto error_out; - } - if (glite_jpps_tag_readall(ctx, tags_handle, &tags)) { - err.code = ctx->error->code; - err.desc = "Cannot read tags"; - glite_jppsbe_close_file(ctx, tags_handle); - goto error_out; - } - glite_jppsbe_close_file(ctx, tags_handle); - got_tags = 1; - } - break; -*/ - default: - err.code = EINVAL; - err.desc = "Invalid attribute type"; - goto error_out; - break; - } - - switch (attrs_inout[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - attrs_inout[i].value.s = strdup(owner); - if (!attrs_inout[i].value.s) { - err.code = ENOMEM; - err.desc = "Cannot copy owner string"; - goto error_out; - } - break; - case GLITE_JP_ATTR_TIME: - attrs_inout[i].value.time = tv_reg; - break; - -/* must be implemented via filetype plugin - case GLITE_JP_ATTR_TAG: - for (j = 0; tags[j].name != NULL; j++) { - if (!strcmp(tags[j].name, attrs_inout[i].attr.name)) { - if (glite_jpps_tagval_copy(ctx, &tags[j], - &attrs_inout[i].value.tag)) { - err.code = ENOMEM; - err.desc = "Cannot copy tag value"; - goto error_out; - } - break; - } - } - if (!tags[j].name) attrs_inout[i].value.tag.name = NULL; - break; -*/ - default: - break; - } - } - -error_out: - free(owner); - if (tags) for (j = 0; tags[j].name != NULL; j++) { - free(tags[j].name); - free(tags[j].value); - } - free(tags); - - if (err.code) { - while (i > 0) { - i--; - switch (attrs_inout[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - free(attrs_inout[i].value.s); - break; - case GLITE_JP_ATTR_TAG: - free(attrs_inout[i].value.tag.name); - free(attrs_inout[i].value.tag.value); - default: - break; - } - } - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} -static int compare_timeval(struct timeval a, struct timeval b) -{ - if (a.tv_sec < b.tv_sec) return -1; - if (a.tv_sec > b.tv_sec) return 1; - if (a.tv_usec < b.tv_usec) return -1; - if (a.tv_usec > b.tv_usec) return 1; - return 0; -} - - -/* FIXME: disabled -- clarification wrt. filetype plugin needed */ - -#if 0 - -static int query_phase2( - glite_jp_context_t ctx, - const char *ownerhash, - long regtime_tr, - int q_tags, - int md_tags, - const glite_jp_query_rec_t query[], - glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -); - -static int query_phase2( - glite_jp_context_t ctx, - const char *ownerhash, - long regtime_tr, - int q_tags, - int md_tags, - const glite_jp_query_rec_t query[], - glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -) -{ - char *time_dirname = NULL; - DIR *time_dirp = NULL; - struct dirent *jobent; - char *info_fname = NULL; - char *jobid = NULL; - char *owner = NULL; - struct timeval tv_reg; - void *tags_handle = NULL; - int matching; - int i, j; - glite_jp_tagval_t* tags = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (asprintf(&time_dirname, "%s/data/%s/%d", config->internal_path, - ownerhash, regtime_tr) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - time_dirp = opendir(time_dirname); - if (!time_dirp) { - free(time_dirname); - return 0; /* found nothing */ - } - while ((jobent = readdir(time_dirp)) != NULL) { - if (!strcmp(jobent->d_name, ".")) continue; - if (!strcmp(jobent->d_name, "..")) continue; - if (asprintf(&info_fname, "%s/%s/_info", time_dirname, - jobent->d_name) == -1) { - err.code = ENOMEM; - goto error_out; - } - if (get_job_info_int(ctx, info_fname, &jobid, &owner, &tv_reg)) { - err.code = EIO; - err.desc = "Cannot retrieve job info"; - goto error_out; - } - if (q_tags || md_tags) { - if (glite_jppsbe_open_file(ctx, jobid, GLITE_JP_FILECLASS_TAGS, - O_RDONLY, &tags_handle)) { - err.code = ctx->error->code; - err.desc = "Cannot open tag file"; - goto error_out; - } - if (glite_jpps_tag_readall(ctx, tags_handle, &tags)) { - err.code = ctx->error->code; - err.desc = "Cannot read tags"; - glite_jppsbe_close_file(ctx, tags_handle); - goto error_out; - } - glite_jppsbe_close_file(ctx, tags_handle); - tags_handle = NULL; - } - - matching = 1; - for (i = 0; matching && query[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (query[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - if (query[i].value.s == NULL || - strcmp(query[i].value.s, owner)) matching = 0; - break; - case GLITE_JP_ATTR_TIME: - switch (query[i].op) { - case GLITE_JP_QUERYOP_EQUAL: - matching = !compare_timeval(tv_reg, query[i].value.time); - break; - case GLITE_JP_QUERYOP_UNEQUAL: - matching = compare_timeval(tv_reg, query[i].value.time); - break; - case GLITE_JP_QUERYOP_LESS: - matching = compare_timeval(tv_reg, query[i].value.time) < 0; - break; - case GLITE_JP_QUERYOP_GREATER: - matching = compare_timeval(tv_reg, query[i].value.time) > 0; - break; - case GLITE_JP_QUERYOP_WITHIN: - matching = compare_timeval(tv_reg, query[i].value.time) >= 0 - && compare_timeval(tv_reg, query[i].value2.time) <= 0; - break; - } - break; - case GLITE_JP_ATTR_TAG: - if (!tags) { - matching = 0; - break; - } - for (j = 0; tags[j].name != NULL; j++) { - if (!strcmp(tags[j].name, query[i].attr.name)) { - switch (query[i].op) { - case GLITE_JP_QUERYOP_EQUAL: - matching = !strcmp(tags[j].value, query[i].value.s); - break; - case GLITE_JP_QUERYOP_UNEQUAL: - matching = strcmp(tags[j].value, query[i].value.s); - break; - case GLITE_JP_QUERYOP_LESS: - matching = strcmp(tags[j].value, query[i].value.s) < 0; - break; - case GLITE_JP_QUERYOP_GREATER: - matching = strcmp(tags[j].value, query[i].value.s) > 0; - break; - case GLITE_JP_QUERYOP_WITHIN: - matching = strcmp(tags[j].value, query[i].value.s) >= 0 \ - && strcmp(tags[j].value, query[i].value2.s) <= 0 ; - break; - default: - break; - } - } - } - break; - default: - break; - } - } - if (!matching) { - free(info_fname); info_fname = NULL; - free(jobid); jobid = NULL; - if (tags) for (j = 0; tags[j].name != NULL; j++) { - free(tags[j].name); - free(tags[j].value); - } - free(tags); tags = NULL; - continue; - } - - for (i = 0; metadata[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - metadata[i].value.s = owner; - break; - case GLITE_JP_ATTR_TIME: - metadata[i].value.time = tv_reg; - break; - case GLITE_JP_ATTR_TAG: - for (j = 0; tags[j].name != NULL; j++) { - if (!strcmp(tags[j].name, metadata[i].attr.name)) { - if (glite_jpps_tagval_copy(ctx, &tags[j], - &metadata[i].value.tag)) { - err.code = ENOMEM; - err.desc = "Cannot copy tag value"; - goto error_out; - } - break; - } - } - if (!tags[j].name) { - metadata[i].value.tag.name = NULL; - metadata[i].value.tag.value = NULL; - } - break; - default: - break; - } - } - (*callback)(ctx, jobid, metadata); - free(jobid); jobid = NULL; - while (i > 0) { - i--; - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_TAG: - free(metadata[i].value.tag.name); - free(metadata[i].value.tag.value); - default: - break; - } - } - } - -error_out: - if (tags) for (j = 0; tags[j].name != NULL; j++) { - free(tags[j].name); - free(tags[j].value); - } - if (tags_handle) glite_jppsbe_close_file(ctx, tags_handle); - free(info_fname); - free(owner); - free(jobid); - closedir(time_dirp); - free(time_dirname); - if (err.code) { - while (i > 0) { - i--; - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_TAG: - free(metadata[i].value.tag.name); - free(metadata[i].value.tag.value); - default: - break; - } - } - return glite_jp_stack_error(ctx,&err); - } else - return 0; -} - -int glite_jppsbe_query( - glite_jp_context_t ctx, - const glite_jp_query_rec_t query[], - const glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -) -{ - /* XXX clone metadata */ - int i; - char *q_exact_owner = NULL; - char *ownerhash = NULL; - long q_min_time = 0; - long q_max_time = LONG_MAX; - long q_min_time_tr; - long q_max_time_tr; - int q_with_tags = 0; - int md_info = 0; - int md_tags = 0; - char *owner_dirname = NULL; - DIR *owner_dirp = NULL; - struct dirent *ttimeent; - char *data_dirname = NULL; - DIR *data_dirp = NULL; - struct dirent *ownerent; - long ttime = 0; - glite_jp_attrval_t *metadata_templ = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - for (i = 0; query[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - if (query[i].attr.type == GLITE_JP_ATTR_OWNER && query[i].op == GLITE_JP_QUERYOP_EQUAL) { - q_exact_owner = query[i].value.s; - } - if (query[i].attr.type == GLITE_JP_ATTR_TIME) { - switch (query[i].op) { - case GLITE_JP_QUERYOP_EQUAL: - q_min_time = query[i].value.time.tv_sec; - q_max_time = query[i].value.time.tv_sec + 1; - break; - case GLITE_JP_QUERYOP_LESS: - if (q_max_time > query[i].value.time.tv_sec + 1) - q_max_time = query[i].value.time.tv_sec + 1; - break; - case GLITE_JP_QUERYOP_WITHIN: - if (q_max_time > query[i].value2.time.tv_sec + 1) - q_max_time = query[i].value2.time.tv_sec + 1; - /* fallthrough */ - case GLITE_JP_QUERYOP_GREATER: - if (q_min_time < query[i].value.time.tv_sec) - q_min_time = query[i].value.time.tv_sec; - break; - default: - err.code = EINVAL; - err.desc = "Invalid query op"; - return glite_jp_stack_error(ctx,&err); - break; - } - } - if (query[i].attr.type == GLITE_JP_ATTR_TAG) - q_with_tags = 1; - - } - - for (i = 0; metadata[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TIME: - md_info = 1; - break; - case GLITE_JP_ATTR_TAG: - md_tags = 1; - break; - default: - err.code = EINVAL; - err.desc = "Invalid attribute type in metadata parameter"; - return glite_jp_stack_error(ctx,&err); - break; - } - } - metadata_templ = (glite_jp_attrval_t *) calloc(i + 1, sizeof(glite_jp_attrval_t)); - if (!metadata_templ) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - memcpy(metadata_templ, metadata, (i + 1) * sizeof(glite_jp_attrval_t)); - - q_min_time_tr = regtime_trunc(q_min_time); - q_max_time_tr = regtime_ceil(q_max_time); - - if (q_exact_owner) { - ownerhash = str2md5(q_exact_owner); /* static buffer */ - if (asprintf(&owner_dirname, "%s/data/%s", config->internal_path, ownerhash) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - owner_dirp = opendir(owner_dirname); - free(owner_dirname); - if (!owner_dirp) { - free(metadata_templ); - return 0; /* found nothing */ - } - while ((ttimeent = readdir(owner_dirp)) != NULL) { - if (!strcmp(ttimeent->d_name, ".")) continue; - if (!strcmp(ttimeent->d_name, "..")) continue; - ttime = atol(ttimeent->d_name); - if (ttime >= q_min_time_tr && ttime < q_max_time_tr) { - if (query_phase2(ctx, ownerhash, ttime, q_with_tags, md_tags, - query, metadata_templ, callback)) { - err.code = EIO; - err.desc = "query_phase2() error"; - goto error_out; - } - } - } - } else { /* !q_exact_owner */ - if (asprintf(&data_dirname, "%s/data", config->internal_path) == -1) { - err.code = ENOMEM; - goto error_out; - } - data_dirp = opendir(data_dirname); - if (!data_dirp) { - err.code = EIO; - err.desc = "Cannot open data directory"; - goto error_out; - } - while ((ownerent = readdir(data_dirp)) != NULL) { - if (!strcmp(ownerent->d_name, ".")) continue; - if (!strcmp(ownerent->d_name, "..")) continue; - if (asprintf(&owner_dirname, "%s/data/%s", config->internal_path, - ownerent->d_name) == -1) { - err.code = ENOMEM; - goto error_out; - } - owner_dirp = opendir(owner_dirname); - free(owner_dirname); - if (!owner_dirp) { - err.code = EIO; - err.desc = "Cannot open owner data directory"; - goto error_out; - } - while ((ttimeent = readdir(owner_dirp)) != NULL) { - if (!strcmp(ttimeent->d_name, ".")) continue; - if (!strcmp(ttimeent->d_name, "..")) continue; - ttime = atol(ttimeent->d_name); - if (ttime >= q_min_time_tr && ttime < q_max_time_tr) { - if (query_phase2(ctx, ownerent->d_name, ttime, q_with_tags, md_tags, - query, metadata_templ, callback)) { - err.code = EIO; - err.desc = "query_phase2() error"; - goto error_out; - } - } - } - closedir(owner_dirp); owner_dirp = NULL; - } - closedir(data_dirp); data_dirp = NULL; - } - return 0; - -error_out: - if (owner_dirp) closedir(owner_dirp); - if (data_dirp) closedir(data_dirp); - free(data_dirname); - free(metadata_templ); - return glite_jp_stack_error(ctx,&err); -} - -#else - -/* placeholder instead */ -int glite_jppsbe_query( - glite_jp_context_t ctx, - const glite_jp_query_rec_t query[], - const glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -) -{ - glite_jp_error_t err; - err.code = ENOSYS; - err.desc = "not implemented"; - return glite_jp_stack_error(ctx,&err); -} - -#endif - -/* XXX: -- no primary authorization yet -- no concurrency control yet -- partial success in pwrite,append -- "unique" part of jobid is assumed to be unique across bookkeeping servers -- repository versioning not fully implemented yet -*/ diff --git a/org.glite.jp.primary/src/new_ftp_backend.c b/org.glite.jp.primary/src/new_ftp_backend.c index 5774b51..27da176 100644 --- a/org.glite.jp.primary/src/new_ftp_backend.c +++ b/org.glite.jp.primary/src/new_ftp_backend.c @@ -1784,7 +1784,10 @@ int glite_jppsbe_query( memset(metadata,0, sizeof metadata); /* XXX: const discarding is OK */ - for (i=0;attrs[i]; i++) metadata[i].name = (char *) attrs[i]; + for (i=0;attrs[i]; i++) { + assert(i<2); + metadata[i].name = (char *) attrs[i]; + } for (i=0; query[i].attr; i++) { char *qitem; diff --git a/org.glite.jp.primary/src/soap_ops.c b/org.glite.jp.primary/src/soap_ops.c index 97db1b1..e2bceaa 100644 --- a/org.glite.jp.primary/src/soap_ops.c +++ b/org.glite.jp.primary/src/soap_ops.c @@ -91,7 +91,6 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__RegisterJob( return SOAP_FAULT; } - memset(owner_val, 0, 2 * sizeof(glite_jp_attrval_t)); owner_val[0].name = GLITE_JP_ATTR_OWNER; owner_val[0].value = in->owner; owner_val[0].origin = GLITE_JP_ATTR_ORIG_SYSTEM; @@ -195,11 +194,22 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__RecordTag( CONTEXT_FROM_SOAP(soap,ctx); void *file_be,*file_p; glite_jpps_fplug_data_t **pd = NULL; - glite_jp_attrval_t attr[2]; + glite_jp_attrval_t attr[2], meta[2]; + file_be = file_p = NULL; - memset(attr, 0, 2 * sizeof(glite_jp_attrval_t)); + memset(meta,0,sizeof meta); + meta[0].name = strdup(GLITE_JP_ATTR_OWNER); + + if (glite_jppsbe_get_job_metadata(ctx,in->jobid,meta)) { + goto err; + } + + if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__RecordTag,in->jobid,meta[0].value)) { + goto err; + } + attr[0].name = in->tag->name; if (in->tag->value->string) { attr[0].value = in->tag->value->string; @@ -252,6 +262,10 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__RecordTag( free(pd); return SOAP_OK; +err: + glite_jp_attrval_free(meta,0); + err2fault(ctx,soap); + return SOAP_FAULT; } static void s2jp_qval(const struct jptype__stringOrBlob *in, char **value, int *binary, size_t *size) @@ -407,10 +421,22 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobFiles( glite_jp_error_t err; void **pd; struct jptype__jppsFile **f = NULL; + glite_jp_attrval_t meta[2]; memset(&err,0,sizeof err); out->__sizefiles = 0; + memset(meta,0,sizeof meta); + meta[0].name = strdup(GLITE_JP_ATTR_OWNER); + + if (glite_jppsbe_get_job_metadata(ctx,in->jobid,meta)) { + goto err; + } + + if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__GetJobFiles,in->jobid,meta[0].value)) { + goto err; + } + for (pd = ctx->plugins; *pd; pd++) { glite_jpps_fplug_data_t *plugin = *pd; @@ -454,6 +480,10 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobFiles( memcpy(out->files,f,out->__sizefiles * sizeof *f); return SOAP_OK; +err: + glite_jp_attrval_free(meta,0); + err2fault(ctx,soap); + return SOAP_FAULT; } SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobAttributes( @@ -461,11 +491,22 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobAttributes( struct _jpelem__GetJobAttributes *in, struct _jpelem__GetJobAttributesResponse *out) { - glite_jp_attrval_t *attr; + glite_jp_attrval_t *attr, meta[2]; int i,n; CONTEXT_FROM_SOAP(soap,ctx); + memset(meta,0,sizeof meta); + meta[0].name = strdup(GLITE_JP_ATTR_OWNER); + + if (glite_jppsbe_get_job_metadata(ctx,in->jobid,meta)) { + goto err; + } + + if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__GetJobAttributes,in->jobid,meta[0].value)) { + goto err; + } + if (glite_jpps_get_attrs(ctx,in->jobid, in->attributes, in->__sizeattributes,&attr)) { @@ -477,4 +518,8 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobAttributes( out->__sizeattrValues = jp2s_attrValues(soap,attr,&out->attrValues,1); return SOAP_OK; +err: + glite_jp_attrval_free(meta,0); + err2fault(ctx,soap); + return SOAP_FAULT; } diff --git a/org.glite.jp.ws-interface/src/JobProvenanceIS.xml b/org.glite.jp.ws-interface/src/JobProvenanceIS.xml index c811e69..702b127 100644 --- a/org.glite.jp.ws-interface/src/JobProvenanceIS.xml +++ b/org.glite.jp.ws-interface/src/JobProvenanceIS.xml @@ -83,25 +83,5 @@ Any error. - - - - Internal operation used for parsing XML config file. - Not called at all, only forcing gSoap to generate XML parsers. - - List of attributes which will JPPS send to JPIS. - - - List of indexed attributes which will JPPS send to JPIS. - - - List of type plugins. - - - List of requested feeds. - - Any error. - - diff --git a/org.glite.jp.ws-interface/src/ws_fault.c b/org.glite.jp.ws-interface/src/ws_fault.c new file mode 100644 index 0000000..2623ae9 --- /dev/null +++ b/org.glite.jp.ws-interface/src/ws_fault.c @@ -0,0 +1,125 @@ +#ident "$Header: " + +#include +#include +#include + +#define GSOAP_STRING(CHOICE) GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, string, stringOrBlob, 1) +#define GSOAP_BLOB(CHOICE) GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, blob, stringOrBlob, 1) +#define GSOAP_SETSTRING(CHOICE, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET(CHOICE, string, jptype, stringOrBlob, 1, VALUE) +#define GSOAP_SETBLOB(CHOICE, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET(CHOICE, blob, jptype, stringOrBlob, 1, VALUE) +#define GSOAP_ISSTRING(CHOICE) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE(CHOICE, string, jptype, stringOrBlob, 1) +#define GSOAP_ISBLOB(CHOICE) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE(CHOICE, blob, jptype, stringOrBlob, 1) + +#if GSOAP_VERSION >= 20709 + #define GFNUM SOAP_TYPE_jptype__genericFault +#else + #define GFNUM SOAP_TYPE__genericFault +#endif + +#ifndef dprintf +#define dprintf(FMT, ARGS...) printf(FMT, ##ARGS) +#endif + +static int glite_jp_clientCheckFault(struct soap *soap, int err, const char *name, int toSyslog) { + struct SOAP_ENV__Detail *detail; + struct jptype__genericFault *f; + char *reason,indent[200] = " "; + char *prefix; + int retval; + + if (name) asprintf(&prefix, "[%s] ", name); + else prefix = strdup(""); + retval = 0; + + switch(err) { + case SOAP_OK: + dprintf("%sOK\n", prefix); + break; + + case SOAP_FAULT: + case SOAP_SVR_FAULT: + detail = GLITE_SECURITY_GSOAP_DETAIL(soap); + reason = GLITE_SECURITY_GSOAP_REASON(soap); + dprintf("%s%s\n", prefix, reason); + if (toSyslog) syslog(LOG_ERR, "%s", reason); + + if (detail->__type != GFNUM && detail->__any) { + // compatibility with clients gSoaps < 2.7.9b + dprintf("%s%s%s\n", prefix, indent, detail->__any); + if (toSyslog) syslog(LOG_ERR, "%s", detail->__any); + + f = NULL; + } else { + // client is based on gSoap 2.7.9b + assert(detail->__type == GFNUM); +#if GSOAP_VERSION >= 20709 + f = (struct jptype__genericFault *)detail->fault; +#elif GSOAP_VERSION >= 20700 + f = ((struct _genericFault *)detail->fault)->jpelem__genericFault; +#else + f = ((struct _genericFault *)detail->value)->jpelem__genericFault; +#endif + } + + while (f) { + dprintf("%s%s%s: %s (%s)\n", + prefix, indent, + f->source, f->text, f->description); + if (toSyslog) syslog(LOG_ERR, "%s%s: %s (%s)", + reason, f->source, f->text, f->description); + f = f->reason; + strcat(indent," "); + } + retval = -1; + break; + + default: + soap_print_fault(soap,stderr); + retval = -1; + } + + free(prefix); + return retval; +} + + +static struct jptype__genericFault* jp2s_error(struct soap *soap, const glite_jp_error_t *err) +{ + struct jptype__genericFault *ret = NULL; + if (err) { + ret = soap_malloc(soap,sizeof *ret); + memset(ret,0,sizeof *ret); + ret->code = err->code; + ret->source = soap_strdup(soap,err->source); + ret->text = soap_strdup(soap,strerror(err->code)); + ret->description = soap_strdup(soap,err->desc); + ret->reason = jp2s_error(soap,err->reason); + } + return ret; +} + + +static void glite_jp_server_err2fault(const glite_jp_context_t ctx,struct soap *soap) +{ + struct SOAP_ENV__Detail *detail = soap_malloc(soap,sizeof *detail); +#if GSOAP_VERSION >= 20709 + struct jptype__genericFault *f; + f = jp2s_error(soap,ctx->error); +#else + struct _genericFault *f = soap_malloc(soap, sizeof *f); + f->jpelem__genericFault = jp2s_error(soap,ctx->error); +#endif + memset(detail, 0, sizeof(*detail)); +#if GSOAP_VERSION >= 20700 + detail->fault = (void *)f; +#else + detail->value = (void *)f; +#endif + detail->__type = GFNUM; + detail->__any = NULL; + + soap_receiver_fault(soap,"Oh, shit!",NULL); + if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail; + else soap->fault->detail = detail; +} diff --git a/org.glite.jp/build.xml b/org.glite.jp/build.xml index 3c54843..925b449 100644 --- a/org.glite.jp/build.xml +++ b/org.glite.jp/build.xml @@ -12,10 +12,6 @@ Revision history: $Log$ - Revision 1.11 2006/01/16 17:20:25 mmulac - merge from RC15 branch - - compiles - Revision 1.10.2.1 2005/10/20 06:55:15 zsalvet Add libtar and mysql external dependencies. @@ -216,7 +212,7 @@ - + @@ -234,7 +230,7 @@ - + @@ -252,13 +248,6 @@ - - - - - - - diff --git a/org.glite.jp/doc/install-guide/JP-install-guide.tex b/org.glite.jp/doc/install-guide/JP-install-guide.tex new file mode 100644 index 0000000..5e20c39 --- /dev/null +++ b/org.glite.jp/doc/install-guide/JP-install-guide.tex @@ -0,0 +1,107 @@ +\documentclass{egee} +\usepackage{comment,alltt} + +\def\LB{L\&B} + +\title{gLite Job Provenance Install Guide} +\author{CESNET EGEE JRA1 team} +\DocIdentifier{EGEE-JRA1-??} +\Date{\today} +\Activity{JRA1: Middleware Engineering and Integration} +\DocStatus{DRAFT} +\Dissemination{PUBLIC} +\DocumentLink{} +\Abstract{This install guide of the Job Provenance (JP) service is + intended as a detailed technical guide to the JP deployment process + (including all configuration tasks on related services). + For description of deployment modules please refer to the "gLite + install guide" document. + + Currently this document contains only description of LB-JP + interaction internals. +} + + +\def\todo#1{\textbf{TODO:} #1} + +\begin{document} + + +%\input{frontmatter} +%\newpage +\tableofcontents +\newpage + +\section{Logging and Bookeeping (LB) and Job Provenance (JP)} +On fig.~\ref{fig:LB-JP-interactions} are depicted data flows between +LB and JP services. These flows are numbered and you can use this +numbers to find additional information about each flow in +table~\ref{tab:LB-JP-interactions}. + +\begin{figure}[htpb] + \centering + \includegraphics[width=0.9\hsize]{LB-JP-interaction-details} + \caption{LB to JP interactions detail overview} + \label{fig:LB-JP-interactions} +\end{figure} + +\begin{table}[htpb] + \centering + \begin{tabular}{|c|l|l|p{9cm}|} + \hline + &spool directory&initiated by&description\\ + \hline + \hline + 1&lb.export.dump&lb-exporter&Export of LB job records into spool + directory. It use glite-lb-purge utility. LB-exporter reads this + spool directory + in a regular manner and implement next processing of LB dumps.\\ + \hline + 2&lb.export.jpreg&LB server&When new job come to the LB server + it stores its + registration into the spool directory. It is responsibility of + JP-importer process to handle such registrations.\\ + \hline + 3&lb.export.jpdump&lb-exporter&LB-exporter do its processing of + LB dumps and passes + on it to the JP-importer using the spool directory.\\ + \hline + 4&none&jp-importer&JP importer handles registrations received from LB + server and sends it to the JP primary server front-end (using its WS + interface).\\ + \hline + 5&none&jp-importer&JP importer handles LB dumps received from LB + exporter and sends it to the JP primary server back-end using its + gridftp interface.\\ + \hline + \end{tabular} + \caption{LB to JP data flows description} + \label{tab:LB-JP-interactions} +\end{table} + + +Notes: +\begin{itemize} + \item Only JP Primary Storage (JPPS) server is involved in described + data flows. JP Index Servers are not part of this picture (they are + feeded via corresponding JPPS). + \item Only flows number 4 and 5 are designed to be inter-host. All + the other interactions assume the components are on the same host and + do use access to a shared filesystem. + \item Data flow number 1 use glite-lb-purge utility (see its + documentation) and passes to it argument from lb.export.purgeargs + clause of the deployment configuration file. This argument contain + the timeouts controlling after how long period of time a job + staying in a terminal state is to be purged from the LB server. + \item The LB exporter have a feature to store LB job event dumps in a + directory for further handling (e.g. for job statistic tool). This behaviour + is controled by lb.export.jobs deployment config file clause (leave + this clause empty if you don't use dumps for futher handling). + \item The LB exporter also have a feature to keep all handled LB + dumps (in glite-lb-purge format) in filesystem. This feature is + controlled by lb.export.dump.keep. + \item LB exporter is not a deamon, it's periodic invocation is + provided by cron deamon. +\end{itemize} + +\end{document} diff --git a/org.glite.jp/doc/install-guide/LB-JP-interaction-guide.tex b/org.glite.jp/doc/install-guide/LB-JP-interaction-guide.tex index 14534fd..dc27de7 100644 --- a/org.glite.jp/doc/install-guide/LB-JP-interaction-guide.tex +++ b/org.glite.jp/doc/install-guide/LB-JP-interaction-guide.tex @@ -45,24 +45,24 @@ table~\ref{tab:LB-JP-interactions}. \begin{table}[htpb] \centering - \begin{tabular}{|c|l|l|p{9cm}|} + \begin{tabular}{|c|p{3cm}|l|p{9cm}|} \hline &spool directory&initiated by&description\\ \hline \hline - 1&lb.export.dump&lb-exporter&Export of LB job records into spool - directory. It use glite-lb-purge utility. LB-exporter reads this - spool directory - in a regular manner and implement next processing of LB dumps.\\ + 1&lb.export.dump, + lb.export.dump.keep&lb-exporter& + Export of LB job records into spool directory. It uses glite-lb-purge utility. LB-exporter reads this spool directory in a regular manner and implement next processing of LB dumps. Optionally it can keep handled dumps in lb.export.dump.keep.\\ \hline 2&lb.export.jpreg&LB server&When new job come to the LB server it stores its registration into the spool directory. It is responsibility of JP-importer process to handle such registrations.\\ \hline - 3&lb.export.jpdump&lb-exporter&LB-exporter do its processing of - LB dumps and passes - on it to the JP-importer using the spool directory.\\ + 3&lb.export.jpdump, + lb.export.jobs, + lb.export.jobs.keep&lb-exporter& + LB-exporter do its processing of LB dumps (they are in per job form) and passes on it to the JP-importer using the spool directory lb.export.jpdump and temporary storage lb.export.jobs. It can keep the job files for futher usage.\\ \hline 4&none&jp-importer&JP importer handles registrations received from LB server and sends it to the JP primary server front-end (using its WS @@ -93,7 +93,7 @@ Notes: staying in a terminal state is to be purged from the LB server. \item The LB exporter have a feature to store LB job event dumps in a directory for further handling (e.g. for job statistic tool). This behaviour - is controled by lb.export.jobs deployment config file clause (leave + is controled by lb.export.jobs.keep deployment config file clause (leave this clause empty if you don't use dumps for futher handling). \item The LB exporter also have a feature to keep all handled LB dumps (in glite-lb-purge format) in filesystem. This feature is diff --git a/org.glite.jp/doc/install-guide/glite_installation_guide_LB.doc b/org.glite.jp/doc/install-guide/glite_installation_guide_LB.doc index 42eb2e80ba01220a0ac22e6b6c401d624c9e13e7..8dcc46478bdbdd959e2078be3b1d0c79a8868be9 100755 GIT binary patch literal 174080 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�GE|oa1S(v=_!U86~cU37C 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 literal 309760 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 E0-)IsvH$=8 diff --git a/org.glite.jp/doc/testplan.tex b/org.glite.jp/doc/testplan.tex index 8dea285..b4a73d3 100644 --- a/org.glite.jp/doc/testplan.tex +++ b/org.glite.jp/doc/testplan.tex @@ -12,11 +12,11 @@ \Dissemination{PUBLIC} \DocumentLink{} -\def\req{\noindent\textbf{Prerequisities: }} -\def\how{\noindent\textbf{How to run: }} -\def\result{\noindent\textbf{Expected result: }} -\def\jpps{\noindent\textbf{JP PS log should contain: }} -\def\jpis{\noindent\textbf{JP IS log should contain: }} +\def\req{\noindent\textbf{Prerequisities:}} +\def\how{\noindent\textbf{How to run:}} +\def\result{\noindent\textbf{Expected result:}} +\def\jpps{\noindent\textbf{JP PS log should contain:}} +\def\jpis{\noindent\textbf{JP IS log should contain:}} \def\path#1{{\normalfont\textsf{#1}}} \def\code#1{\texttt{#1}} @@ -43,10 +43,9 @@ \item JPIS -- Job Provenance Index Server \end{itemize} -\todo{} \section{Test Coverage} -\todo{} +\todo{TBD} %\chapter{Test Cases} @@ -56,7 +55,7 @@ \subsubsection{Basic functionality} \label{regjob} -\req Running JPPS +\req\ Running JPPS \how \begin{itemize} @@ -74,16 +73,22 @@ $ jpps-test GetJobAttr JOBID http://egee.cesnet.cz/en/Schema/JP/System:owner \end{itemize} \result Should print the OWNER value supplied. - \subsubsection{AuthZ check} -\req JPPS running, a~job registered with the procedure in~\ref{regjob} -\how +\req\ JPPS running, a~job registered with the procedure in~\ref{regjob} + +\how\ Call GetJobAttributes using different user credentials -\result + +\result\ Should fail with ``Permission denied'' error \subsection{Tag recording} -\req JPPS running, a~job registered with the procedure in~\ref{regjob} +\label{tagreg} + +\subsubsection{Basic functionality} +\req\ +JPPS running, a~job registered with the procedure in~\ref{regjob} + \how \begin{itemize} \item Call RecordTag operation: @@ -98,86 +103,81 @@ $ jpps-test GetJobAttr JOBID TAGNAME \result The recorded value should be returned. -- record and retrieve more values of the same tag -\subsection{File upload} +\how\ Record another values(s) of the same tag by repeating the RecordTag call -\subsubsection{Basic functionality} -- call StartUpload, LB dump file type -* check with GetJobFiles -- shoud return nothing -- upload via ftp -- call CommitUpload -* check with GetJobFiles -- should return URL -- retrieve and check the file - -\subsubsection{AuthZ checks} -(should fail) -* call GetJobFiles with different credentials +\result\ GetJobAttr should return all the recorded values -* StartUpload with different credentials -- StartUpload -* ftp upload with different credentials - -* ftp GET with different credentials +\subsubsection{AuthZ check} +\req\ JPPS running, a~job registered with the procedure in~\ref{tagreg} \\ +\how\ Call RecordTag using different user credentials \\ +\result\ Should fail with ``Permission denied'' error \\ -\subsubsection{Cleanup} -(Foreseen test for feature which is not implemented yet) -- call StartUpload, short timeout -- upload via ftp -(don't call CommitUpload) -* uploaded file should be purged after timeout -\section{\LB\ plugin} -%\todo{honik} -\LB\ plugin is a component integrating the \LB\ functionality into JP. +\subsection{File upload} -\subsection{Standalone tests} -\LB\ plugin as a standalone component is used for example in the \texttt{glite-lb-statistics} -program (part of org.glite.lb.utils). This program reads a dump file of events related to -one particular job and using the \LB\ plugin it computes the job state and many other job -statistics. See the \LB\ testplan for more details. +\subsubsection{Basic functionality} +\req\ JPPS running, my certificate subject amont JPPS trusted peers, +\verb'globus-url-copy' in PATH -\subsection{Integrated tests} -\req JPPS running with the \texttt{-P/path/to/the/glite\_lb\_plugin.so} +\how +Run the aggregate test script from \verb'org.glite.jp.primary/build' -\how -\begin{itemize} -\item call GetJobAttributes to get the LB attributes \begin{verbatim} -$ jpps-test GetJobAttr JOBID ATTRIBUTE - -where ATTRIBUTE is one of the -http://egee.cesnet.cz/en/Schema/LB/Attributes:jobId -http://egee.cesnet.cz/en/Schema/LB/Attributes:user -http://egee.cesnet.cz/en/Schema/LB/Attributes:VO -http://egee.cesnet.cz/en/Schema/LB/Attributes:eNodes -http://egee.cesnet.cz/en/Schema/LB/Attributes:eProc -http://egee.cesnet.cz/en/Schema/LB/Attributes:RB -http://egee.cesnet.cz/en/Schema/LB/Attributes:CE -http://egee.cesnet.cz/en/Schema/LB/Attributes:host -http://egee.cesnet.cz/en/Schema/LB/Attributes:UIHost -http://egee.cesnet.cz/en/Schema/LB/Attributes:CPUTime -http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus -http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDate -http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusReason -http://egee.cesnet.cz/en/Schema/LB/Attributes:LRMSDoneStatus -http://egee.cesnet.cz/en/Schema/LB/Attributes:LRMSStatusReason -http://egee.cesnet.cz/en/Schema/LB/Attributes:retryCount -http://egee.cesnet.cz/en/Schema/LB/Attributes:additionalReason -http://egee.cesnet.cz/en/Schema/LB/Attributes:jobType -http://egee.cesnet.cz/en/Schema/LB/Attributes:nsubjobs -http://egee.cesnet.cz/en/Schema/LB/Attributes:lastStatusHistory -http://egee.cesnet.cz/en/Schema/LB/Attributes:fullStatusHistory +$ ../examples/jpps_store_test -o 'OWNER' -d ../examples/job_template \end{verbatim} -\end{itemize} +(substitute real cert.\ subject for OWNER) + +\result\ +The script calls JPPS operations RegisterJob and StartUpload, +uploads an \LB\ job log generated from the template file, +calls CommitUpload. + +Finally, the upload is checked by retrieving two attribute +values: LB/Attributes:user and LB/Attributes:finalStatusk via the GetJobAttr +call. +Both calls should return OK and print reasonable values. + +%- call StartUpload, LB dump file type +%* check with GetJobFiles -- shoud return nothing +%- upload via ftp +%- call CommitUpload +%* check with GetJobFiles -- should return URL +%- retrieve and check the file + +\subsubsection{Phase checks} +\todo{salvet} +% soubor nelze zapsat pred otevrenim operaci StartUpload +% nelze cist pred Commitem +% nelze zapsat po Commitu -\result Should print the corresponding LB attributes +\subsubsection{AuthZ checks} +(should fail) +\todo{salvet} +%* call GetJobFiles with different credentials +% +%* StartUpload with different credentials +% +%- StartUpload +%* ftp upload with different credentials +% +%* ftp GET with different credentials + + +\subsubsection{Cleanup} +(Foreseen test for feature which is not implemented yet) +%- call StartUpload, short timeout +%- upload via ftp +%(don't call CommitUpload) +%* uploaded file should be purged after timeout + +\section{LB plugin} +\todo{honik} \section{JPPS-JPIS interaction (feeds)} -\todo{import this chapter from testplan.txt} %set of queries (how many?) with different "triggering conditions": %- on job registration @@ -405,7 +405,7 @@ Mulac \result{} Expected database INSERTs in the JP-IS (last two steps). \subsection{Multiple feeds at time} -TODO +\todo{TBD} \subsection{Advanced feed features (to be implemented)} - remove (not implemented in PS yet) @@ -414,10 +414,9 @@ TODO \subsection{PS-IS AuthZ} -TODO, if any +\todo{Not implemented yet} \section{IS queries} -\todo{Import from org.glite.jp.index/doc/README file} %TBD: insert job sets via JP-IS interaction or directly? @@ -517,7 +516,7 @@ There are 3 scenarios to be verified: \section{IS standalone advanced features} -\todo{To be implemented} +\todo{Not implemented yet} \subsection{Server startup} diff --git a/org.glite.jp/doc/users-quide/JP-users-guide.tex b/org.glite.jp/doc/users-quide/JP-users-guide.tex index db9317f..3d8fc9c 100644 --- a/org.glite.jp/doc/users-quide/JP-users-guide.tex +++ b/org.glite.jp/doc/users-quide/JP-users-guide.tex @@ -12,22 +12,13 @@ \Dissemination{PUBLIC} \DocumentLink{} -\Abstract{ - - Job Provenance (JP) service provides long-term storage of data - related to job live in a Grid. JP provides a query interface - allowing to perform data-mining. The possibility to annotate jobs - stored in JP is also provided. - - There is a overview of the service architecture followed by main JP - use case scenarios in this document. Technical reference +\Abstract{This user's guide is intended for a user of the Job + Provenance (JP) service. The service architecture characteristic is + followed by description of main JP use case scenarios. Technical documentation for both JP user and JP administrator is included in - this document too. This user's guide also contains release notes - describing current JP implementation. - - For actual version of this document see - \texttt{http://egee.cesnet.cz/en/JRA1/} web page. -} + this document too. This version of user's guide is part of the + first release of JP and it also contains release notes describing + corrent limitations of JP implementation.} \def\todo#1{\textbf{TODO:} #1} @@ -63,7 +54,7 @@ their interaction with the Job Provenance. \begin{figure}[htpb] \centering - \includegraphics[scale=0.7]{JP-interactions} + \includegraphics[scale=0.5]{JP-interactions} \caption{Data flow into gLite Job Provenance} \label{fig:psinter} \end{figure} @@ -83,7 +74,7 @@ queries. A user query part of JP is shown in Fig.~\ref{fig:query}. \begin{figure}[htpb] \centering - \includegraphics[scale=0.8]{JP-query} + \includegraphics[scale=0.5]{JP-query} \caption{Index Server interactions} \label{fig:query} \end{figure} @@ -97,194 +88,21 @@ Primary Storages and vice versa. The interface exposed by JPIS to the end user is described in the chapter~\ref{reference}. Command line interface tool for end-user -interface to the JPIS is described in the chapter~\ref{CLI}. See the -next chapter (use cases) for futher description of JP to user -interactions. - -\section{Job Provenance use cases} - -\subsection{Prerequisities} - -\subsubsection{LB/JP relationship} -When JP deployed, any job in a terminal state will disappear from LB -after preconfigured timeout (one week for example). If a user wants -any information about such a job before this timeout (or before it -reach a terminal state) he must use the LB service (please refer to LB -user's guide). After that timeout he must use the JP service. - -For LB configuration please see gLite installation guide. For a -technical description of LB-JP interactions please see -\texttt{http://egee.cesnet.cz/en/JRA1/LB-JP-interaction-guide.pdf}. - -\subsubsection{JP service location} -To call JP you need to know JP services address. There are two services: -\begin{itemize} -\item JP primary storage (JPPS)\\ - From JP design point of view there are only few PS in the - grid. Expected implementation is that these JPPS locations - are preconfigured in a UI instance while one of them is configured as - default JPPS. -\item JP index server (JPIS)\\ - Each index server is build (configured and started) by site/VO/user - group administrator (or even "senior user") based on given - community needs (expected queries and its optimization). So in - principle the index server location for a given query is to be - provided by the user. We expect that the UI instance will provide - mechanism allowing selection from preconfigured JPIS servers list. -\end{itemize} - -\subsection{JP use case 1 -- get job info} - -The scenario: -\begin{itemize} -\item The user wants information about a particular job. He knows a - job id. Job isn't longer in the LB. Procedure: Ask the JPPS to get all - or selected attributes of job. -\end{itemize} - -The implementation: -\begin{itemize} - \item Let a user to specify attributes to be returned. See section - \ref{attributes}. - \item Call GetJobAttributes operation of a JPPS and display the values - returned. -\end{itemize} - -Examples and hints: -\begin{itemize} - \item \texttt{org.glite.jp.primary/examples/jpps-test.c}\\ - This utility is used for all JPPS operations. Some hints how to use it - can be find in the test plan document. -\end{itemize} - -\subsection{JP use case 2 -- get job files} - -The scenario: -\begin{itemize} - \item The user knows a job id, job is in a terminal state. The user wants - all files (LB event dump, sandbox) stored by JP for futher processing. -\end{itemize} - -The implementation: -\begin{itemize} - \item Call GetJobFiles operation of a JPPS. You will get a list of URLs - which can be used to download the files. -\end{itemize} - -Examples and hints: -\begin{itemize} - \item The same as use case 1. -\end{itemize} +interface to the JPIS is described in the chapter~\ref{CLI}. -\subsection{JP use case 3 -- job lookup} - -The scenario: -\begin{itemize} - \item The user is looking for jobs with specific properties. In this case - (no job id known) a JPIS must be used. There are the same query interface - provided by any JPIS but if a particular query can be answered by - the given JPIS depends on its configuration (configuration - determines which attributes are uploaded by PS to IS, and which of - them are indexed). - \item The user should know the proper JPIS to use for its particular - needs. - \item The scenario can continue by the JP use cases number 1 and 2 described - above (JPIS answer will contain job ids and identification of JPPSs - to ask for all available JP data about the jobs). -\end{itemize} - -The implementation: -\begin{itemize} - \item The user will select a JPIS and provide query. The JPIS operation - QueryJobs is called and list of jobs matching the query is returned. -\end{itemize} - -Examples and hints: -\begin{itemize} - \item JPIS CLI tool\\ - org.glite.jp.index/examples/jpis-client.c - - \item example in org.glite.jp.index/examples/jpis-test.c (starting - from line 161) -\end{itemize} - -\subsection{JP use case 4 -- job annotation} - -The scenario: -\begin{itemize} - \item The user wants to add a user tag (annotation) to a job. He must know - the job id(s) (or use the JP use case number 3 to find it). -\end{itemize} - -The implementation: -\begin{itemize} - \item Call RecordTag operation of JPPS for the job(s) to add requested - user tag. -\end{itemize} - -Examples and hints: -\begin{itemize} - \item The same as use case 1. -\end{itemize} - - -\subsection{Job attributes} -\label{attributes} -Job attributes are referenced by its names. Each attribute belongs to -one namespace (represented by a prefix in the attribute name). - -A namespace is defined by a service (currently we have one for LB and -one for JP) providing its data to the JP or a user group/experiment -who wants to attach its own data to the job. - -It is expected that UI have preconfigured list of available namespaces -and XML schema for each namespace (the schema can be automatically -retrieved based on the namespace name). A list of available attributes -is generated from these schemas when user have to select attributes to -be retrieved from JP. - -\begin{itemize} - \item The namespaces (schema is available at the URL representing namespace):\\ - http://egee.cesnet.cz/en/Schema/LB/Attributes\\ - http://egee.cesnet.cz/en/Schema/JP/System <<<<<<<(NOT YET)\\ - \item There are header files with known names of attributes generated from - these schema files in our build procedure:\\ - org.glite.lb.server/build/jp\_job\_attrs.h\\ - org.glite.jp.common/interface/known\_attr.h <<<<<<<\\ -\end{itemize} - -\subsection{Authentication and authorization} -All the calls must be authenticated by user credentials. In the -current JP release only implicit ACLs are available -- the job -information is available for job owner only. +\section{Job Provenance use cases} +\todo{In next release} \section{Release notes} \todo{TBD} -\section{References} +\section{Documentation for JP users} %\subsection{Role of the JP administrator} % Podle Ljochy sem nepatøí. Podle mne musí u¾ivatel vìdìt kdy a s èím % otravovat administratora (zejména IS). -\begin{itemize} - \item In general, the page \texttt{http://egee.cesnet.cz/en/JRA1} should - contain actual versions of JP documentation. - -\item Interfaces (WS): - \begin{itemize} - \item In source code tree the WSDLs are located in these files:\\ - \texttt{org.glite.jp.ws-interface/src/JobProvenanceIS.xml,\\ - org.glite.jp.ws-interface/src/JobProvenancePS.xml,\\ - org.glite.jp.ws-interface/src/JobProvenanceTypes.xml - } - \end{itemize} - \item Namespaces of attributes -- see section \ref{attributes} - \item Job provenance test plan\\ - \texttt{http://egee.cesnet.cz/en/JRA1/testplan.pdf} -\end{itemize} - \subsection{Command line interface (CLI)} \label{CLI} { diff --git a/org.glite.jp/examples/pch06/align.sh b/org.glite.jp/examples/pch06/align.sh new file mode 100644 index 0000000..4f6a452 --- /dev/null +++ b/org.glite.jp/examples/pch06/align.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +log_event() #1 - attr.name #2 attr.value +{ + GLITE_WMS_SEQUENCE_CODE=`$lb_logevent\ + --jobid="$GLITE_WMS_JOBID"\ + --source="Application"\ + --sequence="$GLITE_WMS_SEQUENCE_CODE"\ + --event="UserTag"\ + --node=$host\ + --name="$1"\ + --value="$2"\ + || echo $GLITE_WMS_SEQUENCE_CODE` +} + +init_log_event() +{ + lb_logevent=${GLITE_WMS_LOCATION}/bin/glite-lb-logevent + if [ ! -x "$lb_logevent" ]; then + lb_logevent="${EDG_WL_LOCATION}/bin/edg-wl-logev" + fi + host=`hostname -f` +} + + +exec 2>$$.err >&2 +set -x + + +hostname -f +date +echo $0 $* + +chmod +x align_warp scanheader + +globus-url-copy $1.img file://$PWD/anatomy.img +globus-url-copy $1.hdr file://$PWD/anatomy.hdr +globus-url-copy $2.img file://$PWD/reference.img +globus-url-copy $2.hdr file://$PWD/reference.hdr + +./align_warp reference.img anatomy.img warp -m 12 -q +GLOBAL_MAXIMUM=`./scanheader anatomy.img | grep '^global maximum=' | sed 's/global maximum=//'` +echo $GLOBAL_MAXIMUM + +globus-url-copy file://$PWD/warp $1.warp + + +# Log LB user_tags +init_log_event +log_event "IPAW_STAGE" "1" +log_event "IPAW_PROGRAM" "align_warp" +log_event "IPAW_INPUT" "$1.img" +log_event "IPAW_INPUT" "$2.img" +log_event "IPAW_OUTPUT" "$1.warp" +log_event "IPAW_PARAM" "-m 12" +log_event "IPAW_PARAM" "-q" +log_event "IPAW_HEADER" "GLOBAL_MAXIMUM=$GLOBAL_MAXIMUM" + + +globus-url-copy file://$PWD/$$.err $1.align-err diff --git a/org.glite.jp/examples/pch06/align_warp b/org.glite.jp/examples/pch06/align_warp new file mode 100644 index 0000000000000000000000000000000000000000..5ba7bc170887fc85a885fc27b749482dbf7229d0 GIT binary patch literal 374675 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

BC@oa4;V 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%0DgCBAMDPhlZ;EL^^#ZIg`TVW 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

`3bwgkEJM7 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�Q0K)1#kk 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

-PA`#eX4ch85 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"B@l+>%_SM}YY_j2Me28suLKUPC# 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

1f8{;SLhKlG&^p>}y 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

5IBz1B=Zs!-+BhP2c4LTG@`3jO^+tag{A= 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

ehiJ-ydNL^LcnT$G`RB$eCW1= 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.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

2&_h<8b_^i*z^E-S=Yf+a;2p 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

1H>=N{hSC)D<4tc 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%0DtMgouCXxkLSKEiM23J?x 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

IlLi13`8Ud*GV;+760A-km zVU~GVkzpQI2o@E&SQMD0OMz3Au&Bso9!4(nFmjoPk;^=cT;^fqG7lq{c^J9O!^mYG zMlSO(a+!yb%RG!+EGlxbsK~{lA{UE_Tr4VbnTL_fJd9i{Dsq{Jk;^=cTr4X3T+G8L z#XO7zi;5iPVdO9mqZAhPKQRyUpT#^3)}VG7^h%hAg*5YUR13axZeu)9^ZQ~|gfCxe z!0M!77;8oYGbn3d2BLv^FZ&qebY*S*b z8km8n4nU5sBjBH{1HVH9Q&oMVG%yixbw2mst)~CJDhcM)>{^A-Lpo@04a{Jg zx|eG|+|=HF8koTx)qpCyE;jY9p9W?yPfh1Ct4x_MrhyqORLi-pTj8LjgKx41CIYU0 z$Y=77Ig|C%zzptF_ab}OF6_D+tX%^$cvSt1^KEJJtsSfio>sk)rFt0_Z%y#Ljf3Y@ z&9v!W@PZO=aj)hWST9;DtT_gOK3}p{Tr&;U%hsx^ITkrzu~tLPvDo%&YxVcK{1&wb zuc{reBg1|Sexq3Sy1D|mt6@I|R(&&g$82C46tf?LKU-7SkHIQy3i~nmi#09#F?d(q z!{@UbYBlV~z^ZQsp5-11`|-2GyRzJA*Lhgz;PbE_gHE&`3RQF9cEf%QjQVEKrL=pF zl$vHg1{wBaP)!$e1�tG3>{{vL6GN{TR6Fn?Zw#(@4o`} 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

2Vt>A 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

-@WWSA09T5_488Uv%=K<%cta0SYi{_0yVgCGT`nzaM&G_oZ z1q}=5E=T&*6)Q)M8F9dfF(Vh9I{)Mq4GYu_nGz%CEn2=T7Ms8L)YBF;E*~*Jh6k#L zR4-q(WWk7qXi#j~f>Y)$S-7~7lgk?#795W(fvn{Xix%T&JQhPc_$S@E3|A4&5ho6~ zM_w2A#lta2^w=U6uNA#&kE+`|vvGQZJ0wpO%xd(jW>&4+R`*i#rn(K{`0f5Se_EqE zI?q4If5>lg^Uw{;(Fiy8e5;PxSKYB-<@^OpmM>a-YNifB57`}pq$$3T`VW0FxA6qs zb=+6fjk>SUZQNJ*$$f<$q`vy_di2#_V$S-;nN^}|<))^_W#Y7}{DJO)Niq1Hb7odm zFI)Eme}aGT*-gzY>ozw3V|+tnW78(l&mHHS-Sl8f^ST+;)ek*%rax(uKMdt2h)Q>w z)09eA`z?+BG(YX9#o)C_i`+`FYL>p(QYQvq6)x0gZBtY8?Q0rF)-*OXuSt(sELOiG z22)+rHZ|;M6n*`78pJ?Q9MZdtgo70?{w@XK3x6bnoUF)sJjYeV3kD zRkfq>lqsVn@oGD^e z?ZN&vt_$3K9RPM?Z*&^&7S3I^5L2xU)N!r?nKdUR<{B5BdO|%wrvRuXD1mO#38&6o zzCzAjl_e+XCt|SXR$y?02vG^m=^X6@h%`IZN-~VlVRbq^0nR*|R)r!^gMeb67u|+KN`-^gS zHnp#+d0FGAQ(EepDZA92>4>gN#c7qIYkwf2j-CMH1hvh)lwApBEwyI|AKZR>V4&#Y=*E?;lDNKW-j zw^oUzSFNcVF=<}9=}2+%JK`YpndrJ!wz3xeRwsH@ic_v?IsM#Jdg_3h5j9m!;`FH# z#mY*2W{FXF%);hIkb%C`f#S6JqHAq~zpkmOZprbY@6Dp?&EmABxK`&+Z>nm0yQvU;sJe*RX`!|$IKja!=16;Z|6(qD1!X-(FQS;pk0uV);@r89D2RPp+fMJAd<&T(X2VBZ@gG_v$#(UPk^G$bz)$pn0Hmn zva{3UtJ9+AQViw^Q$^m|n)LhuHPz{c*>h^DCVW#Yq<#hflTozZPWWoLK$NT%4V9=2 zxIN)!w02_4%&JjW*Q6U7nh$vsbD)+m{D5pPumL_$iE=HQMc(}MjOx1PP3bf7El~7U{;XcoxahRG%SqBfqvkI@d2wU((kV+8FI%*HLHIIwJDR3={?Zk5 zPhGy^6jjBNMJpGa94;$sUAAQI{74;Pxr>N(l*YG~yFlStmcUO-mN;R-;!_qZZ(L=y zLj9b(e0k%dc`Nu84Y}nAa!B02&)$;$*$B{g;p=ql> zV9rqu8#XNTXZsud>HY%I^@*QsNY^!7IAL9?S#$@S!b(|woMt!tcJlRmQ%ET&fUe8-=5yFbxSH;boZm16VS zwV(~p+~2rB6!}x*uDIwM+qeF;aUDwhEbfSZilw6dW-(}ssIL{jiOm;ZUhBUkj=#Wf znpx#TeA%|?uykDwM69MWQw`t?tH1+6Y)`8N;T9)@9wq$?MA18@`q$5Rz^eY*_|lq& znzT4}mKeN699t_&Zl>zD1l4bCzCZ0x{G`f%y!IVpn#Gx=EZqOPuC!7pvVP(XBBw^hZrC8(W&2n!rDniV9q4*fCk;tD)QU$Ev!mO}93> zWj&hK9ka|oa}!bNtKMja^fBL^kwjJRU_6LWc2lnlATQW9t>O3y3($(ymDi?6HGmd3 z%uH87SQ+VvsTVZ-ZNr80=51(d+VL@fdL}h`!zTRm2W)y)B>V^b0Ra2o7o-~eX{q#0 zRX{Hwn`)udnyQ`iTDI;$FAsAzZrtj>;2$bZ_owb`fv|oG=1v2^eq>ki7QNQlb*ZWa z(;DQz&G<(@ZlNFO-iCSU7QhWZ)bEy-6qer;OZwDu|t zbb7>+s%T*0~p&+;{N+ zy7vgWcfqFnsp^kU1M1u{RP|Z8OXY?B_3-f3Whe*P%def%xam)r zOQ6S%jaxSmIj+M0*-e{THf#_>{g1E|#O;ed_GgQ3Pl(gEe0+N~kg@jmL&QW>Aqv$j z`jOw1YQ{>kxKf;mK0~MY8{=`Yv2hDV;-zl2@^`KLJr%#NYpgwE(0M1U!-YR}dt&g| z6Xif$+xQL$1_-~Rh=1(1l%}@-5^lJ%af?5|osgV2O`Q1Ais6&bn0&_JOa1fQvY!6W z>FbRD8;81H?B*Wqi2G@7h^`lG_0McLtm;g^7`4n*{U(3I#AV<&t1)c3e*da(h!yS-M^vE;S3*b~+OT2gQ(G&lTk5v1 zTYG|lCe(}T!6G0tn8qy-aQY^cf)Ed>z@h;*I zORzS7aT@-|bHtq5nGLvBURn1cQb$ikW1h*MKi)rDtnh1*@#GSJY2E#2;qu0O_j%V5 zkHydyXih$sJjb2f1H900s%e?mkV>E5P}5X5bJ}LHdg?*x2|KU|sy(RXmMi`rbKe5k zRC)H_oLA)KrsXP18?JI`P70zxa#Bz~m8J@t+9m~cN}H2j1f)4B1qw7N;APsJf|pHc ziq0!dy-hcpB3?FWicX!<6mQ$KL7j7xrp#^5+4TQ=PLk3>LAKBN|0qq*CFk~@_kAwE z=l49X>|G#POv~qQc}1?mf_;m&MZ(z27v`s$~qSJVB8n4cbeukGWoUffD$Yma@A$74S>zpEc@;n_? z@w++pJooE5*zc;$>|vb7D9jmI#y+ab#z}=A3%V2B(%(*SsylG1C{DFqXJ-GXg2?-Q zig4FyIv#os4^}9dWPbQ)>)d;S=lU$AgWZM4`Xa^5c6y*k&@~(IKL3zX$6{4Y{0~Cj zFx;##Qya1oxfz|WlTD|$JeDLZx3ITU+7vr`%F`6@LuKOg?UzloO7mEjjawkRcCYR$ zyta>Wp_gz6Z)MqSUGXmt^>rknQhGN(e5sQPOGlQ zp!rDsMx{PIKo9qiwn_8&R47;K;&-i%cX7_1_Xv*&I$_bsoSaLXIhR!D%rF{rWV>C$ zWp<7hZqw=DKxFB5*dqZpDVu~+d(>LZhLbU}w!7Y*A-f?q>}4{LEVcn15#Dl^?tWR0 zaVfxNIoQ-Dj2iyQVYH^$d05G3XLm~(3fg(6Vvn*>+!Kj#r$2%YC$ZEvxHWZl_L9dF zs^y_@g)nVgA+WWI5SPMk)y?&-T#9+OhGQ5S!+CmG;oc~YW@WsMx6^t2Y>&sxox+S! z!2rzKE19E-=co{_b}k)a>pNI6w{dYRe|e4|j^^GE*){0%8RMXg?IzVEr+L{@Aw$O} z!cN!#QT6ibPC6kArF5e`UKwS^wii~DJpJ`3vjr=EU**8c?W4`LJc8A~uA+Ulqq$Aw zF*V;RdSSS^%y`W7n2i0ARSk=&Wsi)4(Rf5B$moEH127bl zZH?`CT%#b4hi7ybfGe!!=k-0{)#M{GVaz5WI%Mf1jPFZZ`P!WS!vn=e@>1Z%6kR_== zg1qlpW2v-XaRH4@ZOe>IZG4`_#?tUy>4DB1Yvw!no!lORRqPPV!>+h$A-@D4|77PG z*bkw*Xat_wX2FDD4wba;($_TK;iDWtr1Qe^cz zbo}8YyA#okzMlGb>T#1NJage7jy|rLUpdiw=lQE(YRfXKfV5{b;F`ST4Elqjlk3+l z#pX2zHo6XOqfZn8_gRC?$Xn2d*^M?f4j7;4g_Bv`j=?Rk4^n7wKj!Ji@_Q);ZQ1OU zctpM{m?xE+M0YM5;$!R5Zznu;a^3bS2z#z~f74UPk9V}wjO@e zTH!JXmlT*ZTfOzs`ymM7Zm(_2k*jlp%+>DGP)DJ4L7(yjd}#eiE2;?~Nf?Rm!h%|HXvSF<$@Y-*i5P{o(B^`3L_yAn@L zK@I?90aoTvae{!y2j@V?UQO{~tw}rGt0`u>*KFnz7VB{TxK{wP#%MiPt7U7w$**C< zK<0dGnvkvA;S6%G$kKSr-L+h7<*N6a`;ApFdplqnV|Q(kZvnK|wABd*G3b%gE+wr*LYqa=!LM(fxlm2!yqPD*nsmAeCNeG z4*~%;`ni>@6Q=2a5|`;LEX^i|fv;`#Rwr6mWaW915S=gauSmW1|0S(Ar`taklWWG+vMQ_0)?BebW@$$lgO!$pq&=$^E3rDm2|Ego-;#?`q_l+is@5~!5l7C-3NG&ZE#(lHVF>leOEL@ZaWaTKgdAb0%&Bk>)HNXWMj@Dqhi zzAaYgE?ZTw!C0<16Sx?S{xMf$^mnD`WdEKTzdbgOO@iaP!)t{xff3X}_6s*gWi}+6 z1S+o%!_=D&Hx@3L?IOSfAvUCw!U#OtZc-zyy#3BlFjyv9%HOz&N~J&vQm4%!X!1ylibp zG(!~o{<3qSGe$IR*{3M`%M@ol-(Mf$lk7Vsdn*Zo(H&~F9nLeJ$PDe7&0bDvfRr#_ zWaRqAfade=vdWdxl>o4}IoJqI_9^x~INZ*?i{+PL zh%^9ZaN~=-i@w85-E2Hs8rT*foobxKf_-TG4&j1S9tfyB22&3Zc~Kw`YhNHKkPyz< za4Wqb8o=wwCS4<3qr)}pVVLNlLvJQY>f+}1A8;`WF|nQ-Vo~ODFmiCRQ`v_)dOfO1 z%*}N3oXd>ODt|m|67AL6N;7UE_&T_p6;d-O7bKZxR?_jvjJ7`1s~4($FSVdlv2YS>1d@gXkpz^M&! z!vI74MB*SFBizEy_Q~kH7@if`A-dX|B`ApJOXrIN@(MLn{3OPSxuv zq$rc8#Z$)5>r0&1$Ar7#eLjktha(W)HD7Yqh&hO>!C#o`fCr<&^@tcQ@#&#fr|YDQ z3q2(y#WY2vvpi&f@yG?6fYHe?qbo!^6|gZ;doV z-r4zHUJbF17R&MQoc&xslb7&n{Jok`QpmBK5FCU@0o;dDn&9a=@RuyfpK|kc$-O^4 zZttVoUiP$y`v5u0nIEz;2w6XtqKMIiu4K=85bz;E8tx-VV~14U$PqlA;K4}GQ{0H^ zNIoCS!4iq>RO4QpRf1^kj0=x&?Cc z6`gL|Vi1xb9`Dt};{rCkvsXG!hlw+JMlnntO+1b@04Asl^Pg$b(W3A@+!==XvtR)8 zC#(|Ka&q&>7q@;AUxn>6fTc7UqOqR|BLleUDtFXNjjeo7eT*+Ofgs`M zjj?973ceU3ODe_h`FxUw8#**$_$!E?Gn=5p9qddqT$qRQTlZ^22&PEy5ZX;ci0qJ1 zdcSi>i*WW^((IyDi_(*9;jFh{WgGNfvb^KPYZ(m^9CpwwlCKf6P zC-T`chFLd448zR@vYvugc~{!)_T`u2TwiXq@jMK*EvIG6Snb~EAW>0$ni=4A(Bq(i zHTw^6w=ReeteA2Yd(I;)(Xrp_2nlE^RO}}4>e+ds1%c4ZjPL^m%Q#bUFX><)&tm%y47VTabj9=n@tgSPXJZW| z`Jv`;>}ocJnz!9$eRaoACzXCBcw8E(F}Dqj1}7K0YWZlmG>xqc@f)3x zH>#^K#AG;%0Dje4JKQaTB(}X3`vt4$K#cb~*ek3(rA@N4^lUb#fnDihbIb})+s@^% zcQu>rd)gb~k>Fg49lFaGv&q5+-Sb`^CVoeN+%7keKD-V`B1pzk8<^tblM#0lu7Y@`|1noYf&P4_XqL$yZPTwaH9kO^qiz;3d!QHIPr*vdBH z3_SYH(56DlyC;40@6tM0(}%BooO!S^N#_1vl8O=+(c~jFnYbHG_72zWoxVtp9z<|- z7+l^KL_GXT@V0BFBP4Ua4sgYFx|d*#Uo3-e8(CbgJPtz1Cd3?;5-nK{?%Gwu=K+3; zhal>!5YL`WfEWZ!aMuI3W8W04GNXgp+la$w*O2KA;|+nWx7U&!@f&=~){n+*-xb954F8V00lw)o?&`gMggP zt~Db{0JNgmCS8Lc5U5v6Y$hPlCbo*0l}eW%Ay$cRsb)jkumC`Wi(&1P4Xw*@16p0y z#0(uWNudfC&)Bt{PXL>aXY9wqSNu_;)gdZ)v{90A8M@(VXoTlsPDOX^66TKJf6#*Y zkYr~sv_pgc8DZ(TZJ=4u!_A0JWog{`U*nw%DQ}*%BYu}-uuNG~RGLKQzD?owAEbQ@ z&Qlt(pZx;e@4b`+q#12Lz5`YgHD@MpcW-?m{4w+UFysB_A(HRq)3siPs8{{2s$Vb@ zb+I#G-WlK?fcoHVyoR4cK+U~^js0$Ooth^4g;`_5d_B8UfU*gA*=L(wtQg!9_NIV? z>8(ZU0q3(dKEA|XPrtwed~7!DOk9Qd7t)=dX$Wkz{UCYLJ-J3U*}zH=(u8z12KNAz znoEn$Ao~%*gVRO`*Fl{85otR@%Ec!&sS@I(57zS^zt^LrKTVbnz=P~ZavXp&rcpRDCJu!Mo8 zU?jF|BEC@;5tCkKO;#&$)}|40@1l+vJ0C8?54nMd@?>Lpx6JNAWK)46^y z?qUP`Dh2U5#@^Zl^Wt}46Et{0POQ83daQIOS1wpWt1YyOD}{v?9Ps#Nf<(fCL0hIk zOjvMW`O(eY_T;hH_$0#}oU>>;MO{s?_GXh*XmxgRE0AAS=wp*Q0F|&QJ_P$tW4CT< z;r70`x&0lYVF@ck|2tt=mrxb#GV{$IGn=B?Utz~9G#Ctk>M%Tp7 zMT`Emusy?GBeR1kaAk&iB8cU5hk52JpgJHn8%3l1gLQ6#(LrG3zkezuH&e%0Cr~o7JPIwH%RyjbbGv!KNy5|vldEV%EbS(kq(pBo11T6 zkz<`9=1bfg5ax}#I*YCFXp~L|MMYzQ`In0~TrOo`H?#Vfxrt@Fn57Ag``U)?{(;oP zgX)OMp|$Qc!VNmE&$DIp5%6W!9ul%#+VVFV0yfSV7B1P`gtEd%Tk z42x?lwE^p8mV7^b@LR(42V7llkU`VU2KvWZQxFm)UMer$7<4WMb-=|kNb?N!CC?_~ zY{NQL&^3NrX~QdddQcsf->M|F{_{Z&Z96SLJ&5Qaw4JesH#dcNM(CT+H`s9}I5vzO zUI!mc!Rk+WH&#DeN5|aDvz<8T*OeVud2vvawj4hJcLWzp`=X1bk3x&3-PnCUH}gh} zz8$qPj(>k0vF5gO;U0ll7twW`*1HD_tpG`XO-}_J4f3nD7X2I{R|$p<)GausimJr9 zP2-xtBE=W^H2Y7v{MbJBGfzXTOg6Hck{x2gpB^;umysatunA}gX`RY zC&f@9E)hlmjilT&6+VeS=glbqN7|J5gByEq2t8Gxg2ds$AtVAHs~~Y0-~L!dx1Aqm zqZ}j@JJ>^>IsmUW_OQp?D#x^g`|0ubaarsXo?Arbktk3PmHNb!ZtndB3JA@nFD!Cr05SUv%0EZddSpg^g zCgHZzXjr@>5aHxF5#BYp4spCLKPcEAOQtF=$p~&os#yk5Qy*JngI{DX6OHYKvIstK zF<>}mFtBAUCNcUhZ|+)Snd2?H#+qX{1^A_t9xa-=GGs4vs>UxapSdK8h+_KI4Z+%; zTBphKyvce;R@g4fI6)mt)3|V=Nsd0h#yCro_$TMsDMM*mcL2QELu^?mM~b8|4DO-g z4uUf*rm*iLZQnyfd7XCL z2im?zu#Xj)*@SfF1OcWc9$Eiw3Ps+vsAvG`4Cvd4=mprhzUA<3xL*5zXYV37WxdPq zvC@{_70_Zj;59meL1E6AU=R#!e5|97C{%o$at`uQp_C@&=NdD?wK`uFH^RaINZo>{ zVu_9|Ai1G^bI$?<6%Y_@j(>B`T3C-W`7~8zH^I+<=jtam*UK8yZ@RAs?i5U#LPQEC zaC3kadE)H|)8)=G_+;o6lXwHxR*){3WS}J)O_Oa{x`F!rWHT)_(Gu;AZ=)k_(7tER zKtmrmvrc(ts(mrcpY;%y-JtrO#-0Vjp(oyHl6L)kstZ|F4&)@v>|kj=CfisV@m_jD z&BC12Uhx;~bJUAZ=^{Qplz9e!eVhS;j;?*a&u z8PVQkWt@7mp6FpKJ>a@%RL8L$Y^8yXb;t*I87n-8P6P9`o z6&TT;#&#U|^Oc=_az@@6yG`xYgqHoD{+Mm@8!n~2p4q`k6(-xg@2ZTR0 z6j<**9#pG}J_}071Oxs3mxQ4-0FkpSfUHh6Fr^_FRsyogT4==;>u zQ)*+B=SWCK=?Qszf=Fcq>bF3cqx;OuE%p$+mYyCjvKA2b9AX9lX=Wo_VRja&@nJrE zgAIk>ynM#&tG!+&0{;a$H*i@*R+b$JhlQ+>#2^{d^g2StKWh%cxN*h)4h8iyHq@pK z!zR$sFc|HDs9Knx;pKL3xKNw}r@L8u!DnjF*hk+RBB3~o!Tw9)g2%nK-rY&q|0ryD zT>jm+L<9!l1id~4ukCLsy5gr+L)Gh%1!k808el(71MFQl@=0K*Agz|I^r`kL$xgt% z;hPbfTNN43Z_FCH2*C4(f=G;zHFIzs%Q-Yj~JLed9oI68j&z!F$Y!V!7iOx@Pd{;(Pq5j554 zlZoCAZ{V5>7VR{Cg2EBm?SMH9{9X7wFS9wF$?Xno_Q|s;=NZ9DnTcjL()Q|%*~P8Z z!t~MMa0oXFqvP$(26W3d+~{9)o<@izZ2L{`wj;gUT6(vA)w}Jb-fc0R=ZX90O`b6s zoH*?i&-CuPL+~`RTw#WeRW<>kX!=uih&K~^06%V6c%YD}&1_8@o89yRJh%&4WxDoj z4}Q8cm=B9kduO9qsV7t>ngaQFS@8w7lG`FXX#>c2$$e~*>m4tTA)g4ojTasmbKwnv zKh(n;y#RU7*C7EkPqL%od}yGiqYb2$sFF&Eh{fkoCR`H zKS6FEH)sY{SbdHl-SzH7bosARbl#lbY=4by=mwnLad*7H2@y-nDV^23!H;e^94YU0 z>N*(K`PuO(*g|e_)`L6iwbs7AP1*7S8wbjOa}V;)y;d-u?TbZwErt(bS!W9tooZDP ztdW4Ys%$j8lRAn7UdUxtxC&y%scD{*i<$4xw4iuzqWFf^y8STIqx&?yb9}@0e-&uw zqk3sTBO%%5kW$p<)25=$+fj697-~3Jyz=}k5hi7}*Xy<8m(pb+-rb!j8iCNl0^L?r zb%_U5-0n45Ais68i5--Uq|cK}BhXNsIHEbT@(W}_Ij?rqU;xfFD;auwhMu-8G0>I; z=2;W5A+asnP=#$-N4JS4J-&KzHhuLKq=Ll1X<@~6Y;roGJyU(m4$xfWuE_I3&X{n7 zf*TKb8a~1Szv(@I**t=27&!65^*T1MiLlo#ImXqK=CkQGdto#En3@mG&oV7=27`)_ zeTLH_%t+$x;Zyya8@Qdvp2xd`nkAxBwk(4^)AW(s9yJ`JHyO zqk2Z`X~*}bqhE-dImh;{{;`*Tud7{WKv&zT)4ixRW{B>`TXX*UD#}qfP}So)&+jQ! z3gts)88c*~!p?Mw3R7J0i3%-X|Kj6EfX3cHSnWZ8KyxKoDOc9Mf|%bB?kZ98i}qGC z%^x8hHO#PE%IA7e9FsuYG;X+v>3tVLH2z8L;*n&NcPqV2w=dXe&vhI9Dr#nUS(yzH_hpGt z_W)l3C{dP;FlYQLKR`(r2(>xPT^B@%@X|R2GI1h?@;{ z0J~U%`_6{9CU5 zeM)ztU=;Gf=NEyqjek@tWi^$K0+#?(fQ5FaUlo^AtTxmLpVJ|N>f;G|YwPojZm()& zW*^H3YU8d_irSZma;{~^Cw|oQmUAPIa7g^!AJ0Cr#6M zF*PzbOC7!b<4I_CkP;-Sc^1acEl^JhT2Gweb6t|@gGWsgevbRwhYXb5*KZT8TnE+Y z`LCT@I2|qa80w@7DdSG+v-fMU|5W&C{I0&%f5PC0e~0>4@iupmCPeTL${t!1SL$7k zi#4?R@$&H`^01F$O)kbg^*Gxcr%QPC@e2;{zUd`!G%yJE>X9n&_NarSfZSGHcL-@b{xF-#JC^es7Ai_G z`s%$9MoSU{IcjY#bn<4We*8r+3?>V!5fukP7Ey7B?7d=zX!Hi1GCQ-ADW2+lYucnD zAd*vs%fSwEv->yK@d*2)(2baO=AJ*Zotx>(3ygH-_XS)zgSXLbqQp}m>SdpAav%W8 zZ0ygQ4D6@O5aRV%tcyR`6HJhGu;2ob`d}XHycUp>kST@)N+Lr^b5JtC7-0G~lV1)# zC)y)5PFCzvGVF~U&pqSCJaKuginv1tHFu9mk78qqww^9rMJADk(m6!y74t=7R(+OL zT6f9pvlkNPHx)NcaSND{Gqr`_F8?n;9k~=HQuW~jFqS}`BJvf2KqHXM+Pwjp{%qUn z9`-LJg57*N68p>JuQqeBm|r_%;n_>GC>3Nq_>;p}&jv^QO+R%yZVu_PA`c^nW+KA> zS}Fm8%sWMUEKi;zZd5^10e@y_6VlH^i%||G#-_AgbN!<6i;BzdxLKoef6OLlLt+NN z;kOEzqvtIIM}eIK@TS=74qzX0MrUtlquW?%6Pue&_0qhsr+%eHgI?m?k>Q5WorP2~ z*}WZkF4>?*C%^Pz1p($i8=`$_BEIw|NcxpB2kl>!_MyN?K7YGp{B^j!eNrnKh_OeD zyY3F~9+Xg(+wP`3`zMBXV7bjrQNSmLn}dfa z#{zC*YXHHkAuhkaW;@T%bry3B1#eY3Ka^|96v1cbQJ{K=l3Jw*YDwH$YqbXd=QFEt!AP#6^QLcG2HRY? zcr5U!0xeneO5HsH5Ghg3GbVAr)UNQz!YI;0kVUw`W<@@x85T!3h{D_-4gs^;UnYCu z+18Xfknr?(6c6|@ET(^)>A+AfD#}Ggs1Rx^ENw(;93-2{#{|KGnW_V)@j?@_rJ3Ev zGHlFlX0uThh`bmfVJCM(UNt$yTCWdlympsiv$~3JEKrs-|el z{k~IC?#C&cfuJUm{YqT%9H&*17%vnO0q(D=f^?9J5pp59Zz$%10oU2Pc>*@mN*JYQ(C4vO5pH*S z-HMjXhgC0f%YT3vv?t%n>vNJTs_I^U_HVpa`05}5B)nRBce`o%e_oG)aK z^5!1`VAn2Z=&O;L#fEj%D_65idH3bdt+lilT@$b7$STrb)PK%4cogIpndQZHzlykT z9EBw}-R))XAeSXj)quPNlzdcrtkp<%NT&Fox{&>%dO(d0M29m7VR% zLP;7Vl%MTeBJqj&Jij_?!9=#clNC4$jZeb#-UFd!Wvd$`b`kWAy#_U>yxuV43jsHK z7de>AQF!1Y7SIXBy5*}E+H1Dhi??32aF;CSvond3aLXnVa$hp;!^)kT>ag-P(;#v4 zjglN-x8aHZRpl`)Mke{?DB%h(geuT((Y5*6k3HEU>ZvsNA&EnP2V8IuflG25ynyT{ zkc;PTK^ZKWon;HU`RmAoK>afhFNfFSc?rrNQN@ZD2{qq9%?KGa0D3=qjgS&M6{#?Q z5YPs&-Afn9yZgA7{zTm1N&!{FVtM7fUllk0frZ!!_Gk1Y1zy<;rFT(ElA;f zlD3zcM82OJ?SX}SNuizZ$(Jmsr}b{*EeJ{>tER~P(Lu< zTy^XQm?MaT%#m234Y_LA_g~Dfd`t&InoJyT1%7@Act$pE((`vHbp*j4KkN@6tuj~f zw`+Nouwi&nW1e4h;#Ur3$YCh`60$K8>6IuD>cS)LPifgk6}~8Oz`ZY-IgtE|!HK#p zpl0Bkqs-GE$ZyrMo{^}Bkq4pxxW|3d_1crUM)#d0*9c{E&P!xF+xLk9FIU0D+t31Q zp^Y7%bHqLd2_Bpn4KRC?=?@iy7P5^QL*Tn+4LSkp%eo8888TVfG@MWj0RvsS=W zL-78}Yec&{9Q1n2@xe;!!p-olfaqqkcc`S!CsY-KhuMf0wzdwb_5O%43cn^B=@fwH z(aT4g6-uLrE#hr|t?dUHeFH{j49 zh?HMTMEerR@;WvR1y7LF8mrNpEO{0b6ya9;^5oi|Q-E?)mNzPgqVNGO8h|YyTP!L2 zYsA_ZH|hO6P4BPK-&QjI2N5>Rb*UBP-9mjDIyhgf4`lIRKEM=IYk?JhE?i#J2~~EY z2)XBz95&y^mVi{n&qbwB^vu~P8O0_yP<NA`o+=Me~9P$F}kMHxs;_8^KVA~IB&l;d4oj@)l58;y>Z&PMszO-R!))FZ$cM@?2DJCeZB zwJ6Hn^dQPX5S{7s4K50Ts;9R&dywwyK~76z&z|_67f)}g?Ey#1=OtGJ0aZKKe6qVITH3l})z}7VcLwu)LtAeW4Et~_H7RGoLQg-}@wn_>ndT^ie)CT>n zg+$zGV6z%V2gwotBakDnrl2IjIHc${AQ#cCw)57muFz^^)d1G^$yO&j$3vgvJ&AQ; zFrMpv%`^MUanI#gBjc76m|fiZ`cI|xiEOtdfUEI;3jQk-VI-wGkkYs!h@+C!WRE|J zCVM3XHIt|Lz#Wg5)k7`C)-EoYtkUYq8?Ts``;bPYvo&($5hXYN2sj=}NKrLTJ}M9m zkSJ!x2DaQ2M9@L|-x!pIS*b!^D&a*4udL;n2;>#D2CBo=kd>&y1P{ZbZc$$WA_42_ zI>O+=3PI)DVJ?4}5uq?I8)uXKnp-$Z!+9qjr&_B$em@Z*@r{-s(N4>)=8WpD)0d zQ-VjCbc59`xlw|yx%&A)nRH_q%EcsR%tp~H;#EEjkQbsN$&lP~x(lSQjsVhAT6h;k zVP~iiUpJ8kD1^^5p*wniwVPjZV=)SOOb7Y{rZ5auRB0-2Kvsztx}w}Bz2cTo3%i5W zP%T>t-l^5dGuadylBcu+iCW*0?N0*Q^RtO{7H-{B0~=m;+GW0rk70)gk$^o5%=q{C zdmx9jX}=5bcS2&@5K6!uf(=7>9d8ygQDo-;yv6VVwyyt2C9OI;dtel%Dfwjz$|Hk; z0#G;k-x~?;lSCOBdE)8=$ce>`H}oJNT!-WAov5`_CZph^JxwZf7TOD?LK!E)2JJk} zh3>1JatMXNCPLF8U$#ExzUlz{%XeLE;VOLwx6+5*q%VVnfA|a(I&qwf7?F#cSiMJB zjshcaVPaKKcf29OB~%i(X@AOXxVU!bt2%pPeeV{x?Zps@M6eOX7H#Y<3T?f?cw10* zXZSggRlFzEd^R>71e}!*plt@UFsfRQ!t6E?7~a|ZI$nN2E<^#ZG*bLdRDwhyKn!zd zL5{R)N@c|bsO;8>`sr+#rw7{n=yo;)MTvxr)Iz0DvZC+oa5q5}C5rO>c6b{ehuhwV zt#r{|u!_{(vQsdPWH0I(!mPOpMhJErSobDaQHPLo(Elz_-~~j@zbL!`Rb8J%bL|*m z4r=7h&lE}@xOYSw_WwySQzgW^N0?(MgGM4oOKy`2i8MHra$F*cE&M6I;vZqIiSEbk zqU<$FsnYF!g7Ut-x9c5I2YeIt)^SX`c7>)9!Y_2X8bH`-@}7PTMD-C*V=pN-mCpR4 zc4HeSd#T9jL;bGstG-uw0#_K9xWdo1EBu}+2lo{AKRfDp;@+N7Jd}cU2nj^HJg7u> zIT7+v!4I=JzQCX?#AM%2EG9p>ou3f!(#iT(p8*mA;RD zU*8*RPu>_4n_$^=%g5Xi&h}S@dywa{Q>mgl4Le2<4g0V{DGhgysEaR)=-ODn8z&>e zCiRS?P5q^-?r2kg-Fv-2Rg>_8(OhbT*LAKAT=8i-Va5pNMA--@#&GNaYuePn72$`& z*kV!+w{pmjwSHwyWLnt0hr7Qw3c2KE!lq_NE5w<2sCuuo;6dFP(wTjPlgh|Tqt;$4dclST-*t+ z*`9AG^WTY1x3)vvsqR$pgLgbK9b48A+Bnh-flUN^R8S6~AN-A?e|;JDe*<@AB2~)A z6b$}D@e5ak`J%vX>HKg2CbkDjClnW0-9hohwV+|MQf?5I4`sjfK%8e0;J-%5)v+GR zAL#e)Sz0zb%SX)mvxu~>k%d~{>j^&5o@*&Vxij2)QJ#cb-CO13@<-xf(Ig(wXW(-m zed6}_>B!>VTjjv=Z*=Ke$F+s&K?0lmRyb}E8rV4sDo7{01>un_J^>*r1>xTIhxkw6wCjT$x*FtH}tLGOQK2i|NQ3dZ)d;T{v&_q1xJ7m;&i4mz7AD zbCxWL^=t-8>Z5w$)YL8>%aA4b1E2w*@-`x5;?vxo5qE~d~SaY z-fKt5g_;ksc3$p3G_qUVis;>XE08l9rQ!9RJkU4QR~_8OkP~SO^HMgZ&Ce%QDNf|S zitwR%APlK6OBdrMNMqK_ikrIOWw!z5C<(Kh+Jq}p**BXTXpj!;KJLCSz@J{v+Y*+= z8-q2=0@=6g$+8F!Zo~d3)@zo@S`*0sPWaoOyl+3X&;+w(X1DY`N z6rw(r(B9|w)1}+i_c2>O$NA$%1!G^Xqtox?$hZO`>^w$`3%Mf^Ayo^U^>Qp$Ce_!= zN~}<-Crjqf>nX;2-(Z>~;g9P{7~VJ7p)He!zi+V1$n}1#A6iePuOAqkt%a1E`rXyb z>-yZ)PaqOA$<$#b9bf(HD*(<&nT2D=!+cU-OA6<#12amqEJ(3@KG=4FwvF!LlfjO; z{VuVq?_ZM^HY|qO=;u@Wo?WA;MKy_VruxROD;(werP+i!TX!#tM7C}}QS zHiEwmU4;C9aRmPJf8pn!^eJ31oE3nUj3k>*l*wMn%~9}b`1mLSyHS>HfK+&bi#2L+ zp#NUeqyl5EW#%$+k}&li;bKEPg<0X^d0SaoI_98=ANKrJTltKI@MOAqD+1({L9i77 zK_^n+X6afH*ldNsi~nlNHg*Zj4vI~1YfuwfWy*`7DaMPbpyVK8>2pDXM*|Aeh9UnE zF5U{766L|u-!z>*p??+@P#Xr&Uz8+!56d&0uxf9SdE&W5~Q@#Md zQMhR+NMy5gbU|b_KkM<)u)q&8gt!Mjx%I&DJy;)ZxE)9S&?N$V4Ar)Tbbf$ zo!v?-R}{!+1w8!?j4b4GoL2@%#3VP$D1VJiu`v6pN+?B7K;Z}OGA_`IKnkdjp{@C@ ztBqoAedaz%Dm1=~#;#Y;*gPC>>-&#w>wPE>Itf({=u|B@6L<@~XYyx={@vEJd@jZh z-g@l8T{!s6_`$?GZpoH z^{VC%X}1H>9$1VMeeU+4`EhU$CTd(OtkgnK8)#r(g85UB>C8$Ev;6iw{(Kq9+87$5 zuFT)F#?4k?u<%Q1?xaq8djPQp5Wnz?$(#VDuj>$gtb={}Q&^@#%4gp*(3#>W=u;!= zJGC!mrGTb`gB3~6P<$zVfupu%TKZrPVucPfktKYgD8IEnfN35>^*NOpZlR z9gQofX!aD$AU`Gp6GJuIL-0-B;SpiMNFbuY;6Kq*eGuqo?#0Xq+}miU%=xJ~fC}{W ztfUF1lnYFjRI0PI3NP(u?)?=Qa8%WhDnze^*Uvgrpbz`GGaA78`~M@ZtfMr+h8e(h zIR4f3K`f64Gc}&T3BA{TPRB`H*)ONy^&y3)4|-TU?|uaFmLezG1#bEww%V}t!C9cN zBi$RRQJBFB`JZKkNQdBrUgSaH2BUC8YA{ga40`D|5Qwy@6|I&QbRm*w}KGS^j-BZ?`l;rMbGLi^cO0T`T_-i?z})Q zzUqpz*V;p&5NadiHx%Kq-Ml9p^6qv9H1!z5)NWCKH01Zw63jCMvg6Cx`f6aeGmL}r z?^S=|i2Joe={&-eG4|ahc6>P8rom{F?5GpIm9hKfPBm1NHsn(P_$ zJ^RKfj?#oHJb>SO!YD#YtCN4fS3eTs!f{CZ=N9z=G{QOv@1Z3`(SBl_)Q9@G^U zip~fNSD%5j-K)=t30F~NsE<z z#``LQ<3(2=UIV?_zLG2vWjUefBE;fL2`?{9FONc181%3^@$Qf;?YRg95ur#2Go1%( z!H^Dkg>(!63j#Po%82iI0Q4n@Xc4Xy$Lb9$PZ-1cPTT2JMSNZs+OmVt%A|%4RH1;z z9~cOHU(-l1|c-Ywv&F#c=f!ft?X2USKk#^$b6a7$KBQEEE_6|-3UfZ8-S`Gb)e9Gm>48rWAr`t z#ZAXQ(JyiASO;d8rh+qF?1uQUH*_9z=obSVddsOD>K~vT-w_77>grD1!E&1a3Y9;8 z4q#h*L-A&Q4`HxGuRv3Hc~0xmk9umOBXM0nQWRqe$5dH8=MYM^BMDAhVB;`pLy%3(MpdESA~V3N13Qgr z5)aE==*@Q`IyDv&mdlOk#JI6WUjHXt+#2uB1$~ELLY6Y7P4QgZibsb#^NSfH_ z6)gmJg#dQ9vx;tJZo3C*<6buy^&KC)j}(?uTjTZGcWZgITbq(+Sljk?oDkXct9cvx z1Pa?=vUF@&*{Q8zt|qLkPOc!B*MF^%-GrzqDBk(#N{8@RTDTG){4PA$XB!A-?|rJ9 zPbWCbj8m*@I|QDxgI^7A4=5=(DyUHd@mUOU{C^?V<5-)R&uajKqMyL~PDSZS4CG1I zLwbU-kAz6j^KaL|m;Sm6X`L_xXkN_vZ{u=czDRO4r(@jYA^iOX&GYzXl})Dj>Qg$i z|B;1W(>!c@yNamNJ{_Tq_$I=|1m6Ay@mvr-v_LJsOmDV|Qv~u}9aU!fQ&l`pt3$!3 z4K6}bUzAMb6Az_Xwjx!&09~d|XGVpdBiQnXDncYNEB!MtE$J$F1Z=+F!)=MHVD3-4 z3Z~|xt9+6|SMhtat8~P7-K$lm{7l<(UwjXOrgYFf+MYjadwvq%^T!n2S)v*S=IKT) zIm%#3rMs*3GzIqJ8i#Q(r?~O$i49+3gVhwkmTjK+1AL7w61v)^9GSO;gkkyWOyvM3!N;s*>i`Rcm|U8kxx~& zLPFsvE*&iNZ#Vga!uhFO-ah~Gf_l_Hi?-L-_~mFUy!ZASaaPNG1ojs4Wk`<6ldJhc zVdhyvW-4YN0t*+f*c*O4ps3C%B*cxe^!g~Fx-IkXt+w;4*k*u#H)klVW@v?3h}8p&t7QR12Ul>EkYX*q)vD( zfi#d;&<@}f1xbLY+M-EnZ#Vh*#Bdl>E(bDX;7VMrvO9$pqhiTFRwJM(StraNV}DL& zKj1zSQ4-;rl-Yu;*#p7C9;X7j{mgI87w^_Y&HPib)Dl#o{~bB3PvP7o^+@A`$&S^h z7FHfW6v3cH)EJHo*m1{8qNKHp2R+`Y(foECmW(=MF)4mv!X_6Hbxsz$h5a1A#8J>i zc0(xrW{ggLl8S0iqiHVtcJ!ZfB^Klhx$NJi`0L}iuiL+bs{xa|?d1~Ch~D7=UW{3@ z7LDSyaCVSA!p`X4YVsHDC@^ODjo2H*%-11I&Be!9l^6~Xve0Rfr8Ts(3}kf&7@X;- z|H^&sVLBVQojB$|R!Wj*g>?LZd4xy)|`3#!n_@8OvmcZdZ9f`s1L?14E5g%k|<57o&FNosZI)? z|DhOEWZ_(Lq#hbiB#u86lh}H2y!jvk)lbUm0_QBt$30->^M+sU%CHw0VF<&@1Z5rF zo4r`o!QRKr7ycN^wZ-@x#Jr3|rJ?x~*LWz_RgVmQDv*Idl9SDBd7~YsmlYBIXNyr; zLSEs#{=%6~*%-x~d&ttEBCqL)uRHJ;rA}!&qBm1eZxtzinq6v|dVMTzQ)>YjuIz~g;(HYBDLz_xpf zD01}X*$7hbPqzB`s60uw+(7v><(P32R$6vDFTlHovO0v4(`+JuU}P<3C+_KwMIasb zzo+PU%tN5v5?ZspxFx(3*gD0Kelng)34M;KZo{;C`*@mm>F>n`ZEgE_7uei@LR~Q2 zp7fAqtZ?UUf&?+-^{4GqATZM@hF_h46Xx3Rwj9P<8 zd;1{BK6ZwSW>p|tHQ~c*0`T6!WNRIt$nYJqEl-J8BSV5|Wkm)+Y6g&b|2^}oKh8|m z^9CT@>{lW4sAcNyqUV)!QIdm%Bz_~HRb46hzTVtDw3B!*rzR&Qgo0as~| zt8D){p_Xl3(E8 z*a;DlC&R^x*Srm#=E2l^#4pH1Ee=dv)(!T+oba=hmj}}q6lB2+`T&TDeXa>s1BB#P zmAnlE4l;Ld9%PPU%a@g$%)6RF9<2PWQZqzv8${#*2gn1O$@`#`rkT8CMIElRd5Jt& zJBYXkM>IJnu&&BZAa_Ua@XOP(HTHm+*aMMDidZ)c5?+h52NY8%LyWTrAgu9)*DA9m zI_I;vqu&;L^<;)6PW<{YCw_1cTxWzTwG+Rf)nk5p5Xx7{Wr$+BkDi%#*}a9tYuQ`r zQ6a~B`G}V#*B&BvBDj|nQ%~-Nq#tBvWt2gdxPIL+*MAMyCt3uqFQAHcTk>piuA{0w zLuJez|PLarnB;VCR>DY3ll9&qWAYw3JS)@JN2VqY3I1^FhW_*P* zl{|>ntxm>V|Bhna)C#jlLR~lEwRa#=45+$8`z=91G(eu#Jh=#|Y9h)5EE>6(0`rG9 zb&ESgJ2i#!AhTi1A2yM@@*qpU@*c$HQBJIscSqqYNGj6r9Wc0K5fIxK!)@vX2$WUl z0U=1@g(%k!`(Fcl1F!YKWhhfcl`AUP&*Dy}TFdoEZrhHcWQa8{ya5F|60v3v(qN#K z#@F@6i3#&(vlk;0^=yO<7!d`yrzQg2pMk8= zFUt8fm@0SB>|HG|@qj0ExKkUXWG< zZKn4{cpIM)HC8(9v?^^|6FF{pJNpNtntr8Yojx9lMZ%XBh~IteWkR^j*hGByn9JO^ zet_`q7lVnJahFD$`C>42#=F;N$Ah<@4L0`;{BB!!OyKuVxYW4#rL@2=`;w^Nz>JX; zWWu}+M106eEtEu7(3FQc9Kr0ytWR-R{RjYcA?2;_8&;Rg5){|Imj3aM#s3mjFAqY6 zK6;vN?ft9g^s`9L(ZKU_PsJsJ+cLY@;V{zQ((_I8jfzt)DJaMKO>5WBK0kAA=J~Vx zxorcjoX{mJTYo}}@j`PT*#pFvif&mg(bj^=%_ZPIo&_o$Oc@z;A<13SFQ2gundtWSkp^sD=1dnD|Ik-#mH>OvFQ1o@G_bsg#Y z8#m(r-&Jkbm)zUG#RLGy^u-3{ml?z#5wE2WT7ZaBQ5}_Ms^4a2aUs6WhL2ce3R9ZMrGU6 zJ@ND0LRyD>m%b-z2h2GWiU)OfZ|Y!fNK_(AE*;57*J65W*z(M|d*b$4Mxl5a(UHEq-{)0Dx_klf!o}*Lk z>Dt3z;a5T*+IXe*vypE^Swv3+(TaUR`eHyTq&F5nevkM~t$4T=`k{qiN#93}T@M&X z_=j2GdJr!0Bt9@dES>{v%aOmz_K-59EH6cin3FaHOim$lLsA<;ov;pF2m2Wznf$`t z{`{SO%#+Pxv!PsLvR|493< zE#ocloM!Yp{4C4!&!2Slw#>W${ozw^yEM(W_Cw^Yifjr>yVFH-hdQyDu{{FQ|ny2*|Sx`OYk$09WUHM*!aU*sP)kItrLn062kC1 zm3)0A+yH(b$+qBokZr$1rHE}aQ9HOps|9aBE&|O37ec`f%#+@bCySUa5ZS<(oEqvM zdCUeGeO;F4sETmm*k_KYGzS_bm$)%sD#(*a($@IdY{b!y84u)Wnn(-eAUL0#{xHGm zKs6~JD{2Vr6NBL;J;6hP*R3XStW#IE(P)Pd-i0A;r*VIDE71Xu@V4Y=|<%FvPc-+~*yAW)5VjXkI zU;+gwpIbdBwd2ij7K(-X45^)-X&asi^~&&2slN8y98~9Z;&D0Vq?$CJf2!<9X?HxX zHG*-1itzJwAV&zsQ6ais=-BJI*KCh)=L~0`D+1E*bBFzpD8e0LHV*9$t%*Cl5uj-$ z#xVaa|1I<=DufXPC)p3zh7VH#2wDmpWAM}E! z6DIv!4`vzaW-kIV{WZ-UHsHd|NTCHF`x3r{1>d(U-~|-o+YZc_wSr*B`+8l&gw0F3 z5d7sy$jL*6gJg!2(#pr0{0M?U|0<*l-nA}%VD+pHdojacR*B&F}$4T0ePmys|p6(~>m2A-9u@r<8`RU9hw=!AL#EPA7r( z?$;1#59@T^@^W`k4@{_r&oTYzNK7#wX${*E?ea?#EYhLo&6fAv%KQ@53WyzZo95Z) z9NH_P{y0#X4KK3MMEcDaYx$aqM&JWW!49r-=ghKL7C24*Y6Ycl&g2cUvTT-IELYp* zEGWu$HnahSLY(<(eyuv!q!?SJ=2$xllBn%!5HpbPlFFoo@Ii0vKoKi#vYyh0?LnF( z5CupKOhWkte}P3(mc>&Gdk{@TxfMx=FsCPyCzWglSn+y_FAydR?pY7806_bgiG{mR zqJNCFQDS-*r3?b`M#;@S3Flt`YsB0w4j9?xZLGp)J%lR4Wj5_ksfW2d6lsiYYM^+r z7sWjEDkzgyt+tt2PteOSGv*T^iMg3#mUl43sR73z4HicA*IL1DR96c`!x1zpTDnsX z`lS^U^(!ova(iL5aQ(PVib6KOw=qy9!9aYiu^>nB7Ohe2PCnMUwz`#VMfZ9cD97N)(GxHqD*N7MQM;tT1Dsl=Q>aCDQmz400n;?ow9~!PbVnO-O-M6 zK)kyhrPuJGEiFSlgg9LlotQ=8X^)HRA7pc(X12yKOSU1#rKl-n4Y5frhect^Xe%^{ zn-v?PUH<(^ZP6(gN)P}6wmtg`OkQdJMuyJ+4=XM|k_B8gvT7&!z zW^&OII_$~Rghz%FcJ;wpibXy$H2qpW(Q3WqLjET;f&uhsIU40T?D=3=_7+~-Z1S3r zOZD7#OnzARDsDuE+ElqW8WL4|Qq_~)T`q6zF^7~}Yd1W05B zF{Pyu%PR#Js-AkdITQ&-{Za&zOh$Nh5Ox23Le{uIB#0bGq%Wdz=jh<+OVxnxBg)~& zabHI;MQIOiYxgkBErW;mBF~&2+_)y+a>+vN(XVY13`0Rfi?Z?#1j!0?am?&0%|H6y z^B#(o0=bl`VQDd}0rb+pql&(jVcge%CKV%3;o2m{thb&Pc}D?E_<^!=v#CJ47xsV^ ztZ>MzRPK-jg~HTs8w`flgAtnVZ4GhTE&wGS90`gNCLJLyNSKST|NjL(D_S{G@oWIk zA9^MLS6k^r7mOw>aCSb6n8Qat=f`_V%^9D zQG0t$aA~cYiA(K5!vFW4nF&bwPUtd5X>k} z)X+~gkCo%=G%@?hJr7ubQr9vbr6uu~wb!ja=yUZo)Cu&!)W}Qx+sQmi2h<3hoP+pC zd{oh++Pb=SSrdfYg=?QDgJ8O3=FG2CD}|}~Dng|rJB851I(?*Ddmw3*|L%RCo-*@} z$>+~U3o9cov(jMwXyo+lG*^{9?UDv7&-|`2zvr0Wb)IRL7`OD(by#XdQ}^f8{@`ea z61KByZoc0SX6AHij=|C1ERZXB()IeTu-`~CU8?hBG&l$RtS*L{jVNjb&3(GO{$rXh z>U~UYi%$tEhN*_~dXZs4E`vNs*2{u^iPF0V@L_#J!J@@G`9sZv^Y%9#1Y59t$>R7k zb6{W7BmUpBcm8K{0sZ(7Q?ht2AWam5FGaV?+q!ge9C_U9J6R7aRVCd|3|g-*I4Ysy zLEUl&Y)JYN9ZG{!z^9#$AB&Y!r5DO?e!0O+xdJ6e&(n`+_YPw2A^nKJ@N|B-4I99z z-`Uos&(s(!o_%5cZNHzG+L45-1FUm17E5Z#Pw!@bhI2AM%6RjX_BFjOTQr0~6X|aU z-0=+p@P}VjY@I$je5*k@LJR_uYjL|Zag?D={2s=0&xQLE%Zjn@7s7R@a)n-jNV)Yh ziHBZh+|>Vksl~#=We2aO>(#{^`0O0qDg9q9fqyVG{o)*+8zI^_MVHu))2C^F4Q#04quwYh7K~d-J6J)&B_F3|sw3-7OW~^358aYz;KS?sAW5F065+^B zL5q|&#(4f(WBP*m=g&MJj00Y-oaj#bv&6=?aCSX09&fYl$mF&kQo2E39pB>5i7h@^ z+vjjyY%!Z+U`ju| z&d`zxHCY=y>l0QrGk2_$!DFi>EK@tyN$Py7mGvDBQ=hoiudJ&Mhy%B8Kqa;EQZvDb zLkBSrXoN!jBhM+E1+vD^9C^o|@k2b+JpC%cxJz_9hB^<8z&QEG5AN7@%eu|c!^%i{ zPKnxyq@_tF=~(c7iLOf`wgGT)Gju~V02!U@dl7m1h+D$q%(Kd$NF<6Y0(3#2rN^wr z5k-mM@M7<@^*AdyEd{tsgc|ylp7%%20&#@YY)IGS# z7c@#q|GYAhC=9Jm?+5qs)*)GEeE(aQayJC}p|1n`Q9{9n`lt-vbmo$@NHMkcM^`f? zS7Fz*Cg-$CvuoZVvJtPgZw~t8N>uf|5^s>@JSGlrC}}li_D3XlqCtCT*IxIyI@$7b zSW|kDAyklP9iG5ow3_3}D<9l0=kea^>H}-+?>;2!WoqsO?PF@}Un6_lYmY(0laj2l zkIrI8zgvxmFDUc71|6iverY-~ELYWsD6XYzNs+Hrt$HzfmpKT}Gr)Y;IF#>v)3(OK zrSq2cv^Bm4`?DWgSM1Qo7x!m};uMIMD0LI0-tY-xO}nD%uv($a4@Ms7z~nzoq5$2r zSzfTlRha={Cy2+B?={!)y>I$DE}mQ9J*d(4Zw$P>VWK_nPW-oA$tlaYl0rvtjC5+^ z9LDrjElm~r)JQ|7J=?Z-NZm^d$)+-$I?L9n%(6}y#o$t@Pb03!K#`?g4r}s5T-*c+q&E%x0df9O`T?A+<(<~tv2@JE;E7Xy5_t|m zI}VoMCdigr-+s9X>djqh{-*Cz!elnVldsf1>S>G1E%BFfOYTW`5CzEz>CcxE>wvK6 zCd`RyIBx?r0P4|ETFtcq@E?vVwb#c@ZpNttM=s_FL5(a)ekX$`hMh+65sYd*N&@vL zf6R>Fb(y}qNa*+qpym$v{d>C9F_nl^Msd($0`aSum=AgW(DbOEc7O^9j`JXOurlQy zTz;ECD!36$f;BR>S{Kt%U1yx4|2#wDlDUa8{9ab?*Bui32Zrz;)^gAPo7d1u4N^Li zzhDQTjgY$I-2;%OM(eB*F`(Mbc8kxNIwIsbH#-!=tSEE6fnVd)duF*rd~`MRh#~$C zbgYsoXgE()BZ@;W5vwPOa#UmJ0f8CJCxn*iiZPZ^G{?qLP2W;hZ(zim9a*VNzJ@dQ zea55*99iRoY6VJzS%!+6&q8=@7>2|MYb)c6B-ZYO*e_qgUYpYAA0O z3;M+YIdAExM+3%*Z>h0|L9Y>Da1$GrvtdY4J zP}X4XAE>``oOhe#qu6kfIo(ORxQe_ND@Dud#SVMekwYBPobB&Tk?FlC8d>VU%cRA> zGz%BX8GK$QNc$Vj!q3dYDo0MPZ4NqI_Vtl@ z=~@MGnSj(sFpfH_s7K1=Z}RKH?lo~DehQG?Z@A6(k}>;PS#>PjhI|8mc=7l{q-6Y+ z*6cAbq%f*B@9{TS$B!kU7Sgvs1(X##6Pw)XIQjQX%x}PJKVjIh7l6~& z834jss=7c}2wfm<8mxQtE~n{rBvA5oPLrN^55I=D{)W%h&=zQCo4PnXxikDkW|eGANx@sm`ee|EWFu8e%wQ!C;`w_Lv{A*u=k4W6;qLC2yGg2I~Dd z(;b2PX~-7f`O=Wz4r)Aa8q-g#X_SEBZxWNgT4UmePs*es4PCkzZEsdOb9 zCbV;Urh}L*_as`)Jpt?SR9#0CR17obNG8Y0K>I^e=xJ=;{InT?7ZFQi9C7>@) ze7UK{4(JPE^Ur+(9Y|mpm4tLAj0h>aT3=Y?$w>87<@=YRqz5m_;7Y%TvVUiZ=-wn8f=KuI%hQKi1afw zXbvY9h10>9l1H)Ta|5I%Tg;EiVv3wE!J^ZMzkUjRz@6pgL@@j;5whn1~vr?){j?Af}eJ?8#S()9kD%#OzTL?M32k2Gj&dhugJBd>UCKgfZoWa z$V1U_u8>>JFOOh=MAVGhP+(tl(_BcaWcwM<$Imp{0RWCOU5q1|)qSRcTjf00{|o22 zb6u|!ebkaOec8mtp0K{Ya}5zlJ@~n*lNy%?o7$Y}@VspuPi{MECS}gotmlz%uKmeH zz}VcnWPM1V=UjTv(}CxG3_49EPS80|1J^j~s8ThfQ_ZT?D}rUtQ%j=n3TYaoq${h5 zaCmEjlWSnYb2^FBd$y*|slcMFL!O7=XTmp)vl4vbXjeCvm3ycAAmT+_;9^)0y}>PQ zJk38O0-&8;+QWlXFd_w1H34liR{=iKS6hKuxUvZM5N8V!8qS z7b(7yuU|nuz(J+dSH30y1dPnF)o_8Jw^nHP(x04%3=wd8)-9l}_7sNkZ|~pBBEbaT zmV|Z0jpzz-@{BqCP5g@E;SG*H@geTwQ8Zq(q8EL-U-0b{RN-lD1>Q7wn(Z??52OV`cW<_9n%bauE&+rantI83<`9tz zwWgVR=E{g#R2)!KfUDI{+Zgg9`9w{-uD8{_<<-9YuCC`6Q9%V4fOZ`p)ov&>1-x6+ zrQQF1Nf*qd=S4aQS1mx;{i!zVgwf&mfx$sLS{VBs=!a9_nRZL#ClZ$I5$M{bcN4%> zpAATl-S#N9llp(<#pFDlao-CWs$zY;sZvAV%V%9SB43zuhXO~@*Gb?P4v-+)xiEvZ z@tz7v;3{jSgB{q27GB}do8nu0Z_K7?PV4d!$qk&Lwj1b@mmp9r-WAZzBX~n>tI`3< z$5?i4tDlrxK1ZB!@0p?EbFKPP19Z>v_NzvlFIhM*f!6FfD)0BmsE+DuCNZmTY=Bw4 z2XAI{kL--JYsj_Di-*~Ij_L8W{()pA1NnUKGK>h{YPM$e{mN5J^cdFHa9tAnH=6H4 zU(XuxM#X>kOw_VS2LJ0`X7I0am_+SqNTRCy9Gxy1vUc@?ug|d|nb`EU&*ML9PVj-b zU_E`JsC`1?Q+B@gR#6)Q;i!#JvL9c;^`5>3%=%Uf4V*6Z(mDuNh*9Zr&TzOOY&TH0 z)C4X~*bY8em&c-#d<>4rIxYM?Pg}Z@6?8@XLkwva@M?Eb+f>N64DkQY$^t`P7^Tw} z7c_L>8n;@7veWwxTym#{EG*?XmvN9fN;31Ju=mJbu90PeN?L#vCD_ z#4r5Bl<5XkI^=F^@`R<8nfIL;a^$z{eWd2p%NBU`&tUMG6U6QIvSEoD(g=`NjS|M? zPFb;Gc1DJtnMkt9gV+AqPIF4E+NHVL^(sg7RiF<0fhvMQW|A1gA~K7KiMah4=JP+ zMM7al-~yu_gYjJZd;CaGHt1tr2;bY?KB^NSxE`7!%H#;!!9;7S0cU`y|StNd!U zy4lqI%)JBjaxFrD6bBA%ZWB^=oqH4Nz4$s3s%uy+MdnS1RP#H$T7nWg4iWjCdNcn8 zGk>d@|64QviPh;6#fcn}BV({~=D?8TPO!^a;j&H|;{>VEFuNjyQb>P+`&qSs6(B)8!GT5( zK-X=;y-xfBb`(nYJSMc=5c4lpN5Od<1XGZc;P}CE+(&WDBoeTxWv=-*33jbGG|u)0 zLrqN)3P7#NW2$&)V%C}HM1DewbnIJtEO}|Tl=slB4Tk%DkG`M5KQzss>?;^rN zv3x5O{oxs1pk8k)YDVYLE`rc5nHqoXux1=IUap=T=~w~f6!`G47Uz+QB2B# z-<0drt+NBpjt!nFXlCvzYSiPnO|iovjCK=h&M?%}MV+YaptYk$SCa|?vEzeHfYom= zDijQCE8!)5g>p9s_RP*$sCmD+`F}#R6xOi4EPrUYcrLH`(rqTT3>V$&*NiaKqh`U& z@db~7DrCvaX3677MqQB(A%VIgMV(w9Q?0qcW?LdHcbF~zC=BuPbl){RYvOoT zc;CnUm%vPQVn#cXQB2-$4*G#l2Aw;H*P3$nn~rRB5MP zfRS~gIOI8MLn-Jo$9v?|cOWndAg$6mW0VxpG?tZb@NM>O=7c&26wa2{__}iGC%OiR zu=q9QS)z({jiXrZOlO%axz-^ZA)O{LS?x&o{wjD=c8Gue+1VMl6ma}JrCx7Rm*&;6uP4kAUmPI&eWF}?rk4khAuN8jE~1Ka z>LQu0T%MWx%JN(n$C;V7ISO6OX)4RJzB^1u5_2Dl&uwOI=CE*L<`eOmFBwX^$A(y0 zj-R7}avN;fhwDasHpYo^E(m27Bnh^l*Nk?`3c1_62g^fs{|X7#28U#2BjzkuWV>1T zoLTrQg1u0o4~B=Xy+(aoy1nkjYJMKT_hx&enpCUKf?P$Zw;8VF5vv*^PxU9Id3#+< ztv6G#(n9G;Zyl0FXctOC9@$cfJl{S<9{N9062hZ9Bui@P{!rSe&n#oQ4Z&5VHt_^7 z(VCc$6V)&f0sV!|wW4^_2b;%FOI|kotloyXgxvm(Bzm_&&3?p!K2Z37yWIos)Ms)&xuRck6w$S_qDa&0Yj zLwRoi^&XtuBPFUyK1(g83prs3Q0NaOn>N*f3!H?%_aSaM8lrhK)cKlri*Q(^tUh4b zf}npIaWSQSQzrNRY4gherc7?`(~g{7>ex;IJ69qiT=KxQNx+KM&vMoP03xN9CotI8 z*CqH~lRBKYP!@HxsfxngB?K<$o;A`jKVDYtu}+ucJ%O5{{!SbO`;H09{^&pN^A#1w zW3mTz`FcMycuPH3o!R?nF`^SD;--kZo%IOh2h(C+FawlM%_8_|u1SK`I zsrTT)Y1i4agTef{w)k*q|BDazWZZ{)p45k|b>jGZT6Tad_wsT+n&q zDMGNZ-&brAU-9j-UcTag@vchNQHG}fawL33-aTek$T51mqfa@qcVs*bRBHV-U zTDD$YP87k&x$U$#`B>6D%sfs*xu&Hx(er&5#wcs881pn}O z9eY^!=kvuu`^)e=DV`J0?*Y1D+^tTD$5F+6ZKmw0SsQKeS zu_*2|^Z#Jx-(lwe$;`j~YU6IbJFt(tmFAGW?Sq|!T~rK`UF=&E_nNL5Wc;qq__Axw zvd%SP4O~0O_+5JqkL6Fzg1^Vt`blCUz6bvxIU0T!X;^mr$klR?R|cBhK6JJCUCpL( z51IupnYLvqyAtxo{hn9IneW0^w#j(lcww}5dtSnYxqU50sL0(>Jb$;aHI@Rs?*WJxP$V_N?G!lHV(?Hyg;B%e3Qk-H_6if3ExCK74cqhQScARg~iAD z`HV@{fWLpkhG9R+*COxyo`}?*YAHR^u06+dF%SPYg^ivzV2==Nk3en0IJ{{ZV=|?7 z-F%d2i;qlJ-5FW>fO4iQPkG?lz$~X{yUTMkymo}Nyd8wg3BlXp2-rzAx-f%T*kM>C;V72rQYYvvxce!(=mf>6&nWO_YAOU_+*3msgilUa zmo>5yM`BkIvoRY{QH9D2AJFbHKmIAd`uQJL`PC|4$iSznLfmY>cC|H;F&JS@8yV5x zUHFl@K%gRK_C6iUu-1);=yQleC||SX97EtOn`cnwy{E1dcn`sXWCzrx?trxEPi5r~ z2D0@=>%>vX3g*%2^jySE+92+;y&-532Sasb-AKiIgP&r8u?6KK>_QH#!~#c6Nltq=)@lcl7aHDo1{L{uaYAA zSF6SW#K?WR9;o1@UxX)M zKqN~Ih~$HVy=pz*iG(Bc&%+&h?j%myGhj)P??4OsK%=>bqZK!l<4^|@BFUGGH-*ea z(tb|9O{6`1-uVuUx{~b^eeyOK{4=Ym*4?UH$-%*0ESCzjaho+D}gjT+2-H z`|&ck76@#rN|HE4L!ks_d`P`o5vObN$2!6>e+kSa*>glfFn+~jT~YUYPKBuBZ1Em%gjV6_0mi-Qbes73bn7uQ)$@Tyb${=bX=Ved-KH=~E2mrV}yM z)EBa^{|oXKOO~&QKX&``bF{3lN5rhJ^ui>sQBU*?$B^r_S*{lqusy_qK;%6V(^1eW z)8<_{V`9J;_>APUDBXDUsJ*siI|f>hOFfb>#s27wvxSjQQFx7)@9Q1;{RmLYILH7= zDWnHK*^KuVU4i(|K01{xka&?SS==Z!)1@ZBxR}mp_7IU9#wz z!dZ{3>r>M5ELCyeB3Ru+&(r9VBk1Wfg)ZK9YrSJAIi4KU$%!02ZhEjo4i*%M-^qWk z)9N>hwBqY94gR+pi=H{y{-0cVs$RV${!}FhQ^0vLge3`5wumG)&YVx@a?`9cM-)KF zp~Dx3)F^8Br>I5ckqu5zicJ%-m?>I5nCj7>wUV$4@%auhsFEB-KIkfT>K+DDo{_ zF&A{B5#2PQz>=c5h2GxtztX;;M@4*mzwu+sUEDpFyC_5pN7SoD>FS6C0U&@TsQ(Il zB}Gw!)y>o!!8F7b7R441!~5HTy@9>FSr=x_k#})Ix<{rimKa@hK%Q%=K7ss$AdoN7 z#h&fgkTcp=Zrx`&tcynG=APrtJ*Oh~l#GmA+vAZi^h*P*%N!~*G3c3s596Dm`V>fW z*+sUf(-5XMUnL7k0CBVK+-sHi}wj zCE%jKzVO4-vqRPeBLY6si1}~f7CYB+!uk2^-^o!Td?yR|#4`;rOkK4!wY zFPX6JW2Uc0BkXkwVpE-Mno`jdgKE6aBE~ycV!XSc%C3oMrxAjd_-;clZj46=?j98n z?$#6Bt=&g(_o~J&9>!k)pHGB$8+(Lz9hhy_fT`bbkI>6HHOe$aa~JnVl+jNY@s&PJ zJ-UK}SPXr7f75|=^RP*mvABo_u-@Ugd7z~?4s_i4lxLtdTc`OY2kTeI7ps~3M*3^KP8J31fBsYuVqAeugiC3TJ17nG~`Z$)&0hQs~iCM!ueAZFAH!)mWC77TOtNy1`60nb)O(R|f==`Te9r z0;Gf-<7WrdtF!ZzvsoQhd@J=7 z5>4w;?T}>LT2|d)FWY7NvSU7N2igjp0=*72?Fa{UsC4ZAsN_>c5c7xe20X4^}M7Xd9f2GoDQ6279{OsY@dBgTgv1Dvp47 z4>$aMA_FT)>q1SS5wgd9U5~y5Hx~EzFc2wM=z8CthGVj~dM345&f(a!>5jVD<8QRx z+;KIJUJ?W7(vhp%REglLMJDaALgmYPBNQmgF3MF`)mj0^Q2k31^Ep(bX*3OwaZ&l^ z38lfnD{x!6)vsRN>famL+a(x+EyP4EwbKM|`OPb$qbN0lb2|Gk+7sIBynzVvR&{A- zM1Zf5k)6Cf#xIFPAM{K6idUTJZ-47dPL? zeQ3wLM1@&;1S-DhTNd2t^tj;u{muxu5W{oa3tc(`-G)%6a{;abD5?UNHD!c{4oC_m zk=gQPsl&45b3`E}8~6}#Y<)hU5r33`cpdst-*s50j+~CpAKMkVeE6Fo>)a!!ao=YE znRab}mb2BKMWw?~sxhKZ>WZS&IW8+}EHSz{Rfuv5N1`};Q%82OZJYWoF>z^8fy>Jm zb!@aKbA*0f9o2r5FHQ6mZv%Gc!>38gnzuV@^}djdMXN-1WxS7{^7(MN^##?6tEF=2 zVTX04(Q`YI9;q7+T@uyPc2Gi~Gq?bDNx-?*$~{65UnXc&X^WI#s>eQOW<{#Y{p|5) zK*OyLuf?shq2It`is}b4vrW}tRtq3DHM-Vc=5tQZuudCIbxDf)VY)i4kRCbdn>`Yt z>x*o5#&Ek}saWq2R<)ly($(+QmA8R+ng9MopYK`W@TQ8ols6~eHSJ87QAKQVPWZXT zB*(9&UO_u!WiI{GIUf7cz)fCQ3&^F7=YrH_pNVXbJ(KrnO(9x}48AoXSCcTZ@?S`B z1{WJD93iG(G|}a{k~J6#sh4y4t_$laEgf9o_BHJsDbuwbGPbyG>&pYHfhM*xMETpm z&|#P^uU8Au8jxrO%%)dYIyVF|-9_@Bp7Q#EIcJ8wUNaH>$|`0SfV<$d2wap}Wd3|omQ^*+hg zdBHoWJW&_v&evwT&QMEhXDSDO;ZJ%>o;p};py<>8x&$@}AzuN~63 zewtj)X~d-Q?&IhXm|p7_2Ag(!c2c?2|37=PHyR9W_O?ARCwKFLE-9t)hn=dVTFtHI z0Z7-be5g?4X`i(w?Q`ze*^BoR$?3=bFHA%T`T+y|^Bw!Yktnjgi@o!^;}N}MLkXF- z-u-&tv3A%N`uO*|6G&4Of@Y^DT!2qa0tq{_R_&t0lz?Lw*?r4-By?ERODJNbo`LG> z#sXi+*AdW9M|{~h98te@1(o?#bDca0by#Y6l8g*~9|b1G&4xt);tpONiv3r~$8zgb z#|L7vfxKi0f_dIo-~>^xikiuz%=OxUM_rD@&vTHYvd$X;43f;v&ZIfaScA?`@#!We zEk(S-_lT~W411dAH@2tDBf$2*t%Xq9S}m}n+f*m)ly(Sm!Q)}DKU1efAbQzUj!9Rt ze%d@zQ>km5lWUyXKQ7~TC=6CgG`jZeb0n#}nGL1=+@uFdNiR!uWBKMyG(yM1k~!1x|l zDQEmpSB12n);x1Hgc%!zeKSFk^)P+(n0R9@YD6!SVJ`+JCX(U_c-5sC5Y~Y4{|DZ` zgz`o&lc}FKub=nxK*Q?ac>j`?S3iOK>z?J!+S~nRP2$axENw!ID79Ffu|H4i62*?a zK6M1(;oPpfaWp$Zvs`$po>}hrzd+<>y2kOdf&wiVoRev{`D)-#MP<}~lgGABKqfX^ zRfhAyv-4(Io`+F17^fqHK)}osc)>3nDdx8TOn&LeI<+lA$IHMtW#9B{@APb41K+v} zW)F32`IBlQbdz^DbWTGk7!BbRX9f4b=-q`@ApB|NYPZ$yi{fN2E{}c&PZt(TT$dF- zLhA=3sM1v*ly$l@QK8@L8i)Ju^48smrEq*<0}0*0xQdPBp)-PBxBIB?LjC^A032@7 zhUi#}ArRy*O}t%66!HTjynMTorhl+D$7tMDs$w-POD)e)hvf;Kx>D^|_o7q3mK9(l z6FT)Jtx^)11zB9V`XR9c&&ShWn0iT__P-q)_dVWS;E<%ib#5>%^@1119X)gEso@}! zCd`fv8n>W^O>_bmievQB5Ck7c7@mgnvBG@wfNpqd9&S&o{Q{!2Bw5e+?jlXKIh zC>Pu9@I3t4ywFXqh=f`9u50aaSFVF*PUgv7xz3VP+q+Kg%5{_;6%_|;lv-42El&H7 z9k30AW;r|j<6O%tLbKc*RiRCrQHRRTtvCiL*@8S}iI;LaMEQ-p!(Dn-a4DamhdHO2d0YiKC zyg9B1X1TEKgywbk>RL&}-hW7|nMg4`Ufm%nLXoiB)TeAd1k3;oH_cjl;K-_0VcnNL zPydb$e{yKElt-k*v@;NpjM5^~@zE996NTh+ml{$`D06jrEYpd10WrVMG?F4|BWGvR z)uY3~_dMZf-2(}nlrd~PMDA>P{^&o14ty&&=W~Sv*)y;=|Rg zX6et((m$D{cgoU#_m@}vX8AE^Gm3a7*1 zaPK&@n(05nUI+sG(45!Jo*ul~>CBkpx+V#`J*?6V+(JUGU-VV!`-uIHkM9?{$c(v& z7OrVzkGofuCqlEehY$r@X03H_4mE4qu|c6)_ZzBpKSk{vcMr;xvP^Oddj_REr!GeG z3!#{~xuy<5ErkaLoK$jrc?S>H8ZhbW9ACbimu`P;DTCyQ@uhtAx$_qmUKP*x^cv~< zgn1>fd+FN@H+LCo9alrBCY3j22##9&+o|KWh+u^HLXU7Z8IIQhOXHic(5ofnt{51(Dw^0bgYiuV4Z)d+mfd(qL#$VgJ zwvTc1i4_+;1yFW6@j8;_>_WI;Y##nc*0#sC@QnTzK_Vs}Tx-~Snw22Ux2(;&jzzC1 z5w)#8+g~8=`jA$0lt=p>I!c4e4{dHxkGDMf`Xz@#EE*4WdxVZta|CH*hnyw;%+z@s)s%Ym z<2*H`n_{a;kIE!7uqRB|cgC_n;1Y_~Z3*ZBG?;``ipO(|?Mm~Eb9-X3s60RjAP{8Q zv%#$==lYhHX2LvIXnSqj?F?g#^CU@;A|9`xsG#pkecryp4hErZITJ1)VddSXOM<~j zP#x9`TO7NJ@DF5qEL;=t+(}Jep@x4aq8=iYOuve!UPl?{D7B_uSg7c#UJ=>CJ|Ky` zXai-MYo+Eit5Lc=vIv(aL+aAnh<@XCRHOD1B0`%|W7pWoNsS1ipr)XY@gn+H|5xb zz4VJQf|zHK1i-!##Di$&ooQ6NKMfFmFHyh4#l63*R)_j^aj{5_v4b9;9)FYh+?sHA zMG#Vt--3jtUVh8e`B%)xZXDKZ{t^E>uTdnkasoRpU*IorE{a|&4se|Xk$eyLw??0u z=3H0?+e2G#4|v%a?T!)R_D6Anhw17IjSp;>jTbL?S$|&eO1xnGntr*B_cz#~irWdE z6yxdo)sjA5v6Yr|hKs42PWZ*e*2T%6PnLK4$RI&0lJC8^$ZLvEV+1f}V{#%61Qp9s zk|TNQ@RW%)RI@g@3Q`Gdrk|LNJZYlZ-+0quoh#Q34s?iJ(#4#I@<7l6qvg?Oi(0RIuOj!SCPHc+5n@X3y#3fp^{U6JhzE7Xx1zZrgK{cHMSY z-CUS1Y+pD$HylRbG7Kive(N*b=RJB9{1T%KS~OB%m)RfNI@2W$%D>Tej?<|{4Fv=< zItWX|e7gaol5UctjSshxKx#-s)oz)0p*3~Xl^2F_xgf-(5LXDoholS6oB=77Hj3&g zn=$_3rw2BK^WV$%w^_Y6znnU<9q_7Oum-ZK)*S?TS zsf9gcj-46yyi4>~TE|gIHYHE+=t)szX!JHUMK{jiI@JZW6ToO#zXNKXNHbv$q-i+- z^v&7U)G;tHG^mHH=9yjNxYE=CCw42F>eR&Pd}2+7Q;7o8)OW*N)jIB`)RrfXx&L4s zn13baVCF;$Y)Gt&!oY3KajvsEXGQ}Dwm)&0HtVcWO}a^%xFPJ7@N=NJ(cY{1mnvDe z*kNe9wSThz0+`zqZ)uy@{Dxy%mjX9V^Ud+O#(5y;52ktEM{^gJ{#5zLy&&uo4$#Xt z>z2okJ6{!d^5&>T?Hq1j5yUY2kM{+~TSY1Xq~4L#LrC3S*2=^X%5*a&3u)F=Jh-v zf1;ZD$ueEoqGni&4LXGI*x<%q2ddNigwWl!**8vXgjKq=g{uBVj*vk6%p%@*{gR%e z{->H(iLH99=yaw8zlQAR=AVX6Clg%o)U zS>m(9^IB8}5@7M8a^^IN`ecbkOOsZw~4zGVy_QKqsfq)WsG=Had2x12P_nmn9TQ=xil zT_+V>+*S29w^H3()-K`nj5nmf{*KZ<3h=)hQcZkyN}^$WpLK+q&M5$QU8aBCptH9BVOUgVcj%V7 zwzkc9q_U?kN)Fi5zM*8yxB^4U)l_R;ys>gXVEVF?U$B#2wCXPo74tcHOL;y^o0E^-t3&D^ zmE*JHtq5<*W4CXxZs%UgW5*YHPcG_m%XUDFa3uj@FFknt0mObtK7hf`_dkF4Qo(lv z!#S1ua-i2}*q9pKsp{EyOhlL^FyXNtP#+kLR zS(PXVx=y!37P)~!w0yz5@VPpVr~St;gL&2Yx;!TDb*i(jl-`+fR zj5v+^{0}s^&u~sYCcEU_KyJn{&T+>+sYX>^s4mS?CuB(&@8tBv{A<*x9QS-rRokM9 zR8(75R(Gi@vRr9rxozi0vOgYoTB58@--K0s-GnZxnhz?enPLE4o>gm99Rxn)N6fT@*k2Z z+s=C3F(T#dKXxIsc^m9c ztT!DaKeC^n;L3JZ-3ss=G-2vPRqE(Y>$DNpr6X|h2{+OC%x9yy*+hFb+v+!vE=540 zq>qf!bCI`V;4t}p4MQ-Y8eB5k5L(r_!M)i%i^e{4sQCKN85PbC4&{ZIlcgph`16j+ zp;LG1RxG6r#6x=tPybOjgHr)|Bs*J=b+^IZ?B48ScfUPUqPUNlNb5`NuE&JfB#*5s zEMoYGWHOTY%kvEF`LCcy){y{no?0n<)mt=awifc4cwB3$ySjF&D{x1*+fKH>XLTWK zynTpV;Ja7L+HHr(*iI&17PLWdB)`RSdglXn}mI!7YG9i+$FqHVaijW0y^Fsm){ zE@7uwFcyrwATg*AX+8E3HG5{~pKS=LF@@^z>TD=!iH4rk*bs$f+ZN0p2*zr4DaHne zup_?j&dZoL(YEJ$Gq_`a@aepd?M%P?kLMbOn_Po2nKurX2cpfFW4~=1ZI|KY&j_$} zNTqI?E6zc*xRJz1k7V!7cqvewfnWJ?Bc~q&+EM^8rkd1Gd~#TxB9&ZU&K}(GO!AHgwmTcP z`tr~9dUQr0(nYXN0(Qy&Tu>(Xl>hj?(O^`*WCdpF)GDmQ&%`=hjY~xRqtk)hslWl_ zM#Vdr6V?DJp!-G%V*qA<^{BoieveE+62I3wY0wwTaa}ofL6lI}$*s_wtCM@-#-M%= z`TbzxNZSwtCzW+yqJ2hmwW-t$`q=? zq_#be1S55)-y87@piDrAcviy=YFKTR&n2A8BU9XNms*^qjsO)KdP39 z3zrryF15Y!vQh)(;c8BvUs#wS-wRLAoR;D9+6(3`XL@Prs>!EMI&ISFlM`F@ilPn} zP_%e%$&v)yc0UH&!m0Gp8MYV;7_>q zA8_lBZ?*k%K@@x2{4Ge^sKW~*;P9MjKJ2ffqAeix=!>%Rg=Aa(t*o6?D6c)*a`9~F zHIC|^>XuTG8h_LhDuDl4D}+$@C`o6&v(~!P;b1ZdphPAGR&scul|F(@{#Hth&DUh} z#d18b5>yadi5^_`|I`I{;Mx~kG>+=d&J9r zmiAZm(@#gh`^&N8oxqp!8j}ztdG`e)f`$&X03 zc)*?X7wD(LY?^VQQ;iqs$PtxkB^x8IkVqrAbJ1dccn2^HH{915I@d|nXC?-cDr~OM z%j+0LBtx4UL3SJqveU1Y0%*eBnXx~qjHUkSz+!cHyQ;mqT-#^rnKwdE3QIP)ZSc%G zP+@Pd(Rv{#hkrBjrr=dN12=$<>D6`QGOUvX{q_jbj50%viHEJMU05m?>)X`*N~5PS zI>=x)tW&!SoN5dah`8wGg6L*D1DaK3*RIg+x)$|3l|a;Amo)0Y!{GwAFsBNCYVBv%siW|W31JzsRsxPA+7tVEzVCiSXL4M8KZ}}U zk)X@$319fI6y>Y^qSu~K+=>fUDpk{WKQEdLt!dAq#@GfM#aKk9V>Of_5iBbdbp2uV z0;@lz87xepuE38&;K;Oa*W8S?-e5yTTP!-RVq&&hReV*36h{ri$1!LB3DCb@Xa5C9 zJ38L#WsN)!Cpo&@n8%Wy$<@AhG<@e`^=^mUDVNO7Z83^cpy&{c(lP8*lID-dK0hYR zHr^m>emO7)1bcN9E{R_`!~u8`dd2jSs-T_hi9S`ggbQ4k?%&N0xiBa>&KV+f=&dk4 z+BK3a$fZmkfS|g|Rgjx1t_p&FrUSo2-rxKIqay&|_OwE-VN%>QroZVB&<~I(? z$!7Y=dGr^9Q6cykBDi4Hkl*qr)~LE`g1u|^D+7YAjDJN0;SKQEaBJ|4deuW>-$ zsT{7sUsS6&qL2UshFC%DCc`@MFybC62jWGtTqu&x>k{B|E{2ax<{~$n&zv71N>N9` zqeYD-gYbP47z5!YYggz8r1W4Jr^Ez#){OM4yk}O4d)TI;j0)c~>(zJi)S3G+8rBJ8_v!N{X5a7K;K5+b zgT<{4Z};@j7cEt40{k&k@DD<;roOSVI)Qx-aZZEOu9XsY4(a08=LFT?VK)D%)!Y$! zNd#L}#o8R@AJ|E)#maiz2KCvxT6GNwqwChu7uQKxx>z_VK3dTSrQ;tgy=M+_Y+-%^ zz@0I&4Rxn_eVMf2H!E8csOV<6v4XEp%+6#8FkK!?f3cEhB%WB|0mk41dN)YjZCd%Z z$qwyWStyyIN3^bufUj&PBP&W+qbj8>zv|nT5N$cGyDg>7Ql$CDN`nl#MRPNpjfoay z#D^Cdx;C$@=H0V1Qw8nUs=u`=*`8R~xO_@&i_TY;4#C82(FxPb#MMCVA4qwQtb7W5sl;W@T>4Tm%c`a!-yZBpa zbMK_qpzc)WCxffEP1Q%R(oa|5s3-1_FP`W8t1MK$PQoB9riWc1hgX%3R`kw@8qkVK zvupv--n>HhA`OYBeqzwq5{@%$yPpqEIRkcgSg2_6=j3d9oqLStp2Y1W4ab#UCQ-aQ zAh!+9YMa$1J>VbBp6)Pv>KL3N(UT%%FB{=D@IysAy=G#rGc}Nr7zWJsfy~4k;k@oH zwF(lsw?&37_wPfvbrQR~&g7*2KEwnCuPx0Hu&RG3-3rV6rP3Ywhh`yQsfOYSXTkTI z6L0-ZeOn(Q$_y z`>LUGsXjqz4`G0wM?D-F5tjUEIfaxgyK^Y+J=1?!F70D#f@3_B@0rOBL$##5-&-!- ze{g7_oa7#JykPuzZ5)q9_asj8f6P|*aJc1E-5P_1swp;lb2-@N_*fY-4SU@*tX2-k z;$7wd511t_W=Y*pt|?2RX33WLsqQp~elULM*Sb&jF|*yvX1hmw9yv4l9? ze}Dd>6@g$RGZhYX0vw&X00~EIRXs7^R+s74NY!_sabG4vRoHGCDb%0eZp|32VWD0| z5&=3K1Lu;02y4JMUy{^zt?uqtJ)jz*1JZl-!iU)W(50qcfHYXPrb#B`{RD}TaOA9S21PzJ-xLO@I37* zO8zLKPN)U>qP)6N7zGaabL&-t0FsKYOFKj?$OLDDXvss#&=U=Zxeed{$&RQVbNPbk zy_6Z9GQ#>cG*H`k#V7{z#EZdB?Jfq}^}Ke1hbsVTRuj;_n&We3Yvi-$0)_+pxu|9? zwShQ%feh@2_DN60#wM)TzbEV^ztq@;TP2J&*Mlj-_rdW2{OGQnQ8!GhE-LKcp?^x8lV_w2xFQ#C`xx zDTjNl2Vl<>weiBn5qrrJw_fRVQKiHEH=4XRXo)>P|J zH^Q`d%RVnEp35M7{>ON`6G!&J+fDZtXjfV|fwtQWw9?8ORTQMqx=?q8EEklmZ8rZ% zLV&0x%&5a~P&jqdr`D{Idc1+u>9ZU3nCAi;)fWS-Ne=x3%Q-4W{w~W1UAB!tj@uDjzd@K?y`e*pI6YDn6xHa#^alZQkFhE1o7OpI zTdwE>zqVb$7Cj|bFq$;}eaKT#P)l>V)PgK^WV%{dua2(gihvrCK+BuHKJDE{d(+~_ zSkemnC@D`)_U|S2ww0B%oImC!2`Kv(h^MXZjEd=>;9|TtpgyXqh0R)Ebixa4sr*p!R|ohx*-$)^Pm1?#Fi+sNOKX z!~OUUmV0yqyrBE^zLH&6&J#NR?Fl;mv8a=jE2l1wy{C`owPWwrq)~VbDI{8V>#CTZ ztIyHC$7fssEo%IGX>Svpz%rL9K{| zOC%wMEh4tuXGaXx>K$Xt^@$QlcMoeDqSf7feWXb;)Q1-)y83+S>AnA3PoLJerw3VG zq*KSy)%yil{c(oRI)5a!v5mTmN+KTLULE}@-5q@h2=K{tGHv7R*Z24NziPmGXtHLG zrn6_$T`Z@{kY7)!|3*$AqTPYLVJg&QmM5kg4(Po-K+z8DzT1Hp0RDI#cFFd2NKDuPAGegF5%FsZIL71NTFD2MUz;i-7{_d|E)A>H!O{4b*6bSE@s|}DdI?w<)@s!r!n)ezJHqyGA zX`KP~s?K$UMc{H+)Gl&06%Hcnqs*lfxKb*7EOa;mvjo=(mRK6X0FkSI#DQaoOeevX z)R0N+D%Y46^db9*Z8yQ{!C z%Se)^xukaT?=T`gJ3!!<$%{`zyrvno=oE3DT5a z*WoubC7qiT2i^`;o7hX+&eXKFw~71S#J>J8ki-Xf<);o{%w{|@*8~t(sy-6pvcxTt zDY3G@wv~}IRQ7SAVxg*c*CDSiH%?bDN-S zn>TGat>kvCC5@RUV|nUlQ-==Qrz&i^xJy z`gBEJtc}6y35vxCRY^Z?AG{yG99uc#Fd(451hw?<44uGtzf51A%)=EdTwW4)^!{Zx zk-q%&f5Qpvo#OwO+-}M8B`Dw-&5~)o9=SXm%73nJXItsp_s*bi|Ds#|Je)vH;H-xQ z-#9wXI8a0-)AW42BOCaBkpmE6Cswt=97SV1sh5=Zc~5y$PL|No#bOVo6Jr~ZCw0ib zE`#`Hj;qL-6zln=qnLnciVs%^ZNhzkkbQ!Go89-lckY$9pM6b|yzO`J&~;vRb|1ujvRGPJ>!4%; z5DXZ-MZ$Lq>FH=#Zg%-HJ;#*LoOyG&4lY4XIp?H~%MWsaV7ml+zMp35SMXhqsy3&v zvRqT0uZjvSdx$y~WE}dvYGIx_G7*>G5||}pU+mf?+dh>b{EUddz#|0jp^|_RIeWak zGPG%_FBtq(qh7D376*b+%5dIhB7Tw>#oWAY@{rJS>5R%l7m3Ven-%6i~~59x^M%} z{&#AwdOLw5MGLc$PI$C+_NZ;2;)y5yKsuKZ^XZ%>OCs@b07)kzv`H{EZYYE)|GCII zd*o9aq)g9Mv#+U14M8Ni5_)4j#!4Tpk3&=z{km;>N1HX}NPSEYmKy6EM@(O*j%h#j z1(3%Yg=yMh@}Ux3y;oaX=&cjpVOHEb zOh>b?IHcB>73;~`zk=E(8=Ao99JL`eHt$%<4|U$&)Hx60-=~vpD%bAGyhgFIbReTT z-G5R1FWAUtSm_zErOjj8&(d`dcBpSLvTV^8v%fZW@r7h1KP)YjDC{2xcQSGNibkV~ z_@Rk#-?pOK!=jG{w=*!po0Z2v2fv4qSzb$sT{io(+3bcDt@d7~{%SV6KEB!C_HUNg z=%>g6#%KNy&QrIQw5BgWVRz@mpar?)5Y%I{A$9=5M zZ{~c9sf`S)D~QVICF=U}T39CWfpiU(VM#A2KE53{ZQio7`P0k%HV`%Vi%DLrWr**6 z1OBMGZ$S7{{iY0OpT-Bh7uxh?PzYso?CTI2MHya)6~3pJMwa5qEUYzOzUIWBwva)M z=J;x3YC$C)O6I{llsrbZ2{N)#D**5h63+;RdNbO0^Zx5w_>%9`PF zEIP4MkCYt4Ldk<1nbj7qQDcgysH-ZkabM)RD4=d7p=!}Hh6HPvFKbQ|WORO3jc}xS zyN{6teV&>n>z-LHJIycDKG|2gUoA_I@9U><8Io#F5UKmC&_AhES5)e%#9s;%`}zCg zOp0R16|1Y#mlPG17L}H)hka_fI=c7^I)CkYmhq%+y!nJj9Q2f4qzKSZ6^@hLh>mzOHbQ+pEu_w3q^?y{;>`IJMesop=Pt ze0q)U49h_ygW4saO(U(6F)d-aJ~Oyh>RV`+8sN+neHPUpd6_{owSZXW$E2+T3}IO+ zty+1~Ra)VE?b-Pdjt@e+Lkc;3kn0!eYJvG|!$X|Ei<5y?84Ocxnb_KII;1o3RdH)ifddYhz@yzB6*_B}ChZ5Rc@6Revl4sBI#gbDd65 zEu*SDSZ(Sk;Y`D+riOcjE^4vqo1yV!cP&7+vgzF*03pY$Tc5^Yy0KJGg8kXsDpApL?)XFp=dDK8>X{!07lPwGeWYk%BcSCj093^Fe1DZZ zADa%Px|!9f@!08BOAA#tLT%?}shO1&2T0k@G3<%8UtJ}Y5RV^PZJjzIT*HhfSD9zy z#Y0>5C%vAHTUX(ukB}Sn=%KZb(movC8N}FTagx&*1InR*1kdaof@z1LLoU^!*JA1k zXELk$^yYn^>c2ra2S_f*n#{=oNjAK_r)c1dA`v}Lwy`M_$D<;^72T;;wX-A2CKm!_ z`$YepU2)ApuC>@ z+s!VXGAnMsI*V#}36O6aC}jnWhNO7gKtyeXNuU#VAtU;cAqH7S4WO>_7lfeqw@w?z z!_Y|yxbJFSI^4f9NR>n@n_OWJ9!rTU9aeAq+SsT=yGXaLX-7aV@A?OIDb_=MO-U>k zyOnU^YTmD9T>LDU&=8B*riK<@`#;{?>Dj5@y$*xlciuGhR2KYLZh-xsKb<=N_6 z>9?^_@!5KOZrgj~ub7$Jv0*z+D&&Q$eMWsNOD#xusUwSTfqcLelr%v(?GEc~Xr`jU z;AZc(n}bgULm|D#I$?ALH?Nq-`-o;<-}!BNrE7w(#9g;OxGgwi+PtH4r_Xr336OjH zfV?edoax>KLjHEOUd*0r8-lJ~uGuAaC>W}XLRiH+T%+?}4+Vk&O#UZH(NMxr!@r1+ z41)fi%l~``!dG3WD`s7 zD!gq4rts?1l6Kd}+^-vl$pH1askgXsSl;INQi^ho&38TY>uK>>e=pHlX5O{K8rhjX zHFpCpJIe6Dn_7ANh{=*UpmO3dEEa3PK3vLgvWlV~n$49(J(Jr#O_d~I_FqW7CJmTA z)=57wUa?S~--v~>Yk(Qxg*W6R!y6K-TIK}b`Ua8>wdK_@h(pGU8gD^yKx+9?bu?R7 zxpsQPaIeplDk{jlhqMMDoEIiB;84$$H#g}ws3A(T7iky0Q&sdP`+@~gVYk$E4|fz% z!{qB|5l+3O(&H>GHYz-gsQW?)_qT*NTLRsMdv9RUTaCWPu&>kH{8Bk~-`oTyp`T0o zmBzn&nX?DEt#S`<`vvzfTdEy!kXP>)SZ zCC4)3b0{D>I$Hdcz}7JWXNYh0K5>tpZhZjum@)W^0iA}aa5uRkXD<<@MsRHR$^C<6 zu!$V)X%3x6mzu*Tql6UPA-K$)g=FdWZbH%|6|nEC_^}@WC{H4U|Klr>gEfr8iB3`9 zg6&oOd0WK2XLj}i%mGgwK?FesUB4Feu`3zk=}@(5WNT;-Fh6&u+YjR@fH$zGpkrFZ z@_4LV0+qf?X8F9|ajxkZTVdJMlYn1mFtVBFHxsymQ%}%8)jyD@ zSU&@tnCUlkb{+LT=OHU2w4Uj(aB`bpDXZ_zZ+)kuoNA&dCJo!DTC02p!*8&m3Ox51 zDnLU({u_hug?6l!{%jS};mz`hzp$=Wl*F-LY<(UXTd^^RR6+t;z_8Db-Yg^h)sZ|t zs*&c6+Oe)ZCM+_#3@~hhg8DuSW3*7s&!Qe7(Tbm_p#tBRb0Ei?9%XZWA7m~sbR#}k zhCby@AdhBceqSF^m-51K{<)k#a(+|dEqHWo^8qb*O691d3)Q?VHI`hsjFE+itRq~Z zF7D*?%nlMK@F9F|eNW(eHXmCkIsFl``4z2Z(<{VP=(%ZiKj*&N>TlB}?d;|v!3?;f zaDNjOlFJ&uL2u}c9v9WGbBX8jQDaUt_<6h#?*_TYA)O`^wCt5ylJ^Ac{dw#fF^HdrRzj zJyv+h?K+-C8d#@m+N6#Yy-=RO+BMSAa60i?v|kTuMnt8xBe2wU??>(Fc+)MnCTnguLUGMXFpJd#( z$QHF=9!rDuboK387;l$yp;ua)u(>M4=6dq~%HX~D;Ps8Y#@ny7Kl}%ScV;tP;OlgO z?+=KZULqS)f`(DM`fXWxl=wxFFU&nk{3W&_F%9NLTQYqG@ufBwKK?fqR?0y4RD7OO zrg1-T^#j~i*Z*hkOaP;*&i0?VM?a1rG^{E@P+Wjyg17+51Qh)=nYdMjOx$WoG81-4 zX4oM!6R~KOOmM48Ca7(#WFl5uYbL04ktC?K3z^_jwI*@tVogA7)tco0d+(hI35(kG z`;(BFyPtdSS>E%$&-*;@(sbM98pW4R2Xu5vdk-uKtZgg9iL}V{`+SXVtVSgsJ$)ySis4^U@n?) z&^^g)A*gOuB2VA5zA6R>Tr3tM?Oo$KB20fkhxha_J=_nXj7*r5NSoBxH?jrqj9VO4 zq94xymwCG{JUbn_j^S{U6q68lekn8`;qUoMm|?j1$0=fA{F>miHt1*lEXNtNu^TPPKs@J1T(!Ze1oNKssu4q7lC9yKyCE=0nhR*yz zWs6l&`o`|^_Sx_AF4Uwnb!`p2S{14!jb#sbk%FyyH69SLO2*i=Yr?ZP z-3NbJvuy3G2dwX|29p(;_{=v=N5<1I<-%m*X^d=28M9t*>?}#ifIqoNf2!tl)$UsH z&Gclrx`R>nCp#Y?JA{anK`jV6Kd*yArkR-gJOS;erKO6{R+qk-9UM$TN;=d{#?_?7 zBu4pz46o+A5}yE#`-A^;cYv=bE(v{j<2`!hA`zBghLH$M^bcZu!O(NhJ{qqODvWGZ z#jRehXBHOcm)~s{m73!-^F1%czv&fo z-Jlcf6uR|psi22u`6GsEp`w|RVJZv7ag>*Y~^3Moy(0*W{|4S4~|k_ zIV=8XZoJRj_!BnnFgM<1b{rouL8iGeOOCrl4m-benuL0ajC>mzjPx|UZjM8GnwI}xdYa;XSvCJz z$D>rzXS=ARaWCU(y7h$#^L)$jl+bY$`9l6{pJ2);A@;RtZcpLdLNzEr-h3;sA&t+> zc$Xygc`pvhVQE;Ffo=phWMGFk`0C`)hWpMEzYa7_*LQnDm7kpZbc!1(w^xGU2hIY$ zAxvq5ip2KSZoB}l(8@@#5l`jWLqiLq*>+cOWt1T%w2T>+y0Ib>)LY@P1+EeyyfGCx zqn8j(iFhV&Px!A6d9hE^M*qY1;a7@;`{pe;DvbAF??m6yzjtCqZ|_96lIVE)4`pwh?oJlBs}NL zbxu=X&+~cn%}vEF_f$z69A4^mx4T?ZiHfV#zSgDMk68l)!>wfXIL~)O00%@VW`%vt zSyGH(j0`l|Q{qJwwYsEmUxp)_WR|dwde8%N=o@xGy_$P^?adM|5%ji0$Qlq- z6+5#q;LhmYI;ET4aWLeqD2a#)9o+^~de8uea)!zK2DAaO%`6$jThJH{6rzGYy6gLgj3s6+c*`Bu$*_dd67EnA}mDA zc$~pipz{A(;ws-?e+a?Bu7gw&ulwtCmTT$uscIz&%2x=cf#%Tj}Av^~%EOcS8y2+(qBhkFIw_O&>@ z78RT@i637fCeh%`tcl3}c_1O-WMQYPJmv`cCXKUaoP0OyT3nU&sg4wVDTqKQF}@~e z9WRxi-yX12&)ERss$G8M0W0+dJxqXx`<#tHlJ5@r+-hjWuXx})VMMj5remw%wLJKP zFF-pw^*rMF=b$iw_7=5WRJMp!&jGN^fm_xdsTRA289$e>qlAjo%RT z@3-N#?T7yT!~Znn7AjR~4ZI=qC7G|tzGcQ-A3A?MdOw0|Yb#b13%Buca&Pc1Ci4#P zIO@xy(WZzbC7mnD_Nbt)t`d;hvMTTnyU?gvEHUXhfRJqaghQh}+OzM`$EICQoHR{; z08AN<1H4_p{J1YQze98i)LhAOHYN@W?Uk5gZ@$HS=8*jUf7$q_yG7S->9V7C)`$1c z|H2f&I+sBh!3dCYbo{J);0vQhV zBOz;F2VvL?Y}b>4xj2nn!N}DNtJq6_Njee<+S%ry`X5ze`)Y&ginuCpzY+9M`=254 z2#GR>zsJNZ;NLsW9&hKBzS(D-J(KJ$#D@Ujh_Z7Ue_h^7NlBP!Pp?FdZDZ%o?yhvABa=+Qd-2ZnG#x_k)R#>CCy;sk=He%%ZR_WJ1`;CP{o=~0)} z5!j#sP{k`zftoXE=1It`*`H3yaLk!J4v&U;`2PNf3+>X$=HZAaT-`NoMsUImHm zR9YFNAGhV@%kppH%TLCaUyd(7Wy{Hj=_wC{&rbuwIQa8K{;X-k_Og+g*-?Z}&*>dv z+)eMpee6ZS#?kKe2Dgba+Q3r%9_|1&6mO33RyH=iw8^W^D^eFomrP3OiFD!P%%0mx z{1kODAq*L+ifRZWM0VNdSIQ&4ca14#*ZYj$B#{LI942tYXqNniyZJszKPEW$#baCd zvi#$`yB$2L61;uCAD+=31H4UD@vU6OCe4k1ey>^H}n6FQR@=Qqa+{{0DawEE4l zIj=}C{s!b z9PaM;r@bgizLoP5P?kOkB-S*+a+%QI_3sSD4U*^#>FIk1sYBc&)^14CiW+Ghvf@Q3RR9(H|I`87M+xBO88*f=+ec!?N;5R`mF~dLuHT(=o zQ-TwFbdhLBy@vbPTo4z?A4U+^hm)-9Zz``;B70jF36bNbk)Xm1$1qmBu~1<06(fa7 zQPm}rqhz&>uhhw`!T*Gj2qMweRmoJ1q6CSJpg7mg@37AIMa6|*Tiz!JbnWC z9?(rLFheOHjLLMe^xOHY1TjdQnWfFvwoYr?%htB1t!3QqCJw@_H%EuJB^f=P8hTk;LeN}ES=unI5)Tte9$Zx$?5`Itp#a5>V zS5gxVeu zYP&J6VqMSNWVYwrP6%B}jdO-EGK|$JC#yYvozte41;QrDpa82%EA%7kGW_LFtb@T^ zsf`P$!{k1U3J~ymggIi3sTleBeCyeZnp2Iu9lj)-eJ`Ali6&!M{f^AV?dw|k`VIQI zpz1c*^=I<9580>E+~>#EJ}+DQbRM$LJ)=cM=ka1VG&s?olZvjxn^FZkL!PN` z{H{kD!q(AdYx{mNT?&hDoK*BYAcs8tef@pkX! z+U@48{M9N#6Gh-G&srzlXcg}>YuoeIwx3zsZnm~{TibqWmSvZ9#%_=FZ1@jG7hUHd z0Y|T+zJZx(Q)gE7z962uykF_7T0FhYzr#91v&VdP+ee#y$7WA+pRVJh(V4ULhJH2X zq4+!7+rJ{U=x^qKqzRuJq}VR_zcI-nn7 z8Z!h}3g>}DoR1cr3jS!l`s-R<_iAT1fO=`a8sKl{y;cKWUDXEZ_*ekc^CiEG0lI}@ z=|8Li`jt?O%jd;`5J#A`9AR$LZ|>87Ah$;O-dvia_zAh~L~Mhv2^S*+f8uN3*v27a zI*T%r?^f1}SN2Ql|w_nElZQDIg;HqxN{SB+(X&PXJS{I@Jyqbb`Njco7s;?JX} zE;UXY;l&v_sA3Ir&z`0XgxFgM%ud5c3>jc9W+)6jo-q7pc9-lSIUbJ62Wy>bNNZSs zBUIvKFs~>pa@@tMrlvovbXsktHweXeO#toaq_JunJ?ZO76?)js?pjABsuWc8J%nAu zeIpmo0s{Lxo^F{I?dyy*5~Z0R)l(ub1Cw6e0P>6+%A3do1bMa+rhCb#Y<>#LK{1hA z*Q14ub=#dpYuiI1{%)&V6lKNEvMP*2a7h_MNaZ+fh!@~o3EP{{WIjgiD3by=8kx>| zPI6#9zsg&osVIWK1QTNrrSt2qJrSsog^q((~0J8 zdJQnuux(B%j@>vn`O-_bPeaLh?xn;fkma1Ouhf@2oz+g2oP%y`@4vn3q$*JMnEf6G zWyy^#bOZ?|JSO+PHh|?H*KZ;h-^>HP&zzF{(G&@}@7S^I_NTSLW4Z4KjxAN*2E279 ze`1$84|t79P|6&K1-H44o$mObfIxdKhgiR96}n$Nob3%#g5VlRd7Bq_d4N|=vPvp4 z5OFMh8@65F1FTdjYth#A`+$9(8N z95MQ8!@zTns&#xu_|4dL~3JHQ#4VOOWVc8;S` zO8Yl|MgQ{kTbdm&t$8Pczsoyiv>HTGBMyzvIQc@lcaJd(9s$kkJA+Fx`biUKn$q|GZXd_FYrE^oZq$1X`w5bP8!e35pIavs zlk<()L!kxy=FEvKKuQ&gY9#3K_b}gZdDXd+Kr=24ZSR2LNT$!g&Ctdf5T8rYx9}y! zn3XKCIH(pf`*Z!Z+L}9`wpTyYgBE?;; zr1C(myzP*#G|ouI(s^WEhlDj8)7=gS++V5go@E}2_sTKiJFZ#RWq!xo6eP=}Q>|=> za~ThA6}S5~;`aT(NV|>+sIfXHP81%`AR>jtS3?(ktqd0H{$$MrPo*v!Nq_xs_irl} zEVf4cuQu_sTHDcD-oIc2NUQnfW3-xAjjr5;$+>_^|z~(lj!}(lExU{YCmQJJ$>S-1eN9dl$XZOuP z$vHpvi@P_8&-OKcN1HKEocKSq;a_2|Nkbv)8%wOHini3wY~xgs7M)9SzOS)Or}xO= z<k6N?BjQP|_)xHYPhEK9ht|tT)lL$z9^arA1x>S~_ z>eaDS$HdFwq0GEWT!?CA9cJTv+pqLR7RN^R7Y~Ac``IIOy8mo{p0vUnuOztWzW|!p zI}j!yWOTcI`&wB{44Q}d_~rHA@-(mi{UqC6XP%#)8@*Bphf3_@3i1(@cXyL-4^aSM zju_M?=jeu*Hs2nWtV&(z0>2;9Hyhc>QTzgd70q zeLpvw+vorF=C)?#n*Rd}yKl4YGi=FIkJj_lC0%q(t8%9Sj!78U#Pu?zgLl^8C+Y0; z>0z53soq6I!E(Y)`jm*i#JK!;RUo4ambJ7y)3n_b=$k?L7E%9`%vj#y2Gjv*AID2) z505$D0*KLX3YItuS%W~MS|omnl4dhTExyiViJPEUu%bEir)@NxO9;IPEb(&im`s^j)5NoGuGa)7MT_PRre!1tcZEXBZjQ4Lt+3|K%;+va=g;^%qH^nE} zb!H_VeKh;6Uw81&HvYaRIox(LArna}7Zer5(dsntF9JndrAYJ-bQrxI!XbTywdo5w z8#<7KGg9_Wn0kF3hpd(=KH_<*xTXID6_{||!&jpw(7&F3&<>L{s~%=>w*~?&1@`cQ z!mw9FdIsyF<=w7W27J~byh5iBb9L6<3|)1%tMi8mAdguhnOP(mx(HNA z`0NfpcpS8ha7KBIGY4|24@kp0p2;eSAxIDc9suCXOb)hi1KsI}5e z>(s(LH7a2{c^P?`Qy+Mj{EPWblk#CZ8JZSi@LNivpRcpg9Q)SO8<4^x@StjAvRu0w zz{H?djGZMUh8w7WpJ$mnb>>L+U)Qc&xgbss)xRRrj`|K%vX~gC`cy=!=#ib)OO`EN zUNEoUgv2tDjxe8*3OVuDRLEBP-0>FVDjLP(D0Dz{w>ttAp6Tgj4zDYwBd-L5eut~Q zM>p*S6zB{`#@NXtP0_;|slp;k7Ruk-s0zXLoC&nb??~6%BiqRKsSZXL^SDXUsTUX= zeJ4~eEBIraH3)YdEbPz$n5-oSQ`^K|X2{iJdLZAc#gx+faA@_)8%WYQ*i&j?c{xb_Be+BRumX*tUni|GqE$Fhkbth>rUHkJR^2 zlDJ zh2!vKofk!DH`12vh~kNnuZe#x?oA%IW1B-?MpJDfF7@47TpbjYAb%)fl1_^^SN$!1d z2jP$J5C##m0}q>_K3zw;koG%uhLcinI)?BzIE!^A=Hi&lbToKqAoJ-r%qy=3&|B z8WG)CkBHIAA*Rd!9dtO4QQ`GfE@OtZ=6&3Ua_Tm5qv>ra8D%ftv{6#@`TCg0x(K0q z1ZVpv=GAi*UL-xNx(vFc5GYFh*dBDsnOZEDaIm*@g}K7lthesk1)WYC5liE;K|q$S zw+V@@9xD`Ld&>l85-}v7XK$H2tcZc!r!1tIc)IOIl`tjjG534i+;5M$-{aPPd*b`u zXH=|USfmI`o9S&z@{9`x(N%P{zfF|3Ree|V$)D9uY)ChFnlAl!emT$5N;l= zLZe;BZRIcvLJABAXdkAf{#Z3|)W1hj`(cLL-;*R_(I0tHQLNw=s%Q<4^LzBYV2s6d z^m-W|?ZzcTQE~7tx7L_{gH#Q#I=(cjl8ZJ)Phws40Do}5h%^NMsLZ4bNOP<8d-MHX zSEA)vpP_B@;Z(zgOD%>^zC!&B&+RB`kv%FTBEXm7>lXYnHMyulOD{{kcy<-h0^|Vf zQb8MtbswXiSyd;ZUQHU>YpJH~D-W*kBevd8q%kycsYVgys;|5ZU4Ig z#PA`KD-pS>y{pq4T1ajq10-&^ceO+ZBLl_?(^+hFk+tnHb6d>Z_L#M8k8G3B*W>24 zJ?6H@+19=C%>wEmQc7LrsIa)tMfaD{Jkg%Q>j3hQWf1-6I00_}gt z$Q(@FxE>e5Br0i|W!PL#Pj4jsjo$vh8u(gOxFk*=_0NufhmCm$WBBn||53+3YcRD; z9vS6UcUuPc_RW!MvaMXHcDrjs!q^d`!bjgwqb{t{KCf}ba9U>+p?TfbqVs>p@MN#u z{6PBLEU)Kb?HE(7R>C!2qlHuPJyTozX~1KGZ0jgu)X&q+*WG?hD_X?aD&2$INia)2{8vdIUSo zxUjeBRY8Q_>`!1y%gywa9y4@a4*7vnJ!UkVz{}o70#oC3CQ#P`RK0zVm8D;k?#yjT z`3?zg!rOPJup}Rh{Jcgy#+o0a|FIVRl?;@mS~=r~Wtzdl#Fc((BSI2)0DVfmGLru5 zQIJ(j`b9zhL;k<{dazb6jkMvp5lNm`%)eH!-i(rNWo~CAo$!Bdc&;jm!&{GFSN1bS z|E)%*c{1zCAI093rg!3TJVUZM5(egV*G-*y(oA25Bh{{kkY!O7LRHFdPj_Xw+^*n5 zaZSkN%oikm(nE|>*ODZc;dCrHb=_rCXMazG0SD&Q3KwT$C3(bwSJZdFAaY1Lhfu9Q zhxHOm@o^euxh+!+hfhG9vviwH%&|}XnYXZTi?!)vzcAe1VQ%@WwdGc8%YJhU6k{Co zk+tP^TV_Q0N)w3-b&d>44@<@tP#^f~BF}QBJ2_Yj1_z!GbH#nEaArtObF051B3H)K zLSwIE%}&1eawoG)FSn+ee&=Bml89xS5$VJ?hf06#{Nq>=BO7lyu@W{+y#?%{Gx!o)f zR3k8)N_lAf50j4UN+dSClazCwxlVjc*fzjTK!|jX_Bn#*O{uSi&pMSjwkJ2T$xiAG z^x$@NgT!e|9LDtFo|ed4M(U`@9LJP*9PY=_YSN=32s%a7C}`X&I@OY~YG{tv5uAF~ z{`Mv{9h1_P>hN^yF}2>HPW5BaR&l}=m}}LMxA3%{Mj=Vfj5*rW5bU;C%q@GJj3WV3 z$>&Wd2p7Z6@{TSik7$i}yK%UjqLx&dJ3wGO(FTWQVBz&syds zkTZj9la&DPiPE^oxZrQ+p~TmASf8sqLdJxFY9eu~(NIuAWNnZ}ltv=ntHxg?a%e9l1=P#ni+=3ShFGCgjy&K?neX4aGI|M%MU zGg8B3iB9rBLp;f2*4l+`caIiU#Qe&_kUF1-s@nYMba^CeraO)^6Yq({6)+{t5h@#R zk&!g)|9pg6U3hdH&k+W#fB!hO=&*rG2B#Y*F*xzISV=Py_%!enqXWX`^pR z^Qz=DE9BQp8?-@RBf@wWjj}#x4Qq6-z*)tFvO@2`A7S4bOLZ5!L5F8CIvH2uD;NHr z9cYQY)24HAceJ@(ZtCQOF1MOndYH!J!4-Fc?=K={(Yd~OsXDG>3llz-k_M-#D(HfR zXYZqS`!&Vs&d%;JxpuXt0!4u|HBhEJzb+GB$U#N;r%YC?Uy@_ipDpV_&^afPB%L-? z>B;I~ty-dzFsnXvO)?AC8Wpx$KncKfoO{JuVK^&~28< z{apAB&K^@m9a22^PSQzFWQ915f4e@R4fnCZ!-^Zan@#`le?1d-b&(aF`w}zmUzjWP z3BMgWZTh~0=J7gi;ged`yfh>LOjKb+qFuy2A9n+frEOw6F?(rz<;uL`${RetBa20_x(pYv4jE54JE!3Pr~PK`g!{U zfy}C~VC@mS`{q>l0^ZqERzBHye48iW)$Ae`iP(YZQ8NE*RO8`bg;2d}5osK!< zDv5jop(ua+MKXQ|Q|j{s!TX&+jrxGtRYb1*vgFyChR8ni!khig;uQYCmLvA<-Tur7 zOCOq>?(%1f!P3cPf0mTzjj0C%rPnvA(`!<|#+0wTJ{NU5?8s6;%^dpYGGVfR*bqhX z-<#jVMwOhiz04ZR=^$BZHOV0!VtRa2+Fgz6Tx3+nRTOgyuNquBBe=6sk0;mC{FzbW znC@`QyTrHfmH(ajUIdw(XLW8!j|=G)Q_oT(FllwqW=E}e#;X15@c{n7q#{1kdOu%F zDteS2_X3-YJKqc#XC9B;c@|s}BfWE#OES{YpgBvhzV6^_&*TDdzhd(>#n(#a!2K<& zO!|hZ^H*Qn-5tyb?I6YLrAT=}`fgI_OILCumFqHt@^nnz`OPK={r+Plce!Gn81x?< zlT)n2`#*}@ymYcluONPn=b%aurH%Py?4+q8!T`{|^Jf8naA!|3|MCUu?QYVk>!YFN z@S5ESyjaf*3%PPPe%CQ|aM`I5Rq<#(lLKtot?(JYyS}CorG&31$9Q_d$ac2`7rb8g z>N~-{fMel3t<1r3U!_*(of~z9BG)?6TR2m=P}+etPqMxE(&lS+T#F}}?B6VPU56T* zM?~uLdW_F5Wp6Mp9JcrVV!#^M>B)_-DmN8+Gu#Y!&R8%8cyz|nVzr#`e1)3S6;f9; zv~LS@!|mB&b-9p3=o$AHd)oB1qi2lvgjKev5}XbzBojLx>Spyl?DTj2t(7sk&&{?v zZr=ByswCNE8W%QI;974C*qd6*jPN| zid1`f8TgBQAUiLFJ!(*EMmUJJQ4! zNUvt53kS~>T~!zk5}s~}@9y@*_F%Yoip@AN8LZ*W?I>Vmh;MITQ7%SSks4elJP2Q_ zK&dtWwyR2eAXpAXKhvA^Y~#!!YOTz&2$_<{UO?lo-xo5b4@OoD&8Vnvn|q8~c^dYC z$>abbx7`;atg(q?6kIIKl~b}2){3|zYGtYNRl!_Pkgl$V%UHD}?6`QkeJ^q`{>7Y1 zU~Cf3XfeZrrg0Z-Vk)A0XoUqH7cE)Ty}Uuv8MUkYX;i(6USvK6S&AFR1-Cl6C;@nj zVh5rZdiKypvfd7ah(6>uyFk|*7{YBZ z9`196g5l}4HM%i1^kFXn>@UfyH`G&WyTsBhfj~F`Ja~$nb)Idk4XbjcnfZTZgSt`& zQb4Qb&(3lici57FP6%TJ^p@$%PMvxMk1s&a3jbh-xxRh5py4hAB_7aEs)cp1c6yO- zAdU1Q)nwxYHkEqN2HsmJPvaqZ8v6hN_Ins1(!92!j^4%`&&wTNj*3U`^T<8Y^AOBm zCq=(WP=68gv5Y(Xu?X;w+kbI2^Mixte{_I6lijTJ_J1Z1A%uCdC6~;@Sj@ny?PcT* zx`ET4W=nb7ZBFWaCi1nhJ^o0@KqgTWu<3kbp3U4;-}_wh^sVw-x+T{zZahC?c3ngM zlZM(?iqNkqDon6g9w91mc<1#mnAQCZ_AltkI(_tH0=+mb(OJPU-)zJ=<{vDxIOZdv zNn{2m=;dFt)DiRr?R&ftnC18F3u<3CfvGs1`kRt8A)ZsFb3!zJ7mgq@SHtQZdO$Oo zuSq*sLLV={>c_#Jl_m(}AMgisHkva8PFIqf?Gvq;Y^DHoBk;)kN!%;;3(&FBydc@i zCV~8C2T9cH6F8esx#mdXq`1SH!*mwewJ^f(QzIL~orip1$%g%qhoIn)y`d3j4_qRI zToNb0rL315zW3yv0NzIAsKutrq>1IBl&eVV6MA@HvN+Wap5Tcil&*mj49`(ZGO;g& zzG7KxpA(Qs-0uV}M>xSlUvz>}PO#6+ud>c6jPXuA)_i^*)GT;c+?~6L-`6FwEQ)Gy5{&Rm^cT^=ryYR~{yLueK{|MSH;?s${$%hQ=>8?y zsD&KWc9jDR^coo}ajzA|0gNSPM|D&Hqt!!LT@5zNS@VjD(&cl(xf#>ay`*FoEN6M? ziq&VGJNcZ+=bjbU&F$AW^;8)pPVfFJ_p zfQXwNdc@);(!tJ~h4*%>8rB>N>#VJGdwGygY}NM5V+SArvQp+ksV!5+urB%&{-$l?>J7pr*Qm>xn1+Ci?jzM7 zcQHEX7I396#1a!PrA`&*sgyWeg||36{t6$`UNx|R>C852c_9-u#PGz|Kf-*Yo*tD} zMLvOvA9+<^3)O-Ya`rbgUZLX{smE>?6^ItuHC?T3MgxMW9i2sDd2n-Nw`8X{Go0dW zAd#@ESLOymLPPyw9j`__OPh~rxD@8g20Hy7)_;cIPe93^sDrBkZ=1|o4?*)G+xD8< z<}^T^X#xscxCiXu&D@x*;OA7ikB1xKApM*B{IMhFH9yD)3(V_%uniYM)s0u0TlZUd0nM%7${Q>&t z2mDoVhBM-lQKcQf*RK=;@pF~9Bhf-v5R#wGTbPZI>-M%IroG0+$p8c&M=i0$q5cG; z@5!Prcmm#u=pNkgdbGe3JIUDc;;B4qm|lZrBr}6_BDu6}0(N!C2$aW`$*c`M7ldvL zvZM;6>FPW9LLwwhrBhv=hChPHD=);-D6lL6h)s1}NO`JABFu)BIu)jh#jr%O#h<22ByPmNWEUkVZgjlCLl`yH@i z+I93XcdEnq-w|PVZRn0Yk{L1IxSUip!Li`pL*1I`th=)%7>m|spoehnvRKTOZO;ep z@^za!OZFP18w%~^zRFIln@pL=i0ALbw8mhyPdfp%UxWN0v^G3g>9K=&uO_9tal`Oe zxATYR*a6mXHs8Ett0_bTPPbJW8OiE&GJ`9KiQ1XnHaQAYvWSG7o|UCfRTJtOjhVyS zBp$mU*2V->k84MaI)B6_`y}lUwAl8Q7A4GU$1(k3`O%dU;Ct;j@ee+_Qru#%9arS$ z5zyTkh8 zXGl>Dd$Z0sYpBB!V%B#_)~&!9F1%^})axj$qs8Hf#pcr=iP)!uajhX{tOksv7Bmph zFaz<(m)C^KjjUnQW=!0Hr$ea2|B{p@sbWxQLGN=69#i4<**F;GASY*CD48tBsGzTi zwYLt=bXuIb$RX%}an|u5#jd4hhN-1x`DNt=I=7%wJEo<(N9$AO7VFU-sAZSviq2@X z0I;E22-5OG^hlB`eT7%*mMo3hJeX_Ni&W=H7G{xw7DD6aWF zC}*>Sqc6flvuqcu3}3C^>I;^(I;jHhJWgZc@4X9_&ikg-86}J+dhx{9KCXLuuY_}p zuLt`=>901uWKI2^AuWi`DkM~ffImnGr3w)p_Dpx!3!Q~o1*@jIqp*=taZ?K2Q8a1! zom(8`JHPRN))z!zi`1~9iO_>g^N?7rrBywBZ$vC14huYFw3a*KP66*y5UqYp7D& z+oEb=RS+jQ?toUN6X|q)oz(K84gWjS=XE)j;~po72wcYJ3kIh?>@0EELr(k6hphHG z?GMs#a}^I&v8U4ID+zmcyWJDQVYj;ltq1IzaJQTE;;NpW9$0ET^EL@j|o;7K3jLtnN7Xm^%tXVT7A2ux>Vng0fMC5AD&E_3`0Ob|4nim*X1qh)KZRq zS(pC~!R+)C_>KgP%)2+x8Xj8zl$s!8)+m|e^mM9jm8LeVuMscaz@l!5`*b7t8D4J{ zBD3n}M47j)&s2X<=uSss-9(e^s(yV#3L|`JwQJxMl z%BjEl1L{Pg8N9$ey8gT{xPd(FxsG3)sWm!3C0LR&X783Du4WHvcX|^s5$uhhCFwj5 zMCy4M_p|Fg`bN^b&2+2u-kplHtCD0xu6XdUHKaM12f&#_hNT>;zM(53ro4EMF>B}~ zUx5#gliqsG&9oHbv|(yn8BM5@(~zr!nreQYuDwy!(g5D_=e6HRVFKpHkGMfY@pAK(+7#(qFGyD>{r|96kZ1% zyvGg;f}JT!;x|2nTVHkQBECYP8phOR!WuO7g(*SOX3U z7|}obgQ&r~M-WdmW{fbd8WuE8A5#4BZ4WIlZZucgM;IByAYN=W&KaoR#5S8|Go}tS zG6s=(m5w0!P&$>u=(JM`-M1rR+e*EblHN*5|1Kq^g5ol46D4)9&%V7BkMwkk_q!yx zm{&7vr#Z=gXy~_^g>-&b4Q?ie0+=1+kPN>!?xDO=#5}8T`ik2g0-rPz-cjw_DiiG` z63}06Ot#U>SL$WsqE8uvF%*tFP9pi|eiftP;IRL1^uQz)E?yQFAN4UevaAJJ*MBN> zxc$&)qVuKktV1SA32Onnz&fvGPsFc}4Y7Q|5}7YySeT_VXHG|%`kZGB(F_JMsN2^N zpRhZ;F|XI*Ma>!=0*3s7u!?oYqB}C|^Q(2s?DPpJdxvgutpjVp)D;_iWhtU&6Vwb5 zQnq4IgH5r=&5`wFs*naS#Go%sZfGlsjPR6QN2 z3VFK=v;1CU?C<@Zq=x)KdkOOrJtvOxK2tk}nNKU6L z#sDCyOEESCed@SUF6njiSiC+iySxZnXOc0?=1omu$`bYd5yr=pOCf};P~QZ*KL?8`8@`K6Z#FysSuM?RUoef>Lx(Q?D8eNBH+Yp zG+T|K{2?cgb~N*ypfdv3HBOln-LaE^E13muNXz=*cZ~S&&~)}L#0mc{W-Rf zTjf?|O>YGMBb~*H_9*jcsMygFtwTOd*Mpv%LG0hFk-xJu&rvxYGL_?*t`Ip0Q#zYq zE#ql-q$d)6|Dh(Hk5_Nab|8YvV|k9pa&06Sub7^ki11#lOrvTFQ714?I`^~9tb3?Y z)e(xl&nH>|BF=;4O8*;}E;pbqud&MS(l^)Nkre{l2M4BA`pV8k=^Nsu&ux~{FAq@q z`8YP^`Sp1#VkGEGKkYT2d0D5khuM5!_szUO;tRtoc0w{gtYOBt;MKSQxfqsK=Vd#x z)a0~VovszBxv7qEPM6)sxZSYP=^~D8Pw`=cv~qhEHNGeeX?rycG8+t%Fi7sG>VD^8 zjQN4B8i`F~@-Spx&Moz}$6D0YqK$Xk@_@Ye`;KR@8b&l3@jYX$jXJKTz#m;T$Lm?y zj=Y6rE-oR;ceV|po*+|OH4u#`GW_SbryyGE(o2|oB7sJ_QX>pvSuif>CwcAgU&Qoo z!)fKoILJVnZtejC_-1@x)nQCZIO%D9XtSq8DIaN2nT*UCjss5_smZFSXusR5V=Q{T zzhW-K15r2VJbWX0BILTnI3FLIxF|j60z*ohB@dvM!l7n7C=H#B2sRLz#rw1I2a>p0#l13*34)d? zb%vPzjJNi1vWF{-t)o_z-c2iAo9FbZQ>4ZYt}wUx?e-gPGLNv%X{`-kcQILbV|k4I z_p>h1XHReVx`~|jbVhbso|_wWIssXCsMU4M9YHUIrcJhUL0&^|CvK1Ccit@$Q!4=( zR5o99QE8iF4?h*u*8FXFM|hQ9Y* z^>YbMo<--2E}RZ}UJdv$oGc z>*;Wpaw1w~`CBdb@DZH9M=(JSw~P8j&MoJOmAu#M%soh%#^!_OO~NL^$&&br`IE4$ zu!$1R6mhYXEG}4+zTE4HJC((yvi?HspqCBNj*&TAkD6GD&`TOjfC0}sN0wtM|KZAo zoRJQ#GwO#xBU#NNs@k^2VWg96hogQsvya;Y0bCIqYOiKm)6f>2<5;+b+D5Lm4g$PnfBW2f`y#mTLJ}^KTkm z=tV2fn{wimGfCVT3#2KpTpZ0DTF4L=KlPs|6qc46&eXA1=Vmx+ArYn<%v5W-RK9Tq z+DtZ7Z#M=ztE;2Wt|wlB;g?Qp3s!4y0bU@x?YmarTOF-_>?h1+PbZai#e~c3QRv>P z_b}?wJjYk4oAT6n2^jTsXFIz64ir}fS9EP48X~pdQ;-gUZAO;%I|y^dbUUL{>sq`| z#&rOc%R0zIP+0;QiF^v*h0%8u zio1YB)Tl)@jgVc~a{=P`<`Itq>Y8@0H)dQkklE%$LBZzCQfH>Q)D2ax-O`uj(P>7z z$G8hg0t2K~kZxDYo8{9Dj3N)ZD7;6*>w5GIF8f z`|Me_%DAZio)3e46$OA1x~p90PRa`3p5=AveD$)w3uC9xp?d5BEPW3AyC3}S(ZNCQ!jJpFTKj&ljIH= zidO4p>y8i+6DzHV-)Crl!*bVVL%Ndod4UeObOt7rFpsd#U3-Ih4q zAIMvMuB=o&Z)EbB7XK`=3RtR+Km5KLjhq&Dwwt^Y{0sq6rwLHPOOsKilL^JcM*Lyt z!FZK;*0CT^*3LgK=VGm8nd(6<22?rz+2>-b4tq!1&^i=vV9I5#6s2zQp$RrL5T~Yovx=*uR3hGZ?nXLUri& zKdD&wO43w&4;{8+eb;|1vQuTbxswk|aXrA7E@YgVnQe3KV4=G@KmT*RjCj!aj+JL#?&;i`8^!!z zD@N(_NhAcQfz9Qed)vI2-fB#D(Jto+`2(y?dE}s}ZFUq`<*$FagI*yw>Ip*T=fAf#4w%V~`PPYay3r zfH_4*BneIUiBpVYVMA_ot79pn&$WrKa`-)wMxNuqB4+nt?{;rJRP+oJgcJ)swVT3j zS9CW{zI6aX@~q)tUWfI00UiW%PAzE>pw5|h;bV~bX^&>u{*;V{TfdgcXAz&g_RmT( z2@H#wut*Y-H-C+YXQoRV878IR=6yNv$f0RQ;myTo z{5&&mQyi4RV6>XY_SjETfLLZLW{ZdEZg=8Gu`q~t7~_0Im$Cp%ELs~9mLi&D-;OusfiZ^tto&n1!Ds3W(a(BXFN zH)bbeU=`waAmks$3zlI|jRM@R(GIw&hUQauvhX?pD63x1*(09p&J0AL=P;=8P|j}9 zmwyiiT^$tvfMf))^6OMC9H?qi0~8!J#H^`=gNoE~&9UO8)UFLJ+SP*>gO*Wb9aoAw zJJyC219DkvB8K6g{kkTmV?DZO61bE<;szVo#jGVbW2yt)pcT*KSCK={8Lmq4pvKhw z0hTLi^?D4!4I$tyk;?Rv4cE6Cf39%XB*#0jsS+q#AdtuB?QWEo8)wfQ}NbqSEu#a*`Pk`gg;`kaXCyyIcb)B+(yq(#B7T3~RCQXKT2Q4| zMRvK>Zdkk zm|TcKsNPtN#V1YSpvjl{t$yVX4NsJRjbP9-cL+x9{lyjBz_*7Vasz8b-g~du${Wg~ zTie|A1k%*0G|koYzgN1;JGXj0^l zk#k{|+r1P~S=!btnSqsKB4$m>!WuSC9|^@VThjHa_DgVFk4I1Gn*n`BZDC}(M_;S= zy{4X7hEb$l;msMe2Cw>Qaw$EH_GPhqyLx(Aoq9HzNlXX@b#fb+&HPcSqV!=WgWnx4mYkmC~*p#K5=`G`o7TBy*0K@eYa3PGx;nH_3h>VFcw7xFoF%c+hEeQZz!;a zrnMx^&KiuXXm0%O&F4Y;JB^bQfrk0>h|S>6f>za$lBw=2_)5*-mQ%laGuTL$=HboY z-4helDA5e=oM$zIw@y5y7MabU^$5+NYHq7~cU-2bn)?--!DkfvD>Z{Vi@&THymnHe z{C%21xLBG&?4(0(z-$K3xoHMbWXzh78_P;p!%#7)sui0cO;mlYq5s|gF=jG|F$>I; z!Cw^zynD&amriq#&T~gm*@+pGamPH0hr&pT9Y&yJIX(V049gL~z_SvCgeS{t1#IMyHh?uxIMox0~@;KdK%yLmF%-+m3VDlS2f#B3GY|r4&DL<6L8@c+N~VqM|Q+RS7RwKmNwT z1Po(ER8e&C!QQ0tHhJzYr-kTLzE|%w2LR#lw`}IrDv&=D?*zez~fxXhcSxc z+|3b2(t&@nIA#I=5kDVDP5SkO-%h@oA;ZJ!&*Amu3utY*Q{VDFaHrndgBEFa3R81aX{-W%#>uHGKaTVJ2Ef_88<0Rc0($|U;h**qX zDG<~d2qIKA;_Xcvip7`}GR{6hr|jSem)>_WW2ms>BIm9HEkbD7R?ki@{VdLR=v3Cn zK`PfW7Y9c=+jG`iSbgW&U_6-I+3mer0ydZ1B&_=wS{*~`LK*hilYKqyA+mwIK0{M2 zuNorNav9y)S48L??kfHVtL5Tl@oIT6D~hWhDxSfrujX#14pIQB9qp?hewoVp6>7WH zJ5qlW)CY3mLmYa=V-5G%ge>Z2f0drY(l3oVHK@y!@)+w-rDL)4S->Ry z-ufa4%pKmj7+enbgkp!TUzWuIe}eE6+12$8=65k(?_5tzF3vRWC}7_ij-E@hfQk;4 zJ(o4hx6DFze_aK@q*4Q?+>y0WdrO?2&TyeqU7D#fT9va@IXaFxR&|jl)K6vLd3csz zNYbS-+*xRT4Mk5K$4QzQ4bCBoJHZy@3Jq+t#-rVJw^KwpYA4HGuktW(Bagc6+? zhM7YNCl=(9k%le-Tq-x&?s1e9t6})80_gmBvmMSKkH=Aw3I0$`(wVnp+tYoOPwDA@ z>+N;M>e3qpZ{RJ?2zhY%*wvVhjn0x{U&-Iq=^cbogP5Hu?p)C?DP#)RsAn?G83^}} z_=Z6=k{z5nG`0kP383wvohPFE)X>{q!OHR#x}h}bummLa751G#mlb8o*4a|eJKwwp zd^xFi#OM-#=Y&!nTY^#%S_goPVy6dJL-w-Efvj3$A8UWvbB;R$-XQ+7fB67ikzdIH zx37`RlAjGgESROAt(K)*2N>lxo5(KxWi{7ivdA?Pf8|UW_Bko&4aWd(=m6d^OS{dbUkniL zwWn6+9lWSn5(g#WG|dCFFve~-_x*SP4|#Q{ayu5pW;L#8r)L|gSLs4beQy3H$IX?> zTZ1`qp3S923f|@2evR83OLw_(Tq4h+TQ{s}tE|k(+L7UON8AKbt9W5!?c0jg=}e0P zdYs>}FCoQp334n>X=QE)GB~sj0<65;L3M=qiM`S!zD?dwEHx;MJ@ttM zSGOowVL+mR8R$b35CPD@<3(eBEnMQNUy$H zv_NlBg*m2zB=o<&N^9Lk@Xbbkt>%eXq)e4k%-)JQB0RIZ!Y&f1L3`yI(}(tGsDY9< z+37NNcuNlo)i`iX_Lx1-F9u70veRp_@BLzMCi&tl*ClplHi+O4JJa_-Hf!$uj91|I z4Mc)hcgUEhd~lMqs-*#8SmVh?y@zEn{}BA~czPRndt+*a+2O3|P&XMdBH_43<}%xB zRc8g%>* zzx+&73uY|hm@YR!ZeGwk8N7V8h;6=QR zlg-)s>k#8DAeBvB0Bo~c%?gkt0RHKEmy91jE@AlS)~QgZ%jogjuQmTbEEO3ka)fSr zxRCk=m+4a3T0S&qvnt9{Q!CVEIkzE1P}=$8^sFldcpM5AWId~VCJtteRJ*?})ipgF z^C1Y27~S*K5f?yyO~S@da?ipas7~`?5ASPT^(3q-iT*vctiebd0xO}k-dB@Nq|&x! zlCtn>a;C=v3bg@|n_l}%FXNbP%NQjl53$Q3zf9)ciB(3ns90scMk3)*ODsIcWf@{C z`xs(107^sAbiZowH;W~9{g+r`&TRL0sC>Y?#15n5PS|0`{EzwseH_Zw0Xq3LTNNv! zK*#B^k_3LWD>>&z{jH3UP64+mzo8r10pRgnQ)PK=F8-~is z)b|2BCK2P4a6TO48-3P=swgyRHp`T7*);UZrT>*Ik=tb5u!NKz9=nQmL41- zz4qISgt6GuqUw_)Bx7dJq6*sG@z|iBlN9nfe%4y{-Zp|UpRKPh z!i~i8-Vw&@G)_Tvz=DzKpw*&V=>p7;@KCNk2bhW9i(it?V$Z@r!cZ~$il*t(SJaLy zjS_st*VGNQ^;k8WVLTRVgidgU5TsgG_UfD#NyA*#h)e? zpEnnuTTo|FR5zN7I~G*5ajGXyFvrt9^Wj!Meljaw9%cO1u<2W^%MVbUi{ug9J3@CH zGeG@$k)%4@%j=Tw@-h?Or3T+UBCYZgr{i-rez3?|k(rerYXrJBwN70L!9(JtuPu_E z`Z4RIG4rI4nJ0~zCrx~pb3_iFw8cDWWJLU=A$5*fZRS@*KHtHf8%_Wqz`Kh-w;c@6O6lf6uoDB#607h z))^l$&-iBijISk5QDdIsmBiv>=3;Dq!11;|g;V}wq@1$FpMuCqZqJOlGfsAUvp^(e zjAMFxllmIzAVA3lM}FHvx%*E>rb#`#bz!M--4Oa|W8#pokuDgB;3(NExKIqRo{^ct z1`u2*)hakDQ`pLT7Rd4Cqoft~EGVV(WO3uDhHiC9v$s|prD|U3PjUJ9y}9uM*sTIU zSK8q%k6^h-az4RaLV3rvx-e%TgI|L2jJu1`^u>7qr0gjAiVn0ElVZn-rN70S52_F1 z()32}7Dqbax)s2v)cgt=9*F6UofRber!q{woy;jW50p9OeIs!Y^cOH`|N@%>MGR=vw8Ra?1WEZS)hkjrE?i z&OGUE^Q1cuJL%8NlWzOclRnh{q;Hxh{jPb^cMd!07W1UPN}Tj9+&qwv#Pmm!;+Yn5 z=zO=`esMVHyo`D3DTVoNSLaO^I81uICk(+Eq^X&N(}L=MyUcgYLwR!@H{}N=tL_Sj zw%CW{q}>HC+=p;1-xbK*a>GTR-*Ay0!2_y-MAm$pB5`(%s$WYS(A8g;wwGd(cVo*zR*KzZIN8a{CJTAe|T(#WPu5P_0F|Y=k_V% zJ(7wi4($#G;e8^+yD~6tmfRe>{C+)(CpPu00u?%ODDubb67>@2&9Qdj-fJX-))^Gx zdpefh4FIx2^o+787~%KOO_=J=@<`d_i*LTT*a;7R&N%Cda?#*=>W}c?{=*l&lZ>*X zUG;bf2+O*1HLB}dabt{kI4_F7!;?FB#YZU){zKkNx6@fnYDJ%8M#E_7&^_JdUb%(! z#ZHerw)hEe58&0joT-POpcV-Obj(+!0mE%jI{`%f!n7<)TMur$T*kraI`7~br>t@4 zJRtSO#`W^rpYzKzfvPoRzV_!#HRk7Sna}VxGa=U`4Nj9?5}a=ikNUS3nbHN&-| zjTQ_<0dz3xuuNOtGzr9dRQOn(=TaTGIS1;zoy_SnGr$WiWE8SGJ3H5ZYc*BWD8+hQ z!GEtQ0QB7fnTh!|=H3!5B(U#;;-WD33@~0WdyGmOi4oK=0iRS^4U+aqs#-WZ%h?_z ze4BIHpD%Ek?eGui7?=(5Hc~#PJ_vyC6Mt`G+_QpiOBy3*-!Tv}MlRO4LM){n1Er^W zbvenUsq|@|lOH7`^k4B8sVg$oR2;KrtNixz!&~JugL0rRiMPs{dr)Sd;hx5xA~2OMO4)m{BfD^OzK7D_MC&>8)z>XT zw=RR7^98-^7inK8FH+D;O4-1R@D>7@s0JUJ5q_Puy?C9|n2==Df1V?w{+nJ_g{di( zZ8!D&1TUKKgE#Iy*jvx?Uc%V%#=?$zcFskKclOFw>+`H94m_8zN|o#O_K6fx#>|54 zxd#i<5R&&SmgVEk9@10Gjeq_w+00x&veb=X~ zm{+o54zf<|N$z8H!;`XhmHp}OGG)oie1P&&^urWKsKC0tGfDwm()-Rp+q>IS z5K}?xQkh)V5Oinn4SSZ#9CS73%p~-e=y6_aOyBfWE3uzHU1A){yhBwB%}A$dzgyBV z?-XkJn%^#wd8bfE<{eI5y9B}HBCt9}^Zkj*R=R`*l8hf{RHanr+ogLarq8;fj<^_^ z^mAk9Ncl5%j!ryG|BY#*vkg&<7jqZP&zT)zR@qM^4PV>ep>SXJl>c$s38bzmZ+{+vl8PfSd9j7?55986CDo6BKwqoqGPt-agGF+v$A-dRnyh!5zXi>R8|X@H=`MZdIy~oD2ZgHAOV9|N=czCKM4wBvhP@%b zLv3iHGSbD<7Ef$F9m00eKRvv-5KTZ}Wb&`_kKyoE51DVv78lzJf_Ip*svsDC6nn~x zE3^4ssqPb4?wk0ahpKAYM2GP}PNh+4yx*gV)IE!3ANq0+t6D{c{66-GtCr-?4e_5x zeTGr8M~cLA*r#%iwwKi>im2J-$Xa;%m}|`)D`X{px@!`` z^xY<0?rTv@I;Zt<>jZuXEUM;bV-6$mpF>Yk&D|wJb_4T{f02=Op#+L*3zj6$cf*4A z3@WY97FAMgfgzM=?;?h|$Z=Aq<8YpmGV#{?7f zjqHODgx~%X0%5K`=^>tSm5ae2a_3t{WGh1-DaWEgD8puG&R3DRm$)(Jf;{Yg`(ZoH z!#10TA?tDBg@Zn<(mV|8J77n!f7(@HB}U6ng7}M#0!)Jlmw}sC&y-RfOWS;wlVV*W zo5xb%{IlR>21LcL+ZM?;cr>rl8r7GJuL-o76AzfGyl$#;gQ-fLROK;iM6cEQ8?~(N z&9m;u$=)1Sc0N{vG7ys#xUG!xtl?QE&o(#{)jiAtA1^M4S;1OwMP-Gy(4u9;4a9wv z=vZCVy_R(KP;LXq_nGrA<-3y~F*r`|G{kZ9(-;^*oPz707wkS*xq$&X3KV_-Sywn>&^IY$X!q z_+IC&n4mA<*B4aciLP;6cy@&>(NDnityJxbR(%1f7kb92H^47*>PA!2e<(?g^I<0D zdQBRe0(_fkh@poxNX1g9EHvT^EOz5xO6 zS`qL@LJ@4LETZIpUHxZQw2tP!*LtzWd_{CXs{DPfH2gZ)+2uG~{c9|{J2mA>^*3;_ zE09I$*|)&$7sVQprJr7H&FZz`($y=nEO)Pu`F(ybIEs}wTOI9G-tw$VSIe0IRSycZ zm*QVGk9veoviDdX8#yn-jAMHsS6OBt*P0q^H8qHr3Zxut7*}Z-#`w!KvU0FXoEg1M zy|hHiY+M;0C3hP#&-uLGps z3fJOZQ;WAvEecI72(CwHsHay;FFmD~?swK|>!ipZH84ZX%2uFyXEnUZX$;?$XQQ=>yNn<=y3D?h2Q+!|>}r-c{!09V_gX z`=2a2>W)KX&FcJp2tAK+s(7jWiSAty?kOLH>wLSZ^M|I+SDHHG5m;x9>LtR{^URXZ z^B3l|j)qvxIi!8Qjs&5V4<6_y{XKFlpCEE9eUoFmzhBqQ^!G1KP^9a-N!Q$ILJ>Y_ z9juXdb+hpOeS$cx|ND7)HBhYD|9U#U=a39O`0r20#lM}7)id2QR6Y0ouP0;LcYDt| zb>j-c--4`1e2M(VXCN$WAiOl>;aIbw&vH7Al#UpytoeP5wDjw-Gm?F8q_cC#IDWrxUF}IxaWIB9*>= zNSsGML9%SAtW|Fv5{Jn(w1gcdl4*RUht!2)jTz;XBiXf%a_;aTfy+NmO?Bppt!D(K zj3hZ-R2LPxaGZpF{$)vn=cB2VJ}a6NcrO;xUU&SrNr8#Sv-E8DVzgZlo*Tiee2Tzji* zHoHFHkT%@(06yUd*vkIteJk6`$o`WpY-In*VPyZw%P!|M06k7F&zL_i(>|0<>0S4+ zDg6(o<=&OLJqLwkwpvu}&I!1yZX9yj>8G87-GB4_w>8&z2>Mquk_ZkL^cVMl60f_a z2KecHK{jMQOdBd%l$JuA<7f*&<>JLzD6wXw>uJ zT3lqjtK1SeHc^+`48uXpKn2MqH%%Bfc*P71}0yBVL6TaS7n6>>8Nnm*2>gjZ967N}9>JfmG6F7d=aUsf&f z!3B=UE7o-@hel8jO7*Ny+@pFpz0k>wCj3Icz2Zy4MBa^vIxHH`_-4SFi(v%tx{jj4 zpD#yh49C6wPgko%-WaX%GI{G;EO13aA5`@XdzqU7g41DsCoO(5YNY8I!A4k+Asje& z>|kH=iU;sL+~Jz#!bAIsYjsUyNkVeSciiv^MV!-(3(p>$Lzac=pVg4uL1-A96mYME zZDU7Nlnc_fI-8hAhygnszWmbkG+#U>H1N#qT1WX}1G?XdK&>3{jztnhVoC8%U^HG` z>Aqv9%N+t&oe!(pv`QSaVv64p=DsC0xTh_v#`A^1;vtWkn_^AvNvKBgk}@Pd?YK~3 zBF>cfqpsQ8#Y>Hm1CLC$b>&6 z$z$k(+->Kp<8-!bgFji77e!P}oDE?q(*rq2uEZ0im93m8H50bfmvif;X;=qCK0E{^(4FgPID zkB1I!c4>3a2LKBGb-b1#$|7p^;TjJUeGM_)aJ<7mR2FWJ8d0uG(X1ym6BL+eZ>}hx z79XzwPKk)U`-38fw5piO0)yViOH+SS+Nh7MnCx;p93|RY@vHn*SrXJ_P@o8;Vhs5&Mq{AWJQ-1Gbha!2Qh!z-1Yb#ZzXD|82Z!dtKefm*{`z zmejGv&&ydjd*PypMw>O+UUcc{e|jxvlrz*K<(RP+S=%WlvbJ;BX>Ip-=XkS(qTFQP zPlati*}k-|I$H*p=OYH!YNqKhA2lwhp^(3(swjlw83L)r@PENUr#*|$Zl-t5jq(&t zQ735UUaG0&qJ)z9@xs~G_*~J`tOZa@8SZMsDN{oX(3aq@$g1@6fZlZJ{r+Y@f-}5a zz2N!8Ck>WocvN*x4Wko8O;JKkuz89D7sg~lH^)KBQcK0QkJ z|JS#8!U#g6k9M{YVNvg*1cx3f%xL&kcl;4ZEVNftkgM?VF&LZEfm=Wn(TgZ&j3`b) zD<^+UmgWGlRZJm9tZ9|Bx+1?xwL+w^8X2M;Yg6cb;O!0C_c*YPAnHv*Gq^x@=I2=d z=u3PjmegN!MPdJR7qPwF8&%w*FU0RyDDDT3^WNgoEMFzu0zvmaC%EzcJV0krghvwH z@YXz`)fC0lswm(eV5S#PE4wLxLzut|)b*qQ5lELnKcX+NM)wNA+!XRm@e$&b;xA;? zO41jgZ%oqXwbhGbz+?tgXs2UqC(|ReE7G*w&;<6bPNK;%`X-d0FQ&hfh`hB=r{b$je(EoctA4X z^DHRE`-jLpal~pagoX$us(9Pe*}h^C;DZkY6hrVk4P)-?gqn7}^&D>t_RV6xJ^=GV z(95CFJwU@voCT;(hhd;@}aWmpYXdjIp&1X|3{Hk zx_G=9^L-t`4h~>T+s8_Gux*S1n(c47`;&+nCYyO(Je9&GDk)xLJm7kgfgQo zZDU4j=o0l5er9KavGBtr=yYLW8whqDfvc#h+3&-kH6KZDjEv9|D%JE9b%J!d_Mj)h zzrf=lIClx2!OVZpT5;-8*s4=^>Dz03Y)5or<0lNu?XU_3+!GVUTiuoB@sIF&+UI*2 zrH@C6scDA^Apdxj*lvhe-#I6Fo{EzF@RNDPk(-_}H`!6=pE5T+mY0He0L6>rL>jF7 z;7H6}PvjN5+6|!h8FSNjB?wwDPy_ZRX>m*7|_*#ZXO1l$S0oOhvPK#2vnM)sb$w=RtcJ4S% z+@3EAfseYB%Z;1Di8`1wa4;dxyaRgBS=I&7*7?y~e>$&nJyBmG$_2|-E~v0_!LpSL zyQ8XKgt*j+Cla@8%L9~SbP?RfXGs-}-U#`KsZM#Mt(OSj+8kBw8pHlr#ekfcFHd|Z zPd7yF{*{}IHeueGY5bB%esZK4O2H;-EXXWIJ~t9q#2-o}n{MIIo8$O8}7 zWOtkD>7Z$|wp@ndAKh_Zpn^6rE-U)OMMQ%B=0gJ~hA{kl}4OQl0_GtJ5^ZFlE?x{%S zK3@69qoLZ=Nk&7H{T1I^$!_6~9`TCYMMEdaJA_u&{c%ITuBw-qcE;r@rm0<5RKRrO z=k6UVQQ3TSpS4~cy0?@Ax8z5hM%$^7r<1l>JFMPvAC%ypk5*aN{q|4zTE`#z2`=V3 z`A1n(om1=y3xGmL$%F3Or{u`pOsO|n)@{o0*Al+7OuWo?<)XcbwAF#@jEXiq71l<^ z+xwkI=O5kmf>nJD69^A`^UsWcIx|drRFnUe&W}0RwDDe~QqSe;%E+4>EOVpDtcmzR z@lXGWVe)yT^vC|pU~jUEFX)N~T`oY$jUE;(uXRFC+I~Cn5XWO47%Cm^erfiDeDnkM zgjLoi=^l}9Y4@3q)OxPzkq2A@JM{~C-1bgAuH$ag{|=J+vpo)dJz)54R+M#N^d#@_ zNt4c+1Yqc_fBMy;jQVp5PBaX98Ot`oDo$|Q{d0KFsof{XaB`gGope@#6mzZ{N*brW zGK)P6JA=;m$_4K^E%v?6Ws9HzCE#u69P<2*9O38xagNa)&mSHiKdHp;5n*g|l=WaY zJg(JzFrR9VCGx&(mWWI<6`;QGnthR1KH1}m2d0#$PGxs;Vv{;KMO^^QmVKs`EMNZJ z6(ZY|bp;gz*2E+#y5g9mRK1BVzPT%iesPekw*D#kUolz!ZRdZLAM!G+z2U5ZM3t+S=j zf31{Cw<}ZW0+U!}7useDy`rPi+L4e-Yz*%C-aNa|uE@70QDooKV(!_nZ$*CEry`%B zZ6C_|T&sfl?8Zz@OsSRT;V;=W`L{{Ds!a1eWGrwyRk-=;taGInL6hYzJAau;yldyb z+vNX1^5b6DJKTJ?nk>8R{3RywiJgC=$^V(;m*%#c@Am!81dmejcoev`0Kw0UvZkTM zebwlshW+k_F2Wy?vn=O-rE91=~ zyD|FvvWK42LgJ)tG>7nn8xyafZA6@?Nyoz8TDhsLB83n z1}DV9t`0olaGTB`2h9Xzf+01x@E>Rdi0Z^Y4=lE7UL`ghWKBcas0Ro2vGvUG=c9(G zwpj~=vbKYgWzwPuU+!L7mU!!*ot4Vr{9%>y62b&s%qCW7m<*B2V)RV~dL}lrv-ehB z=*|zO{x#$+!<*C*mFn_1p_gNIZd#cyj;YroD4rhjVsSVL?D0QqavZ^h_>idi`GEik zQx{?U2p4y_pfyE#K|m#ketFhp%FMd?mp?{c*un^--ALRF88;;&bRezeq$JN$@IMy;)9O9@0Fn9VQG zEL1pYiFmv~t6BAcnhaQUH2N8z-p~@L-J;J%eFBLy^kjJHE!O35^Wz;-FOd(H!kW<+ zC}XL2l#*SwfJx!L8K1m>0Hkd``j{7%MFNd|QlKs=RKs+2a4Q7q`B0<3 zcI<^}5px6h1KaC5tVi#}e{(>uYXVf+%Je7yOJ#cB{gvtef)QB_C{)>^PLK7SBEN6Y zs}jU!J6QW`E+VW`I~GJ+)qZOy@8|jSsIao#cfRoB{N3>5e0nf7d)GrmN9Fq6DeeDO zN43D`&FD~49ZU(eul|Wis)Ob0k96^!G*0^}%p)`1LG@1u(A?Wm@R<7c(VTg_k#{iD ztxR;^t!1JUTCrqZ0x10Ws3!@S6-w}6Fk}Wu6f#pCZ~cwPjVLHxYEWUPIqyv%q*b1E zKpZ@{LpiEK>mBeaxlwX~;=>iduTHky9XkFDPqKb)a{Tq<9IoVvu_K|(E{9R|?5JsX zPk>X#ffD}G<1Uys=Hx0QszPCWcjPl46#6HX?qr}USH2bB@9qupma`9a85Xq&aAT^T zkdyb=gfXXYQ^z?U1WtOH&TRJFk~j{s&15Jw2v@@IRU5y?IjWV=H6UAg%VCiA$Y0C> z#%dSPH4tXJjJ93IAqh&>}r}w7v(^+A-N;P22!K?9u3W zODO6X9VdTIXm~PNUsH8UYJAbZVReNvl?c6NZiTl|*R=nLwF3QkvN1lyLuz%;absq* zFzY_JNW$etB&%ofH^Oj%T+piy_t7tBRiK5(!7Sg1hArALkJ}_R@#JdZbH8Zs>qsSr zHLP*xp-yk44@mmB1`jh-ff`mEIUipruPyDMjxSU*Qq=Lbay((_4%rPp;VZN*6zIVVD6)GLmzI|5UArI$%_>&|2f_cG z>7)XBQweMjT&zc-TBo81O_C@sgT&XYLg<6R6zp(BC`t<<(|8FMY`sg|(X6CHt)Yja zFn2`hphNp=;iOF=9tw)}bE2%X57i%l%URhs=g9#=f4P$Y@n{X~UPJSW4IN9xml zqHca}4mKd`45`Tz{d6&*cp^0!z(z<2L}Q4$ouk_cO;Euwz$Z^2?FR{JiC z`z%T-ZcGVB1WszhVm_wK#%S^sEB?O1-pI|JJs{rl@FYi6gFcz=hheOKoFY~He- z9=?V3^o6LX4NL-=RrRIyL|AZ5fyCbLf~rfR#^$-Qbd0;qli4UiVNnCIh*qu4^b#?Z zGxa(-&*O!p%S4go@C8V2TPAxm^{VF*lGC*#^Te&`zA~SqLgtIVB8kq3(sT4Y{>_*F zS?P#e-OC7@q|X;JwhLK<;iqCiI_dk~_F8L9zXe}I?RbN(apgIntk=zOud?P6CrExy zjTteu#5%c;Kr#S?6cVuv3A&XPHt8?*;7L6Ctm{^**g|_8yBD}d<@rk0ZBQA0mREjN z4(2Wd(x&*6bX&mq$$|roS&Ub(9 zdhWte>V#tJtQbHn#KTI!vYOHP@smPD;|iw8jafP{(--gYES%!OYNpZE48u+J zMgn6<$ys%#P_A4iONbskqJJNUAag6>}JXzpvvqVC0|AKTv7>LV~)CmMrX>2Z%=(Y{U4dFVA4P(2WIwmLa zSD3%kE47d_tyF!k86Wy*)(RQf|bknY8NxE6($3(k8!=^l_-x`AumON_m zq={#zrWWK*`fI8yF){Qep}y6$6gAwI4zy#{b0fxI==GeYVcFD)KomS9#_O$s`*oYX z;Cp)ImZ~b^lX`TrM+ZFG|2X=g6i}2pwhctzMk4cyTOPhw8$B?2=Xu5Otzob8@TeKXuP@Zeaq6Gh>SQNc$HSUr#=cN+%A+y}DDPUIywNDf zm8~4_hBZ%o=ag*-+(GT34)w{XI!tiSb;7mp0&v`w2rX8t6*XF)MTgm@t=UmT@Ae4E zgpi{RtZcSUh!c&boHH9(g;zWnL6{KBZ&Y*}8^e<3l4csR%wwGu?O*G) z{}gnj&WJw8+s?o{Ne60bYW2>NR0#5dUorzANU8ZL#G^?fjCEt<)}s^ko0pVKyTzL@ zt~BVT5etd;^)I%k*#shnGolK3vqv@Jk}g61P(u0}2^)roX$w6srV;o{NpqXO)^{)X z9C-g1BD(6L+7hrNh}Js{XWih+V0-Poz-miCqZWL#KICzqlbG)L$kD#uhXb3h))6bQ zb&k-53)5T<-O}uzLL`~KTU_yugjiisV8zFzJ2DfhMmlO+;AE3?PUUeTvScI+Gh0!D zx-cKnzgm1VgMpSnF4ce$Wk|oV8^-019-DQV>pZ`jsi9zXjSN2#BL z4X=MvkMz<4ZZAUfK&r*Q_L6~PubU2+t*s{ zYumXd#1Y{t1!J7`*4n5T-PTy<_K61Sn|f8hv{l_jOvA%NHEp3rdi&NlXO5qU)eAN} zEDl0=J0^O1DfNA3uBmSUoc?MD#1!4tk8?X-_hsZJ&U|m@Sr?Nb@B8pv^S-agnD=d& zD{fRpT+)M^QG$3bg>l3M^SwH*=`#9On*__l4`Y!NgvHXTc7VrQpq!Rz!b1d>@7J^1 zZcqtMJ(NJXlf9RtZYhasy0gB$-jf~}>7NC(hcJq|UdI#vs9F1&T0FW+eiV^J`cdni z=zRK@LLY2OLY-h>8~ zoG(X#(cgg>`b$)!nnU_DNn7Ximn(05GvhlQ^t(LM^pHk%N&`Ti?*Np=J|39%U69V> znMP7gK?hZk&&qd7jCzV)(_lzt(Jm1xdnzmY8#NaKnVUdhnyR!^nsC<~S!-@X-$ml1 zITUBj~7ReKwuH~r0RO^voGl6 zi|sSK4Sr{>yhaMm?k8Nb1JD}!y2;*IKK9=~D_vQ&O08XKUvA_TiiLIvJ9!Fyl1AiE z2FpFYlhjk)Qq;4{v%{5vuDMhysR75Pn!|6jbizu+0&aK#ALj1rJ6{6@G*FbZOW~o; zRC9Oi;~GLvc}M$5Mkc}G<-XnKzBjlJ(ghiPANR(ugN;yt+ySDs^DBS?LHl_{Rjs6d zQ+s)D%8I>MzpWEW+@{=%O^ZmYl&UwP>cHFCZ`sDvzRYF?p!DneB$-r_yt34>{!nIG zPF27gEU9dcKhGA2mzy9HE`#*9ab=TfTxs&iKWW>oY;ySj4!v48`p(z&XaxtUt(MHZ zq1=20(PFiFFI4z4AL?f<3HZ0LpYV=>WU^08ihM%|~a-k{XtW zTe5&;#USqO6o^2X&hn;87etFiJJVcCPmaFXpBz%uT;65X8|H_Dzus_Dxmxdzwm7IqBqAA67_dKbrfm zKCIdt%l%iw?bYdmY3_fAZ|8F1VM2(~U43hAEIdpm-iOTbt8k0qkEI0&D32!g6to2r&v)Almd+%508`Xs3&L}_MF8Yh$Oo^;MFaDTRo9iD zLjW)dTOsEvIak@$%0Ixl;@_T&Qa2t}E_23}W?j4|@{lNXYhTm$cP%iz;=RMn!q_lB z@&%=#?&#~BjF*TE_maqsQoDxEHGx@6o*stFd4NVQvkeO&>nK!3muZTnYC2#()UEx>F4NdsV@0|^=jXub1DEHlL-}kw> z?{)60L3Ovy44(((K4~JEt)WHTJ6jWD#_q`Nd_vP4?ZSu(q&QmI>+z1q%Qvi!c3vrc zOg!^DO~vx?di$>X%w5-Um*|YRWpgyG%%pFP>Ss!ShJ4`xyULa>w$C%2W_z@gNdXm` z$@Z{a+^eRzrn!+ekiSyuYtd+deCEr1VJ^y$j9d)uz4&RzMTT4W-nXI)wNF0IuDuu0 z*4hQXAMLzQuV9E>wTuZhs4mqFA&$M(BlIWy zUkh+}SoAK}>3;cQyGm96e4==iu}ju(Ku+Adkf2(-_ySG%;X4TuT<60KHrj{lg^q90 zry~iSfthOOHLx7H7EDr^*rAWHrR{RB9{MN@F!V_xS3Z@WT?;qNM)2*4s94nl`QnU} zP+jaGBybyq&skB;MZqcVqr-a}P>|Q-y{rqscRji;P++-Y#*QD6=@+VgyvvUkO7BlSrsLjn zwD?Vb>WP~$H|yFEUV$*|&ue|;yqnI`SL^%v_n5x=+cA{X-x+}Uj;~4yx0n)kd9-uU z+|?%Sq>x=6=VU7;~bOn656^cVC!2<=c=d1?dgP?DX>m6ohqDh&7hQj8U;Cq zQs%6q5&m@Bde2E%M3_G-5b}G7o?7}RCA^bfy|(~fW7D8Y&eo;NbpPO>l(Bzf*yXFk z*?HARD)(%9N9D$cpZVG#OcncA?txB~i)4IbP~kq6;|sMVcqRh!Q5#LM=2arOn+AzQ z*#q-VM}61st*_*gzSD|n28SP0Wq)i^xXS17-td0txC-<)L3%NZELw&EDHT4J-&1iF zZ->67uh`|qO9FXBmsSW|Vt0ZEPjhQXOpW&W(t)d|iQn}optP>@>G?@|9l@DTjzaf% zV;(DCi~8BJCPzKlwjg=rD1G{+6NZl-<61cGf?L@)x;LqqLLF0cI`$67tmPh0s03%^ zxWKpf824g=PeXCJz=gLxL`DdkFvHKK1COOM+xQ1DC(D-zdvwvO`_;b8B@oyCLCt;5lX1CsrV*diRZ2TJ^G5d{l?8u#5U%;&Sy{iDYC zM~$7rFnTjhHg@;NCXMNoknvTQCc~>dRz~NW=J@{Dz32BmcIv?2)X|lA<_v;Ng&Q7D z)57JtGgeGzo6}@<-f2qOY)aZ0D~|J#;|$k>D*y!aB=tar#nz;=6Y*v-2&Gxax~AhvSlv3X0S|K%`*$tnp`$AKU>T`YjO)Y$dEI|98_~a zG*SCR(}7N8hjS2lFqc)6LW=i4^CzsuEP4sX4MHTstB8{IP)*OsP{(Je8F6ZOIRV6q0%Mn>O27z)M;7cxv5<}?T7^+j zs|j`CswL_Rg+4M<_GB*)mX5XWv0)+`90!>cy=kVFt?6rn#f9uabIWUkrA`mdl*#Hf zbNhocWnJYMk!*=9IK3P6r1i4{n^eW8q;Prw*^qbE&Im1K<1Ar@rs+ z96y$nQ|FNSrN7g~dru0CJv|sebsY{qp2e7Wo?T(j4Ael^CioJ3<8sF3j2(X|eNnF_ zqOwA$>*s8iu+enre_w>t|4!cIm7z$N$((uUB3(F<6FY~>2-tj)Onf_s%IgO&HNDKq zhm)QH+fqm0GCfB+TjYyg4-ePl1HhKm%yO!21IpEoS(PreeL(hU6#BqL2(<81Sostq zcSVZZr-Q(N)www4NVQ`?xl3)Gm93r|;N;akV^6nE>!%)?m7!iAkfI*oQLhik2>*5R zH;(jg|8Ay$oddG1^J08U)ZMd^#wDt^2O#p@!~O3J$aY!d`x)iF6XiahE;t(6|1$-y zcc}-gB)=yONAn67ZRnVTdp|L=>vXUr6H4tzy(*^KY`kB*So{#Hh(d-Wz4j6#J^XN- z+2+=oOOM-^*4USRwl6(vE^W6jZNJ#uwS9=WtNP+5*)z!e*?JsXUW$F%%V9FWF`O+b;7ZyUa(-rPsKmlNTVOSSR-J5PH;)*+QnB(~#5l z?EN2}*I`jyDljitYVQ5SE_S0`>?d}yx0p-+=_ocG$RA6M>Qh{T&tOr|l|X%OFr)p8 zA#n~8*Iz8d>B}LaA&wkps2j43lEUmbzZ^2iTr*mUNW$Kh=BtK*EH`_=g|uE~>h>>F zfp)uY1*T!zhh(U0v+5u>N5e@;-!78Lrl6;3F7t$6hKNGq3RA5DLM{I=u+#S(KkN;2>HhG;AZf&M(U8d!g5a`+g1=j2IzgwMdd1Le*`L>SJn^n0 zWtQB7(`RePw|v4BTVp?QoBhNZ`-xl4r5A>_QplEzCF-}Mpm zq?d=9@A|O0JfPCBASF(hRSz+_#*RNBZTYjgBMA!kI*Yje?om$8Wk4SC0Xf|2c5fU<&VZK%VYNCm9}zYM5tgWj zQ-A~Eio7_o4*q-m*eMgnO#3up?gZbZi8*8VnJ~sReysWblG9H+{W`gl_S*|5g)fYg z8zQ%G!%6BZPocX0=s5Ky=DO?I?0)GX?mO!<$1e4`CtKZoG;383RYRlIw-Su+f;hq> z;WN(?xMPM09#0HI-c--d5aHyBVY1XdJ42@VZNm`zkH-?1kX(9B&ZOa~-ZAlsT97!E z=DruqeOt_ZFPQtbnEPtwzLyD`eNO3#scGIs>k;(Gr#85J>4c~+Sm&*{*Q@WVx6baT zuMo@YgyH!(ZaD?7gRNfNJ5m-;<$Jdt`V_1bi)_#?;b zj5ZZb4@lloRfK0g));5sWS#5xcw3Nv{K2Y{8g>fcick^ob8ktBHS%!Q%Bp8Y2rrs0 z9s1kjg$=gQ6#wn&O!i7}S$4+erEcer<6SX84b0`Vqm6`CG?>w&Im54$F?6DPWNG%K9t=;PUhp;_!l1Oaec|LCo+ zE!B;>(QEyKwEj|(vFTOm4h(W$E)Y<9{v=%AVFB~tqMUDy6PoB|aL>1n%~T(BiL*}S z1Za8O&l7vd~cg7lgp~%ahM>dKyYQM`oKY|`n+A$N>kO>I;uK{5PWt$+Va?iW93}uO}*FK z-a-&I42{rQq0dv7!_HPy68ZKX0O-k5xi!CFfS0zM#**}m|!eL!ai0Gb^DzV@f_Wk9n#fyTlWGZ^cA0b~2a$@W6oBA~Pb zyR!gFn>&Br!nCX~*@}6W*~`Nz!JVzYFYpj< zZN4VRVIp?Do`u7~ug+=~zlZps_uHEFM6+# zviJTfPqv5G8HSP1^PCgl3?Y3}luX=T<>e38n@Cm|+tA4JP48@?Dd> zJCb}qN}>(knMXVrll#M{Vs#-Jfs-42>K{q!v_hQUO6H1>BKfKmD;R0MHtN!6`vHRmw<%n{F#mjo{S|Kv+mp}CCxzxY%Q zE9FydQnHhOeSK6g zyQ<7$%C6fGH$(OnbS7-Z6eL?iv-+rk^IF$GMQXi4A<4aw&GV-O~R)6@Vo->px zC)h@bW+wX40{|{T&XJ$51G`W-dfrAoEgD}nzEVvr2m69?0_c@D2nA-DICo9bfYY2T zozb2tZr8-r^gwd6T2^QcKU92W7G^-$)fNh*JAfF6iX?*6aM9HuUPp_2&+(N$H9cF6 zsM7`X!Y7vhCZ^^!u!4>?KD}yTHE__`;+Pbt+%WK~_w9ZbKS3R16WTR10ia67v9T4} zAQQI=pD1rAQ07Xlt*zC>x)A{|$z=i;rI?-{T8dx6UN3@c4}r#8Iz8NTXkzre@;`XM zat*8cV(Hxg{H1sE)FZ?-70Ca|b#8S&=yoQXz(yf{$2F?O{M0w2o%K=Q7*Nzsb$C81 z#%}7pCHujpf90XJQz-6D#Lbb_=+&jHN;dBNVdCX-=9Q(=r?wnI6f8lnFG3kt*F`uF zk8V&1x<}iH^V1Qb&n|DSa=CNeFaiP2b$H|#pO@c8q+5wnK=-^|4V0)v=pxV{!Q}=H@-O8W#&mFsryd8lo%n`t8XnAC3zI7| zte!N#f+^N*ev$>dulfygs5yXt2}Kvj1pAx`{PC(bqqcrwVY9?DxWAVS+PZM+0h4+? zoO+1ZGF{cH3yDS`Ssx+1!wlxu5t@M5seIFNUC@}G%qPEPVLq|77kJW3I>PWiNM@IA zU@%a`QwytuJM_7fac3{UGvF6(M*%Uy&!=yvTl? z|DXcss%{LYzBH-p!>O-(%IjPUXwJM&GuzqyUx#;jpVx&pa*CsD@5_8eRwpmxke6A# zs3H6^AN4dZ^LKfd;n4*rrs7StHPF_m-OLfXY1rh`RF4MS3Cr87#M1J=BQ3 zBibzKZ+9sdry5O2OFxuPdO%KywUZ$jO2ruq`4yAORYT5yl2ExA6shI6zG`@E1ahkf z(h8y8*@U30W|>-)PZ;k^#xn@^^wYmy;;|TAx^>rZq|IK{6GE zGcoG=C8@b&sQmiFfVv!O$>mlCvbLE<4~OdY?+=t0QVV z5gn=)PjMqT>A+d2EfbsneTLf|7(Izl9}lu88|g?$j=zSsc4WH8my}EbK_$_p2?MY| zAdI&k#*7gp`N0C&72a`}a}%5MWM7Mlk5hf~&xMg}!6i?XOj9RD)|uG#9v}2(RQIfi z%oaEaiS6<>h438&CjAH@FC05j>cab4Ht4D6dqkcDZ3>#T~_}0u*CK$Ojg-M)UYL>_49tS zuD%srtOkb#AYc`7?j5VR_0DMPQ!6T{E|Z1?xeORVl;=#l{hXNWYfA}s?qXrA&^H}7 zCTq+o6CKG3ss6kihaMd<|I4>$Mtg>p_MUuuM#EZ!2hHVlIM;0H@NdwC-YEmGWp-rFT)(m9@{>CdycgEz5S%izisf4<^6E@BK77R(J_@1WLb`-r1E}+5C@3w zq9@N`jp?nAU8`4}Jxh%h>FwNnv?8APDqXw#tN3+nhlfSu_Y1|`i7w)$YPiKX5 zFwSD>D6*bw$1dX=gaTj0)IydxCehG*=^A%oF!KG{#{WF{4ysM}z+O&o>Bn}~B={O^ z(fbvvORLq;26b^ZesyL^u9#E3?-El+rjx=S;`KSzz8xm~>5cu2d^6cv8YROzC8&R5 zmz_w^(kQ`WoGQId$M_$;71SSl`TF&qV?6FE|F&A0QN0AA`d&{!ceoxv^cxoYybv!o zI33PVz~ zZWI44#hlZlM%#a{G=C_9U5t)3H#nNV_CkMA4fxw!Bw1r}&sv)~zpBJtVRB`i<6ThY z4o-Wyjdv2a68^?tHN=flX9oXN-z3x*6u5yPjTvX^z%lHRi-V)>|6c&Z(?c{Y8Z_;+ z$Y1j`jBdN8*|!GLJ&pD&&|h{eJ{4f2gC*s>NQa<^e zS*`vl%!ujM$iu=1Y!PYvKzi(!SUSN+17!?u!U7Q`<^_obzbQ+!at#A3D+=!QzKsK2 zIxhXM@G(QEgdSqmLLecEI;*2A4}d=|vif7RN9gEpyLE&+o<*_9%8$8llsD*D=WuLg zX$mI#wZr_x>htJoYCr})no0ces96#b!GD=dW2OD^FlIDenH7#f{L4UD-LHrwTTOCx zB-uVt*7t%eU1&#}E;zDSB_l>c`L52%Ruc-16#jB1Lv0^oov#NLL(0JNP9V>&>f6j} z;v$Kx(lpR&A?P%?B8;7xaJC>8=$U&$G|A0bguOEDNWM1*TI-37=&3@2hQno3hul84 zQk|Qk#umy>-d|Ju@jOStQ65i8vl>y1pK_&MtnMK!qFcSo-d^G|wt-jQP@qHcI&^x+ zpBhQ&W9_rhYa?a)b&L6_XGph50PG~T<%8ISJJk(Qm1dH;BV+%!eER5OgiQ7tY)uwb zLbYdQMlo5&GvlScAuGi~idhu?HwIzBNf0q{VEQ|<+To+Egu@@R&NzG;e?PVoj+mxe z^H8(VF!$gCoM@fd7fX!9y=y}x{@6=^9gGJ2hN)@X|RFqUvB1ma9fvQq+SDNU2vX_tYw+@9tf(~&4O zxR+hAgz9BVt3lNkW?qK=*DDr=kQYN5c@gRPGk^o`n!@4cF61#zreYmfYjlMtE2)kwtP z{vronZi}s1dK|8w$ibufYA}0^SFuis5L_Kd2sMiUOHdLcz$S{=byTjQQlz z#Bl{cpS!9?Q|4`^%#WnZ^lfCnbqMWbu9^^Z*9{Tndsp?<#RR6~Ylo9R*vW!$vfWPp zbey1hXW{5=>jeJSYK*3fj2h#HpxB6y?s4?D5mmb)+&b<@W3a|Y2asgJ{)J+!H&zH*__+htdj^9}(LT|9U z9M>aWPKS_O;Or)jhw1mE_dHY zJfyBFWS($;Hz}!Zxs-H&H`(OZnez{HL-JfzH?{sT&U$}d$YVVQsIgzT*MALL80g^M= zhGy2*?5?faU0ZWsjW-air-*wOm~QqOE-mm)Ew2=ZHH~TJ!(L*VIrMi;Gyh{lOlLxY zFx{7T-mJ8F8Qz12o!Q40b3oh8pXY7f*TT}t3==V_9F#Xl>?V%C#%SXB3gZ&GN<7BV zP8tpe0>vXwZ5EsH=KR)9G%EF7vaPrnHLqM>^ypysShTJoeGH!Rgy7iO1(>NU>GPAo zFvr)P7_XB@I`CU{_zL{-$sT>~CdgdW^f*~N(2T}!z1RB=bANwgxF7;Myp1{s(KV2t zFE}ztu7uTMy`B2ePOZ()mj#oJkX*Yezd>^TLJG|-YLG$VR7{L7rEb6m!=*J*8EK?` zHGu+2cpd2ucG_e0(7}@vGoDS4!rXHD&GWh?JdCc4J)$w(=+l1iu1mzCqX3G_*uvIQ-cfDsjVS5vZP@i zA;Oe3JGy{M73b@^gy_p6@X5#mFZnN)fyp;nqR3TaO+05n^Q>{t8;br#z@)K97u)k zR@Pc5PbWr0hDDxjxrI|AS>*C_R=IuQ-?`2yq+hmV|MCbh!Q%W%-pSPc70DFf{N~)f zm6RD3PEXFhyV4B&P0IQbDPmro_`WA61L5GXU7gfgUOyFwiD3@VFH zEK%g25tb-LDe8*D&!jM7g=uS6r=S~{T+XyP1?_s7XO?wFf7eVMQ(%1<)eC9=p`LwF zb9~(^@;liaCtEGOh@8-OO4Z0@?VAGUgbpO2IMwZ*^=u@GPa=Cha3#OByj+jv#bH}s zp31jgKqvj75qpm{mE5HVZ^ab!P>5CtFtmBapO@E7)DC_U_|2Oac56U-Fgk-nXHkXw608B0~|GQcqcdDS`u{;^>$rqOcvIZR4P2^?t@yq4YKGqFFc~aH( z#V5PLoksE*bMcXGu>FZoPoPR2fxnJ+GKf6(ZqfRy@KZj@ZBm_Ax(NsQBg-o#@mjYA z5)W}nrkkB6^?-dTM74#kl0lJ5%iOdKsSpcqx??ALiyTJANEsP#bWZ}|WcG?vD=~g) z;aq=yd4}}xZQY2cN3zCFKG6+PgXFWzGvv{acB{iX1903TiQj~q$|X^qNXP0+8$BJI zV>khv8Xcw`3%;ioR;nXJ>Nry7a@mllV2Uo5DCc;|@PJ#4tnq1gC?QNrTK&`R&Q)q) zp*pq>$MJx=)Nqc*2LTHywQiXiYboK0<%jM`oVGha{nFf~1T4e_UD@xnHIdK^HxFh_#Ur zprtYs+_}st^GKxl54xww+1vI#+hCt9UFPg4ieh$mPm;VF_vV$Utqri(pt zh}FncvWzXfYB5%{m|`_AiFnQ4TF*)cYg$ga!{N40KRhwDfI$}zK}V@|^5L*^$xeVq zr>y2B8K`lj2i<^$PN^@Jh_H79a6YBJG{@JYy}%4GiEKM!6YdOrR3yBSC$tj!YC5bc zEWsiC^vVA8lER71L4-D8T~q4GNOFfsKDMMV!Cb91Wmhe!wllwgHo^zOuHPWhz#bv$ zQ$$}Zbe$}k&-chy$I^%8i{HDXdVwkD9$i^0P4vc+j49?sg*MGw7fEln)2}Vbu%C1f zPg-0jrk3G-P=sV#XY>^A9r`YN>ImPJx5k?wwnlNFa|D8FXr&s7Z8X)kjTY!@Y44$! zKn9Ihvz+Rv6w^go7j|ZGYlO;2u#dHP)?hUm5hY5Ee;|eqA$1~jz=PCm45`JGgu3a( z7R)CLTs!Sr4eeH5L9-f_0&|f}IX#_$5_olD^|rq;#_evFnAt3IYekL> zkN109+v&86CBnk}IWoNKdOKDBN~lxRam7Kmx)f^?eJZ%avz09Ca|~er$KGsMNUpV$ zd&0@9atfvA{?Z!>gsW=^q9fB&t6VmAa`88C0^v2C>OZ)x(+m;~GR(H!cBlz&#rNUv zAAOZZn(r-$<9O*=cjcJ5@Wb9ZUy`@m$;NQ<)*Leze%u@HF|HQdSKr|(scUmYZg{=7 zbvtC&XY{l#M#NteBO-pz?~3^UmpovZOAjjD&rSOs(>n3JdJiK{o?b z*Wj^o7R*Uo7QfKv4P&Pcj>r=J;6F(iCL4(_Z)YR%d6%dsShCNM05DLV76oe(9G)Ug zgd$H-prphBlI|27VI}^{ah2-Q6lg1LjFzoxzYRJrLxTrR*b`XRoY)&gH}1eL;P6@n zQPF}AfuPGFCQt%2K;b8WsN#%>@=)Gyz#&_KC>?2wC~1{?_zEF=j3}8uH_975^>4~i zsiveThh3GHfM8r2u)N)j4kxe+eGx%vTk$GJyn=rOleis2xV&(A2y1eUo-%G0N_cTgLQc&vhWCY{>-x;r%oR*Gc09mmrn&ga zi&;Dd1yq_@t-Qf9he6V0*02Z^0;Mr5PlBYe)U7aecUpH|gr^(35*oD}!fcO#c@pkP zfiG8PdQOGP!T%Rkxf;?`5)7)7nsB#vCDe%B8UuZe6^FE6 z43Xm`$fl8?&W|H}pBLp-G9FBCVVJ|=Mo8c90z;)va;ozQgH79ipak5pbEOCYn}K-A zv1n*EoAVo1%A(z(WZF9v5D9iMG1f!jbr~|g<9>eHCOURCV?s=YnkSTDxuaFzls1^< zmSf@Bh-9dGkW5xH46o~OC}^N#W}D6GNB}fkr=?A8RW)B+zq>_Pr}Doe#-JhgnifCe}C5oeHk}PiC?WSGR=)$ zg@LL-yWf#tFPV+d^Y*2ux&m~4N%g7L1uubuRRgN`KAhYzDI_URxvI_8Nv8vR6W*U2 zA)O25>ip%Wt4Az4N`dynAst+!Um}{~OL99?zg-GXvrg`BAHTF_%}eZ)s+$|wcAT%% zR2yV4gDR^6`clWJ)S@DSxYk{R$tOf?#%6330c7@ao$PPd7jMN#!vsP^VO)ftX6^1% zr)Jg(Q9fq-*A~fM;Le^P%c4_p)t{t(#pg*C8jj`b_4RPD7DCgogesDI6Uu$}L5_l6s4BavRf}YOy`q;@WJS?%H9p<{CGCG()#b?! zG8V?0*qmm)Tiv$;awPD~kOza&bgK8d0(#uMf+e&C<~2I*16`ZMew38rQUmMo^#vB0 zpBpOyPp3jYn*z6yL7ODG+N!D&P;?b9S6*kDWSF#H2JPi?-1#yE&aF=OoalBW?w6yD znOFNLWohvowZy4Pt!h~BpeGzYy2582e>gU=!9G0=nj6MSZI|o)sroPUGzaXKd2s}GK)mFyVu z4FnFgMOum)Y$gkxyj3qjg3+@ zDiJ$5*J6q`=dOsH`*H8N_TJ%qt$WWk_eKc~f*@PR609!{sz%w2JHngsu$g#C$w;i% z38QA7cy7)KguZs8Qtp}ED51d1JYdzt)O%jB#{3)~0-%J;wm!YB%;kAK5rhdqVkmlmuYyoEoVui%y6pltYe+}?INfT)%3{yG8=F+PNqH}DL(b3rZ^i|pWK_lw=6su8Y z38bttgf#b#TWO9*`&d7rlR;U)*8C8)KD*lH{~JFJ(VYE%`#GZEeXS3Z-lP%?=UCUp zI2)Ok)v&N>MY|Tb0J+4e>+_5CbR=Qd<{GB@TNX5d2$=$bLb?xTYyB{VeQ;Q|`lL$( z=1%BPb^#+T3}IAG2Cmw2L!_20TV3QPAaJ)?isrvDKAH0fu8o^kTw+OfkgDSX@LgykP-e06>Ly=tlWf zBfmluMg8(MEJJc#gyruK1NkWt${GY;&FPIW<#7J(!>o_7RK@z$xzYkmLTs`-S|E14 z!zZL8n0=l^WC$Dk3|vXYwFV{ddwldSiS9gjCXWOdE=%E-dHZa^%A&!xNEcR_b!9$x z>ik5yM-J1}&GV6$3C7rm%3ursn`p>w7MdI9i_PeZzD}4aO{IHQ%l;p6pZUQ4-6uoM zE+?*|nhiXF-%b|VxG*m1KSot^j3^3%9jMr0b-^l^n!%|2+947b6)2m>x?rO{--{ML zrn~0JMED-;F=Ne~}7@-LHWv=WQpbs}!ew-^ho2$*0pXL%5i`4oU z=M;7#EWm=%6d=~38VK@|bcqpf=@*31ygWZpg{mr6!m7pwcevQQ zpCsvkTAodChwKoe)ZQn8{E8WS?%5y%7JZKR0nqY zT~);#g1YX=qy;|cXKe>-@oX2UOpX5Mh(dLAoyxKm`7OY2&Y7fljhiIk+x^X3tp18=m@ncr2y=;6w!1_)>jBl?RZ)Js74Z1S% ziX*GW6$4S?_!&>GFr*kp=m zVE;9=(xEP4TWQa6M4t;Wj`m~b>*_wPm(7K*EZp9vg)=O_+EEWxVJByLcKijNbL{p&O9G!hCl<^6^ zc8DdluPT_}0E1{<7!wRZWADx5qOR8X zaprSej-m)?E+x2iGhwj0SA`j@Tlbd0t?rV7)wNP)P^lDVKyiZ^Tr*`*GjBRzwy6xR zxG=b7Cb(+~sAY?wwrPU4m?`jkKhNhgFd%lj_xpX_*Y}TKi_Yhq=WNe;&N}f=VTLdKWis26F_#Xb0;Rq=)3YQX-NGQEeK5KY+9yiTd4tD2e*7pPwP~8K;V(epT+&j9{r5@zX69f8OuO3FAg3k4>^R zNQKncE_h$Qy%fpw2z^_-K9U`^>(&tto$v?^58`Q|a3gHC&ya7xhd9LR{>zN|XQX>& z3A~p*rgLDmY*FZ8_eeTPihqYCBz$2f0xCxcZ0z%?&hv7uz!856GHHu_P|K~E3r_l>K*jKwAbEXv)Tj5zS1 zz01L_D$I6@IJrHes*LU@`*pB87NRhN*8oiU5UMSM6ins{)#+Gq2EA1&VmtDnGLc~# ziH}`68bfhL=wk`<`^7|u4~dB$6dg_RKh|ed<=lkp=OjFekhuS(PDvy2>#B^+WEVAI^z=+g7w4*DB4o=JzK-7Z6* z@x2%S6H*Sq3no4E(jM`yqHNab>Xg5=$1BI<_(OD69@imwgc;9rPGNyfI~vVg2LIh) zWue#w9admyB9)y4$&=Nkhn>d4zY^1428#~(Dm9z!B8*hH!RWZ+BBGhN6vidTxQ9f_e-1<@ zs=`$iZ;V`(o2%N-Rk^vU{an=!0V&ty!n-3QB4H*1uP-*y8`Xh}h7%YlyxY|NY~xBw zxRPyLNr|9W?rmJjL4>#SuH>0wY$?=s1s8jhi&b#3H@R2^7kkTV7LlwPmz(xg* z{Pbkx{$>XIBLZ06fc33!qvngmckyr3|{4m@tlwc;5ivY*^n$LTCcuk3R{lpzP*FZ*v~T4B9;5+s|G%5u26AxRttRCQ0Km%hC`Gkg$qP!l=4WRVhDtL;Clzdpd(N$ zL5zxv85K%+pcq>y-o?#Mr^G>FAOX7lsDJyUs`$oofPE|nnAHjbKUBUgofQ>5y`Rm! zhl4P!_d9Rb`wzJH?{n{Ww=&$?d5AF=K)$KW*7=f>>hxB$S+x|ktPnRHPs}aFFZ_G9 z_S-OHD&S_fGQl$)c6an`=QPqSgd9tN)|7-m<P>|nTG2N zpeh(DDGP`;PVT{u6ep;nhrw&Z)i7k=Ft5r#vt^x9~@eAKY#i zuM^zQt*#DGJ$jj#ghw{~^n~j~Bg7J|`3G2{a=-{f&=J4xu64z7hnU>4chgWJpWGGxV>x zGY@Zoh0xfC7@-=G*${NYj~>!tw4f)GqZB*Vb&$+koKWHtJz{5|ojUH#3>`6lHGI;} z(m97ybh~MAdEdjfQ2s>(L;a;NA;L-`%oQ1Qw>qb*C>kMBZS1`-2*#H5rXGM0n|X0C zu@wC(z#a)pEFAxsK?ublgdG{UvV#z^RYEW^AshoCz=v2hEDWHMG|fV@d=rXv3fxl? zl5QxJq5iH>oQN-TcV~?(?CDjK?xnLJ^z0ddSUKQ~Ll7L!0fSweT$h_%RxKWdI26-5 zO$ITktOZ8`&zsDhtQVAZd>XyJtQUq%V|D_S4J2>QaG|slnd{h@LKy?D;X)_*w@dqt zLc>>!$ra)yI%@YY^lpaO%@BL|_bzT?k1)hAbfHKE=T#wIEW}fWKV1yInnt&Cry#<) zzy));;5qHLVLFSB&rYKt9rxY=*v$$i9L6+O@l+m9dw0BXz{IBts>Y#@#FglCVAyC( z6kUtMLX2VCB4f5i%DY8aF^souF8JMW_Y;Ao(0nbrPb3x>i6^2+iUG|QFh3CJ5B7)6 z(*ru_?_lX=3BL*sH)O)@>8gYzJd|{ru=!H`7OAqp$JmHe@zh#@N~#03Ns42}xNESR5R z`Z_%0R#kd;%t)12hJZ``%13!gccJft>QG@`9B}`uh~(5GbbGf4yFC~uV}^#^w+Es8 z?xzrNW_ND13u;c^BH?Kr1#2u(g0VTjgY8Z6>GMCk@FtoQ#-}EZp4|Mc_m(aCcAGMG z+JAdHrO3&NDXEDjRTH8~z%#WeHOu>=oN7%RKjsBBJz!>{tqO6WXW`V`JWIGvV(lGC(2v&QQ!)g>+|9Ol|Q#P>bWk3@0pi>o$Q!4Tn2l z9Kwz=raK5?poZ768Ygm`+Jk(hPbW7q+E=O(*A#c>Iy|?8iQpQDb`ttU4h^F;(N>uU zs%r}?TO3EqG~LL-qMa@K`?yhIGhu*Pb4~W($Wm}M@fiNc!^YkhR>YC=#NchxcmX~% zduQS4`zrm5YmdC5ywIf1E}~x%ekgA+-V}|9 zS!`XMu%J#}!GG|&VSv>#?UZH8erCxM&1s z>LCWjNA;h^)=&km3=%m9A)1?@gh|pG&1-%?7Ldw_@F(OpHfPY7diIAov7<7m) zyd6BGlS||q`1fD6*!}wHQid7NG)n6x^f8^NFRVK)g^$n!;gqNxcUC2{Brs zC4s|`p4EmZZl^eKAK@eeV}NSU{&|1W`u9Qd7C0Ok!xc8tw!67nVCoI zV;(*dKRtXT_GH>?&d$MJ^C|Wk1S6eDdW2yD&*c;HWLye)7KEyx_=64V#rdLRg+q+b zlKD%+_~E8b(YNo-eq<&=;RWwIcSCm14@-FR$=@e?4={rU&E{$deuiV(CPHXdhA4u= zjAPw#>)g-C7zduZARe935#RaIH_I~HxT!hj7kkYRUUQ%K1k>#NGHgcAax5Ni>7K}oV;G3wBY^$Rn zV8&Z!nH_;1%Rp&Su4=gc7)>fTW?ZZ9m%(upE8}DVTFoROqGtWh;Ou z>&vxP9HbT~6AdP544{=ZGl1Lu0u>~=T$EH^BZ^Ndq_!T!T3$p7VIav7GAj{V(cMUO<7x1-H zmHuk=Ua$1GtNsL6zmBUv(ZXKU#4SdsB*6)a$=uyogl#om|MXM+Pik%4gaF0y zTZb^cB}p7=*=}okOT(roxeY{-?owD8A1(XB3)7#$NNO!GiWX0WYO@w-@ZVwR+ZI&) z5+1_0ExfAlgngET_GEB?SfdEwNxHDEt0JI6W)6)UD~pDPB_f8m1cl0HvFGO#nIz%> z2oouAI0c<(&~oWQq#EH>Gf#wuLJJ3QutUKHRB2BUX~nE_i*OzYEnPNT46AYovk4k5 zQ`vpQNS(Pv42Wf4^7vCz9o(@tQZ9x0Mi4elynR9uVQAz_=uBjyOoOEZ7EG>rtb+jX zT1sSufAIQv5U+*$c%yNvRdh08TZA&P`~gDjX!utcR+b>^hDN?9^$_+bVRy)qQ7NLW zjnZgsSz$(uhfCN;Kxlhkp7L-P7_vgBH3^ryD3~T@TWhUwk5p44c4ydd;gYfIB2wV$ zj-81l2wxZ;pfvndE-I@mcQ{hS-%G`S&4M<_g6vd;ho)*M;sfQAv?&dDFZ1RS-=Ft!)v3Ir*@e2-XjiK1X1 zKaWjL@%i9?wx`1jVPa~MwyXaqTeyeQ{MF5R|0-cs_ z#aJz^aZn3vQ!2ApnRCX-VL9+4Rb6xgto~p*%sfvT&F`bu(Z;b$#$sd%#BC;&!y%?C zLFUBcZY!^5^mAZ#5qd8PO_5xzEswl5o^)6GyzOQ3Pqw)tzfd{F1H!s zfGexb;3MR4H?qSM5R>w*DqM_cD8nIg9p7J0fMd=OAOkwp6U6UnYVPFBfEy13|Zb&0N(%j1nSUG$b|$3;k*FXyBH_hj?`3XD7v3mUp> zVvI@LYrIc2iMK4{uWniYH`(pvQHkR< zZ@9EcG>(~mn?UT%@a2t6vzy!LM*Viv?B+JB|CE8h`yjTm>tNvffNOXz6iON}t^m7} z4bL}uh+qlrs(hK76d85^dQ&|3#LKycF#7Zg0Nyr2{JM10b zq*I`;-+N**k;v5Fw4K99QM6}h$8lt@sST06*2-~+?1dK&#qdZpzolpK{cNcXvY}|1 z<8}`kypTMc_l2+Q%SNjlo}*7mc}vEaqdmSfAwf!r#si=d?LQ_ToD%}bI+VW!8o|(X z3B|nu>hva=`9-AlR7xVaZW{&@4eNoozM*MMb_1Xg@PCvDtZ#`vc=m#+}T?ZH@7k3IuYWM2yq{Vkuqei)oMgw zu_Rndm)fd$$QNk9@L;aT{kS|K943JnaackG**y5e<^g`Z5}>NASDx@1@e@r(oVz6q z#mDfd=yAo!W7cELI2uym-Vr{EPpX5aY)|bxXgvlEQLP!q2-=`wyeN**nDGSs5X`>p z)h=kj^+Tthah8bR)rjZdNClgS1FwDAQ>CdXFODg$!p#91u~VJ=+i(SMZ+oUfSBtbV zcY`HwDRz54_weT~&*$D2=35qMpQ zP{C*X)cej98o_5R4eoJI4492~Iw*)u@oxNZOOH#J7jdzYeU%h!TkEAbDo6?#|gNE)cyqW%Y1?cAaA3MG{=tl zgx-TA*?{vVj7lZsBI`|?#k&|;M_2M2#&Rz6H6D_nP0kU*EBNTZGn|(_ z2-ACd{jQGDR>7s-)HQ>)V;L6jV$|&d9lgmMI7e1=f(56nhIRv)yVJRfO&dtEX z9rW2*sp4EZ2|^abg6n}G@wcF%VqlPX9O^l+5#&jpo#CWM%2^6c&W&_>I-8@=bL8Ii zP~|>9BYf(WL?CMr>9JJlaK9(OO!l>r35_wl&#|_`k3fODt;Hp88i$L^@b&7U#yZCk zeMaOE7%jL4{Jk-q?$fd|jD35VOCknq<|7Aqzc!U_Ft4|Wb&#ggw^KBN;v+h#eal$IbOk!?AbY8spgft2lm>Rja;hsp5Fi6vA;?OD`N- zV3Y?GgKyIIRM7dlDb8hjP$fj7^k;;g4(`(}4YU)lWltNWEon>fA|m8Cr&zp8(Te^O z>R#{`z(p>#q~-KFdvm(LznAgvFI$=#c9ezQEhj^}!_)e;mJ|;S6)fP&s#}7SX_!Hz z*G_Jx&vRSFM!Yhh>7pr^482Wt%Z;Qh_c0QqM$(r1SSTr}ooEGjc8Jn9nI`#2D{Q&Y zbMVH`r<0wlHT*R6(AA3ZbB0U3*XmaM9GGnJE=Blpw<7%P=OVk{I|5!(Fi4#!rnBBAn_#Da(Ix4@vLR!*G=NRHLEp^;rmInw`RAdy|r*sqrEkf_EvZS!2$>1^+}{M zKNk)=5ZqmXNh%oz-NZ;j8Opt0sr2`zxTBELiZN$mc7w^qBRCj zWDekT8j<5_c`FAneNr>zI8!oyGP!?s&ETgh?G|!e1V>4VxXcZ`!TK8Cq!E4=^6$(1 zdl9tO>luIxXRr-_*NQ`V+FVHW*SjyIfl{C z1S=!8JGrn)f~?#aF>pYm%`ZhwAK1$nhht}QtO%&`fI>KpB;VNj?L*5jBN-c0!w!nh z*(VYq-0uf1X0$z{Ev8){<~>b2LY}FNUwv1s)Q@JmqNX?MiUxXXSJaI9t~ADZ+(ERy zasnx;o`Ca^W)O{+vbLdocE2)#&Xq3^cO7T9zjk&fIE|uT!_f@{ubbeEun);0A0VgO zs;3E$uCy%}yr!qg1Pfs81p8%MK1CSx5@O-u6yX4h7uwRSE#u!`w#6en*m(-)wUC?P zqCd3-jW8iD;NsO7Nn=8+OQk+B@GHKyh$&4cB`;N7o$O`xjIW89aaStM$w^;rPP|Ue z&r_YKD~B!)t9^NdpE2w^zPFC>P^ty6Y=O4bmqvJyL3jAl2#Zr`;cfAy5gz2Pi&^^9;g7vJsMbcE|0fKS(tu*qDbm8DRI+G(TdUIpXNW~Li3(^Kg}Y=?tC zo|0=Rv?S-Xqm{KWMO|4r@eX35i+xDA{JpQXv}#glY0YX!XUUBeT3Xl9&x#aV&Oh<` zWW|fneh!_Exc52FdeUUflWL}nnTXV9b3}(&7o-+ho>cKJoT3)NA-Zt3C;eE2c~6X` zXGy%}sh7^txO5s3tZz~lGzv{HFMb4%%?YB;w*q(1%v3mfQ16~USe)=YyUa>9SPT7P z2Rsa!D3-By?2{4*I$q%cVzBr8;1JpH2($#?%Azsgkw$<;ezCU$Eb;)N*~5M?9d4*l z-7&P5-viuUzq!0x(=|n^{z0C-L`4hHQ?`qWEn&a@9GdG?h6wCz!isFv#<&d4<-^N-m$P)_k5noLXgHQ#aWdi6YFPvejy3-` xl|dA?3X}<^r6|A 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 literal 0 HcmV?d00001 diff --git a/org.glite.jp/examples/pch06/convert.sh b/org.glite.jp/examples/pch06/convert.sh new file mode 100644 index 0000000..70b4511 --- /dev/null +++ b/org.glite.jp/examples/pch06/convert.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +log_event() #1 - attr.name #2 attr.value +{ + GLITE_WMS_SEQUENCE_CODE=`$lb_logevent\ + --jobid="$GLITE_WMS_JOBID"\ + --source="Application"\ + --sequence="$GLITE_WMS_SEQUENCE_CODE"\ + --event="UserTag"\ + --node=$host\ + --name="$1"\ + --value="$2"\ + || echo $GLITE_WMS_SEQUENCE_CODE` +} + +init_log_event() +{ + lb_logevent=${GLITE_WMS_LOCATION}/bin/glite-lb-logevent + if [ ! -x "$lb_logevent" ]; then + lb_logevent="${EDG_WL_LOCATION}/bin/edg-wl-logev" + fi + host=`hostname -f` +} + + +set -ex + +hostname -f +date +echo $0 $* + +globus-url-copy $1-$2.pgm file://$PWD/atlas.pgm + +chmod +x convert +./convert atlas.pgm atlas.gif + +globus-url-copy file://$PWD/atlas.gif $1-$2.gif + + +# Log LB user_tags +init_log_event +log_event "IPAW_STAGE" "5" +log_event "IPAW_PROGRAM" "convert" +log_event "IPAW_INPUT" "$1-$2.pgm" +log_event "IPAW_OUTPUT" "$1-$2.gif" + diff --git a/org.glite.jp/examples/pch06/delegates.xml b/org.glite.jp/examples/pch06/delegates.xml new file mode 100644 index 0000000..d73c17a --- /dev/null +++ b/org.glite.jp/examples/pch06/delegates.xml @@ -0,0 +1,120 @@ + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.glite.jp/examples/pch06/dump1 b/org.glite.jp/examples/pch06/dump1 new file mode 100644 index 0000000..12f83e9 --- /dev/null +++ b/org.glite.jp/examples/pch06/dump1 @@ -0,0 +1,312 @@ +DG.ARRIVED=20060831134044.000000 DATE=20060831134044.215599 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060831134122.000000 DATE=20060831134115.302161 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060831134214.000000 DATE=20060831134133.825791 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="delegation_id" DG.USERTAG.VALUE="JEd3B7HE3Ki76xlE93tNXg" +DG.ARRIVED=20060831134216.000000 DATE=20060831134134.156434 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000004:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="jdl_original" DG.USERTAG.VALUE="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" +DG.ARRIVED=20060831134217.000000 DATE=20060831134134.675834 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="lb_sequence_code" DG.USERTAG.VALUE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" +DG.ARRIVED=20060831134220.000000 DATE=20060831134135.487909 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000006:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.ACCEPTED.FROM="NetworkServer" DG.ACCEPTED.FROM_HOST="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.ACCEPTED.FROM_INSTANCE="" DG.ACCEPTED.LOCAL_JOBID="" +DG.ARRIVED=20060831134221.000000 DATE=20060831134135.841337 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000007:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060831134223.000000 DATE=20060831134136.439997 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; AllowZippedISB = true; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/input\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060831134225.000000 DATE=20060831134137.337853 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.DEQUEUED.LOCAL_JOBID="" +DG.ARRIVED=20060831134303.000000 DATE=20060831134302.473834 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000002:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="dagman" +DG.ARRIVED=20060831134305.000000 DATE=20060831134302.838146 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060831134306.000000 DATE=20060831134303.199901 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="[ Arguments = [ JobAd = [ edg_jobid = \"https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig\"; Arguments = \"-f -l /var/glite/jobcontrol/submit/3f/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/3f/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag_description.con -Rescue /var/glite/jobcontrol/submit/3f/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log\"; environment = \"_CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\"; ce_id = \"dagman\"; Output = \"/var/glite/jobcontrol/condorio/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag.lib.out\"; Executable = \"/opt/condor-6.7.10/bin/condor_dagman\"; Getenv = true; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/user.proxy\"; Error_ = \"/var/glite/jobcontrol/condorio/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag.lib.out\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; Type = \"dag\"; Universe = \"scheduler\"; Remove_Kill_Sig = \"SIGUSR1\" ] ]; Command = \"Submit\"; Source = 2; Protocol = \"1.0.0\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060831134308.000000 DATE=20060831134304.949623 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.DEQUEUED.LOCAL_JOBID="unavailable" +DG.ARRIVED=20060831134309.000000 DATE=20060831134305.336039 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000002:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="unavailable" DG.TRANSFER.RESULT="START" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831134312.000000 DATE=20060831134307.661117 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="+edg_jobid = \"https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig\"\nArguments = -f -l /var/glite/jobcontrol/submit/3f/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/3f/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag_description.con -Rescue /var/glite/jobcontrol/submit/3f/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log\nenvironment = _CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\n+ce_id = \"dagman\"\nOutput = /var/glite/jobcontrol/condorio/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag.lib.out\nSubmit_Event_Notes = DAG job: (https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig) (UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000)\nExecutable = /opt/condor-6.7.10/bin/condor_dagman\nGetenv = True\nX509UserProxy = /var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/user.proxy\nerror = /var/glite/jobcontrol/condorio/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig/dag.lib.out\n+LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000\"\n+Type = \"dag\"\nUniverse = scheduler\nRemove_Kill_Sig = SIGUSR1\nLog = /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log\n+CondorSubmitFile = \"/var/glite/jobcontrol/submit/3f/Condor.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.submit\"\nQueue 1\n" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="9757" +DG.ARRIVED=20060831134319.000000 DATE=20060831134313.404204 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000001:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9757" +DG.ARRIVED=20060831134322.000000 DATE=20060831134313.700052 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.RUNNING.NODE="<195.113.219.12:20194>" +DG.ARRIVED=20060831143019.000000 DATE=20060831143019.146435 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000005:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134049.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134126.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134209.000000 DATE=20060831134126.304876 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/4f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f4f30RahamYHsmvuvX501Mw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831140021.000000 DATE=20060831140017.608502 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14201" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140032.000000 DATE=20060831140031.761777 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14201" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831140133.000000 DATE=20060831140032.019788 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14201" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140133.000000 DATE=20060831140040.406440 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9764" +DG.ARRIVED=20060831140134.000000 DATE=20060831140058.653829 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831140352.000000 DATE=20060831140351.727362 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831140406.000000 DATE=20060831140207.335428 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831140407.000000 DATE=20060831140250.200325 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060831140408.000000 DATE=20060831140250.533859 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060831140409.000000 DATE=20060831140250.809459 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4.warp" +DG.ARRIVED=20060831140411.000000 DATE=20060831140251.163968 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4.img" +DG.ARRIVED=20060831140412.000000 DATE=20060831140251.666129 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4.hdr" +DG.ARRIVED=20060831140413.000000 DATE=20060831140252.212529 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060831140415.000000 DATE=20060831140252.516077 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060831140417.000000 DATE=20060831140252.951718 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831140613.000000 DATE=20060831140613.585181 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140615.000000 DATE=20060831140613.833818 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/4f30RahamYHsmvuvX501Mw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134045.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134123.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134213.000000 DATE=20060831134127.048575 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/G8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fG8IWJ3SB4bmG3Y-kkbx9vg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831141700.000000 DATE=20060831141700.180432 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21444" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831141725.000000 DATE=20060831141724.616105 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21444" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831141725.000000 DATE=20060831141724.929130 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21444" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831141733.000000 DATE=20060831141731.883747 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9770" +DG.ARRIVED=20060831141751.000000 DATE=20060831141750.174981 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831142105.000000 DATE=20060831141916.514165 HOST="skurut9.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut9.cesnet.cz" +DG.ARRIVED=20060831142115.000000 DATE=20060831141952.038993 HOST="skurut9.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060831142116.000000 DATE=20060831141952.763383 HOST="skurut9.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060831142117.000000 DATE=20060831141953.109945 HOST="skurut9.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.hdr" +DG.ARRIVED=20060831142118.000000 DATE=20060831141953.415257 HOST="skurut9.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.img" +DG.ARRIVED=20060831142119.000000 DATE=20060831141953.695565 HOST="skurut9.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-y.pgm" +DG.ARRIVED=20060831142121.000000 DATE=20060831141954.089777 HOST="skurut9.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831142200.000000 DATE=20060831142158.703291 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831142323.000000 DATE=20060831142323.159626 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831142324.000000 DATE=20060831142323.406105 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/G8IWJ3SB4bmG3Y-kkbx9vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134057.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134134.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134157.000000 DATE=20060831134124.084513 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Go/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fGo1mU5-6TK6Xv4kHBMQh_5fQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831134315.000000 DATE=20060831134307.962467 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6588" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134333.000000 DATE=20060831134333.185399 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6588" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831134334.000000 DATE=20060831134333.622177 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6588" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134339.000000 DATE=20060831134338.973524 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9759" +DG.ARRIVED=20060831134358.000000 DATE=20060831134357.778584 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831135846.000000 DATE=20060831135650.503368 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831135847.000000 DATE=20060831135728.347031 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060831135848.000000 DATE=20060831135729.031486 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060831135850.000000 DATE=20060831135849.814774 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831135852.000000 DATE=20060831135729.401351 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2.img" +DG.ARRIVED=20060831135855.000000 DATE=20060831135729.710618 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference.img" +DG.ARRIVED=20060831135857.000000 DATE=20060831135730.000217 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2.warp" +DG.ARRIVED=20060831135858.000000 DATE=20060831135730.434629 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060831135900.000000 DATE=20060831135730.900178 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060831135901.000000 DATE=20060831135731.523197 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060831135904.000000 DATE=20060831135732.143125 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831140138.000000 DATE=20060831140123.392312 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140141.000000 DATE=20060831140123.685647 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/Go1mU5-6TK6Xv4kHBMQh_Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134059.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134135.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134154.000000 DATE=20060831134123.726086 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/I0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fI0Jh1NYt4VYVBpzcXmkU2A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831140136.000000 DATE=20060831140123.056666 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14682" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140153.000000 DATE=20060831140137.176267 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14682" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831140154.000000 DATE=20060831140137.425748 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14682" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140157.000000 DATE=20060831140148.720169 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9765" +DG.ARRIVED=20060831140208.000000 DATE=20060831140207.664985 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831140420.000000 DATE=20060831140314.038296 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831140421.000000 DATE=20060831140400.711454 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060831140422.000000 DATE=20060831140401.073850 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060831140424.000000 DATE=20060831140401.402241 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2.warp" +DG.ARRIVED=20060831140425.000000 DATE=20060831140401.679455 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2.img" +DG.ARRIVED=20060831140426.000000 DATE=20060831140402.060125 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2.hdr" +DG.ARRIVED=20060831140427.000000 DATE=20060831140402.373467 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060831140429.000000 DATE=20060831140402.690396 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060831140431.000000 DATE=20060831140403.399549 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831140453.000000 DATE=20060831140453.439969 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831140809.000000 DATE=20060831140809.259995 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140811.000000 DATE=20060831140809.498118 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/I0Jh1NYt4VYVBpzcXmkU2A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134101.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134136.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134152.000000 DATE=20060831134123.178909 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/In/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fInJJ60jN0wDygHUfueSwCw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831134318.000000 DATE=20060831134307.987863 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6589" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134414.000000 DATE=20060831134413.357998 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6589" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831134414.000000 DATE=20060831134413.886040 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6589" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134417.000000 DATE=20060831134416.557353 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9760" +DG.ARRIVED=20060831134443.000000 DATE=20060831134441.720322 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831135922.000000 DATE=20060831135758.793578 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831135922.000000 DATE=20060831135836.007691 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060831135923.000000 DATE=20060831135836.361695 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060831135925.000000 DATE=20060831135836.951954 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3.img" +DG.ARRIVED=20060831135927.000000 DATE=20060831135837.449522 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference.img" +DG.ARRIVED=20060831135929.000000 DATE=20060831135838.010449 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3.warp" +DG.ARRIVED=20060831135930.000000 DATE=20060831135838.292254 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060831135932.000000 DATE=20060831135838.596728 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060831135933.000000 DATE=20060831135841.090419 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060831135935.000000 DATE=20060831135842.197544 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831135951.000000 DATE=20060831135950.577097 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831140214.000000 DATE=20060831140213.989508 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140216.000000 DATE=20060831140214.282320 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/InJJ60jN0wDygHUfueSwCw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134106.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134137.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134150.000000 DATE=20060831134122.780787 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/KQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKQi8TcC2wGKo5k2Qpt0I8A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831140137.000000 DATE=20060831140123.115398 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14683" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140159.000000 DATE=20060831140148.744611 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14683" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831140204.000000 DATE=20060831140149.158384 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="14683" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140205.000000 DATE=20060831140155.379842 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9766" +DG.ARRIVED=20060831140217.000000 DATE=20060831140214.599231 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831140421.000000 DATE=20060831140331.951828 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831140433.000000 DATE=20060831140417.552080 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060831140434.000000 DATE=20060831140418.679791 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060831140435.000000 DATE=20060831140419.044665 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1.warp" +DG.ARRIVED=20060831140436.000000 DATE=20060831140419.347205 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1.img" +DG.ARRIVED=20060831140437.000000 DATE=20060831140419.704948 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1.hdr" +DG.ARRIVED=20060831140439.000000 DATE=20060831140419.987370 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060831140440.000000 DATE=20060831140420.228647 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060831140442.000000 DATE=20060831140420.570874 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831140549.000000 DATE=20060831140548.952363 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831140714.000000 DATE=20060831140714.197107 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140716.000000 DATE=20060831140714.602662 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/KQi8TcC2wGKo5k2Qpt0I8A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134053.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134129.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134203.000000 DATE=20060831134125.131082 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQCnhv-qd6YVYy7Ct15isCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831140219.000000 DATE=20060831140214.672615 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="15000" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140227.000000 DATE=20060831140226.938569 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="15000" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831140228.000000 DATE=20060831140227.200962 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="15000" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140233.000000 DATE=20060831140233.001754 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9767" +DG.ARRIVED=20060831140245.000000 DATE=20060831140245.346447 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831140444.000000 DATE=20060831140432.367997 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831140550.000000 DATE=20060831140549.245803 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831140646.000000 DATE=20060831140516.623924 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060831140647.000000 DATE=20060831140517.031973 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060831140648.000000 DATE=20060831140517.314902 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3.warp" +DG.ARRIVED=20060831140649.000000 DATE=20060831140517.555135 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3.img" +DG.ARRIVED=20060831140651.000000 DATE=20060831140517.844631 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3.hdr" +DG.ARRIVED=20060831140652.000000 DATE=20060831140518.166567 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060831140654.000000 DATE=20060831140518.470829 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060831140656.000000 DATE=20060831140519.094552 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831140910.000000 DATE=20060831140910.012112 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140912.000000 DATE=20060831140910.238923 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/QCnhv-qd6YVYy7Ct15isCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134111.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134141.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134144.000000 DATE=20060831134121.267976 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QJ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQJZ4QRet6oWBglggm-0TOg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831141703.000000 DATE=20060831141700.220213 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21445" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831141711.000000 DATE=20060831141710.877962 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21445" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831141712.000000 DATE=20060831141711.233710 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21445" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831141719.000000 DATE=20060831141719.019302 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9769" +DG.ARRIVED=20060831141732.000000 DATE=20060831141731.384424 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831141903.000000 DATE=20060831141903.266054 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831142058.000000 DATE=20060831142058.130877 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831142106.000000 DATE=20060831141936.346501 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060831142107.000000 DATE=20060831141936.773822 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060831142108.000000 DATE=20060831141937.077522 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.hdr" +DG.ARRIVED=20060831142111.000000 DATE=20060831141937.441055 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.img" +DG.ARRIVED=20060831142112.000000 DATE=20060831141937.763201 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-z.pgm" +DG.ARRIVED=20060831142113.000000 DATE=20060831141938.382060 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831142326.000000 DATE=20060831142323.698884 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831142328.000000 DATE=20060831142323.998797 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/QJZ4QRet6oWBglggm-0TOg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134054.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134132.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134201.000000 DATE=20060831134124.804732 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Qc/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQc_5fQKKVAjdJchxjIOkia9A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831142424.000000 DATE=20060831142420.697645 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24477" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831142453.000000 DATE=20060831142453.230558 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24477" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831142454.000000 DATE=20060831142453.519786 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24477" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831142457.000000 DATE=20060831142456.588653 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9774" +DG.ARRIVED=20060831142515.000000 DATE=20060831142514.913697 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831142722.000000 DATE=20060831142603.567810 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831142723.000000 DATE=20060831142619.846123 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060831142724.000000 DATE=20060831142620.112848 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060831142725.000000 DATE=20060831142620.419079 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-x.pgm" +DG.ARRIVED=20060831142727.000000 DATE=20060831142620.696265 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-x.gif" +DG.ARRIVED=20060831142729.000000 DATE=20060831142620.991186 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831142759.000000 DATE=20060831142758.190030 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831143012.000000 DATE=20060831143012.496418 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831143014.000000 DATE=20060831143012.801435 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/Qc_QKKVAjdJchxjIOkia9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134107.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134138.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134148.000000 DATE=20060831134122.441223 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbwFcsOFZWTt0KIm7FKMThw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831134317.000000 DATE=20060831134307.994889 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6590" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134323.000000 DATE=20060831134317.088815 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6590" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831134324.000000 DATE=20060831134317.367883 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6590" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134326.000000 DATE=20060831134326.023027 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9758" +DG.ARRIVED=20060831134351.000000 DATE=20060831134351.438262 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831135628.000000 DATE=20060831135601.019358 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831135749.000000 DATE=20060831135748.841954 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831135829.000000 DATE=20060831135637.124074 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060831135831.000000 DATE=20060831135637.701352 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060831135832.000000 DATE=20060831135639.388261 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4.img" +DG.ARRIVED=20060831135833.000000 DATE=20060831135640.896619 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference.img" +DG.ARRIVED=20060831135835.000000 DATE=20060831135641.399583 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4.warp" +DG.ARRIVED=20060831135838.000000 DATE=20060831135641.864256 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060831135841.000000 DATE=20060831135642.211217 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060831135843.000000 DATE=20060831135642.571914 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060831135844.000000 DATE=20060831135642.930015 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831140016.000000 DATE=20060831140015.839442 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140018.000000 DATE=20060831140016.115412 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/bwFcsOFZWTt0KIm7FKMThw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134047.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134124.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134211.000000 DATE=20060831134126.705397 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/du/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdui3MDOw4XfkJIXPOr-5Nw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831141702.000000 DATE=20060831141700.080799 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21443" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831141750.000000 DATE=20060831141749.828632 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21443" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831141752.000000 DATE=20060831141750.627412 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21443" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831141757.000000 DATE=20060831141757.041207 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9771" +DG.ARRIVED=20060831141815.000000 DATE=20060831141815.385896 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831142124.000000 DATE=20060831142000.085299 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831142124.000000 DATE=20060831142031.794678 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060831142125.000000 DATE=20060831142032.320867 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060831142126.000000 DATE=20060831142032.602419 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.hdr" +DG.ARRIVED=20060831142127.000000 DATE=20060831142032.882737 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.img" +DG.ARRIVED=20060831142128.000000 DATE=20060831142033.157911 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-x.pgm" +DG.ARRIVED=20060831142130.000000 DATE=20060831142033.454502 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831142158.000000 DATE=20060831142158.473370 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831142419.000000 DATE=20060831142419.290579 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831142421.000000 DATE=20060831142419.643594 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/dui3MDOw4XfkJIXPOr-5Nw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134051.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134128.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134204.000000 DATE=20060831134125.483073 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/kV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fkVP2hUiLSSRrQVwSrzhrTA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831134316.000000 DATE=20060831134307.991116 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6587" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134422.000000 DATE=20060831134422.152141 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6587" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831134423.000000 DATE=20060831134422.403899 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6587" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831134429.000000 DATE=20060831134429.455719 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9761" +DG.ARRIVED=20060831134501.000000 DATE=20060831134500.401334 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831135847.000000 DATE=20060831135709.726003 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831135853.000000 DATE=20060831135850.051710 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831135906.000000 DATE=20060831135748.836053 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060831135907.000000 DATE=20060831135749.161686 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060831135909.000000 DATE=20060831135749.453242 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1.img" +DG.ARRIVED=20060831135911.000000 DATE=20060831135749.756730 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reference.img" +DG.ARRIVED=20060831135912.000000 DATE=20060831135750.050006 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1.warp" +DG.ARRIVED=20060831135914.000000 DATE=20060831135750.364100 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060831135917.000000 DATE=20060831135750.664521 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060831135918.000000 DATE=20060831135750.952830 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060831135920.000000 DATE=20060831135751.364544 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831140145.000000 DATE=20060831140123.969743 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831140149.000000 DATE=20060831140124.185645 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/kVP2hUiLSSRrQVwSrzhrTA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134056.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134133.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134159.000000 DATE=20060831134124.415316 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/pr/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fprP3QCwFm5dVADx5DfFl-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831140910.000000 DATE=20060831140909.688968 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="17955" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140947.000000 DATE=20060831140946.685273 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="17955" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831140948.000000 DATE=20060831140946.912256 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="17955" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831140953.000000 DATE=20060831140952.560100 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9768" +DG.ARRIVED=20060831141005.000000 DATE=20060831141004.885027 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831141104.000000 DATE=20060831141104.415009 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831141229.000000 DATE=20060831141229.459299 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831141306.000000 DATE=20060831141216.148730 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="3" +DG.ARRIVED=20060831141307.000000 DATE=20060831141216.736665 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="softmean" +DG.ARRIVED=20060831141308.000000 DATE=20060831141217.251160 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060831141309.000000 DATE=20060831141217.528612 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy1-resliced.hdr" +DG.ARRIVED=20060831141311.000000 DATE=20060831141217.847286 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060831141312.000000 DATE=20060831141218.157616 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy2-resliced.hdr" +DG.ARRIVED=20060831141313.000000 DATE=20060831141218.434054 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060831141315.000000 DATE=20060831141218.707522 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy3-resliced.hdr" +DG.ARRIVED=20060831141317.000000 DATE=20060831141218.980416 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000017" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060831141318.000000 DATE=20060831141219.506677 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000019" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/anatomy4-resliced.hdr" +DG.ARRIVED=20060831141320.000000 DATE=20060831141219.817536 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000021" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.img" +DG.ARRIVED=20060831141322.000000 DATE=20060831141220.054639 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000023" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla.hdr" +DG.ARRIVED=20060831141324.000000 DATE=20060831141220.494210 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831141701.000000 DATE=20060831141700.141916 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831141704.000000 DATE=20060831141700.566816 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/prP3QCwFm5dVADx5DfFl-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134109.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134140.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134146.000000 DATE=20060831134122.056014 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s-/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs-WytXDHrOeHMRjuOOzY-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831142329.000000 DATE=20060831142327.308332 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24165" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831142357.000000 DATE=20060831142357.165295 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24165" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831142358.000000 DATE=20060831142357.485892 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24165" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831142401.000000 DATE=20060831142400.666095 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9773" +DG.ARRIVED=20060831142422.000000 DATE=20060831142419.967218 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831142712.000000 DATE=20060831142522.474091 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831142713.000000 DATE=20060831142539.235433 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060831142714.000000 DATE=20060831142539.728283 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060831142715.000000 DATE=20060831142540.072394 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-z.pgm" +DG.ARRIVED=20060831142717.000000 DATE=20060831142540.355770 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-z.gif" +DG.ARRIVED=20060831142720.000000 DATE=20060831142540.658403 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831142758.000000 DATE=20060831142757.918710 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831142917.000000 DATE=20060831142916.743859 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831142919.000000 DATE=20060831142917.098127 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/s-WytXDHrOeHMRjuOOzY-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831134050.000000 DATE=20060831134045.680474 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134127.000000 DATE=20060831134123.575263 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831134206.000000 DATE=20060831134125.780713 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/t2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ft2YolMHYAHOtHsosU21yGw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/3fYyqqzjuOHbinsk9pWbig" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831142330.000000 DATE=20060831142327.290056 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24164" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831142342.000000 DATE=20060831142340.887052 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24164" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831142343.000000 DATE=20060831142342.283829 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="24164" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831142348.000000 DATE=20060831142348.365514 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9772" +DG.ARRIVED=20060831142407.000000 DATE=20060831142406.940861 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fYyqqzjuOHbinsk9pWbig.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831142504.000000 DATE=20060831142503.244036 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060831142657.000000 DATE=20060831142657.376514 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831142706.000000 DATE=20060831142519.487320 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060831142707.000000 DATE=20060831142519.808302 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060831142708.000000 DATE=20060831142520.146083 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-y.pgm" +DG.ARRIVED=20060831142710.000000 DATE=20060831142520.445475 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/sitera/pch06/blabla-y.gif" +DG.ARRIVED=20060831142711.000000 DATE=20060831142520.787596 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=University of West Bohemia/CN=Jiri Sitera" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831142924.000000 DATE=20060831142923.774893 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831142925.000000 DATE=20060831142924.086335 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/t2YolMHYAHOtHsosU21yGw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" diff --git a/org.glite.jp/examples/pch06/dump2 b/org.glite.jp/examples/pch06/dump2 new file mode 100644 index 0000000..6fb362e --- /dev/null +++ b/org.glite.jp/examples/pch06/dump2 @@ -0,0 +1,312 @@ +DG.ARRIVED=20060829154002.000000 DATE=20060829154002.327119 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060829154011.000000 DATE=20060829154009.506194 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060829154039.000000 DATE=20060829154022.601283 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="delegation_id" DG.USERTAG.VALUE="m7Y_Js4wjzVZuumcLkiE6A" +DG.ARRIVED=20060829154040.000000 DATE=20060829154022.921295 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000004:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="jdl_original" DG.USERTAG.VALUE="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" +DG.ARRIVED=20060829154040.000000 DATE=20060829154023.340987 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="lb_sequence_code" DG.USERTAG.VALUE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" +DG.ARRIVED=20060829154040.000000 DATE=20060829154024.228054 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000006:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="NetworkServer" DG.ACCEPTED.FROM_HOST="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.ACCEPTED.FROM_INSTANCE="" DG.ACCEPTED.LOCAL_JOBID="" +DG.ARRIVED=20060829154041.000000 DATE=20060829154024.812628 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000007:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060829154042.000000 DATE=20060829154025.535465 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; AllowZippedISB = true; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; InputSandboxPath = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/input\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060829154042.000000 DATE=20060829154026.416652 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.DEQUEUED.LOCAL_JOBID="" +DG.ARRIVED=20060829154043.000000 DATE=20060829154027.251161 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000002:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="dagman" +DG.ARRIVED=20060829154043.000000 DATE=20060829154027.631828 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060829154044.000000 DATE=20060829154028.000359 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="[ Arguments = [ JobAd = [ edg_jobid = \"https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw\"; Arguments = \"-f -l /var/glite/jobcontrol/submit/QV/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/QV/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag_description.con -Rescue /var/glite/jobcontrol/submit/QV/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log\"; environment = \"_CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\"; ce_id = \"dagman\"; Output = \"/var/glite/jobcontrol/condorio/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag.lib.out\"; Executable = \"/opt/condor-6.7.10/bin/condor_dagman\"; Getenv = true; X509UserProxy = \"/var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/user.proxy\"; Error_ = \"/var/glite/jobcontrol/condorio/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag.lib.out\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; Type = \"dag\"; Universe = \"scheduler\"; Remove_Kill_Sig = \"SIGUSR1\" ] ]; Command = \"Submit\"; Source = 2; Protocol = \"1.0.0\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060829154045.000000 DATE=20060829154029.849237 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.DEQUEUED.LOCAL_JOBID="unavailable" +DG.ARRIVED=20060829154046.000000 DATE=20060829154030.254633 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000002:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="unavailable" DG.TRANSFER.RESULT="START" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829154046.000000 DATE=20060829154031.945378 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="+edg_jobid = \"https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw\"\nArguments = -f -l /var/glite/jobcontrol/submit/QV/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/QV/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag_description.con -Rescue /var/glite/jobcontrol/submit/QV/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log\nenvironment = _CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\n+ce_id = \"dagman\"\nOutput = /var/glite/jobcontrol/condorio/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag.lib.out\nSubmit_Event_Notes = DAG job: (https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw) (UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000)\nExecutable = /opt/condor-6.7.10/bin/condor_dagman\nGetenv = True\nX509UserProxy = /var/glite/SandboxDir/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/user.proxy\nerror = /var/glite/jobcontrol/condorio/QV/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw/dag.lib.out\n+LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000\"\n+Type = \"dag\"\nUniverse = scheduler\nRemove_Kill_Sig = SIGUSR1\nLog = /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log\n+CondorSubmitFile = \"/var/glite/jobcontrol/submit/QV/Condor.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.submit\"\nQueue 1\n" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="8860" +DG.ARRIVED=20060829154048.000000 DATE=20060829154035.167236 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000001:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8860" +DG.ARRIVED=20060829154049.000000 DATE=20060829154036.285948 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.RUNNING.NODE="<195.113.219.12:20194>" +DG.ARRIVED=20060829161951.000000 DATE=20060829161950.965630 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000005:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154006.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154015.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154026.000000 DATE=20060829154013.122178 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/3f/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f3fnohtrzr66CZRqop_5fCxJw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829154048.000000 DATE=20060829154032.529194 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18086" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154057.000000 DATE=20060829154057.200552 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18086" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829154057.000000 DATE=20060829154057.446649 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18086" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154101.000000 DATE=20060829154100.989355 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8862" +DG.ARRIVED=20060829154121.000000 DATE=20060829154121.177333 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829154627.000000 DATE=20060829154626.782898 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829154828.000000 DATE=20060829154700.338593 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060829154828.000000 DATE=20060829154701.745621 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060829154829.000000 DATE=20060829154702.098193 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.img" +DG.ARRIVED=20060829154829.000000 DATE=20060829154702.431247 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060829154829.000000 DATE=20060829154702.735599 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.warp" +DG.ARRIVED=20060829154830.000000 DATE=20060829154702.985541 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060829154831.000000 DATE=20060829154703.277360 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060829154831.000000 DATE=20060829154703.570400 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060829154832.000000 DATE=20060829154703.902086 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154844.000000 DATE=20060829154843.654807 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829155100.000000 DATE=20060829155100.022425 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829155100.000000 DATE=20060829155100.297613 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/3fnohtrzr66CZRqop_CxJw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154008.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154016.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154020.000000 DATE=20060829154011.965158 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Ic/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fIcOYL5i8w5WHHZMRpKytQw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829154048.000000 DATE=20060829154032.496129 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18088" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154109.000000 DATE=20060829154108.788893 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18088" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829154109.000000 DATE=20060829154109.107500 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18088" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154115.000000 DATE=20060829154114.803316 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8864" +DG.ARRIVED=20060829154134.000000 DATE=20060829154134.010663 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829154832.000000 DATE=20060829154743.692677 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829154833.000000 DATE=20060829154817.790039 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060829154833.000000 DATE=20060829154818.120684 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060829154833.000000 DATE=20060829154818.439844 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.img" +DG.ARRIVED=20060829154834.000000 DATE=20060829154819.101659 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060829154834.000000 DATE=20060829154819.660388 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.warp" +DG.ARRIVED=20060829154835.000000 DATE=20060829154819.967335 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060829154836.000000 DATE=20060829154820.331204 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060829154836.000000 DATE=20060829154821.215021 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060829154837.000000 DATE=20060829154821.530409 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154941.000000 DATE=20060829154940.679479 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829155202.000000 DATE=20060829155201.674958 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829155202.000000 DATE=20060829155201.897172 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/IcOYL5i8w5WHHZMRpKytQw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154006.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154015.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154024.000000 DATE=20060829154012.789690 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Kd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fKdwR0dNd2GIN_5fljUITI8dQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829155102.000000 DATE=20060829155102.468931 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22575" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155120.000000 DATE=20060829155119.872928 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22575" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829155120.000000 DATE=20060829155120.078513 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22575" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155125.000000 DATE=20060829155124.778921 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8873" +DG.ARRIVED=20060829155137.000000 DATE=20060829155137.133929 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829155448.000000 DATE=20060829155305.423921 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829155448.000000 DATE=20060829155348.364103 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060829155449.000000 DATE=20060829155348.686467 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060829155449.000000 DATE=20060829155349.013183 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.warp" +DG.ARRIVED=20060829155450.000000 DATE=20060829155349.440068 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.img" +DG.ARRIVED=20060829155450.000000 DATE=20060829155349.757963 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.hdr" +DG.ARRIVED=20060829155451.000000 DATE=20060829155350.064961 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060829155451.000000 DATE=20060829155350.499556 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060829155451.000000 DATE=20060829155350.805038 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829155545.000000 DATE=20060829155544.732900 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829155658.000000 DATE=20060829155657.797641 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829155658.000000 DATE=20060829155658.315364 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/KdwR0dNd2GIN_ljUITI8dQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154008.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154017.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154018.000000 DATE=20060829154011.306635 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/L9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fL9od54iYa-l8M8O-BgY3FQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829160533.000000 DATE=20060829160531.807126 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28998" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829160549.000000 DATE=20060829160548.482629 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28998" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829160549.000000 DATE=20060829160548.736258 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28998" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829160600.000000 DATE=20060829160600.267863 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8880" +DG.ARRIVED=20060829160613.000000 DATE=20060829160613.411221 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829161008.000000 DATE=20060829160853.706045 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829161008.000000 DATE=20060829160926.395576 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060829161010.000000 DATE=20060829160926.984665 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060829161011.000000 DATE=20060829160927.293647 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060829161012.000000 DATE=20060829160927.596111 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060829161013.000000 DATE=20060829160927.886180 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-z.pgm" +DG.ARRIVED=20060829161014.000000 DATE=20060829160928.200156 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829161026.000000 DATE=20060829161026.390151 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829161246.000000 DATE=20060829161246.177799 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829161247.000000 DATE=20060829161246.376968 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/L9od54iYa-l8M8O-BgY3FQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154003.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154013.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154034.000000 DATE=20060829154015.012436 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Mv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMvpcJqSSk0pJzV9RWepyFg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829155204.000000 DATE=20060829155203.509328 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22966" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155231.000000 DATE=20060829155231.501113 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22966" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829155232.000000 DATE=20060829155231.763859 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22966" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155239.000000 DATE=20060829155238.832148 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8874" +DG.ARRIVED=20060829155251.000000 DATE=20060829155251.117061 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829155452.000000 DATE=20060829155416.236233 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829155545.000000 DATE=20060829155545.316905 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829155653.000000 DATE=20060829155458.357421 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060829155653.000000 DATE=20060829155458.719900 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060829155653.000000 DATE=20060829155459.019355 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.warp" +DG.ARRIVED=20060829155654.000000 DATE=20060829155459.602719 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.img" +DG.ARRIVED=20060829155654.000000 DATE=20060829155459.972930 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.hdr" +DG.ARRIVED=20060829155655.000000 DATE=20060829155500.324605 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060829155655.000000 DATE=20060829155500.609859 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060829155656.000000 DATE=20060829155500.924156 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829155902.000000 DATE=20060829155901.993131 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829155903.000000 DATE=20060829155902.424697 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/MvpcJqSSk0pJzV9RWepyFg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154008.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154017.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154018.000000 DATE=20060829154011.659053 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Y5/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fY5yNWKqwM9HWjYk4Y9ij8Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829161251.000000 DATE=20060829161250.517535 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="31924" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829161256.000000 DATE=20060829161256.590658 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="31924" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829161258.000000 DATE=20060829161256.782714 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="31924" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829161305.000000 DATE=20060829161304.594194 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8882" +DG.ARRIVED=20060829161317.000000 DATE=20060829161316.869335 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829161631.000000 DATE=20060829161631.005537 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829161632.000000 DATE=20060829161457.466809 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829161633.000000 DATE=20060829161513.617276 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060829161634.000000 DATE=20060829161514.234045 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060829161635.000000 DATE=20060829161515.007632 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-z.pgm" +DG.ARRIVED=20060829161636.000000 DATE=20060829161515.476783 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-z.gif" +DG.ARRIVED=20060829161638.000000 DATE=20060829161516.018084 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829161844.000000 DATE=20060829161844.092928 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829161845.000000 DATE=20060829161844.293011 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/Y5yNWKqwM9HWjYk4Y9ij8Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154003.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154011.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154037.000000 DATE=20060829154015.872733 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ZC/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fZCCjcIjRMfxHgHq_5fskjigA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829160532.000000 DATE=20060829160531.715544 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28997" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829160543.000000 DATE=20060829160543.316127 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28997" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829160544.000000 DATE=20060829160543.537392 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28997" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829160554.000000 DATE=20060829160554.006061 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8879" +DG.ARRIVED=20060829160607.000000 DATE=20060829160607.200887 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829160756.000000 DATE=20060829160755.862041 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829160926.000000 DATE=20060829160926.027556 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829160958.000000 DATE=20060829160826.764426 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060829160958.000000 DATE=20060829160827.149793 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060829161000.000000 DATE=20060829160827.453678 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060829161001.000000 DATE=20060829160827.724866 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060829161003.000000 DATE=20060829160828.023982 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-y.pgm" +DG.ARRIVED=20060829161006.000000 DATE=20060829160828.365827 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829161145.000000 DATE=20060829161145.055281 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829161147.000000 DATE=20060829161145.255664 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/ZCCjcIjRMfxHgHq_skjigA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154005.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154014.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154027.000000 DATE=20060829154013.503578 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/av/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2favHZVS5LPLWKzoSDwB9Ccw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829155906.000000 DATE=20060829155906.123548 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="25924" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155924.000000 DATE=20060829155924.515822 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="25924" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829155925.000000 DATE=20060829155924.750101 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="25924" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155927.000000 DATE=20060829155926.802199 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8877" +DG.ARRIVED=20060829155945.000000 DATE=20060829155945.114583 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829160056.000000 DATE=20060829160055.541220 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829160210.000000 DATE=20060829160210.079054 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829160257.000000 DATE=20060829160208.230088 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="3" +DG.ARRIVED=20060829160257.000000 DATE=20060829160208.590493 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="softmean" +DG.ARRIVED=20060829160258.000000 DATE=20060829160208.896501 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060829160258.000000 DATE=20060829160209.204419 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.hdr" +DG.ARRIVED=20060829160259.000000 DATE=20060829160209.578037 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060829160259.000000 DATE=20060829160209.876140 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.hdr" +DG.ARRIVED=20060829160300.000000 DATE=20060829160210.196142 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060829160300.000000 DATE=20060829160210.501538 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.hdr" +DG.ARRIVED=20060829160300.000000 DATE=20060829160210.920308 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000017" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060829160301.000000 DATE=20060829160211.282844 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000019" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.hdr" +DG.ARRIVED=20060829160302.000000 DATE=20060829160212.238003 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000021" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060829160303.000000 DATE=20060829160212.525975 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000023" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060829160303.000000 DATE=20060829160212.906611 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829160529.000000 DATE=20060829160529.258801 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829160530.000000 DATE=20060829160529.443350 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/avHZVS5LPLWKzoSDwB9Ccw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154007.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154016.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154023.000000 DATE=20060829154012.495782 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/b2/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fb2nH3x8W1HA-TtZGTMxG5g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829154047.000000 DATE=20060829154032.470139 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18087" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154052.000000 DATE=20060829154051.858582 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18087" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829154052.000000 DATE=20060829154052.102674 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18087" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154055.000000 DATE=20060829154054.742360 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8861" +DG.ARRIVED=20060829154122.000000 DATE=20060829154121.430604 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829154622.000000 DATE=20060829154521.416816 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829154623.000000 DATE=20060829154555.611052 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060829154623.000000 DATE=20060829154556.388415 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060829154623.000000 DATE=20060829154556.835159 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.img" +DG.ARRIVED=20060829154624.000000 DATE=20060829154557.128776 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060829154624.000000 DATE=20060829154557.441922 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.warp" +DG.ARRIVED=20060829154625.000000 DATE=20060829154557.742094 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060829154625.000000 DATE=20060829154558.058970 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060829154626.000000 DATE=20060829154558.407706 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060829154626.000000 DATE=20060829154558.769612 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154642.000000 DATE=20060829154642.139596 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829155011.000000 DATE=20060829155010.979705 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829155011.000000 DATE=20060829155011.180270 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/b2nH3x8W1HA-TtZGTMxG5g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154004.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154013.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154033.000000 DATE=20060829154014.693348 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/jB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fjBm3T0knxbtnjuNPO0rEAA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829161145.000000 DATE=20060829161144.693766 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="31550" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829161151.000000 DATE=20060829161151.426480 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="31550" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829161152.000000 DATE=20060829161151.630081 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="31550" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829161157.000000 DATE=20060829161157.441247 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8881" +DG.ARRIVED=20060829161216.000000 DATE=20060829161215.710384 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829161425.000000 DATE=20060829161347.195709 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829161426.000000 DATE=20060829161403.244813 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060829161427.000000 DATE=20060829161403.561211 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060829161428.000000 DATE=20060829161403.869143 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-y.pgm" +DG.ARRIVED=20060829161429.000000 DATE=20060829161404.180406 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-y.gif" +DG.ARRIVED=20060829161430.000000 DATE=20060829161404.744728 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829161531.000000 DATE=20060829161530.443140 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829161749.000000 DATE=20060829161749.559925 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829161751.000000 DATE=20060829161749.774448 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/jBm3T0knxbtnjuNPO0rEAA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154003.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154012.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154036.000000 DATE=20060829154015.579156 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flGHdArnB-tp02XPlbykzvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829160532.000000 DATE=20060829160531.684844 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28996" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829160538.000000 DATE=20060829160538.093755 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28996" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829160539.000000 DATE=20060829160538.353742 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="28996" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829160548.000000 DATE=20060829160547.726294 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8878" +DG.ARRIVED=20060829160603.000000 DATE=20060829160600.522140 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829161016.000000 DATE=20060829160956.286705 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829161127.000000 DATE=20060829161126.802760 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829161217.000000 DATE=20060829161028.287327 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060829161218.000000 DATE=20060829161028.575607 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060829161220.000000 DATE=20060829161028.861629 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060829161221.000000 DATE=20060829161029.142419 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060829161222.000000 DATE=20060829161029.423663 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-x.pgm" +DG.ARRIVED=20060829161223.000000 DATE=20060829161029.812864 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829161341.000000 DATE=20060829161341.290163 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829161342.000000 DATE=20060829161341.505324 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/lGHdArnB-tp02XPlbykzvg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154005.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154014.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154030.000000 DATE=20060829154014.099489 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lb/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flbaTLdA50xsw7qmxMXLUNA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829155012.000000 DATE=20060829155011.514687 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22307" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155020.000000 DATE=20060829155020.078148 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22307" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829155020.000000 DATE=20060829155020.328424 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22307" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829155023.000000 DATE=20060829155023.456643 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8872" +DG.ARRIVED=20060829155042.000000 DATE=20060829155041.741533 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829155244.000000 DATE=20060829155152.700074 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829155244.000000 DATE=20060829155236.191832 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060829155244.000000 DATE=20060829155236.484023 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060829155245.000000 DATE=20060829155236.776524 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.warp" +DG.ARRIVED=20060829155245.000000 DATE=20060829155237.109682 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.img" +DG.ARRIVED=20060829155245.000000 DATE=20060829155237.747830 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.hdr" +DG.ARRIVED=20060829155246.000000 DATE=20060829155238.102084 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060829155246.000000 DATE=20060829155238.568714 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060829155247.000000 DATE=20060829155238.880853 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829155343.000000 DATE=20060829155342.905068 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829155704.000000 DATE=20060829155704.568019 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829155705.000000 DATE=20060829155704.801895 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/lbaTLdA50xsw7qmxMXLUNA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154007.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154016.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154021.000000 DATE=20060829154012.222607 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s0/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs0PlUTdZ7gpQHZtJgzd3Ig\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829154800.000000 DATE=20060829154800.143793 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21016" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154808.000000 DATE=20060829154808.087145 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21016" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829154808.000000 DATE=20060829154808.467855 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21016" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154813.000000 DATE=20060829154813.160741 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8870" +DG.ARRIVED=20060829154825.000000 DATE=20060829154825.415729 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829155038.000000 DATE=20060829154951.823876 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829155039.000000 DATE=20060829155034.657565 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060829155039.000000 DATE=20060829155034.939189 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060829155039.000000 DATE=20060829155035.302527 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.warp" +DG.ARRIVED=20060829155040.000000 DATE=20060829155035.583723 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.img" +DG.ARRIVED=20060829155040.000000 DATE=20060829155035.958453 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.hdr" +DG.ARRIVED=20060829155041.000000 DATE=20060829155036.336350 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060829155041.000000 DATE=20060829155036.618594 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060829155042.000000 DATE=20060829155037.144116 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829155143.000000 DATE=20060829155143.412493 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829155402.000000 DATE=20060829155401.650508 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829155403.000000 DATE=20060829155401.999111 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/s0PlUTdZ7gpQHZtJgzd3Ig" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154005.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154014.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154029.000000 DATE=20060829154013.847624 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ug/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fug-_5fsHdqyECoVGwwumZQzQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829161346.000000 DATE=20060829161345.670487 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="32273" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829161352.000000 DATE=20060829161352.594393 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="32273" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829161353.000000 DATE=20060829161352.837073 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="32273" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829161400.000000 DATE=20060829161359.736845 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8883" +DG.ARRIVED=20060829161412.000000 DATE=20060829161412.031788 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829161639.000000 DATE=20060829161546.441802 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829161640.000000 DATE=20060829161603.008578 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060829161641.000000 DATE=20060829161603.357686 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060829161642.000000 DATE=20060829161603.675291 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-x.pgm" +DG.ARRIVED=20060829161644.000000 DATE=20060829161604.003818 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-x.gif" +DG.ARRIVED=20060829161646.000000 DATE=20060829161604.411399 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829161731.000000 DATE=20060829161731.328271 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829161944.000000 DATE=20060829161944.575739 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829161946.000000 DATE=20060829161944.770109 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/ug-_sHdqyECoVGwwumZQzQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154004.000000 DATE=20060829154003.047871 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154013.000000 DATE=20060829154011.512662 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060829154032.000000 DATE=20060829154014.376500 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xA/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxAqnWHE01PQo2r2weBBjpQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/QVyQJpT2HhmGCqVIbi5WMw" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060829154047.000000 DATE=20060829154032.484554 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18085" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154103.000000 DATE=20060829154102.532953 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18085" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060829154103.000000 DATE=20060829154102.891259 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18085" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060829154108.000000 DATE=20060829154108.242633 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="8863" +DG.ARRIVED=20060829154122.000000 DATE=20060829154121.733662 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fQVyQJpT2HhmGCqVIbi5WMw.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060829154417.000000 DATE=20060829154416.933532 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060829154618.000000 DATE=20060829154450.804009 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060829154618.000000 DATE=20060829154451.543066 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060829154619.000000 DATE=20060829154451.858743 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.img" +DG.ARRIVED=20060829154619.000000 DATE=20060829154452.148709 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060829154620.000000 DATE=20060829154452.429040 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.warp" +DG.ARRIVED=20060829154620.000000 DATE=20060829154452.806262 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060829154621.000000 DATE=20060829154453.311769 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060829154621.000000 DATE=20060829154453.823359 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060829154622.000000 DATE=20060829154454.178061 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060829154643.000000 DATE=20060829154642.378664 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060829154801.000000 DATE=20060829154800.704188 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060829154801.000000 DATE=20060829154800.931546 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/xAqnWHE01PQo2r2weBBjpQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" diff --git a/org.glite.jp/examples/pch06/dump3 b/org.glite.jp/examples/pch06/dump3 new file mode 100644 index 0000000..6fff0db --- /dev/null +++ b/org.glite.jp/examples/pch06/dump3 @@ -0,0 +1,144 @@ +DG.ARRIVED=20060831125552.000000 DATE=20060831125551.903978 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ edg_jobid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"; nodes = [ slicery = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060831125618.000000 DATE=20060831125615.746557 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ edg_jobid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"; nodes = [ slicery = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060831125705.000000 DATE=20060831125632.568211 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="delegation_id" DG.USERTAG.VALUE="1zqAuw05JHSupS587Ss4GA" +DG.ARRIVED=20060831125706.000000 DATE=20060831125632.839168 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000004:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="jdl_original" DG.USERTAG.VALUE="[ nodes = [ slicery = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; converty = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; softmean = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" +DG.ARRIVED=20060831125707.000000 DATE=20060831125633.280366 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="lb_sequence_code" DG.USERTAG.VALUE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" +DG.ARRIVED=20060831125710.000000 DATE=20060831125633.984300 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000006:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="NetworkServer" DG.ACCEPTED.FROM_HOST="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.ACCEPTED.FROM_INSTANCE="" DG.ACCEPTED.LOCAL_JOBID="" +DG.ARRIVED=20060831125711.000000 DATE=20060831125634.264605 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000007:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ edg_jobid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"; nodes = [ slicery = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060831125713.000000 DATE=20060831125634.711662 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ edg_jobid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"; nodes = [ slicery = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; AllowZippedISB = true; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; InputSandboxPath = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/input\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060831125715.000000 DATE=20060831125635.986857 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.DEQUEUED.LOCAL_JOBID="" +DG.ARRIVED=20060831125716.000000 DATE=20060831125636.589828 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000002:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="dagman" +DG.ARRIVED=20060831125718.000000 DATE=20060831125636.915877 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060831125720.000000 DATE=20060831125637.161924 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="[ Arguments = [ JobAd = [ edg_jobid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"; Arguments = \"-f -l /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag_description.con -Rescue /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log\"; environment = \"_CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\"; ce_id = \"dagman\"; Output = \"/var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag.lib.out\"; Executable = \"/opt/condor-6.7.10/bin/condor_dagman\"; Getenv = true; X509UserProxy = \"/var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\"; Error_ = \"/var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag.lib.out\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; Type = \"dag\"; Universe = \"scheduler\"; Remove_Kill_Sig = \"SIGUSR1\" ] ]; Command = \"Submit\"; Source = 2; Protocol = \"1.0.0\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060831125723.000000 DATE=20060831125638.240868 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.DEQUEUED.LOCAL_JOBID="unavailable" +DG.ARRIVED=20060831125724.000000 DATE=20060831125638.544956 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000002:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="unavailable" DG.TRANSFER.RESULT="START" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831125726.000000 DATE=20060831125640.032216 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="+edg_jobid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"\nArguments = -f -l /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag_description.con -Rescue /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log\nenvironment = _CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\n+ce_id = \"dagman\"\nOutput = /var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag.lib.out\nSubmit_Event_Notes = DAG job: (https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ) (UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000)\nExecutable = /opt/condor-6.7.10/bin/condor_dagman\nGetenv = True\nX509UserProxy = /var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\nerror = /var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/dag.lib.out\n+LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000\"\n+Type = \"dag\"\nUniverse = scheduler\nRemove_Kill_Sig = SIGUSR1\nLog = /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log\n+CondorSubmitFile = \"/var/glite/jobcontrol/submit/9_/Condor.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.submit\"\nQueue 1\n" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="9735" +DG.ARRIVED=20060831125732.000000 DATE=20060831125643.478857 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000001:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9735" +DG.ARRIVED=20060831125735.000000 DATE=20060831125643.816980 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.RUNNING.NODE="<195.113.219.12:20194>" +DG.ARRIVED=20060831143628.000000 DATE=20060831143627.785342 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000005:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Warning: job exit code != 0" DG.DONE.EXIT_CODE="1" +DG.ARRIVED=20060831125600.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125627.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125655.000000 DATE=20060831125622.242663 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/-xcX-i0EEYyGLX0YziJ27Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/-x/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f-xcX-i0EEYyGLX0YziJ27Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125554.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125622.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125701.000000 DATE=20060831125623.599945 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/FBQDjtECNROCLSuv1Su9ow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/FB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fFBQDjtECNROCLSuv1Su9ow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125555.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125623.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125700.000000 DATE=20060831125623.273381 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/Vd0BXmaKC6Jx7VDsd0c1TA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Vd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fVd0BXmaKC6Jx7VDsd0c1TA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125608.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125633.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125647.000000 DATE=20060831125620.708220 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YO/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125729.000000 DATE=20060831125640.467179 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18729" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130017.000000 DATE=20060831130015.764853 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18729" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="hephygr.oeaw.ac.at:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831130018.000000 DATE=20060831130016.278897 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18729" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130028.000000 DATE=20060831130024.653183 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9739" +DG.ARRIVED=20060831130035.000000 DATE=20060831130031.887537 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="unavailable" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="stream_error = False\n+edg_jobid = \"https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ\"\nArguments = 'UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000'\nGlobusScheduler = hephygr.oeaw.ac.at:2119/jobmanager-lcgpbs\n+ce_id = \"hephygr.oeaw.ac.at:2119/jobmanager-lcgpbs-voce\"\nTransfer_Executable = True\nOutput = /var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/StandardOutput\nSubmit_Event_User_Notes = (https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ) (UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000) (0)\nCopy_to_Spool = False\nExecutable = /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/JobWrapper.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ.sh\nX509UserProxy = /var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\nerror = /var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ/StandardError\n+LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000\"\nNotification = never\nstream_output = False\nGlobusRSL = (queue=voce)(jobtype=single)\n+Type = \"job\"\nUniverse = grid\n+UserSubjectName = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"\n+edg_dagid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"\nLog = /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log\ngrid_type = globus\n+CondorSubmitFile = \"/var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/Condor.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYOKggeuqQKsPBxwfjiKKcQ.submit\"\nQueue 1\n" DG.TRANSFER.RESULT="FAIL" DG.TRANSFER.REASON="7 authentication failed: GSS Major Status: Authentication Failed GSS Minor Status Error Chain: init.c:499: globus_gss_assist_init_sec_context_async: Error during context initialization init_sec_context" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831130049.000000 DATE=20060831130044.977942 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="20646" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000004:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130053.000000 DATE=20060831130045.851931 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="20646" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000005:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="99" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130055.000000 DATE=20060831130046.302049 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="20646" DG.EVNT="Abort" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000006:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ABORT.REASON="hit job shallow retry count (0)" +DG.ARRIVED=20060831130057.000000 DATE=20060831130045.955549 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/YOKggeuqQKsPBxwfjiKKcQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="FAILED" DG.DONE.REASON="Job got an error while in the CondorG queue." DG.DONE.EXIT_CODE="1" +DG.ARRIVED=20060831125606.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125631.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125648.000000 DATE=20060831125621.028569 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/YQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fYQOSOo7Ov3Bmql6mk5fSOA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831130204.000000 DATE=20060831130204.502467 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21227" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130248.000000 DATE=20060831130248.080501 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21227" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="ce.grid.tuke.sk:2119/jobmanager-pbs-voce" +DG.ARRIVED=20060831130249.000000 DATE=20060831130248.405496 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="21227" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130250.000000 DATE=20060831130250.299067 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9741" +DG.ARRIVED=20060831130311.000000 DATE=20060831130309.453139 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="ce.grid.tuke.sk:2119/jobmanager-pbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831143320.000000 DATE=20060831143319.374059 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="n3.grid.tuke.sk" +DG.ARRIVED=20060831143508.000000 DATE=20060831143508.117054 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="ce.grid.tuke.sk" +DG.ARRIVED=20060831143521.000000 DATE=20060831143457.565443 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060831143523.000000 DATE=20060831143457.724274 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060831143524.000000 DATE=20060831143457.858582 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.warp" +DG.ARRIVED=20060831143525.000000 DATE=20060831143457.993552 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.img" +DG.ARRIVED=20060831143526.000000 DATE=20060831143458.138063 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.hdr" +DG.ARRIVED=20060831143527.000000 DATE=20060831143458.279122 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060831143529.000000 DATE=20060831143458.409290 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060831143531.000000 DATE=20060831143458.561298 HOST="n3.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831143621.000000 DATE=20060831143621.131846 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831143622.000000 DATE=20060831143621.461718 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/YQOSOo7Ov3Bmql6mk5fSOA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831125614.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125638.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125640.000000 DATE=20060831125619.211301 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/aPimH0SWMj6ZhvMmtlICow\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/aP/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2faPimH0SWMj6ZhvMmtlICow\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125553.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125620.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125702.000000 DATE=20060831125623.975403 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/bpVdssMPbFXgGDH1RzWxJQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/bp/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fbpVdssMPbFXgGDH1RzWxJQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125557.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125625.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125659.000000 DATE=20060831125622.875802 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/cu2HDZpnjTDOjVZl3ELhCA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/cu/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fcu2HDZpnjTDOjVZl3ELhCA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125601.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125628.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125653.000000 DATE=20060831125621.964302 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/dGOcuol6zMjlRvkwDuoxEQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/dG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fdGOcuol6zMjlRvkwDuoxEQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125610.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125635.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125646.000000 DATE=20060831125620.186373 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/f1/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ff1QFbuGA6E2xY03gr_5fpibQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831130539.000000 DATE=20060831130536.157667 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22805" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130650.000000 DATE=20060831130649.474002 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22805" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="fangorn.man.poznan.pl:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831130650.000000 DATE=20060831130649.858747 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="22805" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831130701.000000 DATE=20060831130700.660307 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9744" +DG.ARRIVED=20060831130707.000000 DATE=20060831130707.184706 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="fangorn.man.poznan.pl:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831131039.000000 DATE=20060831131039.191755 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="fangorn.man.poznan.pl" +DG.ARRIVED=20060831131152.000000 DATE=20060831131152.298259 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="FAILED" DG.DONE.REASON="File not available.Cannot read JobWrapper output, both from Condor and from Maradona." DG.DONE.EXIT_CODE="1" +DG.ARRIVED=20060831131157.000000 DATE=20060831131156.695852 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="25581" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000004:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831131158.000000 DATE=20060831131156.918812 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="25581" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000005:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="99" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831131158.000000 DATE=20060831131157.095715 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="25581" DG.EVNT="Abort" DG.JOBID="https://skurut1.cesnet.cz:9000/f1QFbuGA6E2xY03gr_pibQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000006:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ABORT.REASON="hit job shallow retry count (0)" +DG.ARRIVED=20060831125612.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125637.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125642.000000 DATE=20060831125619.540536 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/fB2N2WU7ECyGz4cJ1nBtbA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/fB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2ffB2N2WU7ECyGz4cJ1nBtbA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125604.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125629.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125652.000000 DATE=20060831125621.640330 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/ix00sbSdfS-r3yTHByk_vg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ix/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fix00sbSdfS-r3yTHByk_5fvg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125605.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125630.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125650.000000 DATE=20060831125621.343497 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/p9/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fp9C-3H0nVQxh2rp9M5EB-Q\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125732.000000 DATE=20060831125640.458330 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18728" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125857.000000 DATE=20060831125856.983262 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18728" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="ce.grid.tuke.sk:2119/jobmanager-pbs-voce" +DG.ARRIVED=20060831125858.000000 DATE=20060831125857.291470 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18728" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125906.000000 DATE=20060831125905.839754 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9738" +DG.ARRIVED=20060831125918.000000 DATE=20060831125918.129317 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="ce.grid.tuke.sk:2119/jobmanager-pbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831125919.000000 DATE=20060831125918.869452 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="n2.grid.tuke.sk" +DG.ARRIVED=20060831130101.000000 DATE=20060831130047.288605 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="ce.grid.tuke.sk" +DG.ARRIVED=20060831130121.000000 DATE=20060831130059.583578 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060831130123.000000 DATE=20060831130059.748456 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060831130127.000000 DATE=20060831130059.907467 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.img" +DG.ARRIVED=20060831130131.000000 DATE=20060831130100.077566 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060831130133.000000 DATE=20060831130100.237472 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.warp" +DG.ARRIVED=20060831130136.000000 DATE=20060831130100.407905 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060831130139.000000 DATE=20060831130100.572987 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060831130144.000000 DATE=20060831130100.738072 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060831130148.000000 DATE=20060831130100.921959 HOST="n2.grid.tuke.sk" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831130208.000000 DATE=20060831130205.811672 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831130212.000000 DATE=20060831130206.369102 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/p9C-3H0nVQxh2rp9M5EB-Q" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831125558.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125626.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125657.000000 DATE=20060831125622.597175 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/sU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fsU6x-K9eNxVLRuLKZWTx-A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125728.000000 DATE=20060831125640.420526 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18727" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125737.000000 DATE=20060831125722.257326 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18727" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060831125737.000000 DATE=20060831125722.553874 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18727" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125738.000000 DATE=20060831125732.225533 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9736" +DG.ARRIVED=20060831125744.000000 DATE=20060831125744.540672 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831130204.000000 DATE=20060831130127.108781 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut22.cesnet.cz" +DG.ARRIVED=20060831130205.000000 DATE=20060831130203.328429 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060831130208.000000 DATE=20060831130204.438828 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060831130212.000000 DATE=20060831130205.086861 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.img" +DG.ARRIVED=20060831130215.000000 DATE=20060831130205.974632 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060831130217.000000 DATE=20060831130206.272399 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.warp" +DG.ARRIVED=20060831130220.000000 DATE=20060831130206.553934 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060831130224.000000 DATE=20060831130206.834883 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060831130228.000000 DATE=20060831130207.116823 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060831130231.000000 DATE=20060831130207.432203 HOST="skurut22.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831130412.000000 DATE=20060831130411.439006 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060831130536.000000 DATE=20060831130535.030107 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060831130537.000000 DATE=20060831130536.045554 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/sU6x-K9eNxVLRuLKZWTx-A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060831125611.000000 DATE=20060831125553.175585 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125636.000000 DATE=20060831125620.516409 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060831125644.000000 DATE=20060831125619.860241 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = other.GlueCEStateStatus == \"Production\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yo/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060831125730.000000 DATE=20060831125640.463730 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18730" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125837.000000 DATE=20060831125836.768351 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18730" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="ce1-egee.fesb.hr:2119/jobmanager-pbs-voce" +DG.ARRIVED=20060831125837.000000 DATE=20060831125837.048366 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="18730" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125847.000000 DATE=20060831125846.818644 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9737" +DG.ARRIVED=20060831125848.000000 DATE=20060831125847.046907 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="unavailable" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log" DG.TRANSFER.JOB="stream_error = False\n+edg_jobid = \"https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA\"\nArguments = 'UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000'\nGlobusScheduler = ce1-egee.fesb.hr:2119/jobmanager-pbs\n+ce_id = \"ce1-egee.fesb.hr:2119/jobmanager-pbs-voce\"\nTransfer_Executable = True\nOutput = /var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/StandardOutput\nSubmit_Event_User_Notes = (https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA) (UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000) (0)\nCopy_to_Spool = False\nExecutable = /var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/JobWrapper.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA.sh\nX509UserProxy = /var/glite/SandboxDir/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/user.proxy\nerror = /var/glite/jobcontrol/condorio/9_/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA/StandardError\n+LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000\"\nNotification = never\nstream_output = False\nGlobusRSL = (queue=voce)(jobtype=single)\n+Type = \"job\"\nUniverse = grid\n+UserSubjectName = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"\n+edg_dagid = \"https://skurut1.cesnet.cz:9000/9_ttFpHFxe4osjuOdQ2kQQ\"\nLog = /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ.log\ngrid_type = globus\n+CondorSubmitFile = \"/var/glite/jobcontrol/submit/9_/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9_5fttFpHFxe4osjuOdQ2kQQ/Condor.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyoOTrmOjGGVaymlZVz2TiA.submit\"\nQueue 1\n" DG.TRANSFER.RESULT="FAIL" DG.TRANSFER.REASON="7 authentication failed: GSS Major Status: Authentication Failed GSS Minor Status Error Chain: init.c:499: globus_gss_assist_init_sec_context_async: Error during context initialization init_sec_context" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060831125858.000000 DATE=20060831125857.693013 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="19629" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000004:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125859.000000 DATE=20060831125857.957886 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="19629" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000005:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="99" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060831125900.000000 DATE=20060831125858.318392 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="19629" DG.EVNT="Abort" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000006:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ABORT.REASON="hit job shallow retry count (0)" +DG.ARRIVED=20060831125901.000000 DATE=20060831125859.429625 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/yoOTrmOjGGVaymlZVz2TiA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="FAILED" DG.DONE.REASON="Job got an error while in the CondorG queue." DG.DONE.EXIT_CODE="1" diff --git a/org.glite.jp/examples/pch06/dump4 b/org.glite.jp/examples/pch06/dump4 new file mode 100644 index 0000000..5a460b1 --- /dev/null +++ b/org.glite.jp/examples/pch06/dump4 @@ -0,0 +1,312 @@ +DG.ARRIVED=20060904123447.000000 DATE=20060904123446.995328 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060904123456.000000 DATE=20060904123454.188888 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="DAG" DG.REGJOB.NSUBJOBS="15" DG.REGJOB.SEED="WMPROXY" +DG.ARRIVED=20060904123527.000000 DATE=20060904123510.808562 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="delegation_id" DG.USERTAG.VALUE="hL06_APvxBj8jyy_THnuqQ" +DG.ARRIVED=20060904123527.000000 DATE=20060904123511.173108 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000004:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="jdl_original" DG.USERTAG.VALUE="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime ] ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" +DG.ARRIVED=20060904123528.000000 DATE=20060904123511.523833 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="(null)" DG.USERTAG.NAME="lb_sequence_code" DG.USERTAG.VALUE="UI=000000:NS=0000000005:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" +DG.ARRIVED=20060904123529.000000 DATE=20060904123512.221101 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000006:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="NetworkServer" DG.ACCEPTED.FROM_HOST="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.ACCEPTED.FROM_INSTANCE="" DG.ACCEPTED.LOCAL_JOBID="" +DG.ARRIVED=20060904123530.000000 DATE=20060904123512.583043 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000007:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; AllowZippedISB = true; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; LB_sequence_code = \"UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; InputSandboxPath = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/input\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060904123530.000000 DATE=20060904123513.373970 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.ENQUEUED.JOB="[ Requirements = other.GlueCEInfoHostname == \"skurut17.cesnet.cz\"; edg_jobid = \"https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A\"; nodes = [ slicery = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; converty = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertx = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; softmean = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice2 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align3 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; reslice1 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; align4 = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; convertz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ]; slicerz = [ description = [ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]; node_type = \"edg_jdl\" ] ]; MyProxyServer = \"skurut3.cesnet.cz\"; dependencies = { { { align1 },{ reslice1 } },{ { align2 },{ reslice2 } },{ { align3 },{ reslice3 } },{ { align4 },{ reslice4 } },{ { reslice1,reslice2,reslice3,reslice4 },{ softmean } },{ { softmean },{ slicerx } },{ { softmean },{ slicery } },{ { softmean },{ slicerz } },{ { slicerx },{ convertx } },{ { slicery },{ converty } },{ { slicerz },{ convertz } } }; AllowZippedISB = true; CertificateSubject = \"/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac\"; X509UserProxy = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/user.proxy\"; VOMS_FQAN = \"/voce/Role=NULL/Capability=NULL\"; InputSandboxPath = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/input\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; VirtualOrganisation = \"voce\"; type = \"dag\"; node_type = \"edg_jdl\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A\"; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" }; LBAddress = \"skurut1.cesnet.cz:9000\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="" +DG.ARRIVED=20060904123531.000000 DATE=20060904123514.176210 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/workload_manager/input.fl" DG.DEQUEUED.LOCAL_JOBID="" +DG.ARRIVED=20060904123531.000000 DATE=20060904123514.833356 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000002:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="dagman" +DG.ARRIVED=20060904123532.000000 DATE=20060904123515.201702 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="" DG.ENQUEUED.RESULT="START" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060904123533.000000 DATE=20060904123515.548906 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="27876" DG.EVNT="EnQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ENQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.ENQUEUED.JOB="[ Arguments = [ JobAd = [ edg_jobid = \"https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A\"; Arguments = \"-f -l /var/glite/jobcontrol/submit/ww/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/ww/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag_description.con -Rescue /var/glite/jobcontrol/submit/ww/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log\"; environment = \"_CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\"; ce_id = \"dagman\"; Output = \"/var/glite/jobcontrol/condorio/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag.lib.out\"; Executable = \"/opt/condor-6.7.10/bin/condor_dagman\"; Getenv = true; X509UserProxy = \"/var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/user.proxy\"; Error_ = \"/var/glite/jobcontrol/condorio/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag.lib.out\"; LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000\"; Type = \"dag\"; Universe = \"scheduler\"; Remove_Kill_Sig = \"SIGUSR1\" ] ]; Command = \"Submit\"; Source = 2; Protocol = \"1.0.0\" ]" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="unavailable" +DG.ARRIVED=20060904123534.000000 DATE=20060904123516.929525 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="DeQueued" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DEQUEUED.QUEUE="/var/glite/jobcontrol/queue.fl" DG.DEQUEUED.LOCAL_JOBID="unavailable" +DG.ARRIVED=20060904123534.000000 DATE=20060904123517.221811 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000002:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="unavailable" DG.TRANSFER.RESULT="START" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904123535.000000 DATE=20060904123519.223355 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.TRANSFER.DESTINATION="LogMonitor" DG.TRANSFER.DEST_HOST="localhost" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="+edg_jobid = \"https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A\"\nArguments = -f -l /var/glite/jobcontrol/submit/ww/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A -NoEventChecks -Debug 0 -Lockfile dag_description.con.lock -Dag /var/glite/jobcontrol/submit/ww/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag_description.con -Rescue /var/glite/jobcontrol/submit/ww/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag_description.con.rescue -maxpre 10 -Condorlog /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log\nenvironment = _CONDOR_DAGMAN_LOG=/var/glite/jobcontrol/condorio/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag.dagman.out;_CONDOR_MAX_DAGMAN_LOG=0\n+ce_id = \"dagman\"\nOutput = /var/glite/jobcontrol/condorio/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag.lib.out\nSubmit_Event_Notes = DAG job: (https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A) (UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000)\nExecutable = /opt/condor-6.7.10/bin/condor_dagman\nGetenv = True\nX509UserProxy = /var/glite/SandboxDir/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/user.proxy\nerror = /var/glite/jobcontrol/condorio/ww/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A/dag.lib.out\n+LB_sequence_code = \"UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000\"\n+Type = \"dag\"\nUniverse = scheduler\nRemove_Kill_Sig = SIGUSR1\nLog = /var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log\n+CondorSubmitFile = \"/var/glite/jobcontrol/submit/ww/Condor.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.submit\"\nQueue 1\n" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="unavailable" DG.TRANSFER.DEST_JOBID="9799" +DG.ARRIVED=20060904123537.000000 DATE=20060904123521.075346 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000001:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9799" +DG.ARRIVED=20060904123537.000000 DATE=20060904123527.445256 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000003:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.RUNNING.NODE="<195.113.219.12:20194>" +DG.ARRIVED=20060904130437.000000 DATE=20060904130437.460808 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.SEQCODE="UI=000000:NS=0000000008:WM=000004:BH=0000000000:JSS=000003:LM=000005:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123448.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123458.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123524.000000 DATE=20060904123501.238089 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/02/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f02ZaAADKyebzggYPp4M9tA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904125334.000000 DATE=20060904125333.163726 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6776" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904125353.000000 DATE=20060904125352.932710 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6776" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904125353.000000 DATE=20060904125353.248432 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6776" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904125358.000000 DATE=20060904125357.859716 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9811" +DG.ARRIVED=20060904125417.000000 DATE=20060904125417.034574 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904125727.000000 DATE=20060904125537.148436 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904125733.000000 DATE=20060904125612.795856 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060904125733.000000 DATE=20060904125613.110294 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060904125733.000000 DATE=20060904125613.413990 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060904125734.000000 DATE=20060904125613.723824 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060904125734.000000 DATE=20060904125614.005832 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-x.pgm" +DG.ARRIVED=20060904125734.000000 DATE=20060904125614.311644 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904130227.000000 DATE=20060904125629.915312 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904130228.000000 DATE=20060904125848.915608 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904130228.000000 DATE=20060904125849.381556 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/02ZaAADKyebzggYPp4M9tA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123449.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123500.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123518.000000 DATE=20060904123459.949634 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3\"; OutputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/9d/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2f9d0XMwfPuefR9woAFkDplQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904124230.000000 DATE=20060904124151.623318 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3715" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124235.000000 DATE=20060904124157.630058 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3715" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904124235.000000 DATE=20060904124157.905000 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3715" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124236.000000 DATE=20060904124205.716011 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9805" +DG.ARRIVED=20060904124236.000000 DATE=20060904124218.664148 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904124527.000000 DATE=20060904124339.598715 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904124533.000000 DATE=20060904124428.239587 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060904124534.000000 DATE=20060904124428.483885 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060904124535.000000 DATE=20060904124428.839644 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.warp" +DG.ARRIVED=20060904124535.000000 DATE=20060904124429.216990 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.img" +DG.ARRIVED=20060904124536.000000 DATE=20060904124429.508146 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.hdr" +DG.ARRIVED=20060904124536.000000 DATE=20060904124429.795840 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060904124537.000000 DATE=20060904124430.086007 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060904124537.000000 DATE=20060904124430.394089 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124745.000000 DATE=20060904124545.021008 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904124746.000000 DATE=20060904124704.085401 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124747.000000 DATE=20060904124704.374370 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/9d0XMwfPuefR9woAFkDplQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123453.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123503.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123504.000000 DATE=20060904123456.984076 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/BU/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fBU2jWJ2FaL9rAEeR1Lea3A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904125334.000000 DATE=20060904125333.211179 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6778" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904125341.000000 DATE=20060904125341.316938 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6778" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904125342.000000 DATE=20060904125341.546981 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6778" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904125345.000000 DATE=20060904125345.309055 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9809" +DG.ARRIVED=20060904125404.000000 DATE=20060904125404.243987 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904125526.000000 DATE=20060904125526.067376 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060904125726.000000 DATE=20060904125629.508575 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904125727.000000 DATE=20060904125557.751347 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060904125728.000000 DATE=20060904125558.031007 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060904125728.000000 DATE=20060904125558.283524 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060904125729.000000 DATE=20060904125558.578001 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060904125729.000000 DATE=20060904125558.857358 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-z.pgm" +DG.ARRIVED=20060904125729.000000 DATE=20060904125559.160909 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904130330.000000 DATE=20060904125856.196182 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904130331.000000 DATE=20060904125856.472984 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/BU2jWJ2FaL9rAEeR1Lea3A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123447.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123457.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123525.000000 DATE=20060904123501.611573 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"slicer.sh\"; X509UserProxy = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/MB/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fMB994jT9V2PGcyK9dyjgcA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904125334.000000 DATE=20060904125333.160793 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6777" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904125346.000000 DATE=20060904125346.370666 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6777" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904125347.000000 DATE=20060904125346.656307 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="6777" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904125351.000000 DATE=20060904125351.589048 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9810" +DG.ARRIVED=20060904125411.000000 DATE=20060904125410.634367 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904125727.000000 DATE=20060904125536.363207 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904125730.000000 DATE=20060904125611.196999 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="4" +DG.ARRIVED=20060904125730.000000 DATE=20060904125611.527471 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="slicer" +DG.ARRIVED=20060904125731.000000 DATE=20060904125611.798787 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060904125731.000000 DATE=20060904125612.090269 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060904125732.000000 DATE=20060904125612.391118 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-y.pgm" +DG.ARRIVED=20060904125732.000000 DATE=20060904125612.718979 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904130227.000000 DATE=20060904125630.198449 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904130229.000000 DATE=20060904125855.759058 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904130330.000000 DATE=20060904125855.981210 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/MB994jT9V2PGcyK9dyjgcA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123448.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123458.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123524.000000 DATE=20060904123500.920995 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4\"; OutputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/Rg/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fRglBtUz0IzwSeM32KLnHPg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904124230.000000 DATE=20060904124146.834417 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3685" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124233.000000 DATE=20060904124152.669043 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3685" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904124234.000000 DATE=20060904124152.955570 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3685" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124235.000000 DATE=20060904124159.439059 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9804" +DG.ARRIVED=20060904124236.000000 DATE=20060904124212.033705 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904124326.000000 DATE=20060904124325.692965 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060904124526.000000 DATE=20060904124444.418383 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904124527.000000 DATE=20060904124408.101920 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060904124528.000000 DATE=20060904124408.544697 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060904124528.000000 DATE=20060904124408.826657 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.warp" +DG.ARRIVED=20060904124529.000000 DATE=20060904124409.141281 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.img" +DG.ARRIVED=20060904124529.000000 DATE=20060904124409.420485 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.hdr" +DG.ARRIVED=20060904124529.000000 DATE=20060904124409.745107 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060904124530.000000 DATE=20060904124410.291018 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060904124530.000000 DATE=20060904124410.646628 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124747.000000 DATE=20060904124711.349331 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124748.000000 DATE=20060904124711.647250 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/RglBtUz0IzwSeM32KLnHPg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123450.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123500.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123516.000000 DATE=20060904123459.627092 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla x\"; OutputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/hv/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fhvkpZCsRsiqrxs5K_5fbo7Ew\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904130024.000000 DATE=20060904130023.859168 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut31.cesnet.cz" +DG.ARRIVED=20060904130225.000000 DATE=20060904130040.564712 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060904130226.000000 DATE=20060904130040.845852 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060904130226.000000 DATE=20060904130041.147216 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-x.pgm" +DG.ARRIVED=20060904130226.000000 DATE=20060904130041.479142 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-x.gif" +DG.ARRIVED=20060904130229.000000 DATE=20060904125850.551826 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8116" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904130332.000000 DATE=20060904125909.911659 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8116" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904130332.000000 DATE=20060904125910.282364 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8116" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904130334.000000 DATE=20060904125920.803371 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9812" +DG.ARRIVED=20060904130335.000000 DATE=20060904125933.878107 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904130337.000000 DATE=20060904130204.972748 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904130431.000000 DATE=20060904130430.964594 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904130431.000000 DATE=20060904130431.206276 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904130527.000000 DATE=20060904130041.829279 HOST="skurut31.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/hvkpZCsRsiqrxs5K_bo7Ew" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123449.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123459.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123519.000000 DATE=20060904123500.248507 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/lM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2flMTEhrxDUgNhUpPUCvKB1A\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904123536.000000 DATE=20060904123519.974835 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2035" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123548.000000 DATE=20060904123548.120811 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2035" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904123548.000000 DATE=20060904123548.372106 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2035" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123554.000000 DATE=20060904123553.632355 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9802" +DG.ARRIVED=20060904123613.000000 DATE=20060904123612.818223 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904123927.000000 DATE=20060904123925.694717 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904123928.000000 DATE=20060904123737.185164 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut27.cesnet.cz" +DG.ARRIVED=20060904123937.000000 DATE=20060904123817.733509 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060904123937.000000 DATE=20060904123818.139436 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060904123938.000000 DATE=20060904123818.489929 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.img" +DG.ARRIVED=20060904123938.000000 DATE=20060904123818.794738 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060904123939.000000 DATE=20060904123819.085044 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.warp" +DG.ARRIVED=20060904123940.000000 DATE=20060904123819.437875 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060904123940.000000 DATE=20060904123819.770658 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060904123941.000000 DATE=20060904123820.066379 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060904123943.000000 DATE=20060904123820.569449 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124232.000000 DATE=20060904124152.400873 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124232.000000 DATE=20060904124152.636736 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/lMTEhrxDUgNhUpPUCvKB1A" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123451.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123502.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123510.000000 DATE=20060904123458.348951 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/q8/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fq8Ifnr5i2sZ-aKDiz28Pnw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904123536.000000 DATE=20060904123519.990410 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2037" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123539.000000 DATE=20060904123538.507056 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2037" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904123539.000000 DATE=20060904123538.937421 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2037" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123547.000000 DATE=20060904123547.392245 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9801" +DG.ARRIVED=20060904123600.000000 DATE=20060904123600.247693 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904123726.000000 DATE=20060904123726.338115 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904123931.000000 DATE=20060904123811.652619 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060904123932.000000 DATE=20060904123811.971176 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060904123933.000000 DATE=20060904123812.257359 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.img" +DG.ARRIVED=20060904123934.000000 DATE=20060904123812.552032 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060904123934.000000 DATE=20060904123813.002561 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3.warp" +DG.ARRIVED=20060904123935.000000 DATE=20060904123813.360738 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060904123935.000000 DATE=20060904123813.689388 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060904123936.000000 DATE=20060904123813.989102 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060904123936.000000 DATE=20060904123814.297488 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124227.000000 DATE=20060904123926.213172 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904124230.000000 DATE=20060904124151.632949 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124231.000000 DATE=20060904124151.984186 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/q8Ifnr5i2sZ-aKDiz28Pnw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123451.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123501.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123513.000000 DATE=20060904123458.952830 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/s4/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fs47ihjBHQXqPkkNwA2iazg\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904123536.000000 DATE=20060904123519.979789 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2036" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123604.000000 DATE=20060904123604.345472 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2036" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904123604.000000 DATE=20060904123604.582182 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2036" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123606.000000 DATE=20060904123606.533255 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9803" +DG.ARRIVED=20060904123625.000000 DATE=20060904123625.048807 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904123928.000000 DATE=20060904123737.944986 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut27.cesnet.cz" +DG.ARRIVED=20060904123939.000000 DATE=20060904123819.138942 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060904123939.000000 DATE=20060904123819.437384 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060904123941.000000 DATE=20060904123819.771294 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.img" +DG.ARRIVED=20060904123942.000000 DATE=20060904123820.066749 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060904123942.000000 DATE=20060904123820.606438 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.warp" +DG.ARRIVED=20060904123943.000000 DATE=20060904123820.926343 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060904123944.000000 DATE=20060904123821.237386 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060904123944.000000 DATE=20060904123821.519909 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060904123945.000000 DATE=20060904123821.860664 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124228.000000 DATE=20060904124026.577250 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904124233.000000 DATE=20060904124152.966935 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124234.000000 DATE=20060904124153.239529 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/s47ihjBHQXqPkkNwA2iazg" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123453.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123503.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123506.000000 DATE=20060904123457.457283 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla z\"; OutputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/uX/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fuXYClPwMnO_5fEywCGlpM2QA\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904130225.000000 DATE=20060904130031.310577 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904130332.000000 DATE=20060904125900.993428 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8156" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904130333.000000 DATE=20060904125915.407974 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8156" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904130333.000000 DATE=20060904125915.710338 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8156" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904130335.000000 DATE=20060904125927.183646 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9813" +DG.ARRIVED=20060904130336.000000 DATE=20060904125940.128314 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904130338.000000 DATE=20060904130205.215225 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904130430.000000 DATE=20060904130430.520092 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904130431.000000 DATE=20060904130430.734089 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904130528.000000 DATE=20060904130049.579728 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060904130528.000000 DATE=20060904130049.918749 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060904130528.000000 DATE=20060904130050.251367 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-z.pgm" +DG.ARRIVED=20060904130529.000000 DATE=20060904130050.547723 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-z.gif" +DG.ARRIVED=20060904130529.000000 DATE=20060904130050.944849 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/uXYClPwMnO_EywCGlpM2QA" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123448.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123459.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123521.000000 DATE=20060904123500.557822 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla y\"; OutputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"convert.sh\"; X509UserProxy = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/vl/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fvlTIc3M5tknmwUQLOflh0g\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904130225.000000 DATE=20060904130040.826122 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904130331.000000 DATE=20060904125900.979106 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8155" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904130333.000000 DATE=20060904125920.662983 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8155" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904130335.000000 DATE=20060904125920.921183 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="8155" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904130335.000000 DATE=20060904125927.564957 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9814" +DG.ARRIVED=20060904130337.000000 DATE=20060904125946.378542 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904130338.000000 DATE=20060904130205.481291 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904130418.000000 DATE=20060904130417.990222 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904130418.000000 DATE=20060904130418.221470 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904130530.000000 DATE=20060904130058.544287 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="5" +DG.ARRIVED=20060904130530.000000 DATE=20060904130058.912532 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="convert" +DG.ARRIVED=20060904130530.000000 DATE=20060904130059.214055 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-y.pgm" +DG.ARRIVED=20060904130531.000000 DATE=20060904130059.518753 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla-y.gif" +DG.ARRIVED=20060904130531.000000 DATE=20060904130059.833410 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/vlTIc3M5tknmwUQLOflh0g" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123450.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123501.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123515.000000 DATE=20060904123459.301681 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla\"; OutputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"softmean.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wG/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwGMnTvCILtiSTi7ZOQwfTQ\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904124749.000000 DATE=20060904124717.149828 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="5179" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124750.000000 DATE=20060904124725.805561 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="5179" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904124751.000000 DATE=20060904124726.077297 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="5179" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124751.000000 DATE=20060904124731.353051 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9808" +DG.ARRIVED=20060904124751.000000 DATE=20060904124743.657694 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904124923.000000 DATE=20060904124923.178082 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904125124.000000 DATE=20060904125114.332832 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904125124.000000 DATE=20060904125031.850483 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="3" +DG.ARRIVED=20060904125124.000000 DATE=20060904125032.131727 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="softmean" +DG.ARRIVED=20060904125125.000000 DATE=20060904125032.425280 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060904125125.000000 DATE=20060904125032.950542 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.hdr" +DG.ARRIVED=20060904125126.000000 DATE=20060904125033.261428 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060904125126.000000 DATE=20060904125033.502973 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.hdr" +DG.ARRIVED=20060904125126.000000 DATE=20060904125033.817348 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.img" +DG.ARRIVED=20060904125127.000000 DATE=20060904125034.084689 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy3-resliced.hdr" +DG.ARRIVED=20060904125127.000000 DATE=20060904125034.388489 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000017" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.img" +DG.ARRIVED=20060904125128.000000 DATE=20060904125034.692513 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000019" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4-resliced.hdr" +DG.ARRIVED=20060904125128.000000 DATE=20060904125035.023361 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000021" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.img" +DG.ARRIVED=20060904125129.000000 DATE=20060904125035.334638 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000023" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/blabla.hdr" +DG.ARRIVED=20060904125129.000000 DATE=20060904125035.673770 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904125333.000000 DATE=20060904125332.791857 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904125333.000000 DATE=20060904125333.028953 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/wGMnTvCILtiSTi7ZOQwfTQ" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123452.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123502.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123509.000000 DATE=20060904123458.072830 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1\"; OutputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/wd/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwdWQHL0-RXkd3VeNcSrTaw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904124231.000000 DATE=20060904124151.663646 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3716" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124237.000000 DATE=20060904124223.093936 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3716" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904124237.000000 DATE=20060904124223.399697 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3716" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124238.000000 DATE=20060904124231.112363 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9806" +DG.ARRIVED=20060904124244.000000 DATE=20060904124243.694931 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904124526.000000 DATE=20060904124444.662666 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904124527.000000 DATE=20060904124337.266357 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904124531.000000 DATE=20060904124426.706175 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060904124531.000000 DATE=20060904124427.062794 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060904124532.000000 DATE=20060904124427.387340 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.warp" +DG.ARRIVED=20060904124532.000000 DATE=20060904124427.684461 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.img" +DG.ARRIVED=20060904124532.000000 DATE=20060904124428.149760 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1.hdr" +DG.ARRIVED=20060904124533.000000 DATE=20060904124428.448924 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060904124534.000000 DATE=20060904124428.758926 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy1-resliced.img" +DG.ARRIVED=20060904124535.000000 DATE=20060904124429.186278 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124749.000000 DATE=20060904124718.692608 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124750.000000 DATE=20060904124719.124737 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/wdWQHL0-RXkd3VeNcSrTaw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123451.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123501.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123512.000000 DATE=20060904123458.663149 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2\"; OutputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"reslice.sh\"; X509UserProxy = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/xw/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fxwIsN2JgGfsRuvYwh0QXsw\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904124231.000000 DATE=20060904124151.625037 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3717" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124237.000000 DATE=20060904124228.091516 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3717" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904124238.000000 DATE=20060904124228.325095 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="3717" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904124238.000000 DATE=20060904124237.410070 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9807" +DG.ARRIVED=20060904124250.000000 DATE=20060904124249.935054 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904124527.000000 DATE=20060904124347.461870 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut27.cesnet.cz" +DG.ARRIVED=20060904124538.000000 DATE=20060904124433.331337 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="2" +DG.ARRIVED=20060904124538.000000 DATE=20060904124433.670790 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="reslice" +DG.ARRIVED=20060904124539.000000 DATE=20060904124433.974650 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.warp" +DG.ARRIVED=20060904124539.000000 DATE=20060904124434.329198 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.img" +DG.ARRIVED=20060904124539.000000 DATE=20060904124434.690356 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2.hdr" +DG.ARRIVED=20060904124540.000000 DATE=20060904124434.997368 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060904124540.000000 DATE=20060904124435.272736 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy2-resliced.img" +DG.ARRIVED=20060904124541.000000 DATE=20060904124435.592177 HOST="skurut27.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124746.000000 DATE=20060904124545.595704 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904124748.000000 DATE=20060904124711.938604 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124749.000000 DATE=20060904124712.184016 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/xwIsN2JgGfsRuvYwh0QXsw" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904123452.000000 DATE=20060904123447.684688 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123503.000000 DATE=20060904123457.236278 HOST="skurut1.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="L&B server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="" +DG.ARRIVED=20060904123507.000000 DATE=20060904123457.782669 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.EVNT="RegJob" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="[ requirements = ( other.GlueCEInfoHostname == \"skurut17.cesnet.cz\" ) && ( other.GlueCEStateStatus == \"Production\" ); edg_jobid = \"https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w\"; arguments = \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4 gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference\"; OutputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/output\"; MyProxyServer = \"skurut3.cesnet.cz\"; JobType = \"normal\"; executable = \"align.sh\"; X509UserProxy = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/user.proxy\"; InputSandboxPath = \"/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w/input\"; VirtualOrganisation = \"voce\"; rank = -other.GlueCEStateEstimatedResponseTime; Type = \"job\"; WMPInputSandboxBaseURI = \"gsiftp://skurut2.cesnet.cz:2811/var/glite/SandboxDir/yM/https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fyM3sz8v6WCIPgi5-0m8L4w\"; DefaultRank = -other.GlueCEStateEstimatedResponseTime; InputSandbox = { \"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert.sh\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/align_warp\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/scanheader\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reslice\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/softmean\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/slicer\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/convert\",\"gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/delegates.xml\" } ]" DG.REGJOB.NS="https://195.113.219.12:7443/glite_wms_wmproxy_server" DG.REGJOB.PARENT="https://skurut1.cesnet.cz:9000/wwBtp1l0inuUFD7-Y-8y9A" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="5vY8fc90h6jpb_tkuIl6yg" +DG.ARRIVED=20060904123535.000000 DATE=20060904123519.985185 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2038" DG.EVNT="HelperCall" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000001:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERCALL.HELPER_NAME="dag_node_planner" DG.HELPERCALL.HELPER_PARAMS="" DG.HELPERCALL.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123538.000000 DATE=20060904123532.411689 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2038" DG.EVNT="Match" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000002:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.MATCH.DEST_ID="skurut17.cesnet.cz:2119/jobmanager-lcgpbs-voce" +DG.ARRIVED=20060904123538.000000 DATE=20060904123533.023074 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="BigHelper" DG.SRC_INSTANCE="2038" DG.EVNT="HelperReturn" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac/CN=proxy/CN=proxy" DG.HELPERRETURN.HELPER_NAME="dag_node_planner" DG.HELPERRETURN.RETVAL="0" DG.HELPERRETURN.SRC_ROLE="CALLED" +DG.ARRIVED=20060904123541.000000 DATE=20060904123541.021783 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Accepted" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000001:LRMS=000000:APP=000000" DG.USER="" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="localhost" DG.ACCEPTED.FROM_INSTANCE="unavailable" DG.ACCEPTED.LOCAL_JOBID="9800" +DG.ARRIVED=20060904123554.000000 DATE=20060904123553.942529 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Transfer" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000003:LRMS=000000:APP=000000" DG.USER="" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="skurut17.cesnet.cz:2119/jobmanager-lcgpbs" DG.TRANSFER.DEST_INSTANCE="/var/glite/logmonitor/CondorG.log/dag.https_3a_2f_2fskurut1.cesnet.cz_3a9000_2fwwBtp1l0inuUFD7-Y-8y9A.log" DG.TRANSFER.JOB="(queue=voce)(jobtype=single)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="Job successfully submitted to Globus" DG.TRANSFER.DEST_JOBID="unavailable" +DG.ARRIVED=20060904123927.000000 DATE=20060904123925.966158 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000005:LRMS=000000:APP=000000" DG.USER="" DG.RUNNING.NODE="skurut17.cesnet.cz" +DG.ARRIVED=20060904123927.000000 DATE=20060904123727.005454 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000001:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="skurut28.cesnet.cz" +DG.ARRIVED=20060904123928.000000 DATE=20060904123810.041136 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000001" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_stage" DG.USERTAG.VALUE="1" +DG.ARRIVED=20060904123928.000000 DATE=20060904123810.410476 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000003" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_program" DG.USERTAG.VALUE="align_warp" +DG.ARRIVED=20060904123929.000000 DATE=20060904123810.692037 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000005" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.img" +DG.ARRIVED=20060904123929.000000 DATE=20060904123810.974525 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000007" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_input" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/reference.img" +DG.ARRIVED=20060904123930.000000 DATE=20060904123811.347217 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000009" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_output" DG.USERTAG.VALUE="gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06/anatomy4.warp" +DG.ARRIVED=20060904123930.000000 DATE=20060904123811.654467 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000011" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-m 12" +DG.ARRIVED=20060904123931.000000 DATE=20060904123811.936867 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000013" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_param" DG.USERTAG.VALUE="-q" +DG.ARRIVED=20060904123932.000000 DATE=20060904123812.222233 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000015" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="ipaw_header" DG.USERTAG.VALUE="GLOBAL_MAXIMUM=" +DG.ARRIVED=20060904123933.000000 DATE=20060904123812.531894 HOST="skurut28.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LRMS" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000004:APP=000000" DG.USER="/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="(nil)" DG.DONE.EXIT_CODE="0" +DG.ARRIVED=20060904124228.000000 DATE=20060904124144.992360 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="ReallyRunning" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000007:LRMS=000000:APP=000000" DG.USER="" DG.REALLYRUNNING.WN_SEQ="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000000:LRMS=000003:APP=000000" +DG.ARRIVED=20060904124229.000000 DATE=20060904124145.229389 HOST="skurut2.cesnet.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="unique" DG.EVNT="Done" DG.JOBID="https://skurut1.cesnet.cz:9000/yM3sz8v6WCIPgi5-0m8L4w" DG.SEQCODE="UI=000000:NS=0000000001:WM=000000:BH=0000000003:JSS=000000:LM=000008:LRMS=000000:APP=000000" DG.USER="" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="Job terminated successfully" DG.DONE.EXIT_CODE="0" diff --git a/org.glite.jp/examples/pch06/pch06.jdl-template b/org.glite.jp/examples/pch06/pch06.jdl-template new file mode 100644 index 0000000..9390655 --- /dev/null +++ b/org.glite.jp/examples/pch06/pch06.jdl-template @@ -0,0 +1,108 @@ +[ + +type = "dag"; + +Requirements = other.GlueCEInfoHostname=="skurut17.cesnet.cz"; +LBAddress = "skurut1.cesnet.cz:9000"; + +InputSandbox = { + "SANDBOX/align.sh", + "SANDBOX/reslice.sh", + "SANDBOX/softmean.sh", + "SANDBOX/slicer.sh", + "SANDBOX/convert.sh", + "SANDBOX/align_warp", + "SANDBOX/scanheader", + "SANDBOX/reslice", + "SANDBOX/softmean", + "SANDBOX/slicer", + "SANDBOX/convert", + "SANDBOX/delegates.xml" +}; + +nodes = [ + align1 = [ description = [ + executable = "align.sh"; + arguments = "BASE1 REFERENCE"; + ] ]; + align2 = [ description = [ + executable = "align.sh"; + arguments = "BASE2 REFERENCE"; + ] ]; + align3 = [ description = [ + executable = "align.sh"; + arguments = "BASE3 REFERENCE"; + ] ]; + align4 = [ description = [ + executable = "align.sh"; + arguments = "BASE4 REFERENCE"; + ] ]; + + + reslice1 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE1"; + ] ]; + reslice2 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE2"; + ] ]; + reslice3 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE3"; + ] ]; + reslice4 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE4"; + ] ]; + + softmean = [ description = [ + executable = "softmean.sh"; + arguments = "BASE1 BASE2 BASE3 BASE4 ATLAS"; + ] ]; + + slicerx = [ description = [ + executable = "slicer.sh"; + arguments = "ATLAS x"; + ] ]; + slicery = [ description = [ + executable = "slicer.sh"; + arguments = "ATLAS y"; + ] ]; + slicerz = [ description = [ + executable = "slicer.sh"; + arguments = "ATLAS z"; + ] ]; + + convertx = [ description = [ + executable = "convert.sh"; + arguments = "ATLAS x"; + ] ]; + converty = [ description = [ + executable = "convert.sh"; + arguments = "ATLAS y"; + ] ]; + convertz = [ description = [ + executable = "convert.sh"; + arguments = "ATLAS z"; + ] ]; + +]; + + dependencies = { + { align1, reslice1 }, + { align2, reslice2 }, + { align3, reslice3 }, + { align4, reslice4 }, + { { reslice1, reslice2, reslice3, reslice4 }, softmean }, + { softmean, slicerx }, + { softmean, slicery }, + { softmean, slicerz }, + { slicerx, convertx }, + { slicery, converty }, + { slicerz, convertz } + }; + + + +]; diff --git a/org.glite.jp/examples/pch06/pch06.jdl-template2 b/org.glite.jp/examples/pch06/pch06.jdl-template2 new file mode 100644 index 0000000..d084313 --- /dev/null +++ b/org.glite.jp/examples/pch06/pch06.jdl-template2 @@ -0,0 +1,127 @@ +[ + +type = "dag"; + +Requirements = other.GlueCEInfoHostname=="skurut17.cesnet.cz"; +LBAddress = "skurut1.cesnet.cz:9000"; + +InputSandbox = { + "SANDBOX/align.sh", + "SANDBOX/reslice.sh", + "SANDBOX/softmean.sh", + "SANDBOX/slicer.sh", + "SANDBOX/pgmtoppm.sh", + "SANDBOX/pnmtojpeg.sh", + "SANDBOX/align_warp", + "SANDBOX/scanheader", + "SANDBOX/reslice", + "SANDBOX/softmean", + "SANDBOX/slicer", + "SANDBOX/pgmtoppm", + "SANDBOX/pnmtojpeg", + "SANDBOX/delegates.xml" +}; + +nodes = [ + align1 = [ description = [ + executable = "align.sh"; + arguments = "BASE1 REFERENCE"; + ] ]; + align2 = [ description = [ + executable = "align.sh"; + arguments = "BASE2 REFERENCE"; + ] ]; + align3 = [ description = [ + executable = "align.sh"; + arguments = "BASE3 REFERENCE"; + ] ]; + align4 = [ description = [ + executable = "align.sh"; + arguments = "BASE4 REFERENCE"; + ] ]; + + + reslice1 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE1"; + ] ]; + reslice2 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE2"; + ] ]; + reslice3 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE3"; + ] ]; + reslice4 = [ description = [ + executable = "reslice.sh"; + arguments = "BASE4"; + ] ]; + + softmean = [ description = [ + executable = "softmean.sh"; + arguments = "BASE1 BASE2 BASE3 BASE4 ATLAS"; + ] ]; + + slicerx = [ description = [ + executable = "slicer.sh"; + arguments = "ATLAS x"; + ] ]; + slicery = [ description = [ + executable = "slicer.sh"; + arguments = "ATLAS y"; + ] ]; + slicerz = [ description = [ + executable = "slicer.sh"; + arguments = "ATLAS z"; + ] ]; + + pgmtoppmx = [ description = [ + executable = "pgmtoppm.sh"; + arguments = "ATLAS x"; + ] ]; + pgmtoppmy = [ description = [ + executable = "pgmtoppm.sh"; + arguments = "ATLAS y"; + ] ]; + pgmtoppmz = [ description = [ + executable = "pgmtoppm.sh"; + arguments = "ATLAS z"; + ] ]; + + pnmtojpegx = [ description = [ + executable = "pnmtojpeg.sh"; + arguments = "ATLAS x"; + ] ]; + pnmtojpegy = [ description = [ + executable = "pnmtojpeg.sh"; + arguments = "ATLAS y"; + ] ]; + pnmtojpegz = [ description = [ + executable = "pnmtojpeg.sh"; + arguments = "ATLAS z"; + ] ]; + +]; + + dependencies = { + { align1, reslice1 }, + { align2, reslice2 }, + { align3, reslice3 }, + { align4, reslice4 }, + { { reslice1, reslice2, reslice3, reslice4 }, softmean }, + { softmean, slicerx }, + { softmean, slicery }, + { softmean, slicerz }, + { slicerx, pgmtoppmx }, + { slicery, pgmtoppmy }, + { slicerz, pgmtoppmz }, + { pgmtoppmx, pnmtojpegx }, + { pgmtoppmy, pnmtojpegy }, + { pgmtoppmz, pnmtojpegz } + + }; + + + +]; diff --git a/org.glite.jp/examples/pch06/pch06.runme b/org.glite.jp/examples/pch06/pch06.runme new file mode 100644 index 0000000..de3d0ba --- /dev/null +++ b/org.glite.jp/examples/pch06/pch06.runme @@ -0,0 +1,15 @@ +#!/bin/sh + +sandbox='gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06' + +if [ -z "$6" ]; then + echo usage: $0 reference base1 base2 base3 base4 atlas + echo " all args are URLs without suffix" + exit 1 +fi + +sed "s|REFERENCE|$1|; s|BASE1|$2|; s|BASE2|$3|; s|BASE3|$4|; s|BASE4|$5|; s|ATLAS|$6|; s|SANDBOX|$sandbox|" pch06.jdl-template >pch06.jdl + +# glite-wms-job-submit -a pch06.jdl + + diff --git a/org.glite.jp/examples/pch06/pch06.runme2 b/org.glite.jp/examples/pch06/pch06.runme2 new file mode 100644 index 0000000..2279144 --- /dev/null +++ b/org.glite.jp/examples/pch06/pch06.runme2 @@ -0,0 +1,15 @@ +#!/bin/sh + +sandbox='gsiftp://umbar.ics.muni.cz:1414/home/mulac/pch06' + +if [ -z "$6" ]; then + echo usage: $0 reference base1 base2 base3 base4 atlas + echo " all args are URLs without suffix" + exit 1 +fi + +sed "s|REFERENCE|$1|; s|BASE1|$2|; s|BASE2|$3|; s|BASE3|$4|; s|BASE4|$5|; s|ATLAS|$6|; s|SANDBOX|$sandbox|" pch06.jdl-template2 >pch06-2.jdl + +# glite-wms-job-submit -a pch06-2.jdl + + diff --git a/org.glite.jp/examples/pch06/pgmtoppm b/org.glite.jp/examples/pch06/pgmtoppm new file mode 100644 index 0000000000000000000000000000000000000000..052c333e3f0aa627b3ddbda6c3aed59218f6484a GIT binary patch literal 4964 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 Ncpq>>QUIr(?Vm08{V@Ol literal 0 HcmV?d00001 diff --git a/org.glite.jp/examples/pch06/pgmtoppm.sh b/org.glite.jp/examples/pch06/pgmtoppm.sh new file mode 100644 index 0000000..7353ff3 --- /dev/null +++ b/org.glite.jp/examples/pch06/pgmtoppm.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +log_event() #1 - attr.name #2 attr.value +{ + GLITE_WMS_SEQUENCE_CODE=`$lb_logevent\ + --jobid="$GLITE_WMS_JOBID"\ + --source="Application"\ + --sequence="$GLITE_WMS_SEQUENCE_CODE"\ + --event="UserTag"\ + --node=$host\ + --name="$1"\ + --value="$2"\ + || echo $GLITE_WMS_SEQUENCE_CODE` +} + +init_log_event() +{ + lb_logevent=${GLITE_WMS_LOCATION}/bin/glite-lb-logevent + if [ ! -x "$lb_logevent" ]; then + lb_logevent="${EDG_WL_LOCATION}/bin/edg-wl-logev" + fi + host=`hostname -f` +} + + +set -ex + +hostname -f +date +echo $0 $* + +globus-url-copy $1-$2.pgm file://$PWD/atlas.pgm + +chmod +x pgmtoppm +./pgmtoppm rgb:ffff/00/00 atlas.pgm > atlas.ppm + +globus-url-copy file://$PWD/atlas.ppm $1-$2.ppm + + +# Log LB user_tags +init_log_event +log_event "IPAW_STAGE" "5" +log_event "IPAW_PROGRAM" "pgmtoppm" +log_event "IPAW_INPUT" "$1-$2.pgm" +log_event "IPAW_OUTPUT" "$1-$2.ppm" + diff --git a/org.glite.jp/examples/pch06/pnmtojpeg b/org.glite.jp/examples/pch06/pnmtojpeg new file mode 100644 index 0000000000000000000000000000000000000000..7c1c6fc3af6eb1f838107dbf1449aa61af26c509 GIT binary patch literal 14784 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 F_+NI_Grj-- literal 0 HcmV?d00001 diff --git a/org.glite.jp/examples/pch06/pnmtojpeg.sh b/org.glite.jp/examples/pch06/pnmtojpeg.sh new file mode 100644 index 0000000..5a68c97 --- /dev/null +++ b/org.glite.jp/examples/pch06/pnmtojpeg.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +log_event() #1 - attr.name #2 attr.value +{ + GLITE_WMS_SEQUENCE_CODE=`$lb_logevent\ + --jobid="$GLITE_WMS_JOBID"\ + --source="Application"\ + --sequence="$GLITE_WMS_SEQUENCE_CODE"\ + --event="UserTag"\ + --node=$host\ + --name="$1"\ + --value="$2"\ + || echo $GLITE_WMS_SEQUENCE_CODE` +} + +init_log_event() +{ + lb_logevent=${GLITE_WMS_LOCATION}/bin/glite-lb-logevent + if [ ! -x "$lb_logevent" ]; then + lb_logevent="${EDG_WL_LOCATION}/bin/edg-wl-logev" + fi + host=`hostname -f` +} + + +set -ex + +hostname -f +date +echo $0 $* + +globus-url-copy $1-$2.ppm file://$PWD/atlas.ppm + +chmod +x pnmtojpeg +./pnmtojpeg atlas.ppm >atlas.jpg + + +globus-url-copy file://$PWD/atlas.jpg $1-$2.jpg + + +# Log LB user_tags +init_log_event +log_event "IPAW_STAGE" "6" +log_event "IPAW_PROGRAM" "pnmtojpeg" +log_event "IPAW_INPUT" "$1-$2.ppm" +log_event "IPAW_OUTPUT" "$1-$2.jpg" + diff --git a/org.glite.jp/examples/pch06/reslice b/org.glite.jp/examples/pch06/reslice new file mode 100644 index 0000000000000000000000000000000000000000..e5527aa82c0c0beeab1735db790de3e64865ccaa GIT binary patch literal 385289 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

+;7PbBJs@%d1GPgJEk z_DnplGZEJXKh1B9LK3QH6m=d^YrBWBV;Oz;z;9X7| z;2<%LE_es$M|8nZ^SX4wJ787>$qgh4)CI$-CCv5kscIxc7yPIRm7?f^;j8szbipF? zj_ZOC$?}Kx+13RgO4J4G!apdwV5l}QTr!^05l0scH?-utiX99{51egeFPp8)Sy7wou;+%iG^P`w2~g`@u!TYmZSNgDm{&)xdp zkN%zYzeEl&CgEqq_R;6hbMW(K4S+|fH|b%Kepw-jk9|vY@X@|sQOL3lk_Q6lF_oXH z6b-QRHAFbNfv$lXU`XenQAw}=eTnm#r2mEaf>@TMXn?8Cga21s1Dv4$MSD(0|BJOu z1qg`Uxab=Kw`C#@`vCO6obmr={qM(4MgPl>U5fUSvn_szVzd3KGu!^7{1PU0z_$8G z-0M;O+edG>i#FOHMSBjjPKTG@1}jYgtgQ+D8CC`~!O-W%G{G<;NYw;$A`>*h(C3OK z7zcV9U9dg(5ZAeM!AY86DR}}-Fjhc%P4HoutiL}^@F&5MJ0j5YC>i57G5;D(@DoXz zVATUd`75eln!pk9K@*G}3C%B5z+M>0JqtCle*8C+6Nnjr9{4%ZMxyei>tja#8#Tct z*j9)CgPP#DeDG9t!TyU=b;0k9VOm@lye|49_(8qkP#@F#(+7V`3hh`I-M!9M3!l~r zpVkTgy>-IyNGczBRGUh*k?c<=4AhmX6NcxgRGlz#x^==J?$Yaoq0kboFAhcOjFWW2 zI2cdsgiq^)MaT93t4d}x-J(|`x!ph7bnM=*FmZO#U&8Nn?aC2m3j8!~UQ=9vI=PAbh+?fFFe=%u3b;}+ZFI?@%Ed)KpoXppPhRUch`>|`v!kIa=PBMj_v93 zA|d+DbvM579P>D@S%}wE9U2&bU&BT3z3`j?ZXNfZGNmj^~Q zTploLTI-fHhXNgKf%dv^Bor7GIm5_mYwu`kYmHoPWZgKvE>PFp5em1~b%biep-6L6 zeWc)=(W@)`8!qrOTGIg^jGNNfQDc;il#$f)JfHAuy#Ru%fB8p>0K|ArNV5tvAj< zE)+(3q`t0|Sp)UUn!@elF@c6L{+2*vbKTMaK&@>ZfhD0pG=h>VnmU#RI+le3<5!Lg zjPDGzg#+VPNluoj3$#Sh4rFd@Yi^cTE$Ix@wFa76>XsrABN1q=YY8Fm8RHuo)8|ge zW{hv>Cs%u0q^YB6IVy~{ED43#X4HAona8&VMn%)+?pT58bt-Ra?FcOmg)z_gcbqcI z!l6*wQd*{=EffiG92-K79O$~h^19}xh5)M%x3@LdaR~)l+8RR5coWK`9moC)#Rp-0 z4$e+zb+ zd$-vLXM#}^!L9;oiUb^71GI$gg*7Eu$9db0c8Nu20A1aPP14Y`ys05nyQH(06Vi%} z1awnh*9>G;SKrYVUSvqV#uH|=ksI~~>b+%AVDv4aPs4Ebde6s zd|kLf_V`5+xMe{(d*KKEVP);Iy5`35il%B;G&KO%bf!sLm72C1O=ewfXah#QwL?d7 zMYsuL+#U+IG)35wG0ejS-Q3aC4(yD5w>;GEATTd?(@A8G4a6B)rKx*55*QuB#(|~? zu|OSabuEq9_Q#MAGf$q7h^>(oxV8z4t*$w+vNO=$T-O>J7f=L`L#M5EX+ZFHR@Ri` z7G0%9CnOf_#2GR5c;!0na!IdT$+ljabhtRDiJUT7S(gbo+8RH75;Ab!vL@lYNW`$b}gpF5xlO&=kSW6H)?0f^l8woYr>z;n1zoCcLAr9hjv(+{Aia`vvO- z`z6A%_^#m9LvVxW$Yu>Ccg3HbH0O8v-Er6)JQvz!9QZ{^ai;$TVb8}c|CW0!|3!EY z!(Axrgn~_$pMmMmJT~k;}6G=|B}R|4hmzWXZNp=aR9Cu& z$Tl;gF%lo=a|8Es6iY7L))Kf#PtEa5Ixiy50P0;DpJ?g#8S%nx?Kr$oR3e@|mK68+9gYiOyQgCyoxg~Dz2@x4kG)p6!CrQE9cTI+8Oq?FO++j+|G>inzU zrF;5R`nB>D-o=$c{wDtK$kpR#4S(}zmkzu7oljc+&up>$+YzkKTK;he^AR>896~T2 z(r_Mr$0C#;wBHVXT^P12@5O>ud?Nw1vR~0tb-VVkN-mQJ!Ow zNLxKmF`KK@HYg^q3rrfnq^W}kWT3r?SWNmvwt*BlIvoz7Sz!LaQ*mTM4e0Icq?4k~ z8IW|ZVyQ_O(0&_e7&7C3fE7^BJ;)M^J1OL}orD|sM$l^PBX8ZtB33YZXkF4NTRv@U+kMgqd5$rPcjpvpj! zV~_=P;zdqBIQgT59&_q&F+`_Sg$SE!8?j`6 zmf^2{aO!L2NPGbQocdOfGdiUz6H3;u>^!ByXn9ikRqwBS=U-7C=VEKE$QSk9)otN$ z=eRiY71s3>acH~-2;p4ZQQ}I$t~yb9AkYSiYL}5ONL*$Zjd*LYX8T2<{Y|;MyfYcn zwNQ9v=W#1cEXiSX%B?#2ax(mOxz6L3yBw#b(_4GZ#Zhtc9wXvSAiCY%zuGvqcFyH@ zPW;(jox!W@UYzvipP%^@dKs;WR6Y^ z(9tEBHHs6Y|2n^%an7%d*QL|lQzG*mUx@Lw)L$Dvh&mE_A?EvVOg97DkPegz&meI!dQ@ag{H1{z&buRZ%R_kMiY0tSb3lc< zI)Hp;3uJGg3Yl7DkBf359pNaZ;Z(`@ldG$#1v-pK6P1E8RWS;Won7htVV~l>i8kL> z1jHtoeH7}Mn_sfT$!E!wuGcoH$<8O!?1@z98O~g!AR=wY8EM!c9pH4Vlg`VLZ#naW znTC)b0_}K{XSK*>Okbq&iQ!4fTNLns1?C&+hEA3B(o6~xBv zl4vA+$&#klOO{4kS2eW<#@7doM&UjhfCyW_JVhcH(UbpITv}CI9xSh{y1ur!tgLcY z@%+-tirQdRRb`b?p2EyZ2PYUTR6W0{v|>(eMdke3lFFKyWkI`85^Q!^W%2ye^YAB^;}&U~!47@iwp|SWy}*=?6Hsa$a>mpt9165BCSFE}c_RT$WOB{`K=p zXCZxdDW)r_H8asRR+*eWs~FQXtE{p*rG(T{Q&C=7gPx~!U`|zK&AeJEo%E*CiUq}G zr6slVis#Qwep^Lxd9ZeVWo505ep11T%Cs#B7tST!>TNlR;bDT0lCBa#h<@2hz1YBJyiS1O%hp=l~DCkj)rh994bugGR z5p%J6WSNy>K6F9F_eg2Q?8@4irSq#@>r2u~O3Raz=9UF3=FFcvyEKUIBvnyXT8`?I z601vZa4%}SlLKKkFb}7V-p02Xu>RF|wX(2O9D~f@&(iJML zKqt}xDk`hW(*i2XN){GZ%}WcL7p$tD*Dtgh8;YAd-Rr7rX3s9YE-k2L*6g(D3xc!e zSEe6|bWKP^Fbk_n=euVr5ySKY6%^ACOmR#ptSu?6l2N_BHVqK7TV7gS%~LNK>OvmLARBumCnunfWS|RwB!hIrC#Pzh$R%+X zYkK+}sIatKP(f)nnhi*|(-f3`tJ$wgv)2@oZnG(*pFLv(({37trP(zKNVhi@RF>7? zG`S&I#U+q}2APDJFE5@yYp#v)%9|qKD`EE%quF80+mv zBE_J{$RUqytFMoSLH0Q>02N`Mo0Hw>8K)fLHhQSRpu0DEe5jL}#o3MnWhmk}Iaoe# z{`Iw0m8Ev~@uU_%E$tnh+8n%9&>!|s=>qo~=T(+nUr||JinFq^isw?iS`2KkLN-*I z##ApTshwS1T2@o#u1&B4x(8~4(*bHCUfuk;I6&tDK`UKQT!q7>KPYCitjq-kYMxV3 z%N;bYxC*2N#?}q3m|rRjCte-T>$2c=&Z1dRibFjPtp=j6DFX$HR#pMAr-95WSx{U( zGcBaDysUCgLIYy;;k5!wm~kf&r+vkOU}Co&7z(6;YV*p2#TDtGx`z6Lg2b-D`I9n5 z!O}Uw3TOS*9H zNbX%f_u6#*ioGp);)2)Bnu~MY8QzKn!ai1NPI1t^;FJ=qm|s;~okWW%&5POumM~5w z*OFi&|1hV@&40<}4bDLlwqA94W##<2q%`8ab&kcd;_EAG63I4wU3qc!htuTe+=FbH zl?H^pR(eDFw^Yw97B(jJ{R!_bnN=NJP$rwsVI4Y+Kip$H&wM=r#kJSfmR9TL*7r0*H$=F5O10d!>$B>yU;a^C1n*=SP<6oTja$(ISr{}R=tn9apv-RBL%i88A3}Kpz zI$~YZ>}e}1n}c5T2T6QInprApUfSe(4Jsp7mV&2Cuu|;7>Zjvacdo&TXXjdtFSxmt z^Mg3qrj*oHR+L@u0)W@5D4l(MZF!~p%*0lm7sSC|TU{d(h+qO=SXPD=4Jp9Fxo-5R zWt=`FqPyaX$_2$T>Ud8A!mA2iTLbdCx^~i~ZvGQuNXjYe+oBM@Q%VUVc}UG*>1*rg z8``1}BTk^8>V$b!6@21+)cl@IePT4HnNRp`TVY(ktS)>~bw`##%#Ia}mYlHem^xZ( zKl%J8+4fld@eZH-J6s*Xm?qhl#l^3%Fl+5-YV1Up)ygcUW|6rqcI?9Ag7X-`%Y9$h z(Gdc*$+ZGyN?pB3&S~UBL(!(jCP+gm`;@xoBUuEYkxtm4w7{&mm2l`yZF6T<5y1@* z5b)IQu^P#b_as)?05K~KznelJ>y5c>?d^60Y^ySwv9!Rd9afQ0Jhp~l%1WbiF-R2) z6Q~C8lEg~&RklptQMb^dJ=P9wxAq0Ln-KfJ5UjIhNgGVFX`p;dB(MUOJ}31i)KU!f z%2FCg)9?d^oJ*H=Q0qfAaJcg%Ms$A4Fhi{ev)o8v3H21(lRC6!X|%b{wo;)^$K7If zCQUsk42vGDKUg|MWEPW373<8f<-`tRc!P^NQCR?u(dK5G{}8E4O-1nn(4)l^GP~qx zY2KTFZ*(<@ZUoB#qtYac5C`sre%cH=pbl3Qz>T$bz?vi4+5&SLBCN#az_CXM152UB zZ>K&T7jni0I@_Xw=DPY@kQpjL*Q#{ZV&amfQqx(7=&U`Cu)19)cZNt4aN#5s!ob=a zEo~oo+lUpn!Bhnmz-){1#dbt_MS!*ew#{%q^A@|fBMX83Y*lSneAA{~Te9}qPg}z$ z{lOTut!RD!LxXj$N-bU#!C9~(-k4Ka?!v6pR8-Fk&MJlM6KrU*6x`{nJ?8bqCzw?X zCuS2X8A!@TJr2*Fey4FXICfmyt>a}3#1@{h4|vTKV}9eRC*|H@z0FliP1143Cw0n- z6&JJDvV_I%tj<}1z)+4!BX7kKck3Q@1lNXJ33fTh%rS`rRqbr_rdB90VN48ty{r-L zVO4k88oapTQV~cDk?N%>u4-B%a(}6*r0#=$>WGVPj$_5fhOiyLQy^CC!y=(V7{9^p zQcxrJq&D>;TE?|5#eS7d=`sXEg(>}7+T6ATs2UiksU_MX%fU&iTPaCmdkwS#OqF0( zcA{}|Nt=$}NpfNH%8Dz33rnHQIT_sqIwl(C*d%a^+nR9T5{`jXWaVYIGqfPUJ>RkC|X#MSH#MS)Q6gRPpT~%35eQ6 z_or>!U@tC2EJv^2o&Aaw9} zb{_0^e6-}UF7N`;x7;yGG=z)U+BuhdQ&*Wy%eZel^w%*PXUI{3eI1FyjCAGkds!Ta z);AtM3;MHMC{tu3GCJ<4$y$lq&7AyVLEDc@m&1wxRJ=_=sv!n9P$DU!YgHO}67;x@ zRpV8tAx4Y>QcC;-qs5bI2X~T;$^I5}dGcFr4n~`z12)btveW zy%tW1^p|rcB4k84gFDo=ZZwFD4h4Z8|Uwuh4;E zN~z#vd8zlyGbE3Vv%XXKhlG`fJs@0fOm?A0WhdqqL|(zpa+_g^$N4UMA)gvAqQk}k zjPC=^6VA(1;7R`4!FTZyVgLsUiA`~=+hS}4&IHi-?ll}^CDNWx_RR`gWJJP?R)nlW ziFG;u$z#RD(J}I0#}xQUrwdvdv6V?MMKNZn?+>X|YJ@n(@&6GY$5Y@#5|A246V3-5 zGE~Xb6gx={6gl>0cs0;&sUASv?IuhU+wLB74ho0CP0wN9X%r(dJ9cj@zD{CPR600s z6Zc16o?L!cQzoQ+e~d4T)08r2Y1``1lj+{gHE+{zr&6cPZz3I+{{0*aSRu$U*w6dp zR>hb*EKc&`6w~2+#9dRlShNfhBJvWp#|SbbyiY}XR`97H^U%tAy^{zd0ZNGBs{+KW zy&j5TBtYBC*`-z0^Al9?s3YEj7%SrNDeza*7Ur$VIAOaCZgh~K$#_Kz>}z?J$4rrE zCzhnjpO0~l?}Yj`6bARe>w?_XX^2>dZ)y?y3SH*l*CLQjiTpxu9!ueP>+SO{)C`)K z(hS}Oz>!oJm|UU}o8m!rt_zafKUhYzQjYImrw*Bo#Cz79XjJGXyc2i@usd=}rH)BW z+5A%BsBMLeVN{Ao1Q!W!v&ley_2DMaOOU4k$D?V=FvDh?>?7F128b2HBIvH52|Yw4 z@vR^?9*8<7PLS{&?zSRi%_KYnW;wL@qNttO@0hLKudV1ULEfZk)u*|#nuoMHf+_!PuBUnNN!Hlc7mwsR;f83SZK?d1ZrOZOfr zE0O)8ST1IbQ$ial7*){f+veIJC$dYE8mhxh`6LGl4RpZ-$tD__`UcE(QX^a&FRAIv z>mp0y;|=p2vBiRY5Dddgg0q2o93}TGp^;WXCXH+PXjTjMx;h&Z2`+fqrBc!H-YrWu zzP0R5wuFE<1c3l_G3v2L^Z5NZ>AEIz6_ptd6wKAhm5HrHZc(Emd5=I) z(`+|Oe5|-Pd`O0V%IGoU0{S>rH@-%uaR!sy;4U5?-;2|(d3WCAv6Xc=50@ukN*2WZ znG};dcVFE5++Ar>1CG~Ls0(hscrvD`McbPE{v@-#_&E0W?xYHxwSct}ZlhvZPEMty z(Bx&eDr!s_&;D={E@wF?N%$7xYFTHxcEeghh<{N>A zTj5_%(M9SzpmB@QWlKRfMu2nzkrs?GRDtjeWZThk@u#%UUADQd6O2w&Os9~S^Y2(O zswopLD7mhn9k(v1Z(3<1V$W$QePGEYRMEq9bhcB@<`9!Db&*@Nb8bB)`|S)JF%F)^ za_zY91=|9xi@f!?`66KR?8Z6c!vl+*=eZ6nBaeJPxf?lMMSc|1w<(oJDhAYDtd55I zNT_)^DoHBYWSii`2|wZHI437vHvYzyiREDM)`FqIfY};cn>`U>0<*f_;pBCdPjWOv2{Bkrn3e%IztD4l5ykgghF>GjV#ar+Wm>iOej1e-jH9|D- zijR|H59%%lGZ+x1E2;Esh}L7y9E$|L(p9#(72ar^_r$wAev;(lnlCA%Eoj`d6jtpH zt6{{N6?4dmMH+8dGYv$!lIxSs-6ormY>3%k%1zaDXR~B+_F!^7v1(xAD4PL&J6;~A z9zj(rMYSF8f*_WdjiW)il;oQVQZmLOxwh$Cm|Zo~*%;L8^Cts|i{BL)x5zT+q;8>S z-PrgyQYZr66=$pP5q7>h?0oPa;W{{w1a8t5MXv=&gNC{d^NpP3yW(;^8XaK|(g`PW z($gTwUe(OoQgG+)Ghf0vr1%Ba$0en_3Oln#uomol9dmH0zuk7JW>+CiGJOay{4u6|5cnaft7$I|;&wmj@2|_)>282%|d;{S%gtrk2zU1?d zMYsmx7KCnuM-aY?@H)bu5Khn2`x}GdU&j7GxCx;H;U0vqAiRq3F2azn`23e4EJSEU z*og31gzX5Y$NqyKgI6%FM-cL!@cA!Bn2B%$!mSARAbb&F7s8Jbevfc^4*s@daORUf z|0M|5BHW7bafBxjUPbsL!mzLU{2xMCjIa{nQwU#2_%Xs?5YGD=<`AJC;q+X+|1r1& zx62#pBc2oE8A17R=1 zuMskz2K|OG1K|dQ2*O7ZzJTxo!eIpC8J~YB!eoRGBP>B!g>VnTqX^$c_$5NdH+}wd z5T+qiA}m8#hj2f_;|Twb@CL%~5zhP;Xm*4v5f&h{BYX_ua|pW--at5pFm#8{KMCO) zgnEPx2oE7Vh431}e{|viH_HW*dPkoaAzJ9g-zIOE#`S$}m{(|`D{2$Ye z|E7k_$Jd9FUxlx@;`>4xuEcK+Lc>POe)@A2SwG~fmJ9e^+d;mVI%em+md??C*rG5Pi{zE0M5@D7U~ z18Za1Blz8fI37>wAIcwN0q2*`D}NsE_s7wPr0r_aXI_~0}?IE@cZ z6AzGnGfc7XU*_~EGzJh0vJ-`B$g3FHq&cm+gV9E(Jd6dI#R| zL(EUg_)J|KgTI~*e%aC({3q$)m$$~?2QB}HhbFiGz10qU$Db|#=O`q!|7riccRKKf zfsjR~z^zX?@Pikog>QA>4OjU5KS(M6nI|0h^m&kt7dmfu=5O3C2Y%-=*bGp}Y5&vq zo%Ad6 z|HOe8-VI$s3j9BQ?!eb=P6z+eAqRfw9-n_)%KIn1<-iN>_4%($fe$?5z?%VoI%WS& z|GfhreZSBD!<6!0KI*`YPx|~HNr8`g&w(!n{JNC-TRf(XAGSXLyP1^o-5C!2f(K#8 zL7}z%Psi`3vmAKe=b$rkfcRB-)j$Wn<6-EKQsDarIq<;eeg5-P#{WaZ9C*nWeEv&Q z_SfX|9r!;!0=;`m{Z*qJ_#VKoPO1OWF%CQrHeTmA!uMGFXO45=6QQr!ol<`26bF9v z+dlt*l=bPo%z@|ZP6vPIat9uG9y+9y`I$7+f#<#C^Pip4|Bg}zK5mcCUzh^_#ykgJ zvNv7%zbtg%i}(5bBU9dA{}Bhi;m7IV-*0f>Ti<{lEv5Xln;rPBpF;na(!S5NJ8kOmmw(oQKb@E1zaZs&34hUn9~he94^b&(|I_|8J?X&bUYOy( zFJ*mw`|A$;!02@F^SJdD88&yUgPHZBeP@e0c{6$9<^epD}nG z1($<0S1yu|-#}H{?W%AYF%r^`X-Y1AA&JP|lwACDreqo^FC-=TX{^61k&!QSfBVw) zMiP{>u}tFGnc}PQl9;1?bNI~G$cZw%{7dpv7w27Vo_?ugko8c7R@{>eKx0=nv+zi*>6sL zwdN#!YV?=WZlo?4Yb)jt`1Lo5jf~);xU^BbLVC3qT`}$D?f%-KWYZNxvh_c)`rfuz z9~}?rM+GHQ0DnCOY1g-~VqQWC9#XauWcsq*+sKN#_9dP0xgdE)N?SxveAwS9lWdBRNaPMjx1C<` zN`_VwkZMTe{s0@y85a5cCN2}TOC7qrNa((c=6ua=PJMGzd#(CGlU&*$lDl^x*To1N zKk+i#m$+L}vAu(>{Z=PO>C(`pxM^?qp8-t~Ub*^rgks>41oZ5m$<2HNf z>?SlC=O(-p)Agl<1kBfE32()OeJLRUGj?ubI~rvo6q%9ZYD9i#D8h9OOD4PE#ft2njX{C>SkWAN9>;UH#yq3E}hDe)0rt9;rCJ0=|NHdV@TJ9Pn$)JOz8OU~B zn*0VGCCxy->lN21Ne%8{BIA|ZMqOrF0U594Hrn&38OV9vn$$*nA~ge9ujDq`GpQNK zdnLEgo=V~*AVK`IO#b~Hgx?g9e+!%KDx};Fpy~M$o~%sILS!)go-6R<$@ILUiJ+Mc zGsE*S#5_JPNqx)bp?uu$^L&>-nbw2Il6iLn=tX^DuH{46vhl znNP9oKs#EHxsRFi?Py`<^^6wS(czh6869Lt1DTXKWel;S7i2!fXrUb)ok?+O#!x#t zF7tPUo^3`@g=gf%%q5JDFgqnWHS^c3`CPk4(=)l;GDh0bD>FlkjxrnY;~6<4^IVo4 zV=|LxWJ%`lS@vSHSfaBtXE8d~Tq`xt$t0bZafx}iMCWEUv8w6ja>-nl34CN^TxD`_ zJtOC5u3+?PJ9=H_cd$<~itT3Hlt~F;#w?S963@uRh98qQ5zkqirZYfm8ySyfuz!ES zV@}3bve|@;C$z_6VryhPsU5bmuOjU0I)i@0XI+W7&$^E#*;H0}=56@H)M-e_`Mf)I zis9JDo3(aC`~*I6u4mxmFL`YEY{)3Vh%I;$n`t=PRnoB*e_Z2G?VQaRzb)#ley4sHeo2K zRC6Sryx+1*oLyVHk}(!Hh7V@@pU1SBlcnSABsZ*CGhi%JCvu3*1p_8ZMBZOLq8&#> zA<_$mp$>BaU*z4qX>9?A-(0BCJJ%N6z%tiqbmQ8B&l7rsMmMZ2Xk^(NHM(wX0ci{K zCXK$gCckZkVJ>|bMbSIEUwE;PQ7>YqiYRg;Nn=a*TZBi8)L*q)UXnO0?Ge0(>MEWf`0W*fQ%<=z2wN37gG+K>kT zISbtdCv3O*4jXbmY8(ehJ!;z)t8tSJy%$h&fE}AH|926z{h!qK&o@Ra2J8sx)buwr zz04S~66t=7r=}m$^tr~l_aeRN8)QSbqr=Al1qp0dIMRkZvDO&4ES5UnPThv7%efE>V-$KL zXvt#)z#<#IyNJ(BGw>Ds`0mz-aV97rkMTKFW0^ewybbLzHONn6y}gQXJIj0!2WUph z0h-b80cu6jUTeY@{LPqx2FO`z=~?PaJWG9vXQ?moEcGRxrM|?o)R%ac`V!AlU*cKn zOFT<`iD#)V@htTvo~6FC%{AzTbC&u>m>VRjXQ?moEcGRxrM|?o)R%ac`V!Al-&pfw zQnQ|=zDvwcNmS2LU*cKnyUOI?I%lcxYCEcDsW0&?_02N3NM=1tufTKsEcHE>!T!lv z>eI8-_k{LX&r;u$+F?CQeXg@~4$Ao~&U6l&nsAoRKtj$ocWV4B9fq~(JyYlkIaj@| zbJeTosvgm~)MbuC80`(3ncv4w^3FE7H%N^=$Xe#uQ7e`vIM7<-| znFAt*cd_|XREwA=vzpL48@kmqAZ&P-*wC%s%nuV=s$UAb6m3cSe zAv?a;%DkBHMj0pX$bD8OMN{6TcKmfKa{%MZOe##hBl|3%4m`1of;znV*T^9}HaBaH zoZ0Sp#2B~&@hcF_LX+5I)Iaf5&mV=#&B273^YW+gM5=NsAVk6WeNB;a?xIr(z%+p)a-&tn`+J64b{hvo=Y?ActHFK6b6 zpGs_azMQWkXb9rj9LSdwbOihD-MqCkU+4v?#;nd4YC$6l29Z{1jbLZpXAGvoXxk?&|1N|fav)c6zm0*e7tlfj`bo%c@lGw#VJ8p1 z0Lgzw?t%9^l{MIv6G0C0A;7&lM ze#-Ly5J91HZ0P-+7!pAD#L86*#H=<7e}(izOn-r$S}YjFTr~V!NPZQa_}r&0|Gy%P zIE;uf{8c;oEhHU{C7;8bS3F?(=OAcKh`ca()D>z|zF;?HN2f7tbS(9&PBT#TB;;p3 z-T!R)??%vi27egI4#|Gx=vO|5Wf#HU6O158)?^3(#lj zUsjgIN_-X@;Iqy`!g*YVC#aC^J750TRoAj07wkzFbeFy#1xLQi(j(DO4_Gla%5wo( zF~k@#Mv)-2?&6_rnxjY%T6b&2_yG`y$LPYyTjm9L-UxF*nhbsnL2ziyd~ccWCTox#4T#VtYlt0Hp-ony9aW)C)=)dDLYu6! z%~#P4htSL#VfIN>3C*lTLNhCo(99ZT{)==_g*I7bYGwVt1uo9YCE<*D&DCe`d?sM2wR(a-g_`_6U`5dCgSn3qRdJgL(V-^p8 zYXcvv+VGe$2f4N&>i4b49*0HcTlpfALDgjsWUTW`60>45AIf<$l^)HgLAiE>>%60~ zU&F8W!Unr6MO)sBR7mE}zK5_ew+k#M`vu0vleY%dnY|Kk@lN=(#0s)+W$Y3*%rmku z`yZHdB3tYkIXwGn!Y1h(0@;+7c_-@|MrSt>HdUv4T=u`R-1Hwxxry1dP4!-JKw?v~ zUuJCfIq0=#0hZ7FT&nK7-?;7|tiKZ2H;hgnaVS%LI> zQJP54tQqnW?&O=-^kQ|G3kFF;=Lw6j`Tn(qK@?-r2ax^W5QcIthS4w>hxpl>@VghO zKPBXIhzxxke{iUNj2XBHJdLIdg=fU|Nb)q8e9ee=2nm_Yg+}vb!zn*8+nC;xP~sL> ziDoTv4wtw8E^YzSJcnrAf44@AxvT)I7OUBu0%GiUu;OMfk0Rv*L+eD!z7#&+=SIr? z2+F;RbFD<2Yb7%GRw8q6B{KI`B6DvgGWS*@b8jUw_f{fvZzVGKklAiT&paa)=R$0& zQN_8|*(S|_9h_^8Fk2<6IM+(VxmF_1wGx?oD-q{fi8$99Yj#M@igT??Y$<}`Tq}{e zw-N>AR-&NXO2oO=EL&`_7&teJ(sApt40cKot@V{NC>^(+&~6%#7$Nqg_R>0o(s9d$ zXeS}Atamm^3UZA(x3LIPDLKw|_n!(#W?9Q`ZEXFkY1nCU!oIx;MA zWeTvl%(Ro4zQ;@#nhnTsmn+jK_J)~$$xJ(#X{@;k8J==wx|p41CgFX)%uEx_r;*{8 zu1uG3ESPB$aDiz737FH&L&!i};Ph@PhYDP_kw;wOy^FJKnt8+}-n%toyeqh5Ki*=Q zKSVX2M?fN?4$4sfZn#8bhTbHZ;s0*5q7pRKzX7dqH+e?>EzpWvW(c(6mKmm^l_}B; z)xQC)XjDnLRJ5{1G83)%tVEe1Fbw-=V;IrDSqU;jD?w)H#xUf$^unW4wl z#ZATXzYOcR!1Ez9Gs4AvmB}>9?N%{*wH>uG$?tn+2*d0d>Ce1|&|;H}re|bM=0HYg z+R;24Bj(Z)R)morTNvp{6h?Xyg^`{_VWcNf80kqAMtTy3ksg;Yk_vjW7%hT|k(hQa1TJwBXuB1yN|GlxzHH$@K($Jdjyr>E#W)O8v(Gua_p0TA z=P7n%Q(e4npY=&b7UK`h7^pb$PIv@=Gp<6;Tk&vj90}flC>Jt~5I|eqBT?mNL0f55 z`B~6b8dZK4w3SAcp9O8DQRQbrTWM7JS(qA<~0Buz!Q8hvUZS`q+QH-{F zM4~a;iWH1zr1G<%tx5zMLxLKOAwg}18X7hgtF@lgZYx)7eO>FPDZ+Iqhn0?+a@b&2dFGw?!_;e$kh9aBI>qqXrU*8%#Sszp z2~Z&`6|)4OLO$nGwwH_wndU-;8jYdC19+JW74DU23>9jWsBjCbr`3NlD&(GF^+Xmx zg&I}83{as)RWAcns8Q9+02Q*Qj$Q_+P@}4s0V>oe^fEug<}@je2Gz!AZeMO=2Ne#R z&3a&MA*gT|wa}i;Ig0&;{fUJa45SG70GgODSn#~Jq{Q3;x^5dJsBol#7Z4Q!TRn)> z03l-jaMdVukqB#=Q79V_0=$?*nzZ+2k_Dt@e<4Y*TG-q%f3jsWuA-48~igSJfaEbFyY5ccvKTc zFrkMDk7>eiCVZL+|E39NGvOg7Jgy1Dm_QY{xlI#>GT{&tzN86-NHB(c3ys=~RLgv# z@Y{qw$?Y~24%-d$t8(LL&=Dqojji`?h8+m;e?FjJXEmUV@y}-+0@P>yM*cpJaq(Hy zx%n(E?wmYSz|A3>EYldKM+JAMX%5q)LLKPvQm zcwd%j|35O^5e&HNP;gtOeXtC-+cFK5u_EQzq2RVmJ5`2TF}hO56VaWxHXX+S`_E@)ZMgoKDHZVO^1~+F1S`jnP zI6J0%=+EGEIyR6{c9zZL0(mhF$EYy5VCyxil$|xh{DE{+nOt!Byx;CHxz0Y|3ujN981s03$wq$*hr0C zl>KYQE|@E@(b-}e}d7;8r@`Oe}~a2^N`m&@?JCh-x-~{Sfbz(bJ)z-!a|&liN*7c z9KJFZ_c_(J%9u8Mv$g7S10g z9Q2vb;vnP;`S=L4x0r0eMr0+5HfsvxRJvsvCK@KvBxY}s%nJ&Hn!kl~KV%sNyiIG~ z@(GC*45CpldG^8bvWN`y=8daW{i8;*3ynd%smy*2S&k!jpP#h+7kt(74;M4;QL?Uin*Riy@mW`) z<35Wo9YJA3Ot&w4;~ZPJ&xmm@&o!T|+dr4*n$OYge+`v*jFH(q*Lv}H1YF_Joz5Bl zzvH=f`nE)(66o}839LrkmZ0X`xgk-Eg=-cf-8{qOGZ!rvuX9DhuXL!AdH%V~yxxDJsaEi8?Vy$-({klIbiJ&3Rl=Y|9c z$f2v4GndK7yCK0`*t%@O&@C)65>NfykkGBGROoQsx;9DLjglVYPRK|tb2a{c7QLsZ ztI-&g50oT56+7+t*8SgYoE^bzI_xBjvpM7r9s0o-+7-zfL$yDR)(b5d1Lt&h) zQKdsujkEh_Ct;k;{s}u7GtSl?D;?@fxaj0I&i-rJNp4-+2s?KImwXAgZk9O;>0Gp2 zyw29ml&!l!w{E87UN~@FZ0qJEY~3?2M-67xAZlc$qLS$dgK3g8gjUn$yur2j!9SnH z4O-aD#4GV`C}PAU+A~zHFwKxFOhYS>(=)?luA$SIOSR(mW)<0vWnY>Q*^cF0n)n1W z8$X71h-EIs-yXP(qg%PvNI$(9-{(yUwK7nxCpM$onBs%ojBaBJY)0iiRkrg!H>0wf zWD3QY0y~hMvUi{uQ}_~$DSQdW6z(1PevB#X>k(&?3$(9Coax$`XI+VPFKpTebTLA? z>e$5yjm9oUXf$BtK1TAHa#3@z$!BgHZXh6pquj3rOoRYFPe}Fx+C4+4l=l=%6uc<0 zyaDj;VHWH`#H`8_+x>z*ffVM6q^IDg5(^BZx^fGV$vrGSijDAY-nKUXT}Cg|C=`~o zEjBOGD0Gi^GJ5fUppJqp8q$uH$A_6Zj*o*v6DJzxC48j_>q8SK!Qeupo7Mt4*)S(* zbR(jZka@C3*D;FBQ#5*X4Wh_ARij4`os7)WG%QU(V(J9D0ol&zI z5o9e=*dD@=^>U3qzb5}pHvUQuEo{@*7=yQCPzK#H#W3e;+Kx5(gV@zljXu3*(8}6d zz>nD@wq{T#qviI9tr@h6(F%LS)(qam>TX7LRbOFi7UaLd_f<0j?FK8m8L7-})}bmy z7D{9ZDnjHst!UGl!IZw|(_-Ab=`rT69@KY zy+jtFPDC0c@{z$*#pHj61zSb|;d?jVxhB7w(N>LaT$6tTqiq`9uqNNbfoRw0x;6QK zCiGT~zPCF6D~yIUdUW-mI^3hw)*o3tXh|$`X!W4_SmeO!K@G9UzSV!d5&34_$Ee@wpbUbpFG52xnz8cMByKhC# zO((3o1v%O7Cy{gSiRvC4K)VOsg4KMFy?j>>x*4&1b#d)jJ*Ww>`(#m6GNfLekA^Ec)o*3j&;ry*0&DN<}V2SZ9;v&b=CJ%bO0G(xQL*rh?)pqvkNa6l`9AQPU)v0xZX?-)b{zPEbyD zPI-2eFJV&GcvPhst{)OOlP`os+v7&15H!2M{S@sWDwXuQ_5FS^o7&r zW2=WmY%O0;pG)a8Pet6`UcQ-ri|99B{Wf-#@1S5}JzdNO2IH|qt*4JGxuHX?r%RN4 zphK;vg-WjPQ0wVZCD)ntv`ERdVm-BMUTeg9GGet@Pe!Z~>&b`}Vm%qLOspp%-1G`A zLf?Q2JNn^BY&M?ES3y+r3MWl|1A)e1?c|5 zUq(&ZJ*%=#{?GO*uCVl<0dMG$_ep=2r4Ro5E&YMu9Z&w{}S-t`~lLhg1D6b zd*J=U?$a;NAbqi;Zq)9uRPCsnv;i+sJL(J4%FK@Xk~S8+cm0b-$QzB2$2X;T6>pv? z^(hHt%p6my`seW7y%j|+--`Mb-DXA6oo_|$$5DE>R#Y~<*IYI|b??fGqJ0?hUW?O; zdI-N~Zi>Ws@Bawo+G9oaSW!Jz)Gn;3{^&ezH2Y_{qnjOv9muz$QuGY0sMH~3H!CW| zyRyxSN{y!5tf*A8#PO$hCJJR%6x?b>nVq!Wrg!R9v0%1Grg!?8p0Vj2v6s|}8bEcF z5-VzNI@O9YI|(~A#fmaJNsKDkBxWaxQ3aF0>?D7-$Lu73w#V!wF{%*P>?AR&5ZCM^ zneBlkWOkAmRj{JWP7xAA ziaMMx1s6Zjih@g~hDNI&3@w=&8l&VbHZ^2+(kio}Y^DfCl}ruUOc9JKv7&6IXh~=J z9HuTaMby`Bg3T0>2zS42R+QOEm{G~j72$#{v!ZOa2u77yQIoVJFjkfz5w)VGh!r(n zCXc2KVMZ-FdDKQC-2EIg%9$~e=_8vlQakEQrs}4t9W`5s*78+|tajAd;xoB?J$=NE zI#0#e&{4jbequ*0P(K)WJK(2wlvql*R^$w7M6;7%HoZeq>?GGz!5gHeBF0x9kHj9u zleqvyWe0xTJw-*G%Y17Jz@&r3cggXC9po%5(sy%>&meP zI2V&+5%5ODq%8UbRsl$8=fElenQIk*%(V)VvIZ1b1t1YOunIutS_L3;t%9U12?bUG z$Xu%cWUf^J5^)2oAemzow17a&z$yTlYZZV*%)ly0y+VC7f^S%?f^-vWoeM@Mso$E; zlvo8PD|t(2QWlI%(XZ-E%7W3Ud_}mgvok4HL6eeLauKUwoRXMonZwj+6`W4h=O(0N z{iuZmtpcQtRU%XL+dGgp$TKwdwhp8XaNVRwXgj!r8c#%&oN1DhPK!)sf_) z(u{kURdebYmUN~NEyxHBOVoY1dm}Rfd6p)HsSa6Kk|~sMH|92Ej%6-GU2A$3iy(6> z=Zeqd^ji9eZE%73Oi6E~k5~p5i_cWkrcvzqr~af6KCpfe?(*CLJ;*XH;|x-X&6?NMagqY(49F6`N3 zDY;u0{)_K{_)k-apF`(yS5P}89o_6W>_CA+q-RzkeoZJ}A<8*9Q-}{RA%nJwjl$+D z#K#%rD?}qy2mVC(8p{rc4&1_lBu58MG#$t(+)#I0o(^ov(}81hbRadN>~#<@9PWM~ zUj;%zWO`&zTum~o0#}j5AZx&Q1xRj#Fcr9rWL5<(A(>TyJ38}J;C7JQ z6=5oH8_BE++(I&|0ymRHzNP{;lYD7_ifksSoiCI+OXVws=%y96cw1& zh@t{*Q6W8&MGzGziwbUXdLn&91HpwA17+OtWD3-ba5G(to51d;~qk zSApm_>_Gnl6{s-qeO2Hx4kSG)5X#{rRDr8m>4F0DRp80_D$sPEuL4cy0TkwQ7X<?q0&`WM={#Qr zn$80#%te6!g?T7&8;g*K0(oCrJ_^jx=RHy2N2>z=lBNp$D}EPjg$hJ3eht$1sK6c- z*rNh>F)hlW&ixEM#aDsoIP5@sMg{6jsA;|3sK6l{NP1M@N2>zIu+nAce7*`aQ0SvT zTMzYBpn*bP1)75NRiG(IsK7R+P8Haks{#cQW>KK*oyW(D3_6;< zxc{MNxSqv9E&1F_xnrMM_@ZdP^UlP_QBn-U1m-0;7^CiHxG~M9L`&jzbTA_(B(4hx z9M4W1mP5^p&zxg?_?lh({CPM*BS~OSX5xp!_yTgmWM`sPs27E5MOAY|iAG3ABd^FW zKb~u6x6A(62l=1CD0@4)DLgwrE`XEsXZ`7kNnE`Eu74Ec1a>6dkGVhBKTe`0&PC1s z<#abE&ZRZbzlNhpcScXK_U|WDeeyJfZAMNhshMG{86H1Mv2G4lY8ffi&LK)J?MzGk z9I7N%#-xUZD~atfQbmU;xuYY+IvSzW8yzXBq{EfO-WjQ-BUnq}?pHg~QcXv)T4XDY zEbtx8!iKxIcBEu=a}=wN`;$Rpiq%MLUy-R@AyYDsYatuK$a!2NvG+yhagC9awidD; zjGVMJaxEA+X={v}p|y}TVB|8Tk*mSTIa(ppjeKjzsEn&RDpm(%njdoYL$F2o+#GUQ zM~WuWu^MejM_OjQ?RLDk+tYHwZ#1V4p;6n@GUGi)$v4{5cQd7vmE7K*zLn%yC0}h% zf12beN^WcSGM~T;ABdNK*GrMuvv?{;fT%hFKW=i>cxe^0tES5TSzd-0f{?rRH<8$h zc;171mT}MalApv@mhH$dy+1Sc_dvC$Umz(u-%U-=Az>PSb9?$uk}?hK+S30^LY74_ z4ZD@Z6s?m@?dcH7sY-5Gl%7Cx8cEFIR+DJcu#N5Ma+1>}Y*aMo>!CbYgC20%HC=rQ0*AH*;fw z1UFSLqtDCqxl4VLJnXrKzMrG-|0llVyi75=EUWk8-$r7K@ksU7T$1Z^1&EzrP*CNW zv6g`MN+ec*C!0Xvlbb-Bz2R&EJnTUUPD13f{RFf*wC>F8Wxi$HkAU-sKDWpl`0P46 z57o)+N?(n{4#1Psp5C2Z^(NL>f;IMStw&Zx@)@MD4Ivc|G2~f>q&bASpQ*{XwliHw z^5-`oBi=iizAT5tq6t*MFZ30!Z7;_-_dE&B=LM#QlN#-{zxf>`d<|bt#6ta6^{oLBo8JVIoK=R4-f0`$dsd=D37^p))h z)lOwu(O$ova@H8Vti7)+&eR&cq`fcF>FZRMw-?v_6x^Rd^3QIM#QI5H43NNjsf@jy z*2bNk^->!HomR*C&U&d1pI+A07xmF-nQULY7b;{Qq3WgP_q7aPU0nOTW!4vkKR~=) zbKSQg#mfjd08;ctT^*tUDE=z=JYv4b`o1Xsn|OB_6u(|%o^0uFT}(MzO^(frwG>mV z6l<&$Q+FzbPcQ3IX{T9gPc6=T0@<*sy#x`8U$>@~IUBz0U-bPwo=R!2`Qu;EJ8-g6 zUlYnT(S1?m?vZ4AQUq11bPDbG8=lWlhod0{ZT{rZ%u} zGX48QlWhAU7U(f8P)qe@Wk6+ZGKOu7Sam;Eh6!~8QQFymiNtQh!;#<_4H)NDZ`Y{s z+vZml+%IdmTp3$81Cc-RCQgUErA_gd!syj4g8#+vJM6FOf4lkL3ICb!djSu{94m>z zC|g|n33xq9ZwS|oL+&mkT8|AJG<9oH|8u~Qe{g3&&hh7dcKn%K{XP!`hNI96 z=$5^@>h|~Q?#<)R{W(wux0f-Wkf!&bR!;Hl267#VsHe9s}BohGq+ZehXaX{Ez8U~ezGxghwoW1o5WZ&?JN zWSAj%bsK_L!VtU?hTw$=5WG=};EgZ@ZF z48a?q$CR!hcmwpn_k!RJ&@br}1aEl$ZA0(|=yw=`KU@(!P8hec%tt7K2fh~se-sN# ze6I+8q}sb%NCHM1x!DlBkc!|fWD^*P;Elu~8bR>JNCa;o8^A~eZ{&JI@Wx04Zy{^J zNCa=>8bk0xDuN%SGOjiRFQg)P3&DwBLGVVdPy}zlABTPg!5^=-I!>_)f;T`9d@l&z z06p-%Ao!D%8Teihya9UPdqMC9=(ih!Z^R3K^Y8eIu@{Y19uA^vG=6~KoAD1vh^wZ_ z|5;vg7?5W@2*u=bY632m1+Bw|SfrS|jdhI4c){e;wZb>Gd&xmo6sRN39 z8H**j{5sa1kIR)9U%iIGg3E7~;HK)0^buTshx#PHiM+PaS8(}S@dYj?TyKPTT{s%+ zk4LJwW?`<+l^}Mm_E}c#vom`^JSK1lB7Y+fi`<@*#vks4ioqzA}1qxFS&JR zX0JL9J3|5Ny;?BJmb@2MMk7K}f-^U14R2^q3(WknlIz=3f---ivL6K5s0pI~^(3#-gz{JoPY>>(opJuH?W&-~PR#v3|gn z10@NsdYL8)-a+EyS{ZMDjYspkdUa4eM_5MN7qfbfG$FPv*6KMbfZbX>NAFZUKJ8b} zC`)bY;>@9Jbf}0;5bjTSw0io&m(@ex&Gg-M^{fv{a)L>Q2?4>CqmACQm}S#zxx?L$ zEv{RN9DY<3jg=Lnx=@oJ^NU@*DX8l@YY1idS zjjPAaT%Xc(r`BUi(%h3XU675{du8uv?5lWk2LGw=8W(ETfO8AD{!Y$sfvEZ(e%#cm zC-D!f6jd+C|Jf)t2D?X)_JDXa_A(x}tBE3jSDQ>kW7p$hMZur}Yq)!5d+l&|b3>;7+l)}I!XcdKl2j{^+1A0CTG@$3hKm&R{3^b(Y z!$3oN1_N#7)`x*dXf{3!JTe~!9+eLRN3yV47-(3@hk-`=Fi=Q^ffnM!KqGw^XpDq` z7UIJ|BYhZXjD&#};=@2AeHbXD!a!S*^~hk-^K3_Q+^O@o03^n4g-E4Mxj zJW&;@4+9P8`7qE{ZhaW|F=h5)Am;#XOGRTp!BcrKh^kTe0Sr7vTE*4(&!$5y$mcc+peg*?|mDUz!4fky^7-;LXJ`5D(=fgn5eLf5n+?R!c z(^*+Q44k1gx2e5)72EPmF3k$+bBX{vH5>>KyR`t3Hn2!}5O6Q{HXj0RVQ?M<^l(*@ zLclewO4pR+)tmM76$tos@dX6@1-x0k4^>2C8}Uf>)-1^Nxg5mKRX)qAe0HV|;xU0! zGSOHwo@@evPi_Kj_Rg{i@FFWFa04QL(@#KOaO=*@SX5#W1gqSm1*2@qZ=g2X5TX$9 zM_PM61T;kGLqJ1>J43+PfME-fL=FUe@8#BOA!`=w{ai_1ZhcNOR=oHN5_!w5fPibN zqOmpA3ISh~0<_efik$C(|KIQs>%C&{ruHl_t|T)&cbF#%`x)S(6_8W`U_7u?iEt8P z1wuRnfMq)Yz@+o#RRHMIKEg>^Y5;&`$cFFbUP$mWJn~{QZ$VhL4*LEtedXom_s8Jf zdev(nrvku?Nu~g>(((ZSJQexeRs(Y!4{dB+`gH(+XCZ{Xch#z)uB*3R^#)B8y!%U{ z3IGSIZ7u+Cb5K1;T1E;0k1`>A0C@CH0C40^)#KBC^&DfV0RSF|CdcZTR2PkP;?e4< zgfFXyzSHTu>+0Dal*9*oJ^&nJk}3c^$?^pN>_iR|`$l6o;vrJ8wJEHR#c<)S*7Xdn z76X8~q>D-dw=U>9S%ga74naH237prI3x)o7yWH8;VD&SDV??cZ~`) zH-mF7xR#OgUJzB^!4Cl7Aa_^kXl0Qex%zN>#UcEJE`S7(R-UhR#b%VD;#qMQhb zJH^{;?}zt0c-T0jDz^ea&i6(m3IlZwj}zRx1c0+CR^AoH?*#zK-$ik$T7r*Af7}-4E-4heu;uQK8(8&;tN_ z0ALRQ{2%}@?bv6w4a@>SS*!a`UI+XgMnZQgdO6ks>89}P{5}9|pl1L88~#pq+sWHd z#39Mn0poQ0>wx7PP5hm_4b?&^09*#G@*lho$iij;psl|70MJMu01DZ&4(M;}^#R~c z>wx|6^7q~+8XJ$Nau|rJk@x`s94oD2cGX1rZvb#Lnuh{Fx%Amz2h>GD+nH+zcl>og z1&0Ozby3g&pl#vx0iZ1l`T$Vip$`BJ9QpvzmIeKFK;6V^>wpFh0RT6#Eeil#Ou%3O zP?iH_2~Yvx4i;%9JJ<>V0=73-iSgALT&Sl2@JkZhR6U$NvIcmo`Un7=NM8YfcZ#n8 zKvwTDgQBr9c%*u3F39y+3S#FfpJi390FVhhj>u2uB@p=JCeUW@ESmrUAQPzAKN>p} zPtFT&-I*C5ZD0`u0O~Sk6J<-@jjCCN5CwpbK3_Al_*m+bI-!#q*kD}jtQLRN)?Q1~t{IcW9#ERZyr9a375~4wY9O$CX-I zJ;N;{g@A{d5IzJPu@eM5e5dO1X}@~>6-7Y6p=flho;M&|&|a zLQYfp{6sTdYJ|T_Fdv<3im<{ZmwR9 zV1zH3~l`7$^ohel%!cq-R{ zsM>%ZK)}cFj}UOP{5J^r9i)BYVbNIc5!$ZCivV8jp`fqB!~Ujw*_&&}fW90LTc*N7 zOimE_{Sk>^C#U=>{)-}yUE;qpDbsH8AGv(|CyQ~0|LD%gf9%S;!hft44jVrHdy)LR z#edoSZ81>tSNE>)-wmjWkoP8*{vvKXvOTm33xF^Kzla9ANAX|Jm3BQ>+M(ox|z&80jklo8sN{O*7oJCU|O2-1uU)S4OiU`6GnL zuF<}3HDU}uLco?R7uGV&H6`Q>q7YmN`M`aq zGOpgix6drP?GCBS_B6rDrHmt#T-sI6LLSaS zhP#(^m9v;fDD`${g%tEiC3kdINKubsQSr%`&Wcx1NH>xKhr73T;*@1}{cIaaY@@XG zvn?cX5K>4t1G_Y{teX+WJ)Fk6iKNd8YaV3o0v^dM^Lmn5=CvSm7V*}Q%rdX;%*bg> z$*4k3WBN;Vot3L$H0deJioXO-Uj14jdpV79S!X%hl`Y~e>8y~woc?ajjtbe!X^VI} zIx1u@r!C^W(NS?X6Sh^m?Hv`em(y15Ud6}r7?rOSZ%A26O+2yHnl=dO!}*B9Tg#FW`JtjqKXM5r?Zo|$rW;9 za)w&vn>s3Ff96aHn_eL&CgolQH>E;$X9l+_RK;)`UAdsLCBofW&J&ZDX+j%1VAmgq zg|m_1s*q*5YsEGnUvUF_gAz@Zg4cvd^J?~q04>pvU)4gyW*IEAdctvymYo+jWyB0RM4ndA8Q_9^&y% zN0KESjB=V~_;!2M9Pro42MyJ(MyqbG<;M=skQlDHcJ43?)LN1Wo>z0?@z^wmhw02w zZ`zD$-V?JVD4;I6@Eb?9vOD$TA`EW%XlH@df`-N4UbQNaSGU>mR4<|+@lK1f9`bm$ z?t(iq+pBLyF^@a}iyU}ZH@5zQ3gFJpwVELOuh9yag5*H0@T-FtpIqw~4go8zGS;?N zZ44^obCx+4N%$Se&ny3g+Ots^H(G?1Si`PaGCCSthlhgPuGJy!tv9;M7K$S9;~q$tBb2wqEO4mL}L%&VdXujxuCdjA|zfedBFdB zegS!J%tm|PIPQg@A6RNz7gsfcU*GqSEW=G;K@m6kRdNoB=$~2R+z2y38o$tNoB6KU z{U_328uQ;Qp$&`mUH{$a^@~w>#PmWsxU5A+5G@>1WQ}l(jvWSghbkr2XX90bY z_}jtw1H*z+MkCC?-&8pX?lOJ^RQFIuBUItIrW-!ROAyA`25;o^6XD#iafbb`aef9{ zBtqVe^@Ju<8?mu;4vZ$)DtDqf_b4>!xnw2}n)G}q+;5(2wEMErvY#*aeTRCXO;nkY z-c>Y3d%K|s$@@5X08KvHkAq(baUMnIFlfTQaK3WmNM=Le2F+|adx(%%;VQ8i1Pm&$c3ZcnPXyvc) zibj}4>Py(_?!Ltm?d#~K5F7=3w9+UHhE^Ky21kHa8XsU>MJtUD(QRm@QA=(&hBs=- z>-8HNM)i-&)p15ODz0hVD9H~>UkJl^J%(V#HN$;4qPXTTB>_i>Yeuj-u&mT6xaM%B zwi&KDLdmU$YmQ{4@H$e(HAk~(_|y_G1aXb5Iq}O?iffD{Iw7tR(#JIxwgF)|XVVB( zh-)mAP$lPl8lg(g`Lxv}v&^eN=A2PmK@zyel3HfCMo7gqqf{?0FgfrBm*MuADk zUqX?FgG*75-V`Nc>L)~F=iy-zuZgeNqu)Rxn~(_YPd%@XtNuEww$Te>7|fYa&0}j@5WRGwTAO;F ziDK}xr(Oouqli)O0y(CF^)h4MPpw1>@-29UCuu4p)LSIs(n|*EsPX6@585HXV6^aI z+M>N`h_XOj{dkZ76HsG~WovtN5`%I(a=3@Npb+CV7s$$moH3dJ{QWfovGFE59ecJ2 zte9e{J=b2<#d*q#d7G+(bRfdLo zrDZ8#40LdBiM*!eR%`3ptJVaye4RyEWBAR#P-L}KbZ~)4d-V?>+mcpniN(X_cvJA& zz5^LHXoB#+RT6ZD-)>W?Rc!t>RzHmXRTE}ad(~#dtz$uO0f{#Kx*b`HXP){_0nJx9 zdP+1l8&A$FoNBLdh5riiO8Q<6epcja@IFZX>?@r59@SX2o#GQRuD5o!qFrC&eO5io z00Hq5zoi1oOPn_~8v6~&X?E=7=U^2KP?)Yj3+1W*7wLeeKwXrVz{b8LDEkx z!ySv6u3k2Rp0&8DURls$er_y4iJ+d7tf5I3SD%ZVe~KJ?w?Qhr{$Ht7=vghuW4I;& z|KI9MnIgdM6~AW*=6uysdv0-66Zq?1}$nmO{^3+?N{;`C8^7!z=ORyq4DY zdM*7S2CL=~@NOl4_O-lM)l|))$b`9X<@Kz;S_KdTN*V4Q zu9V{5!$P-m;AxTOG(rf$y<0RXywIbS-Ei+nr409uQc7{}v7xUqDaF0VDS-ml^f@aU z+m45->n&CTrdm5{4uQ{;^o6v4Q{SsPY9_+xK|E|pA$!e;0UMQKMkCC@2fp8gI}iBM z#xvl{R=`C4b-lefaP4+ok6gO0_?p{?Zd=!*JAYk~H^=OLoidx=TRG{edspj(ufggK zd7s;hU_3bpd0!NbT?JD-!48E&UQUZA^o&DzVQ2!vT`Y7sMJx>cL_H_bvmkT@s8BRK z_q>a|NHnw(R4f{Loc{_VUjWNLvQ8Me7!ksQSL3%}CE%uZ8EWtf zw^D#UZkdpg!YD&ajf@rkfMndrlERn46-gKwFT9^|%ZyAFZYFcm$V}lRk|`r=3il(K zHnP4j!MGJh_Ak7dWX8zGLRgtzq|(Sig|9QT+AT*Cp@t!aGf39Dl|l|H{2f#7Yb6?9 zIFxZ4j69<7Op*iKEc^>Kj4bTSxcdk!4K*BB_$S8Q*Nu|U6AF(dxu1*=p@z|g50gB= zeHH&g4Py%DGO6M2U9}@!d?*;q)vucG5t!O!VkU}Ys zJchdC!r7)!Xo^dm>4l~`da=EJ9p0g7t`20lVTnsz=!M$cvq%F^5^mTWDf~0T&ocUF zk-`M&Ic~7X@?6A=Q7RTfU#h*@7{h~i(B;LB%B3&#;(r2tIEIR~q0l)}+Ify%L21tw zi9-!-EbMt!oGnfZd%hKCnG|-ug)XzgUSOeXt*{HMaBHow7aG0J3VV?iZoL)uVx#Z3 z!hYNe`v3}C9DP?|Ltgw3@U25(+Cmu33X91B8<&fj1Fgsu`j5o*9-!_cdZjOnXg zZiOvL%%48X3ti(lc7+?Rk~h7=inqcF-)+TP@A#&#wb1n;ebd)j=$4Sa>6KR4En$7r zpEY`GSl{&ZR@iM}ebYA>{oAm<=~Y(vSHoV}qZsntAjpra`o9MWIoxyDcc&-0LB}PI zhbO*4{S`D3mk{pe)a?0~mVS}}E$OjHUyQz=c;%`TKF0zyludRA@9`&3_R|s z{c(Qk3QhBBB-x|#P;H@x9+ig%^PjHrPJxW}VdVEvf34^c{|5D!!eFqI`lDB%5T-e5 zrmXsVkv%g<{b{JL{xmeJ{xo#YslO2-3)LS}ez*E#c&_?8DVK)&a~R=vQh)RcN_(!9 zHsq^6ElyVbX>ok@r=eN(r=fdJ{b^yT{wg5jPKAZ~`x|`!IrT@0Lk;hv{=wTT-ev%a<&4 zO)1s(Y71QxSGE0R3*8h~wSBXx=}ie$+g~yIsf4QSTTD%FPN>?x)##rkRBhkptc51L z7!_vl(hfBPt?WK1Gj}nSVZEc9iku3~SLSucbCl?gsWz{Bgu1W0Bq{2%?uSCfMY;ET zfjzN%<+4^;B1bG>vM_~ww0n@QZYY(6-oiGW22Sb~6x z&oSUc$Dv3=ZbQf_hKS|xusaD2h9Q}?@T@$OtJ_i_0L}Eb!Ml;XVi@cdV%c$5an-Bv z_d27obGxv+7*W0;<#rP?TLR`goH1jU2a31@0p+sGO}6Z~mhw+hFqzxNCq*$U@aO=f z>Bdz*b{Wo>;^Af6{w5x;Y7x?S`IFJux0Y&-`$>-B?uX}97sBf*dLxlT#Tvx2(7ftl z@LEW3q;t5=EpR@jdda7wu~o~Wu^L&npT%5jPM|Dj(wRbOX0!bGy7#z;Qcj1z8}0FDxm?qSMvSf{bz+4@IKPZFgy!o7`{j`ycW~L zd^j4^y;{mh(asqD2*gtiUrhOAT7Xjp^gS3J#kc1A1{hwJ-9tIc?zSUX@qC|Ad)T0% z5IJ~W$pFtQi92DBK@V~p*+&m>>k);$hrI}E)!(J>e!?&z&gEmb-x&5c?5zDZI;z|6 zV~pDzPhiAy`%NNYi`Dzh6244gD+<+!j$Vd=V$KNEkZVqU0e)`oeBqdrJcHEPO3g}* z1aI;I=6f#Zim*P9k+J~doQy|f9dg4wRBne(v zF3F$FB zgjb8wguKu0&GG0P2YTM8kv(gZC-?tt<558)MEoz9W6b@)6y_MuL#aXy|B6BAB1t)z zV_Yia`wc>@+?+W^CEsrlx`^4){bfr$5EjwR$wB=&h7X}D+D zIZ7Q{DO;;My|fo+NqRF7hE@Cz43GaA6hA%}-$pWFBlkm;$O;-6HrF4G zP~K1*eq2GegM@SvKAb-ZAI_hI59d$9hw~@l!}*i&;rvPXaQ-BGIDZm8oIeR4&Yy%2 z=TE|i^C#iM)lOTEPQr)tJ4iTx5;f^zmdO_CPVaLb+6jZuCHmkPVZjf@UDAgqKa7a?;pVA=A4^E8RJLUla0@99nVg59 zUeq4kb9M|oCqmW5&%;*#V)dODpNGv!B_!O0_*~qu)LR4Q#Lq!MA0=jaiB*Wakdfyu z#6+X)dUNAJVC$_Aq3((CxtPvON>VNHdEiQE?6$JGv(889NG11S8Ow!fyqCHgsh)8) zE*QcShY~$a0>*ji)tVJnV~1-Z_@0Wy@{j2}gP7&q5D|^Af-2bgL$))vf}KC)?~E1v z?A_AH&Yyt-Uec}AJGiIwqndg;|G&TU{{;=$9m|m;{MOCqC%BPwJvvnxJHK>m>7u3DyXHvOk4x`siJybfC7}WHlAEL_ zqGwD0b>qr7U`SWgZY{=XO1gDM;$!6?eHC*16G~FPBEMfJ9z?*lU>G?}B8<~vWQ688 z3lzHj;Y!W%5>(J$jX&}nAW@pUWG3*c6)zi%>MT5ewBTZ)jTWrYU5plwvhuu*`*5^) z4Wq@j>-2q$+tZ^(&p!G*Te@c-JzBZ!cA-k!7bElg?W5-k1&lI+#6AnqTAiG^FLfL> z*jiyr!))lyAdDQPv<`Y-B1B1Ctb^ViLd6s3&4Z0C{iQjS`7O9ROS9S)8 zBrR^&k~{>x=Lux=BA(QF3p_WJ@xAl~@E?L6Stj4FkdI8eDdkP@NnONKnB%CbD?W*g zdtZxfrFb&egTPcVg~^o;#gs@^h;kYFd9S17EdQ3;ZNa7 zfO(`cztM^LOFDhChVGhgprCFn@(Vp}x1QI^hp?WOeJFMFHH0Qkf%nG2{{j;+I{n1+YCWK9I+&V{`b+I!n+Zj#NEoym5~0&4#JM& z_rFqM7_a?LiE)Yfh;$pCS}+d4Q+6K+FY#&fJ_KGz1>Q+=js|&Z;DyTiGCWi4z-i7N zxCX=zJ~2`*%GSOTDNw;zurjd_DA>KCRIq36&klanAy{%)rLsSr*TIK_EBrK83B9mx z_zmlZ-|*qgvoNe1e#5%qH>?|eBf8-?tQ&sAk7GJ9Rv6-j--2rvF(sW~4Bd|c6s(w@ zO*J~)*9oZ`exs#E>W1HF z+(_N<8%-Fg8-Al@M(T#&XwpdC@Ec7Tsk@(WN33R4FB^WN6-MfY-)P22-S8W&G*UPG zMyuUtPz--XFk0($p-v~`0U)$Qy5Tq4V5DyNjSg@!Giw`uqx-m{q`bP}H@dGIE2M7t zjqc}k-A*UtqX#%$xYEh^=x}$LFzbfj=uwW9>rciJ=T3qm^m3A zjhp~?FTSxNE)L?eku0Cg%SZ1i=Hg&_RisK4`xZe4RMoe9pJ^)nkaTM*aQ zLZh9MkwU7>&=@0Qg=G>@RvIHi?Z4(~>Ir@86#_?O^I9FZAGFC45mM@ES5bzPZ>^Z_b4mp-l~GoLgd z!}&rtXO@B1)yf6ZhPzJyA8^!nkik0;Z1(k7e3aGE8~zHfQ1_Vf1K=gzBGT7QB(Hqb z4bj*lJSyr*zJE0G0wP8uFUs#j5H%Wk9qwMQ!rAKy{FHDPDqDxNvO?V$8d=WfX&XZ$ z*C^qAobTIPJD8*7Cl7^)czb+Au8M-4*^5|Lv~2yuD##@gp%*K zIGNoc5seIC`{ELrjE6Yz!1Bp>7}4=CvQA5^<6*E_LdL_~0}r}c;1qfXU$S!LO~z2?xgHjU;}1DhM6KmO@b3P*p%>l4g?7q05J;5 z#_!ZJtIaRUAUR6jx`aBgxO;Nk~6!Q%Fh%r;wBkP9Z57oI+AE*pjWJ8YMV|q-1ak zNy*?8l9ItGB<*#6rPfQ;+1V;AeLP#St)WSs;q9Nw9B#V&ZV@=Dd8Q5{YoM4+tAbz_eXTO^*7>G^ z3i2UAK|UlX$cF?4`H-MsSCF6}2ND#h3M|Nj1O<7Jpx~c?1SLPTE-5BmbpR1e4YF?= z6qt;DvnQbdGtPkmN(N9sNk9S4it}E+Ru`!)J`b8RQl|rsSG)k`ex$F0hDh-r7*?-g z^~IMmte-?~=wJL6!}j9H6KdGI_*@7 zCNfZ|!NnUGuTiNX#aENs=RpeFa8U83r1sUY6N-O?;UTi0Qe%p@F>KI}g!80g;-bj@ zG`vF%O~u!f8m!c5#mh(?pwz_TYZ-6IOTyV&{3}uiva~!DS9}A>gOpt1ihoFQD8Wy- zVWlg6l;p4isQhpPaDNHKWbx&lgQhS6o%BkWWk5&0uo z5-(AKa=Q~bQfJ&x@U}T5a%gm?mx=jQt_UnvCMd34*qh4)s##FHOb|`^UL0V%QwrQF z1(Hor+*WlRtDt*HN9so8z70dS;n#i*9 zhK^{Y7IOF63NjjLq?0eGntCK^psAXAB1$Nxq%F%?K1b}P@y^HiiuQA;-Ui3Qs zni3q-T_4>?GhbkuD<$Q|Cpe_LxDZWcTwpGfIP!wiy|+`Qzkkxvr&l${NhiWeDa zTw<<_Y(lgo-vCDmIp%_+<`r@@B|brpS|PAK27>^ZqY--ew_$K!ip)sMuDP_@n7V&8 ztv04@X8jSy@Q~Mtnvb~0F*ZE+6?{S-8LmJcSsSxwZ0H#q{39nE@bXcd4uL+3%iYYH zJB#vRH?!JIvdp5~gx2bQ%H}`Nv6Zs5Vu#AP=u-^h4wbpsu9Ez+5GAFU3blZE>G>C9 z-qk`hB-5hFq`ru1j(!m%kmP%o_>P0A(hTl{;XjdK65}EX8}B7JIlU%G=u+`+ zQF)YTraX(7FYYh^MiwXb{CbJ+BkG1A>L(@Y1dX~>(_z%hC2BLHiZj%GnwQvtsGEbR z*XKr6qJ>d!(5PN&6XYKAC13VCgxxAliE&zDCB|z_E78P+zA6c|q~}CEZ!6LYF)dy~ zm{y2QcXyzq7ALr{gRohP`}C*>eoU{#z73QFA3OJ z)7wkmPjSACo7?edI-i$-1o6+RfP1-eZ-eJ!;0)jFb1zfwcMz~P;Fixv<8p5ZeJ(iP z!K2kaNeYEM<3m{<3@-!msLZD@AzXY>z7ff&*P-IormuRqhRfO7Nr=_Om}}VxMo7rC zvhR{OT!^V&`4%Q4;iGcHkFjvz1J+~iUaky-RK-{3s`Sb{mHr3Rb;z4Bj4J)$BRucH zTXdj&8M$Xwde2NP?~5YL3pISWnc7agjGW~XJwfuXn5or0<-u7lHiDe{qIR08C7Se? zkFi{$SaYEwR5`q6OCF<4De2(P+fe z$(<648bEpaj)X@EZ>b7=gX!8nKj#?n7j}`}j*6Y_7Rp`LJ&O6Fa5VFq{8uVObAroeI!Qs1U$p{%QaB*(~eY#B9ccN87btV zW@x0WpN1M@g(op|l;a{Mt~V*9c@sLu$T$WbuHM=K=u%#OYYp8gMYy)>2w&OA@5x5--@^|p%)%=JI;k7 zofCR`VajpsdJkRZpqeOHB~?}Qujqxl*1i8sFZ6XUw{CG2GjFTHKc;)Ne{-pHC*8Xo zH6CnL2y}1YyZfyQjqlMR>6gr-yutHMN&I2{s?%;?gLXY z*axO$un$bhU>}&?e;F^NWe_^quEPu#e>Ak-9|z(?(OKP4^h|e%qa^I8?6BAlHW1^7 z8^+BYm{Ta@$S_Q}n{{j0u)`R&B{6}KhaJsM-kvQ6Vl7LsUpLU$9X%< ztC_o`6la~x9WTX6GIOU&aru(DGo?6|W$qg8sxWtb>5RbLpVMpNkHhFL4gsn}mX<`j ziBL9=yE*GFri4w2Tj2X0JZ1AQ!g5`I;nn$dGDIVb<@YlA+Dgg6UUyfW{!{ zNMCA5YVHzBYVJ5CHFt`Vnma>D&0RxD#qCRajL6iISZP_Qq$jYpA?bbaeHxESI#zf^ z(lwOyJCyWvN8YVqI{OZh6w;mMOA6`CT|(*19jA2WPEk5@XDFSxed$_6j^;!Sl4kNM z-5G2JknSk>OrfvTW1H}bbR(!mx+&e+j=b~0^jkcrM@Tf+mktt{yMz*%J5GtrouWkI z_9Z$;@@`JtVo9n*=d(pZq7Cr<1s;{?V&N5uHc+CwDN&~*@2g;%{Z)|&QgrwdK?-x1 zPzrIo2^7M-Q`(`rB){fFJ(6HDD#a(+BOt{H_)Ma&)XQgtSL+1|%*~_}*E;gf0n@MW zpk9!3w=V^97PsbX-f_+OI?1Csag#;WoNr(+M9%lZ_h~$u^B06y+Y594GIPGok#{SY zTA)6WGjh9?Icsj>U`I zS?}Dtn*JH&jgxApqKU{sDI8OyTf0i>UF<4D*j4&F!bG-cwrosS2}ErmM8y)b^pys3 zQ)kJfRl_|(#S{D_Vp}~rkK8CbkO18^d5Ly-FQm7?(c@)uru(?$ihy&RaJD4Zz$dkc z*D=kyPm&x{c046IQxGgRs(ESR?N{!M#`eDpr;^!+7f@JiRx5uDJ``Ad_Z8nJmW~qv z(Fk)W;pMTxltj|MPDQbVLUJaym3+U6Z5=Y&a*iAj&F4>SE583%ZB}^!y}_T%eieDU zbJ}Qe_P&gBzY%xoah~^= zN20MI$e}&2FL0GNwnxt6Gy%y*md#=LK0)VahS14lf{`o4ISyGxt~{Q;ZFF8OzN6_} zF3v9?D00mM_{}|W9LYUi5Zc1@ZXi!+C}Z9xPF}?t`5K+k$lHwHh9BH{cs*)Z&LQ{G zLkC6qhYpJRxIcqYz6Ao#qEaLE$WKw+NImjXlrU0{{1lZLsYiZ_l1A#0pQ4nJdgP}l zZKN(F7gZRkM}CSjM(UBDqDmw6$WKwV`z3_)mz0WX-EV}{$?T&1LkC6qhYpGcxVxo* zx};Q;f9Rkn|Ik6ve(raYvMwnV9pK&(QhQ#}aQ9tFN|%(1j&iJAzvmSlZKU?RqWnV# zMaQ}@N9G3hylCW$h}es-Nfwfe?kZsUq!SjYN-bKaCDw)HqI03BrSK6Dn1F0jUEhbf_UyyqKIrE*Gk% z_-KY5s5#UZU&0&?(i|F#=Q3=VHibdOcQD@YEfQ}?@!v=t{)$k;ihoS%gndvFtWp+N zG2UpUMi#GQ*che86vr5L`tcI4shGDDgjY>tiY^a?R_ z#;(Hag~h~~zp=vHk`|%IGdb+f@5=C{Ohq!UvPci(iuemaRCO@n30`I;LRY{&3?ZW! z`V|nB-@p$R23e}BnfY|drYZFjIDUZa%jBS@+ydoVs!PEA8bVHC$mQgp%R8@-duR3Q zNS|S)2xGC&8KA|kp-7GJJRDCIMRHA*6bjZE)A=4AP3sbldiWG;XZ4W?J|F%o@Gvdi zb2r|TwCMQ-JW@PM2@!iuf+V$9FnzhEdbZO`2kIt4FnrI71*>}lFACqXA{RO%Yp(VI z#yFq;=jO#YCnv@{jUo3;^;*t;@0{E-)$1B1yqAzv$U6{Arx90n0;Ks~G`0gmzK%-T zqthJ!2#m|FZT#QHZfg7VT&~-|rP2?(ANf(X+Mlz}_I7NUdp*j*rH@=7Q6hoONc}Nz z;bT|wyIFppm*1`O`&;=Xr0tzXgLf}6xiZ%uNqsCQxdc-Iit0UrOqurCXURUNOCTP6IPbW6EaBDhKScZeVI-jtrc8a=&sBaS*C zjkl0wPfzc;Np~kO_wTqyn=O540zbVSTjn7-E&Lzr>D$@x^|)hiPUO3jnQECEjudC) zq#AViQDmwnQ-zxahUGa-L5H7BrlZMJ<5qy-{v4*D!(U0Jfn@6E9st8jIZQ!^UrVM^ zGVSfQfuRh2(eKMahi9jBVKVLKQea?*^_f0Mhd&JSxgqa6Fj^yS@Mz4?K8C$fNMjL_ z+@l@7=L);L*_)oraG`@f&}Fzhh8Whb+hmU+ezaHEodppd#r<5akIZPPytn8u#xL_ljqPRpT-`WmizFoLQ3p)m_3%W(aJDh z4>=}3PVT0}!fBYlO)?*(owziI$|M%$Q1$V18NoOk<8uK?U2>TwLisFYSZXQdD_8l( zrsk2VP-;x7g;YkV<5F^@vWk=&mpX(0s)cAytszk(L`&*PRz)3g5iZ(F{UM;_qOE61 z_GKWi#7gbRA=h=K>}Y2Oac@9j42Pg&Z31ZVOGyGwhWr9BFq)5*Onxidtg@qU1qUt=>mjBN{F zgzu_sgkRPCb8!Cc2)3JW_bpvj=kTiaBL_&$ukOP6mAw(t#K>1MvYc|kr{ub-=AVst z$F@tnm0eY5Gv0BGM|@38K8KMmWTY{g<1$2=i%2JZ0->&@N^W&OS)w$1l}o^0J%Q|U zS2Qhe;^VTrAZ;|le4-IX^iRjK8P)JZwC=?i-qUM&_aeV09j|VhhLEf7^Xh(W-q+z{ExuvJ-jQ7haO!fWf@a0+H({e z4(4jRQn#?F9YZaGduO_;HX%Z}D9YpK3Cr7^<)SE07=Rwh`(eEFXasC$!aro(lk{zD z?<^NpId%a;U30mp%2OoL1g|Q#7uX*myL?0e$628jr-Rd!CG(0#7&TW}RzJkF@|0zb z+-t1LveuL(xoS;WexGhrmUR2dvX08Knstz`EHyn#g-=3t{LbQMx!uM1SDF!(C;Y;wOp{siiMKlmA_ zP@4L?QK14j1%AF;g$l@2721;iGsgEuj+VPtp#mrcZn|a#l!iT_PtVBFn9!#oV%@D^LR3!1yM=F2$e`YN(FkK{D%UKLQukr@*iW05>Mtu z5S6dv2i(M?q3&6g3P_<6xvhfSGr)P-Zn>v}o05D5oDY%v-IB~QNs#t6#+~>{G>_to?$&q7T{V)gLKSGaD$uHl@G>pRwnHsiE*SKf0njnjqEwP6 zBWOM&3kW?ymE;a6NrKQZ^CjXNovMCM+?#r-rD~a^Ou#u-W<_?=qF&V+Cb+X2Jrik} z8fCK42;=6d(MRF2do@ZfUyVLax2aLO^VKM8V)tq^o8DV4o1VJ8Vix%yQKO1PuQ--! z^!k%MZ`x+<)Wu~zY80=#2Z@HzNE^5nNKTjcs8Q4hmEPA?@qGw2DnRouSv9&ADY4fD zYV_SmG*^v6aelB_+(3=K7ZR0eTbaZaB)XFtmAP6UiM~sXZscewSW_l#1&PYMtdT&X zyHcZH%2%V!Ipj@Ul&?mK6@QBQ`V*e_KxjEQlxmbXwBl)~Q9QfGp;V*f zz8svl=5x2c8?{o6Qj*Q!+(GUvR%|syoP%1aMwxd1pJHUilOxG{q)j!-v=@N$T5|6y z?W!$&6?r(cY6rY_0;BI%qt)}CiN^Y&(Y?1CC2Vvp3Q$iR05#>Bt2ZDh zRcv~yVAFA`bem-6ln16h01~YsCd^lP?={UzE}gbjw5Zdzh8#mbL<=g3=(MdM(L7|U z>E%xYXVZI4kf=WmEXek~k?1ZabBVV@-oWFjLL;Ym-Y0*KJ?yBd+C8m8dp0@cP3G>| z11h=u*#FzUAbv7dNZe2~M;zLwo2~ODJXr7N;cOli#`c~*nD#SwNgp5>bI1E&7&dpR z59SHYo#_L}WA2(h7`MfZ^OkxzTk>p)ud=KXayYww93^Rr|1W%>#gmXTmIH-XhYT`A zBNOCziu}%$-?{S3Q`|Z;Buk>bc^9%fnFTw@G3GX;dET>9FcjuMzhEegxl33WbH`a2 zbEjAsb7xo>ar=cCDq=Us>yb2**TNh|DN&eX;4_`RQkap#%fj^jDy2J`(w*$cJ0DEH z$AfBzL?`*uK_YYG`^|wnPKnGvMTx}iOEgyUZjP_9BvqnutT9ORFnoWBMqish10cSL=mRoKGp*9eL-0=_Nd<7v#LymjXG9TXQz=xaQm;c{ImYTU5>Y6Ko~O z`9AnQi$`<5LU<+T4Asp{=KNVl-fdu-is2eLBe#{zS#uL74qs_**Gsz1@fxs_U30rp z?i6T>9|WIq^p$enEWDE2Nz82mbGu9KN@xQUl>>4^Ro*GNH6^9He4S}|^7RORf1P|i zBG_LyN0iK<6R2d0K8CgA=cBQuNb6=KzelG#dz4I%lEE0u8@7shn2TrmKG2Gx4B}6* zwX2e0>nwUsT04~t4=DOdM%}7p)U8TJ-Ku2Ntx87Ss$}T)N5LvnG7nf*+AsUc2;3C^ zC4Aq(qy2L4e^ANDD5RVGRM+qZAa@tbccAE+5|r&)Egy8v5S1~;k=@*)Ys@XW#@wQ7 z%q_Y`+V)O5{k_+E}j%XCy$*W69%7E`(tMc1qZQ`s-1_94+2UpkEP z<`!LJZqYU77F{E5U!s#t*F0uPszj%nuGt3PC^AxsTC%$4P>%BVQ=;jjYf@lZt`b3t zHeVu)_~sT}BW@jo&D(U%4AV7ZEE$#JEYmeJ;CmS!mEydtuDP31e2-FGD!OI`n2IoV zs;*h+OM%f}+?um_o32@8y5?bvsyTO=uK5Lg-wAU5R94sY<>D&Y@ulB zb7$cbUIh%KrkRJ2EEs{o4&zM02noShjN6)wNcFj7I{8LQ5bk1{xyW<9m_&T$95{Z#z6`)_nQ#uy~ zm-}c_x0_e|q6JtA8NyWpH#POGz?TaoL&bLriih)WEf917gj{Tbo=!nIU#OC{NV&(W zph`5Um`a$KN}${?Be_o^sk891D5~rx8oH^K8`;t5$tX>Ab zG&ga&acQY#^_MD9|CaJbz9=cC>^O8&%SVb2i+HjW5j!PdZ&MVu9cCu?bK^BiUX{6J z6N39BwR9TRtS>={ahPbN-2V06CqU8)=99@iF_XzVF~dc!kk>kfqwH3UvXPgfv4*}D_Dmb0sy>iK&-13P z5Y5r`a%`Dwp}{E2z+jYB!baI+B*aEpCHzr#j09yc=At7OD1{6EIOY~H4IOifHMu#7 zM&{l7V+bfq(AkGhH$Ax;WAQ{AixWCt%+h{arunt$Fd-DWbR8pGP^)%g4YDChiE(8O z0UwUUrCvZTV}6BAhj?@_DVL$6H9nIAsPu0)B|Xz;nK^eTcDVbaONyUCz6W6gw(9uO zUj?10f(}qYPg6mK@&y%wN0(Jn4KqnCT9b;ZLCtCJ*ErROhokB~n$6gBBRpQhBN||T z`f4Et=N94sA==Voj5&T$Rtun@KvOPn3x4MCB0w9)@jT$mUrG;ok2+F2fY6=J(#8EAUQKPIY zieoLmiN=1uO-pgG4x;P2v>1o57~Djs3M&8n;WifJfmlj4y*Q|w6 zVuBXN7}s^CE`lU?Q4*-E5tIbh{6ea9;+3PsqY26g1wC5IHbXVjNFmxlprCRD$xYLO z9wQ+vHR2pA#B>lCkB<{#D&n9%jwiumO9(>}vVqJ^E+@)c!R%$Mmc7?*s+V3bUd-!b zl1Q7XemR$fjAycjn=CI;mbwjl3e+M(#!JWyj@V*hyoU1bcv)-zO0E5;I<@w%V(p{K zqzx%CPHSF?@mlXfgu6F&YP}ozSf|#zksCX;=8b%~Q|sQy4V~%DES1#l3XyPHsc8Lf z5?X)PivQG7slV$;pa>hWwaoi1u1R@SU)yvo!c|?VM)(dAU%WiI6@}&tyUJ|kS!#{! zENx^!C!Wy~V3M-`F$ds@~W{j_Prq)5OS6_j&QrL5(P}Y#< z34yl5mwT=dXjOcl=LumA>3kuqA>XjjY|hSi3;b+J+i(+mI60 zhLo^2Bm@pqTD1xp!c~DX4jDC4Tad9n(4{TNkJ*(T&f-X=4iwR>1vQe;7POD}TMOEk z1pe|cGKbdPVdPfqu?=}&!}k7&n>^n0-uzQEHVlP74I|?owOV?v2+YICJy!&xwSFLs z9Of?YbEv3ejxCcdG_YD27+5VznAH-K5VKm8@U50U669MgO8HicQuVN5FkTcWg|Ar3 zoF&sY8%DF56Q2*|T9T6V+7i<#WN)P=CN3t`N2#X7Y*M94jY%vb6<2Cx8LzUgL>kQ~ z-6TB8K_F7Y@#CdWfMqn1V*v&uxgwtkEg@!6ilyS2?S$wwBiD5$#4s{)ZC64}BO~wZ zN}S5Pja<`}5K~D=d`nkGC=0u#DisNjFb{OHlg&|LeW!M^x!QWxb!sOwa&4z}G9&No)J|sPnojLxM&8n? zolHoad6iCPVXHf}lNotar?ws=S9NOpF>+;R#U{QgX&+)y@d7+;A8J!s`w*K7=Q*r> z1XdNR(5$K*9ojzBskpp{A9!kF05hh-z9{`w-JA z+`YL&+lPEf)LHxJ)Eu;ZbP2&J8ziwrMcLG$?c*{Dv-a@`A*_9TQV7oNpm0ky)<(uc zE4W<3tbKe+2x}jo7D88HD*49!nI4YGGFnv~50@K@?;M7nw)+mMXD0fi5%sz}tRekDWP=)Ec!BS1Nnuc2 z?Jmt~R($4xT*XkTEiv;TP{pJYvW{FrXIU2u(p!8lqH$I_AHMPF3$Q^dPABx)teGfG zf&@OH9iMd}s4@wf5kGGRHqN9phtra;F|D*xO{p!g(k@1%@;_snKA!Y45MKF8{8sEA z@w`jmcQ+m?5gAf2D_qT>5Jj zT&jPo32OhUmEhK@B~;qlR-?7H)*4&8*eds0O@?8=4iPgQeV#*>*t_V~x45)-84P#m8gvg0) zq}B;BBlh-9Xl{{P}jXGi;Vzm@vM#3QEy%0ZrQHAA{I#B%<6jgxR zdp<={Sp_T@r$I5Q`a&GK8tT5Pe$3NuPGNUHF56H!3Adnx07~fpGVwZ!AL@&KMw`d) zu1a_rSv*t;>W??K@2nyY&}{V)q+EN%G+}^A-oZ^6XsE5G34fNN1bRjnPJ*sA?nn29x3?&EK$!)hniSXsghi8WT{ zhas`X%2H;?S1J>JixOY{w~Y2%QsPrp30-h!7u`i8eh0=)HfHcC8sAd_SxrClUr_93ZErEm^aCao%g#{~LBS+gPEYW}C7!rXw{Wii&m4i0Kj{X2$%B%{8ZZVjQ6qp!NQQ zfO4_bNvA8Q6xq~s*$B*&(gvGnxHKVhq%m2BRHlo8ww*Oz(DR;`Yi9oc>WR7o*7gItuIQ0W`=i92-7_#7#+eLl(c+D z>`N$c9}2q(qe6{JmkwSMcNjM}@=aLJ334}^STIqV-HZ8o0aYm6Tr|V+{aJNrE_>)-`~3JKAnXv69vHlSO}r6gvlzb;23| zB$Fi6wxgXW(YB+8FncVYaEjSu5yIYMu}J23+IuWQ8609~DR8OTN+C*ch}|?E5*%W8 zy0msKjJ*p+a{6E~w^8Rpk*%G^Kt@xAKx(sr6kD=f6b9^P9XsiqGsJETlm<)}yD^9xVC+2;*3L_$1(K96RzwJ6 z{Y}1XX#rETlOI2@QzxBF)xb^~M=-h94m63a_fV?1C$DMBw(p{zyv)tpzRrb6!IEi` zvFi-}b1|_%I+QF%z9%p1r!Xw3W^-Vc^4uD#8@T@&=N=d zTr|}IA))4)w+Gb+;y2;$?=;@oMih6q3peQ zp=<=9lxTYmqM|dYCEdnw5es9Uff0X-j2i5X4Iqq`$Xx226)mATQP_uLUlGN`jOa_L zC?Rs9C1{t2a-$_`7ixMmdk)S>UyO>L6MPQF-x2!LG3Tbw!ZZxAoZlFL%^Oz|bW*-Y?0v6g~3FGL!Q zDsMKcojWKEByTr63y_9=T-j`1h!hY4GK9yWh29IuW|9*Gi8O&3lFvb!zzi3GK#J^6 z7mA-UFvDs*MRiG}Z_rS(KW%)NoKK=TKx}sy;S_LuY9R3-d2XG@`iGt}EcrYvo;WY={haS%Xy!@}KB^)inkPiF>CSu+qCZwihYa~{m2`0Yx$dI2@#t)>Vc5K! zW<k06e`|7nu|`%0rmP z2BqR$?un6#!A#JJx(I+DS-#H-Dn?`R)pCr*ytRX~Y&O2{*GJ5D1q|0|4Jz6Jei4(; z_6=xA>j^F5{gT{q0r^qwq=14XG#FG+Vlb!>!UPp>aEb{kgs_8(cR0xoDul9w3ZZO( zpHMcyPs+DL45E6jghTB1M=s9>_z7hL{DiUrenQy*KcNKR_aVyoC3^QJequX7DdVE> zO8|b;N$X*7LI6MZM{(3Ez|A;nVS>?q90M2<5dwQ8Ln1<0PK-1pA_NWz42cMVU6dga zA+Q-@(hdoP$cZisD`qPIe%E3uTpNvmB?h*Ut$czpP>lLw$PBxBm{S4x89OcjzXgt7 z55f5^!qd;hi*@Ba4_d|)^E#9}nNKI0CXWS4xKsSsm#85?XpCwG`veNBgkxT}s150TD-Q&Y3ddJdgN5Tgoye zm&tUYOv!mNO+Y=FblTHthP?4~ns!-{hTvu#vlFvZ!ZD>vnQu@U$TUvF{FGuy2LCzd z!+#>hL}TP?={W=bd&PKO0sk4#E72HDa#0&cV+5qbb09e$Q#+qBUYR2@=fZ?**&9)% z5?+~ARSvHR-!9%$0xWncacHomzpXQbMm;TP$uT&r$NZXd?B>K(fbAP zoD2Z*eLhD#GkU*^doS}n@V-!joCi4KStJAicdRf);WESo4)&XP$B>BiScVLVh>m5* zkO<;fh75@yj%CP@2;x|V47t_BbcVdPN@U28TdI0L+^dt`K<(y*2@}Koqf+EVVi>Gb zPyoU)3}k`QKuQ!t%R1nWiDC{@8c2y^jGS;3gJGmJuvp?4BPR?3wB>{$fEcn$krM*~ zd>ACb6a)mg2x+LCL4b&iSWXxMh=cj`94cQea(O2`hpcN@E*JK8C76!#BuCJHCI&O; zzgsFrRs{WLWJS<_MpgvtZuPK8?FgLcxO|W`G?g?Q7_k=RQ zy?eL>8@MNh+rT}cY~UVI2DnF;2Dry}1-N%V?gCOpz&*MQ0{4gr0rxm*kwEq0q=sC9 z@x==zz`cj@&_BVWPw*4}BM^>WFXMObJ_u`OpV>)o!VjaO1i9xCIMA8YH+=h?fkHw6 z8?*?|Q2qn-43H#)$O&QfM}Q<}$uk085n@KdE@XX@vLnbF%w7%KfW3c-f)3*DPy15k z6%OYJDJh#u9Vyq7rPNVes)0lak(1!Sb9MNMVN4L8HYG3#uipSPn2?0D+o){R%4;|@ z^&}_j>4?weA>qM((gU-KU}ItCab+{43qlxV)_hKxDNr0CJPBu^lv}7IRAanzZ6Lvo zJDce)TEw^+yzl{4KaQ%Y+VuWXHNoi+J>kqD!*F(nS1p7`5II7as)fi&_!~+}q>@ne z%~TRTi0A0@8Y0by5xPKnu%dE1yAOjSyhD5m!3Xb@nt^hwAsxEQaQMm)kpqk=5MrDH z89-Tlsdm0y6?(^Ep%}=)t?WhJrqMXv7=T2*TPC_7BiU$C-|yka|WBK1}%p zJ@^P+qOtJA|I1Gs^x*fHm`~F1ed!!p0pd}^r0b{+Ld-lf0VNA&a34Q5@63_7!?pjP zsU2-_^d5KyJ~WlsNjKq#N`8S84gT##E_u3CBgD*vA0p>3C^z-wWzJ5!;H4<&Pq>{j zK=^-HnkX>WpBrv609J^cgigqL7UhOW{3=+^FHjDZan3+#&|fG;?F8V9CE_D0i9%Bm z115nxy9Q7E3qK5c{RcflGVrlH`(%~CUjJ!Y!LU~$AcVcE5GuG)+k=BTX@cN&bjo87 zR|)8@lT+$^psF7u(uAf;@z54L)Sr;H0^=hvTo{Cp(YD>p^LJPEk%DB*Id z7Az1DpEKvoSs1APG_Q!`hVU?*g&^ipWW4!oY2!fC#+ytV2bnr{m^Rup&KSj=)k)95 zW86vs>QQxrO$l485@sOBFe;cT6{H@WB%!_}nOs|{`f*=eT#wTuJrRmdmXIhdMH{Jo z`WzY4cZ7{ERV6%xyMM+HjmaPAE?{g7e}0cgBu6l9LXa$dh?34lDf7-18SqO<0MW4w zRLFR24TwoHMC#7JLGMN)gF z(*>Kv1gejGH|y86eBWSGuQS|YY^o68Rs`mc{9hs|{D9ZVS4Esx3CH{m3dj7N6^{8k zD+2R33qHwmT$)Q^uZ0!SUk&Y~v(dPFVQWt7a$!4GC1Sa-9rFi$IHBdjb0MM5hspJI zb&_O~gd*%+j$--pgiDEAzV!uuO;5B_55aFXV2~y6ixOysLc_I2TS#GVwYGED9b`61j#}Ap2 zJT7vEBlih+Ctag4L-vNLBuF=j$ve? zs2GEjqX$t;Unvx(f!l7Qj>n>uUSxqfb|C&A=M70>TgrhX?%;eEwqD4XfdV!0^WMcw&hvUN$n)bBndrDwxzRZkJy$jLX@&?=}LrCY>Tl#Vp|eO5y`f& z^#K}AY)dNZCu|Fw9H%FWYzx0Z8}GMc+rs+@Vq3)i7~8@Ih@ip?sR*_$7f4HN+w$zN zPWt!wA=@%j+9kGSUC=0uktd98F_TSWTgFM6u`N4-&&W{**p~Z(x7g^3QG#tTR`29( z%ZFsf9XDfI-NE_N0vO4ZPI?_i@8#2NTRLrDK~CaUCu-{0;c+N#rycZhS?e{rb4JGw z^g4HIA$~bKbsCD~a$MfjA?1v5WFk8|@g7o~cXgccHnMl@VUEAzIZEwmNPWf&L`E61 z+Zn&dLmi_H8Fj|v^lXeFyR;|$sFj3go>&)K$r@B0h*%G#wE2fS64 z#=pmINUQTO*_obBl2VdZXI@XlFx@E$F-%W72iyJIOmvIlP^J5QOhrX6$La-RVVybA z6t8&C3yckkUW&801wu@ZCL6aSG44X0*T?1wc~uDc_fxjEJts!u!A#dp~JCztccQEr`zbYPuAKe zYbSNE;8U!EI^QEhr=4WvNJ1%~qG?ShO5{BXeyO}7VcywIb}WR5l2;7~5ocaCAQUz! zs0fXR@Qnw4(*RvtJF!OrQ^5(=PTHdg5<|_K1|*+LCWAfrp^@fI15!55d-0nFgj#Ce zG(eQuu%Jt`VIg;m)+0!h%Tc)OY4YMSiY_G-i=j)r(_S_!VukWXmw9QLNL1V)ScRn& zxQsvq1`}qYqJ{C-<7PhJM5p_S1)E0;SpDUCR{W2VV=U!>l^R4h`HS~)(@`Ro_6JHr zezU_cIer&z{Mh6_-_GBwPe+GiC=6RvnHN5WEiAnnKdNjw>NT6~cLr$noL{6v2#wwo zDgRQWmryZ;4DIzGYMsT!ph`X+iu@LbuOtg=BDG zd<$hVLen|D_bYT`Z6Q3>RpOICpr=SL(VkA5%(hQK7&UGpD%?T;Dr46L%7$Q?jiGwd=I`Ou0NFFJlq{N8u%dI(D@mq z(MOu81Fs2D9f;3ErtZi@BmGOc`$<)AhYQuCz&E%+3P|JV1;r<$=#fxqDsMa` zVcRKwCT{lRn_!ta9D=t>*1ACDXRCY)(u^$4S#Jk)9eVTe`{= z4tI0Ygvg1T6>NqagP0$;GT00`@4(G)@Vbj_q-e6k=RkUe8>wCqMv6Z7YdMPNkda!r z2=B(u?4;jCllwp_+IL~vjno&vQaS|^>g*v#iX@XHG-#wKF=(WOFh+_#*lF!FMoI|V zNKNM?8?-G{KlA3*qfFL9b7GiveNi-jyQDi4g)#G?V3X6})!kx$cw++_9`ZuR5mM`P zd7mRwI0eJ6Ol5)sE_q+0q?z|M3Nb_8)+j_y>{isWo@#-4;UJn&KzHM2G2LYQB(Prd zX$yw+Iv2+74`v~Q#TZ^Ey(ANa7?Oh6-`H6glPSi8vS6)L4o{g+TL@GaZ#5+7ra3w# zufUX}Q|8kaa&$^ylX3oz2)fBoq1iLo0OrKLf)j~Z=GcaU`U)) zW1bljICS3MHzaWAY$%xowEXN?@*q?Y-bry^&}z;x;XC7+=Q6P{{;8k|EwGb`F$x-^Ih{`6MlE}aLw=lYJbKX)F@PaRwEbO)!e2rmP%zmUZ*1@)OnV89g<9v(4g0$#Guy^!g!r7oMOC=5VqHe;w0Pa2xT7? z5^CVFd{Alho$xdp(Tt1PKmIr~3ak`kU5a>luFFTj@% zWd_qo7{}*`&kpk3I5}}La#q&x+?{gN+HaoQHXqzZXrCvRUvZX7gA4HhGT5rP&jApq>z7ZZ#y-IYGQ8OC}^V=rt)Z=rx5f zUULJd7_TXW?KP`8$@ZE;*ULH)nLh4OJ3`v^#s)kAX$h`31 zka$-E`*K6#T@CzY4MVtdA+N})xehKa4m2p zWQ`dXK;DCFX&$GTPepi`FrNa*CxQ-+;wjWWi_^@f0A@2mQ(V+8uG4%9fL$lO#z8&> zAkNc#3P7Bv`4oUSPxC1NcAhx7NKc`KGJQ0k0ubkk`60DkUQfZF0*L=D?0p6Jdg(>N zaX$&Hb7rqCxR*iq-~`vuJ$@Gm2N-KbQgCvV0}Mmr>EAL7tr?fT3%=BEk}oAQFHT5taZZZCfFPu@yoX zTVbBEZH1)Gl(9EySXAM$HzXES*j5-4hx^%981lYAue;I4BNy9a&#MI#`O4V$=gye1 zPb5OV(MJ)}0O=?O6k0h@(sodw3HA))G!tl@C24jLdN!xc>s=ol`yqVCjQvn1Fx+Gn zhB1NRrV58MLF0=GlZe2Xl7Ni8i_>UT1Vft4#3Hc@DNOKqL~Q$A4O=bSes#Etgw>oG z_TJ;Z;jo&1wEAv;v!h?c83=*Z;Om5l=q@hCd9~b5Iu&Do(dmxp+F>;j5ncNk2#Dkf zMRW|SnJEz+NhV1sBD!{1jq_NrnswmPmP=t9fm8^>YQBY=MSK%Tg;rrTKSz!WDF?!@ z7O)yB?QfI>j}U~_+>0AOH~D!-fM7Tbt2s>usO%d#(G&kT z=)-i6p7@poO~_8L8p?Xhbjfax+~ReopW<#c-$iTg<_82;a}QmI!D?=y7E-BCawY?- z`6(V9J3|V6mJ{;he~WuV=pHgZ$MoQct>oQct>oU}7cwGj= zYUYv8?BXQJBnh=wL3B8*#t^a!q6HHot00Cjs~|c8R@0S=khP6&QkuYOUPV=B<%voP zXy2esqQhY|LKs+$5N3r`2m`B0ML{uWH|aMY1GaXW#n=H6uo^=dSPfJ5I<^p=*p(>i z18Ns+!r5Y-;+`XG$5FpT>+|E@2QWrL!=0F09-1{7(9TSz>*XMeP^LR%eRTIZw7anS#CH6)+~S z4rlh%B+Vl@Iw5Ar?vD^TakrqBtEd(j7lYZG756Z1`spTHC)tcNz=^SJBNoQJ8q7j= zBF%)bygVtd%qxg{&(6Xt5}Cm)Sdkddgu#zYU;?W^v~V$z34_*;$wkygJ5vpX=RIW(N8UnF>Fw2g5;B~|A;BVH0b8&!^FiPl!G9Wbhj=I~ ztkZ@Ud#DhiCS7bVBWmspnrHD*K-4_Nx2P`hN3@B8R){}ZC@bfaxCq*7L5f7p2Hi1* zQx>6H22q2aPA`z&GJ3`dL=EmupnI_0d~`R2sF@pys4=9Cs4=9Cs4=9CsA19`2O$ii zMhJtbF;5Yq2JLWAJDBGM(sJRs?C2Sui{~Pk2bd|I%kW%0m*Kg1F2i&7Tp>h__%1=z z91ikaKr-O@KY~18#;q_s=aa&KPw{SrymHm>d?jZyJTDLNJeGJ(YDT>6DPfeE#6?9Q zY7Au%HHI>X8m4SSjSyzOD1<@O2w@O4Lgd6pjfC1UKN&aU1aC-2;<<@tqlX=75K+T! z&PLP-ZiZNmhx(XKvJi`Fg-TG^B(C)o5H+_#Lh-${#SX_si#zFAVAw6E+iSKXY9jVu z+7UG{i6^xG!ibu?#A}jdl7t4m=I4s2p~{R8m3nPN4N(SB!+BQ1mqpP|Dc&O!T}bGI zXrTli}ROpHX-Flq0S3t@K2 zg)qD1<|%uZT+$4p#-!PZ8bjKM8bjKM8bbn6b5kMSSxIdKLne!J2cqWtxEoJ*8BxO! z8nx3#)G&y~M$|BbCWNTDIA}JpmCX>E5Tb@bG;BBFl^8-3LeyN&&&}&SlB_YiZvoN3 zm5?>gGlrEXBpxQnufVV}hz5o7-Z?{PLWmlf{u$haO#f&$huY_I5e7HG5SkF8MrMTu zHzBh^gPRbCYj6|na6^b1+vW0`$HnCu+=RH?5TfQ9@U^g1I9@><2cqT{+?!7K-~`vo zDBxY}jHg%^iKsE8ji@oCji@oCji@oCji_PLM%0)z8&P9O8&P9O8&P9OAZjN2pxe|^ zmJEi_;C;0~ztAvMGFuI*qKb$Rq9(v;a8xF_Ix58iS}25RH)x2GQ7(!4R4dqDDY8Mlu9MV?TP7@5qJ_HGLuxHB8#J zLI`6kgfOe$oKl`lHQI-RkUn^GK(GrCKrj?-dOyEq)0vN;@`2RrDY zE_MkHM^}>%Wl+9uPLx7fx(`Cm5qPAB$%}&EEK|4=s$xjDX|d7H80SPh71a@qlNMPZ zqd}Sm5*gFgNiTYi9UYM=4rExS`2Hw)6qg7vKu5M&ASCm7|N;K_2cB*Os-KT!x9ZjJYPUx1=jcoE)VTi)y zpd*IHkR35RAfqwdG*aj-4R=iVc-o^G8##P&$6{f;VKhXCIM*x0x!xhp@$lKa?t}Yb za&o2!M&HO0=oc;t{Y4TILjo`$lp90T6+=Q}H7Fj#M&jUboYj$K{Oqu12L>LI$u)qyYrq!~k})4Pf_h1K1;yLAJ{DjATz#i0Pka zr%u(lx3C^dZktSre{&}Xrwpu4?oF-!<0ABSP~ppo2=KQykf zL&!CL&ff4O8D{HdOOJRItJtiD5P=>=QzH@RC7e;yEff^Mn{1 z;^mhp%rH(q!VFQM5hh&Gq23Xz5NL=`50gP4?C7p|iFjMyAb~7@q34eyc3(Q~v=F;6 z506+Vx^@2$1I~pR`q*PBcU&Zg!7*WJFR&`?`Ia93D1SiX!5#r`cC@+P&#;>#v;JW% z2)c$u(@M@^d-~7WHJqvy4eQrYvKz+1mR3|GvZYA~2`Dl2KNTd0YWXUu!GD&~_Jrf8 zxky;GLAgZ;6bfm+Ae(D@M@;WR?tq*HRQR|dO{6*DDc*_L-bjPen(ZZ#4V&gk6cDBY zwiOOH9tjdmVx}O$ya5r%a8 znv6QR>abA{69O7_Lt@ok2KvNT-Fb@NKI$!Y(!MOZ-ahKI_ZhkL-^x6>UDsP~#kRV` z_BGY@(3VKcb?Fw7qS!`Wb8RUx$KGAFy?&TqCpRDF*@>i`6B83)=|AK>vHB{G9sb>3 z{_bZxc3LY5GvxLjoH6rXgH;oo%U{ zDqTfsx`n30-6NMZBY`QA#`y$L53Mb6wnRRJbjz#`g!V$hmUFO+X=_-dHrnd;c`pcm z4OnUnnXyO-V#;jzh`9>`XY>82EhgUlw3mcG=MAKg#C|>t@wTHNsE2U{B(7nbphVgm z@wQNsTQNcmry|OBV%zYieLwW185TCH#EjXVa2*?rL41gou7=@azN{0?)_d0@GPY=? zvtcq2-HL3qCKaem%$8fa! zm*BM};?s@?!seBjRhob+q}rc%40{^!>L;RIpa?IWA3Pl=?z;3A+ZWG)t@J)Y%M$ye{S-&Hk}Lcq@}?L3BOUEker0c z&(YpJ;^fBHiX)Lu{fk`{I#oqEmS(i{yvOo0q6%TNcM=kwzl)f_%gDu7TRo@`bX>LN znpvd5Xp<<|ihJtr^E6I)THpN&)AQDxCk;7lB`yDj0u7jru*Xi%>A+C%5{@|v6XD=o zo=$_1+xn_3^Mv)`_%p39z!%$sdLka?>(Y-1PuWU5)w-U9#hesbgvo!5*y&@Ror?6b zt)AAgcWJT0BI_~s6fjcN>@(54kJZ)%QGwFg7`?CX?$>{Mfb21739$%Yehgo$CL3wP zD#DZ`Xt4ep4y3e?3Fe5W;Y}QEG00!EAv+a4u|vnNtq}_|1QD?9mK(K^&LOnI8fo}# z9}~(Qafa^8It6QI0??w7Ot5Dgt;m6iDe!id$iY8OTyC!=N5tkPRN;58P~iU6fpMHV ztHKqe<#Ly8ufQyuZQk#AMo#I46UQBod2vi_# zKx27?{_wI0DH|3=Y~ca|knSL+7e@9G89Os<1cNbRrjgsZrC)b z1k8y6zM=Ws1vM?b&NZpXrK>qXM$At*(e27#+F&%C0G&c;sNmr8HE*acdbhi17&D zyb_jvZ32F?DRK;v{<`xhVks;vU<(UJTkd^FGAvB#*}R5Shsf|KCtS*oni_@BsNoC5 z{|#W~)|uXNl_QerVG(BA3~wkrzzB$A<9QcFR`#q*^!vo%PG2a#=fpS{E_N;X7Gg)3 zyE1Ys+(8sYyond4gvC%_mkCS6bj22?usu5tErl0Q<{(oH_}PS(Uo)3*$|Cb$%biH; z|5?jEK?5WgEeueYdIy&e=*{H8;LhIE<(SQ0koXdB&xUm<%)Pc-`p-Vrd19P9Wwrh9 zwe+p8w*;-dT!b&xa=;*F|0{6H^>dP+cC*jR0$;4zzXl&nu^d;^=Ovu~>d^(io%o=E z!#QGgg?~iZ@}i}yy*@`cF=A2KstQMizsTY6`zn@}75P$d>2Or6@-8h~lv3)zw} z3CGyEHj@So%%6c#C?>nU}8q=*ZH| zhgG9vm$f=-o!YRgR^1b*)7kZ^u`)?#`_-sC6<2pj^>kd1>gQGmojR>i?X1eX>`R6R2%Xr-|B7jJGZD-J>tx}niI=ZH@$7$p-Q)F3DN1bI=exw%JZq!Nj}vl?P0zt zNi8z0LI%oo7MjqY9tcPcc=AA1QtdnyTX%_v8Z@_`J70NCQ*<>qgR^e4%F)(Gt9Ctn zsM72Dr8M=*#wxE`qq$eBwn+s8^TKmnK{?h&<`{r>hRSFy$Kk3Zoj5GruO1KNH8j?T z{@WM2tgqi!@3%Ta@NQ;NTz_0q6zL0>M~B0^q98&NBcu<~DAFe)$|8q)Z0W)}nM*665*beVM?{~n9qm-~^B*rfh!6{($-frhpB=Onu@ z-u>QGOR^5F&fcDrTt>f^Ol!<_sqRJkhvWA3_5C%1QoTP=>(dsi4gI~|6166+cDI)< zR_CeiNe}1;t@+V9UA^PTQycWbyF9tBB_HPaygIu{H(7(D_CEMwPO|D+!V-LkDoXWLMNu_r2582kfVv3t^-0P6E#ckYHVzL%^DV^Yw`blwJzxb zD?Jv9peuLhqdQHj-d4-Y_ug&Ij6w-<)>Ze&KOTx+lsO}0iwS*cMT<;$yAw*~ezcq*FJAf2T~)v5mt?5eG3_9fT) z_?Pzj@@qG1?}L}rPFLsZta??r3j*y^gR*qC^459siJC*dw&0iA8qj-457z9$?`l<)Y<+$Vcf?2V?q7^$CDXGOP{VNvvZF^a`N-SZ;D!vL6MY=3oM#d91GfX~@ zl4K;?l8j3h-@75c{hfnmj2JT8rQ-5-9LZH(@;+2+%9~Y*-qoyz=rjz}ZC1dIk@{_A ze-OK@wEI9jSe4~hJ@RnlC8y4N7I)sS4Cwef_`la)du`uUO{}N4qaw>udR%t2!U{*R z-{&h>vtnt5FyN@pfXjAgaA|iNykMvB9rUZ4v)ZelJKm4m>I6&j7j9uun_IYaMWOd( z8u!t??6Gdh9J4@mPHU`kFIIiFHRZZhmm*yY)vd3-N^MA*yIH$c=Y#qPY(hnm>Q}B~ z>e=uw57bnvGm|!^dVQ)0VhTZB^(OtPE>7($Dd(k}9}EW^#HUeh zWfTGgudi5Snntw4{a{*O=MUAoH1KQPp7j;GQ(fwBjw1EEBS}456{z`THJIS`&iAIe zy%S+9@sl;N+Mm99Ql=-@y@Xi1xW4*@Lol@31EzJ|54XMtye!Xa(uv=$&vm(U_PaM9 z!9esVf(aYvw9bjDZfb0x|J2$d)w#b~o2ELKtF>9Mx~bk&&s4Wx@7?G5xBb7mB%s`S zKlr{rp#CqQKY%%_QJ3%0iC3tlVE^N)0t2*9<HAL>yZB-s~wCOrAo)AO1V4Lr`s7;lqp{nnL2S z^bvIEMSPa=$@^8@2WojZ(`AG!hj+KS}3SU7n)N+*!!)FKMs0o?u z2;3e9@VfJsHCypXCDT)_x!y7z=Ph}BoDU(Qw|Jk=S6%8;>ywJT z)xHwfLe(W{h|A^Mt?M;KnmZH}X0!_>4 zI`N3EI8eB~(3h-#cBn}w<1#r}zorLhKmIplc#7MLshR#%Ew&ao)e(nvxwA%9>`_^| zycPjo!2EjI0o{95-5AJHUa}qaRwCr?2Ru?6PGY21`ur6uPuDuk#PS}8nK zgSV+&7%KQd3=#g#S8I~ebKMuXa@}sXXPn#Z%Jq72;q}UeTAHR}(u#9)eO~vh>%7G@ zaPN3a>b;xQ+B}S#7X!CMt+R$Zm*_zlx2{QpG2!rSo~HLrTjA6B_=WMiR_Q#9+9fo8 z__f-aPFMIvR~WyYmH2zq_<8$zF*r1o&(_~iKiu0S~yMYoz^mY1V6>Jvz(@$fog>T++&UGuD*d0T(qACum=Wk9uHvKr;Yvs8NlVI zMbX}UK@=@~{9b_%+8&_s!)%gfSUK=Uh&4P265Tl&p0OEI-06H#?Q^LWd8#MYCcGHl z+#GMQd)Bqy;3#^{DAr@deAUJHvl+#efLhH%38I)rb9dxu{>##|Hd0e*{mSXY=>D0F zR!wDEv)}t_`sg{T^aHT`Ca^ryTEZOHR}+Kt!udOi`MdPE3esA*Z}WF;1(uQ88Z1%- zQ2Gj38sn_5@?yqI)@$fC^#WLWLm=?P-q9mRk00)J7p4#QX86>GvpJcqxivSPX6w zi;Js~wZsMHUV&woyI5m3TW3e}kLm(#Qi~6QhxdYq=d;wV(*3RE?z^ptv8te4Ex=S$ z#B>U?amA^zv0&Z$li}p5L#K(88OP#em!h#5XJ&jBBUc}bkzI+AWyHw4!N}2~{)Ukg z;=o1l@-#DY!$~pn7oQg+=NwlekIBf8L=qz-C33=lL?YLp93y{oG$Ri{w{LE%ZXZ)3 zI~R>h@0-5JdwkVCCL=qOL@u!<^1P60_o%hN$c5$jXG`R}SbMP?Cll;d6csKnC@L-U zuRI;W-m163)Oe>gJZg9o&6co8Y5!ldrAZI>T9et1?s0BY4_Qg-flUGAMK5YpOw!NX znPVraRpl^s#U=0+_bXb;JG{v%CeLx7qP4zX6P4|DrzX3{rL4Sgb15z-m(9H5!ct7& z1F5QWmReDF(M1=Xe@%V$hp%{jF72gd zBKuOcvS{<>%~yEK9?>peL$c1$BK|cBaMxR9vEAU+OM-THRkV?G&8%-%2Vk{ zYKnEXQ>7QFDKt;}xDqRkNV|p|+{c{n8jG6zab*(U=K|~ma*C4hjFpCx&P7QYMIwZ> zOZ;c0l|m(6ZCU3~;PX!|^JC_jG z$t+0T{jHs9ebMbD&CgqB#ol#9KbGiy{}HRKms()J($HSa%cmBp*2RQ6$RenvU=SQ4SVEyOw98(dW)^`QCKEMyzR4wA?^=Y7ZN*fcUrSrFV{LZ zHoTdC9g1d_(yy}mH&E_(U(oY56F?Et2qo&df zz22G>r5n_(0gS$Gf`a(+er*jzv{}r$UUghI-ulEYr0YR1-g331ZF9S)K83o+eYU#a z33dMkrV`gx9!K3DV0C|;6g)XKH6q~VFYwS8wz-89?q=2*|`H1rv3ixVO3w;S!z=wnC z*XujQ*4a@M=#EoMSf%g5$hNL3>Ijz^k2ax!`%BQkENYwMDAgFG4LL1-4wk1!@7n~MNGttSZX__~tqgK5>ThnTxX|F@mt`FC=$KCGH zBa7V`>|0B`ZAZ#l20wb}{&6(7-ziG+0c+3BRB(x?-N)9je;-T3{{9E=l?%Kj#@ii3!`R!Y|7lgj{vNJjw;2t4 zhc)cBqcm)V(Xb&#!&cR`(6H$(HH;k`Gz<=IID0hpLnu{H!~Tag%qJQ)^K@vK9si%2 zhP^!)8g>G{Y!@`_=g_e2M{8Jmx@ee>WL@0ZFG<7Fho@%H58PRnxU;OQ3NH|M_E{R% z6@F}Wx$1flyG2)2U!uy{kCh&+VdBSb6a{&oHRr}wH0)1C!){;=`xEE8fi>(;tYJ4u z0d@jum?Zr8SQ_>LY1msP))YS$8{x-{cKxrdUB~ob-#?aq{iId>DwPnjbq}_bJ=lH6 z)~|oIEVG5@;wW;1x5TnNR|$Ept?aq(XjQNN9j;e58ohd-_3Fl>^s4QiYaV&7>CmfK z%&Fc$q^Kr_!o<66tr~;~QL|PpK5m5A`g$2hh$p*R=1pfGRipEB^;(@6oB>A6{JsJ8 z`3N(=t1$CRmYH9VBsi#>0YE9s#9Eo^oRsNS{ zi^|lhtPKY*ZxoQD45Hr0}9S;xH zT=JUt+S2Mn+SS;2KYY{^_he$F`7%tBtf8@bE-)$JGGJUk8#_zy)A==e>Kq+oogI&j zhT9UWys2t#mVQq?>(J#qkE++t0_V_5=9P)LocUulR+rPAFDZJwNjq>P0Jc^2UH*9rT=X6u^u=s`Q zQ&BzU+nyPvp3y!mW0rVSw=_i4ULXrx*#E~0=IrfiWzv#rOca;6wqwPTr;IoArOP$S z3xE&*iv`{Vaa{@pcjr0P+13mv;>{XtQCdTtm`z#dMycgihSM6?BXM~Bq8Bg?Dz_%} zsK>Rwfj~ZK!4xRhB~A8WDe=b{%{@XoM&>+LGHQQ zUv-3?*A5>XcMD27IF;#S^bb(u^ zCl{-w2UVgq1lshNnnBuxOplODK(=oNtU{w$*Mt;nYEZGbzGocPBFa2Ts(a3%vp_u= zur8wdo@K1rlYyc`Sk{pG0;rGl?=jZD%S8W>^$!j!n+hthW`}E{bxse}W!oQ%v3h~- zS)+P(z(ggkgQYLUg{ON5%h$nKcvNo=7!{oQ!ezbq*EJF- zxv5_L)Ui$VO;Wc60>lWcv?c3nR9_5Ejo**auA%>%>g&C!-mvj5DDgrHX#DHz8)PI+3<5vfK85(ze_4!Kwb>lq==p z8tw5eEC3H&sU>5u)Np2z>I?KMN-xT*sZojLVXQnxd-oL(A8Ak2N{-d;#}aj_cjXXt zK20qH#&)-woad?8Xa9S=Moq8tc!M-9aO;Tx##Oj^LR_9yv^&R#P-e-`?$GIacB5Le z2PSNfKCrcRqguNQkUFfq&M2>{^>C@OnK3Q6sX=rEg#{-pq2sAsmmng4j40f4oTMo$ zTUJb1m@ZhH{Cr88n`3wLNq+b0*kl`H(K z3VeS53WL;ZTbHJ9MVERwAJm?=*u?yb+cB^0?IVh;iK22Sirk-{bt*Oj`1K3Jlwa@h>l;?6a$W9mQ--tSR#>#ofAADKSlpHlCTs_1 zJ3F^e^)DWiIX0z_d!VnjrZ%~HQznkDbSb)-`q_P3jb9)6AK+LgC#ea65830~u3yP( zr=M;r8h>Gm-(R9#y9+Z`V-?)*&fMX9;#(zSXEpAFCvHIKj1~MOwe}!E`Bh?(T9l>| z)9Cj(uxURGWbNFmbDvOi-}LBY&m7MTphb$Hi3an(na97R%>rIgxXf4JEn9XnF7(|S z!J24iP4z6@&+35D+Rcqvcicv_Hd@?>in0yHdY#&U#odHfMN!245Cb|JH(_~yR;twv z4ZMKG>CV<02m^V-kn)Ig65)h&&rwmhrWI2xcyhGCHYKfNArTHSqL?}o?Yv<@`YIgO z0bcxeXC4Bt0EH6Tzov1x%d5KUtO|5ZT%HDHtb4QQvnfwtD(x(+(5@raAIh2fZ*99 z>uZ|S`h$pVHJC^TOHRf~5lZ$ z&~kWNXXCL?jyg8@{3}lC2vB`3y4}^eFLR9Bosm8)eY4BA-IeaoUAk2D4DiT$*&MZf z;=>4>RX!Vq6Fy3xjgUWQH<~rrxqStW=bd-G*PS|kdb+zp^)9-4i|V=O_UqHN-))VJ zw$6@y9?O^3S@Hf7LLFwji0$!l=`Uh)A^nKU)%>k@{rJ6c&=A$-(<}8k7}$B*ivui) zbgT2Hy2LuKm%CVPI5=VS`15PjIvjOtY_!hqI)1^OgU3(5WUyMGw>7Ckje|qY3kNRO zOY!#^wfa+C)BK$)hUyFP_ZbA&IMmkso!f`1`8sWfcJC`pAL~vZnxSjm`oki(D%-F9 zUZ6sC?axwOuDw;+Q(YrmlS`Txxqt{5lbl(Z&ResGc5e~+$Rhm3%Z)WD#IJ)dotS+mmZM@?B=lPg$i#O=hj z+9d^t-)>slC^x+g2YBAMg9USCo8_QbB-86FTCr>;PD!7X;oWpU>yR%e-KBca`HnoR zKa}P7+@`i8nv40=Sj#5ao)41I`pi10Q54I)LQOi``M4J+xIAv0DtgwDG!h5&cEMA* z7uUaykS2LA4qNj1z9iS2W@}^=qPm6$;QmtfR^tipYW|~&>EKQc-B5Gk^&0r9Ag|F+ z7y0yyPxW2OYiey@N#G;DH19qs&PP3jZuW5M%$e@==Nr^BXJ9t_%(`6->aI?8>aF!j z&FX*8IH-QQE~!!7N@?${OKQ>=H>*!N)TwJXBKf8>>QwW(yk=G3u};0TA+Jf@q;O{w z?i_U1sYj}yp+7*7hZFO7d`{!7DO8r9#Bt!7hRqaM-VnboAegFL_9fXr7~ zb!u}}UK4I|QlokwIlr|DM~rVon?AxWQ`CO7SuT+U|6XXIKcnck`V@~}Q;E7}p~YzA zdmHm`zZpg8kyMxb^UP{S`JP#*8W#;Zwh54#I`s=Q`wn`PQ=0Thlg_ysJ@chHl!21u z8U^DTzvZZ=Y; z2F^R5A25k`G~XfYriP)OdQ^puQh~Up2IE;BOG)bdIyD15v9FpvDfov*HQ^Rj8&!wn z$Y2*5yP8TtIru>Zc(DMciw;AtE!`mL%1-yP-i#Fl}4%N5)^fIfYnKPNQ_h`$> zox+zOzC&mR3NvAwFEi~N`6K9XqMXQwxiTm6@p6YXznhm(|+!gUoAepQuK<3|a&bF))#qZ9gnstjOEa6{{kQ0iAdNew&8fL< z)@Ee;n^Omdd+Bih&MMu%KG*wz_pw>H|9j^ydU{t?R^x6R3&W=lJGM16u%-J3oAtIY z?eXz`Z!k>z?7;aS``N7=>o~t0U$&thlT4spo%+KE7NonAG1b8~LymXi zX6G2?%fj4Mt*_&Nxbk$2fPISU)J7ocrSK7G8V<~~FP->*i247R;mZrmrN@}dhnSb& zHN1S4dGuXQY2aKxFwgwRP{jYA@G~fl`TqhxBc-8apgAs}o$dXbtntM5C%EeUo6<^g z>Ts&7pZlQ$8JOYWpZ9^W-elFY=(cPGHTd6kfAv=PDP@)jNjGcf^udplqnF0~R{o$KBj z##6{1MPYY$uhRp9x8K^XqLF#U9(~ce5AC~{Emoiq%q>w!a#(grh(-b)7`RR+xAw$a zVGno@J;zf_#avi$vRr73uif%XVFP;B3L8RqTe87qo_4})F#H+N1~$CR;m_PQv%z2J zU36X>;*I-$jg8G3&&r87T{1y8*XH-tJUKDY6G1&I~!-f`eBx_j)nT;jZ6Qoby@UVQ(RM%Q-)1jk+L@%%kEg3?+!m(t70+Avto4y{IF|#`j`;~*(rtj zxN&~6s801yQ$=atQ?ELJ6Vv0Z zWzl*7o@$<@M@zjMF94y9&kS@YnL@N-WuIC^XbfjOe-T= zS8OjBQE>4>SAHSh-+?0P0cjkXQGs)HS(i?p?JC{`ByW?x=Sl!?u+d!n0T??G?{?E! z*4*fQXl%n#RpQ+Srb=rRcrWijIsRg5YrB`ENn=_Mk?lpI*7x}^*0eS>`hAQ=J>2kA z3dUY!pH#o;%_9)1`~2TUH!gKf&?(jaX_K?3Ej=$M8E;5ipOt-?tIAWA?Mh#fKP7oe z3g%fW%2hnjgb>uFW~esbo1HQ)$CrHlwA87-&4s>2F7NP^rV4od4WBN~bv5Q@C#QNU z_txr1vy;75)%YJPp&oC_CE&}I*+WNc%uY!u+*GQo>r>r;m}Tp|O~BpF#%}bGG&LK8 z`dbI0ICXhISIoYy#QMH7T5rF1+M=nx{70uf#x?4GE??^K|v1=GknQ z`%kW_+S^)IS!7q4gDPtq0L;zS4fvzxVxj2VA~hGgM0isQ?TEe2T5@tDRdNa=^~qml zq_TOO2;BMoO-Z3adtwv4jc30qN5T`EimDs8x)Hl34jAi7Ug%CQ)ffALTivMoZnLJx zTSKB6r=-Kz;T&%_eX#aPD=QA~Gt{pg*^5oGJbHcDJvb>khSq5|043xasSmx2S;^FF z9HC2djm*~WR}mcp*1g9ys{R+8f>{ev{I$2LbvOtPu8p85c|`Sn*I~ienikvOoibq9 z)7U(#Lv@$N>c1S>ySH{(=9rDvu&y{1_raYFxrw=t;H(?{y$+i=Ph!93jwh{gu~r(r zc5%h_VeeVPx~L&oJx4%Di6gAD;sAMb>%QsZ?$&*BChXDosHud79f>1_sQsH(6vp}R$vcAL zw)nQ!ot+5Nf>qV*QDD4#0?s0N;kt~28y~A5(AX7E-s|DrM!cnCZQ4C}GvWS^@Ty4d zepFwoiURuQze1MwS2AQj?v7wN5E)MRHlUoQU=ZZQ~m_9CjoYf0`>wNN-zPK$; z?voCkbT4vp7qgSgfRlqjjdYelSSIY7w!I#w*dT35i(ynC8cDDp7sXoVL~Gbg?58FF zD;b8tm9j9UGG%7U_I;}+J-A|8VdkQWscKo8iYr%3lYXV1;0&%R%QH2*S}hBp9T1ijFk|~EFrzJQFQGG-L2mCNc6%5M zV#XL^#-0iLvMXw88r8ZwfY!d5KY=@bGa)9ahMrj6%UQ31wXJ~!XnoSVIQ5%!-ipElK_O0!h&v}watX`1R&q)O5X z@HSG^3x~Koy1rs)O4E!xyo&()T$lEH?ELE=Q)tw!PF=do8XP@)Oo?@yGuj#wU6`EH zh<4}!i_nmJt6h)!(2%0!DsG4`Ik^BWxwTZS`{1h0c;9PPHa5*M7ltwDk~Fn?s!x?B zVVl>jO1GiYlbq_JPpzrZjTK{4HWk;*xFprxfa)JX&DIDE$#+lQ#ulH7H+(V*Lj-S_ zof6T*I^Rz8gdiaDczF7Gu=#(i;pLvn!d# zZz|m1)NGxcIy^i3dS9VW*WTuFCUmBDll?ya5*zM|D|1 zzo?(iyl%wzN~~{~p}SXxt}yvtyDb>T?Cg7~Ej4IMJz9}6b~4&AeM=*?BU>NJsrH}^ zmD4JxQB&~FUXRXi#;c8aVCx&FdiSb1pMoWM>=v6&VaQI!Exysm3|X7pVn0{%a(G4d zIr=r@a`yZ{e{b~-R#Ge-_wws0zF|-6|5bzat{+&FWA$q6%huLxgvZhaYBVCdX|avs z)1q{pHNJ~$gl_!Z;HlZ;N4rK~6kjFa$lbV^{)@p=rj5i+|K59PX=o{C)Wd0wV`t6O z#Nqd-&VeWOYX4)`slIjA?07i4`W)XlcFq8^B0MK|8E;)iuU!}#)dZ}Rn9PlAJJd)D z;Fkoff;cNPI#UlR(S1s+i=%3qypu}c+aQwG&@Omu$7HA80v`bH_LSNdz$}4Ee9amg zRpa*->>Q$Bw$AN}R}c?#f(0e|p`cs+9$r(dw;jQA>=c{WDYkvRyQr;D*6hLXiohoM z=DdqWg!z2RQM9^Vr_NE!_W<(w z<`v^SjQBh+E=R4v`7KN%vRj~8^9?9;a9p89rxM>dgW>$)TiaSvw@+}Z=+*5aYXF3+fNaO>4PCHYvutwK~+W>IKEuhy*Q#jonhBAii9 zOYyJv?k-GsZ~4~62&7hJ>PyC@XAEw9K6lQtOib-2%%)$NyZ7OI#E{G}S5^b{`XZrT zyXN6|f-0#~Yu^NnQO!w%S*71eAEXVEdRu)!NENa7q z*_8q@QC)$0&vIWtCr`64cctLqsoQ;lJEKG&%D4rQmF0@HCdKH1aLQ++SNG^YsNVVm zAgT2IIRkR;fyt_S+P?}e9SaUv4M~sDDTsahQ(l0pGQa8099^mhrn+%%HEqJrhwL1a zona+m!n}<475qhNF$~xFdjIo>as~|B2$;3LKjWDUYjo@tSFBPMcoX|BdcE&x)k~LS zg`#vuNwOZdM2~n&r{6Q^o{g&8n@>Em>bF)(+>q6}g2L4A4H~mS&rriPv~-Uidi#TP zO7fhTap}53Zy0~!#_QC}RhWBN=SFk)^z(=p4k47(-+Eoe|?e|&zz*j z@<_BLTEBBFX)J8Ww8`%DkvJ9V_0|*&8l%R(sb&TaTdA@2dY?Dfvm+G%dF{cQP9c~{ zbbx+{>P5RaFW}uGJBE9v&K{fWLNJwxlTQ%kw0~HAV0Y+i5|*Rw)|GqFmbm=gRP-Wz z@hRQAd5TZ)RM?A#XXOnBAkUbwF;Jw%;__z|-&D>u67-}if)ccaU> z*`pTliWJtDvJn_Hs3o7`D-vo+k#$ZNbph6x#zklE^LY=fO3lXPfAU4y|KHx3fXP)= z`~IZ611$zfAR?2}LWBUJNOwjcLK2dYU?d?R1PE5TtE;;!sUE26&O|UEAOWHbMsSE2 zg{ufCJOnNXB6^tzK}AGwR7OQa1sS~}yx)KCv#NHVuIeQE?)Sd;y}Q3&efApm+SA&@ zId#t3Ov|%pa7SL-bx7@RBY8dMDvA%fgnC#3s zv&PKvPnUSe!_%czN3|`SJ7LU}3sO86;a+rKo-aMaH%S><;!zd6_T+EXe0XF{e#BWM zOQfICF>}h;RkIJCIAuZV8TL@8pQP`x-XZy#nj^O3izaP^$#s8nojvBrkIX(GbHemwL5)=mU2&v?sRQ5xSPpJPm7$P{3{#exzpn|3mzBUZjXzu z?LLg1=##i5-I*_J53{E+Jd@%1&na0}i@|8r^$5Z?OMmDz8yZKH<2} zZuq;NXz@f^@AmDLo!mO>%tH%DFPJ@sd$mJ(9$7OPD?i8e;MPBDRS#~>uLqOo(qaES zOUEJomku7#W+zS=uyFMGg=6eLy>RSMW#KrGg@cdn+`=(3SU6UlU;EgWFB}j43k%0q zJ?6RLczeu~TsjVWnp-w49k;oqzem?V{+CBaHQ5bCf=uEC3?^Ins^8ctEc}Q*E ztsm3<`f+Qv_1=N&2R^ue?bZ+ZsQy>hkG8E^KTZkP53QYAKeChfg{Yr4}Z2d~$ z7mz8ofSkbE=ogSSw}3q67Lb!zK;Fj!lD*I;KXXj|hOAQeUp@*fAG2-w;P#H&{o9$E zW{k*AY8`Xp%o9@kpQ+~(JmVU4{rJJZuzvhY4_Fp19=Lwo;nt6Jv(LP`P`_90e)s&( z0ia#u4I!ZBoDHUFp3{Tk=? z=tD4<|52)6-KT47np49wDc1&)S^sZ!^{<%>Z7@?ZN0Y;msj9lC(1vR{JLiBP9d$c4 zRrgU9$?2BNOD!J$iLE$WMq{d7M3-L@TVR zZjTR>PKR!s6{L&nv1qXT>L{NMv-o{|Ils8wYH}p3)L$y+6w>Kzg_8!(3pH~FN!Lp{ z`Sd?y=)nA{rIUSJM>;vK->yQsX-p4C)}^M_oRS(|sk}=666xix{T;5>u2xT_pRDvu zX4TSUrSl>f8o^Gc6%?tdozDAix-@k3n~*jwDcE3k~4HK9(4z| z>iI-{YJTlu+cAfZ8$#?tO{DWuV`;g{V@r9D=IC)b#ob)qlDqpI=G&bs=Y7ex{Hm0?sG6Ds3W<_viNTN0FGbzDaAu7bC@GD>dB zu|w`M^^i`!7{(B{@>Y}GfUGEhlT}e`igC# zwy(!F^x3{XzqRz!&t`|q&ZAQK-1<)%eH5?vIxS6{XT^LPkn16hzA;}IlrwI(s(Tyd zbv5bqk@nIp%uDUNi8T6x`c~$}MERN-N>MEhb7`t!X*HW{Ku5zc^zfbUvjg*;RV|&$ zyO4DH@-`i$V{g=6ElmS*>qw(dWA`3tk87%>Q{UfBI(>e6L6BG64{XGBkDyu8-^)n$ zv8uA4Of__;hHGp{Zqe04>pxvl=NYL6c5o*5TvfSMPG3W;FaNEf_4>Xg(HHJ!!DL=S zMh9jkWSF7-o>JxNxMuS*&mmK&qDS+#^ep5<&%FbgYI`rqkLKP?->M!P$TKZfwey9@ z>qF8b2KMEQYJJ&&?u$vMFEc;*zH%GPc6XW&3`tSuN@G#!?kAnT2D_fPYrE2Y9(~`Q zirgH5%u~p`KPXc?_E=rGv5acg4OX@>J93}EhgAny9^5A;@Ao7#>fX)E%-;f;)mtEQ z^%lrHK8TF^R%MRv8@fgJX$^>urxWx^*I?}+naNuq)4ByR7jJ>g9a|vt!XPqg2bFmw zpMJ3{md4+-D)+0BpE80miTsj4UVER0n70nz*}*&?&q=i#*;7@rW9hsYo%;Bxl1}kf z!@EAvX>0Bf9+6bj`5fu=Jx?W_;(Y<$brp0zHb^-q@5G$T=PQ+TigyFNO67dGicZa? z>qw`sI5s!uO74ZKa^*Q!ay`Ese9o23%g78i=Sn93tIf;2fXp)LQEBd0-%8J7KF`=E zkkQ0mso&Hd8`!h!bB@imhvbHBswP)%56P`ZZm=~-G9!OIcwHrP@fOGo<1>uG+CzHI zL1s(ZLwkzr*g)#jj@<%V-Q0fbDbncMiK%r1`la@Oy2^XI2J+gK^+z8b9K?N=^{0)s z5!+TzH=lHRN&X)0ITGmx-Dj;OonG1gHG8&1I_~W&uX}2fyGW;3f+`yjoQdR2usxp0s+X(gRrl^n&ynyA~LZL)!MdS5Tgx}Qi_wM{f`9w(h% z2>X1n&c}9A^HuI^9!@n>9dpCE2i0pZ;-q|^A zpv_b)r_$U?8ogXHGstUmW8o#z=v9uBEA;yjRr+0djbifB+Yj3geC}4Ud<~>oNE-e6 z|Ke8kx$?T0bovpxZ!6m3Zqn%Y(yeKWw@9O3CFfRXi;07@#n|0w3x3HPu@!C6N*eu= z_17wGkuJ9MwMDDs+OWH?7jFrL-tN{YJ!f9pxuMH;wMK2tEyZXh61Y<6%48!Bq;766 zHbun_T#q*Nbro~%UD?(KzJ-s{X%h7G7NQb0)6rar(%t#ibaz`@F^dSQXU&;AGiuE( zOLHL#Dd#7Q!Jg+jKgmxK1m zLshT>l108dvy_xLmr2i*b5xhFcih&}T+BMpf?bZ-*<4tfEl|N?N3PA6&sE)trO6|m z>CX3cc108|qkqd>W4PuzxTCu>dvJb9H$^zOC(|)@;=$xNA=Q+c5Ye2z67X_e(ehkZ zYxi-s&Ihyv)4sk%^z>^mC!p?L73=57`u0L|XO!;i>MLejn_OdIEb8Le2BLINcQHa9 zLy#G%wWoJ?=d;beX(jE-+$o<`L1!y(*MRA+?26v#sAE3faAd&o`dJ)9pD-DczTAh2`A06sQUG9G%o&=j}H;c)YlE9V*`06~L1vHgH28&ROW(tfrHuLdO@3M4P(P!8xMaG#Rju@^w zDu~au;IrxCWOvOtX%*gGdzyPYKvgO)X@#f0%GssxE+Eu<~{FQjKP4(Ym#osbu|}Ob}x0x zW-+9Eaq`{Gt&#VVmrN)YecGPyZfVZD8Gw#X=Q`VU>1ZuTB`6-bqh8KS^}|ky8l$%E zz5*@S#;n{CIp?7?tsemLH3`wlp3oWRaq7})mw9lFD9;0ecMGW4deB1BJI`5gyS5lmAns1S3r^AxCkr9 zMu|?MfW=H9*Ao>{*xc2eU%4u)j8N6QLJ|`++KUkrE-g`Hh`0CUSvaLuay`ujd>yt? z+TOU}0VU@4F-gK?1o$l;`_HE~!K@KR3%Drj@3 zfaNu)ciOc)yJA1z#Vj2W#$LClquJNElqNnqEEY3!3X1RT$XT7nPfK?%8uWivy0=>+ z#!+NuVvDrW{m*n~+uC}V|GJrZ0oGHug|gFLl*Nh7?1~`xwWiE=%{MRK3JV43DSAD{ zsI!mNO|y`vYpg}ZzDx!;l~NS9Wqhj4a-YfxnQ}RCL(s2h)3kA#?0R>yFP$CWpblqG zrJ2yJ?zzEi*(Xs`?$B;Eqt}>g#Nw4P0vX8CX=XufcMy`9_Di zucl0*tugBAEv(dSK}SS681(kh5euqzl)0|cZ&-1st&WsF}<>7*ZId{oH>S1kDE+tK_k)r-Chn+y#39(y&CY*4~TU?5RV>k81g~7DFgIjOZWrw$oQ8_M`LoU0LwBHeyCHx>P<9;la zaldCQ<9^#$#wREA9};!su-r=SWL1y>beBBo=#}bscCx2p$JUeWV%u%|DXP=YPpVU? z@#h?;dY;C5YmU2n>{bS>L8<$RlI(IH)&A7i*6oNJ%T(Vcj_MoNMT5O`u=kzlH@@1E zIw^gh;Bu1sMt=wE7)?QZLJ%Jp#3u#u@j-kdHx^9gE13JG+uvB0oCG=^tOS{YC{cp$ zR{Z!WL2q|&v)^p>OUf?6<>vMFS6f<>`lqN+u4IAS0#$Z|rFwYG_koZ5hV^mZ-ahWF z(8qm8`MB>XANO75<8cGWLcS$ELYMf6`;w$w3Yxf##BJ{d;|}sj+(XWXQTO1j#WtZ50;LT2fbrY6>jCT>tV zn%LO$-3o*t;uOa>jUJ!pkY zMvao8Q7D1?R3vVXwo<9v*o?q)jgnELbg=*GD4tesg|_jiplKxLn}WtNJrk5b0={|N zi}@1tHF4!@Qb{|S@)Vc4TEcd!#6G662fRW65=2lF?!!xi~8G zOFUWMQb=GK(|KxY!|Ht z^sUCRKnAcNp5B8MO)?gy63LUe7svpPbw=;EIZSoj)|D}k$l`hc#k(HOs< z`s+J_`NTH@{9F{x0xX!E=#56?Dw)~9MnF0&7+v<63+Oi^a4R61E zB9`{*ApPN#eYaTW+JHU{+H2U#aA=JIU31D4Rp_$AeG>Aj=MlhM^3nGZ7H%W*E}*s( z&w}t>fzb*2bnxE-FX$S~FaJ(?egYf??WTavs{zsFz((LFfCarnsy0`@oCWL-%mgf4 zMC1}+JMwuFyR>i*_%E@;KLOVU^kL+EK?VAB=$gwU|Mfur`_RWg8w#xp5I+j|4b(yW zB)uE4(}0zLzL&62q+D&JUj-Z#(C>%-H}oXwyORH973eddw?VH(M+2aAuLb4G!f#FR zUkdp8_GU2tcVqr%N%IFl`p*y2w@`1T7k@(qepr8f_hCWf@>y)|P2kvo{s8n973iw} z?iJ{Bq5ls1-47iz0O{K`(ANq7xdeZBz+b-^{_QbedbbJEeF2?c28{kVapiLb@F-xR zok$Ll4e0w73*V%khof@=@EgFw+t7bP`XpWTJgov<%eybeb;tA@NK}tXyTHW+#dkR-3}z> zBE~?5dE#O8O1I|HUckcq&G0|J8UEAop97NmUyRdPKEugV^=9}z`A<{c{WEEHHMci%CJ9$};M7j0JJa2R{VO7tbXi~KT>l$Y#RV*TP-c(w|C z4ey4X63Y(>f6h00Sn)a=}OlFDBWzp(wW?O&|c#Hqm4Y2*PF!u z0a(x+I2eBi>|ikd;qa#cN&VWVD4m5b5*MD#|9sZM7wKQU3;TpNGjY%!B#mty2Q8%M zp$*4|8lj74VFLD6iQdY4g1-Zj@{+wY&R0AOzpO&y+s(!NZ;Flh0u`-- zN2hcr`_1g88sF@u8sF?D$=@2gd6c%_leW4s>_6;g1~xJYT1Y<@+UwZC`=Ep5FUyk)X#nr;*?B;0t_7ndNc5?(erMsHlRO6f7RO6f7B>7uoH#Xl~ zAM{^1--Pu4U+0^4_BT1;KHzTp(Sp8HdV#g)dT65S`Po6hn_8c^{(K))1vQw6$obTaqc%2<{z3lBj*vI2cS z=C9|0r2IwDeiYM31bU?VapokgF-l|MO6ZqXpl{E-wr2(UjnMxDNY7P)9_juWbJc9- zns6O^8~V2@&=)cf?gIUmguI?Vz6yxGW1wHMYhpd(S=fd7ZcktgH0AwK;;%9PP2f5c z7!4c@SXfH@O8AnW9_YCS`e`wJQb4!)@=ff1MzEjFVfQ;>TVtV#K8g5=fNWaNjdlk1 z04%J+mSx+ALHj5mx%~l?yAhuBUBFe}6j|tirv21hU;$v^-=Nbm>@$J&i(# zbXm|h9VjB_WJD#^fl1O zSD^2RtqzUp!vj4J2lV#@^kcBI4`A0Dm@AdHg=NrR#qN^ypF=+t`gX{M^7`g(VoWav zdj1j6^8sBt9*FfzmxaZYr42Zf@+j}m6F;2m8m<=s1z;s$;b!80VqTH_Wq^g(px++T zFAV6j5LgfVl71LZn_orz%)q{%CB84V+k$F=RDrw8Ls&w0m#9|p_`=-M}q zrhW$jhXEGuCa)c^j}gH80SjNIY+nO*rL9g0+UrsTjv?>Q0rG=j;c6m(2IRYR-++$U zyXXJ!aFs8E4{-e{U|~FwTL9z#i1|=mz=&m50@xKH820;94 z01JwXXXzyqroTJJjSuRA>iRA6xf!?>kc<2q0Sm7XQCq$jn&d1jB(8G+Rd4w#w(xl( zYVS$dxqK{Gc$moV0QqbZ&w^-|kbW21Lp%%eqjEa12)cfcv#=X9Jqu6LKMbv-0$u%l zas@g=FFFKJJN?|0b5%c20`wcwM*#~{h)e~h0W$#$Op_7QOmr7zl&^+8h|e-+9RD`? z9|&JEYU5#CElBoc;5^_0BXZpjIZG!yPo_HTm&w^-r7A^haSDm{1$i`u%Pu%Hvd~-*T5dvfE)dyGfgo*Gv-Tf zDq!IY%prdQ{sz1aybQbwSU8KwkAa^6-=(Y;G*65GCID)Koq>Y@3v;Q%M(pcK;2VLR zJpuhc0i(Yj%l(GyUjPeFQpQE~>|22>U_o=A)*qwmeILnL7=wfr~B4*0sSkn++|!f4lU@`L$?1xV5t$gz5tA+f5rh5gMOM#eKqf00EFwM z?7jo&1%3#~{!areoJr)Xz%{^kfUg5r0TyPH$8P9s0QLqfXn$IXei#Bhz&XH6z%t-0 zz`|P6-H4vMf%|})fja>U=g<7=%0@D9USP>@7(hPdUGtN-!o1HEa*Kt-8*K1_Mm-6 zBCrcElD5%2x*zdhTOzLGfd>HNYtO5_|D!;7|FjbPKLE*%587FAyU)2Upez0a@FehB zKp#&Tx`19l<+1SpN;!|Gz$XBUfUFgstKEmapE~UUtcSK^P(S0}1pOA^O5lG1lG^}S zP+UCIBU$N@tkPOY%H0j4lH7yPwT{)HV_QJ$+mN7Kns5FJ=!9X(y+QnMfCW7-*aye} zx^G+vECvn-J`PyWJTebx10<*W1j#J`Lb=u88mG4bw*y}WWGfc~p93u1NnG!#yu}Ypw?@Tu1z{3i&=;+ZZ>gEYNCvKCTl_O#qJJW>*YRxh4w1+^QzEaCE=TZ-lw}2_%GtR-?X4-2*P)a z`9^;lea{1b1#Tq&7r4FzSP=aUK>L63E$Fv?&DTEzo&fF#9t14BLOyQ*x+lGvbblir z+Q~ZlX=ybQWZ=4ups-?oUQTuebQ;}-buRRu%14Vt?KuT zZv}QI`}`^J4)8tf_2*pw4wOQwxUv%u8c|B_V%)XEV*W#;DAm>7n@vrdKIfp`=JqJ% zoLZz>S9Xywa#z0SOSO0PrS$QxKKBZdG`vDKFF7CS;d{xHzUYloz48~5Y6F4Q?LPfX zWjoSscq+-FS)YO`U2|tH6Qwe}-Gw5!zbwfpPd+9|weTToN*}H9+1Es>v9Ri!J0`2i}S0 zoOy60cCinJ|ZR+1< zaaEsNFuC&}NKRSpx^$cRU3uUzwZo)*U4>l)nB2mjZBxJSxSCR%h;RD77|W^e7CpO7 z{UYS{lt3IzPWOFk6UnVWZUu6W5m$dGNKWm1HK2SYH~YD5>SrHc6TXsO%J=#}Za#AJ ztH^23YWfx;w-7li6RcAF_CRhCa*L3=N&<0E8o^zF%Bk{2&u>$&2L}zxAPx=j^&YMP z**##mT8176Tr;d?6+3kAGw5ens2zgQQo(_n~$@$@Xm;$qdax!kauNtN5VA(k5(v##nH z8eOLc5OI(W!GW=y(dU19XtdT6#WLcJ09;=PAv}4@P`7XOSh-BnS#AZMi+q2m`@M8; z=$8ZPTXm0`KGZktr$eKE>;N$i(o-#HUKOu4ZVAnw9``wGp7glSLGz)Asez7fwTK8lu#P=#A#A>641pc7} zzPGms&L$G0CK~4K)`aS!SKd_#G~bCfgs-*^;A-tPgq2#))~x-9L_50Q{jB|lL?fex z@LS{dAA%(>0@wT`dmTdib#NUO z?-G3gJRk7&+pC?OBz?MnwIF@E&$S?YMgpIkz)wox?cjEPj`S}}@Xtx$mn86w3H&<= zT+b&gsC*A4@ZThG-CJ6ayq-r`5U%#M^H)^foh$I|j1=)dT!C-rn20~A0^iOW5r0mC zem>7S(0bk?KeA=tO^xLNe<*(l+EC~Nb0$2Z=e{!Y2wF2LKjf?+a z1-|(W7k^U)zWD$b|IZ2jTM4|@FWIihD(`y}_|6GD{9RJ=dS}Uk@B^U*34Bok&nED$1imbRuSwu*6S&@0u%P_I=QhH>p5R}bz;8<6-%sH8g4;O* zJJCNs0k?C$gg*nmj{VKP6hga=SHSJO5b@sy-vIxWn6Gy+&A+kudw`qYV&NYKH~;Oz z8^Nz5{eKh=ZgtH2HgBL3qJ{bajb7d z&G4uV+|KzDf4SuM^Jh>AzYyH~-wW5fF6-G}%y9LgJ;3b@AMtMl-$eOS%saA&`@mlU z|GSgtT>*}A5`MZJJnJ41!4{m3r2tNee&iW8O8{Ezg z6TS%C&NdRR-^J`q4B_%GV1DR@%g4l?7p`v&7a{-tSl@@h z?c5si8^P@?0^uJ4H~;6tj{>(dRfOyJc=LNLydB)mOA;<0+IAkI@HOCeo`CRm;Cae3 zEiTVj!R`DR@vjHB^G<|+4}3N9dUsRpr+518{0{Nur^C)65dIvvox3Gm&)e<1OyNVg z<+5`>g%1Ze-`c|W0Jr-s;d_IdZ++oo!0o&&;U58C7t}}JM%g(f;-3m`=UNJ13U22& z3110rXLSlc58TcR6utr6&QcNnO>jH^Q24)t+c^=!{{!640TcdHa61!0_;10(`9c1{ z=Q2KLJ9`=y)o=@H=UhmB2XNh=@SolLEAP5@b>nkc#or6Qow*|XKyW*=NBA`G4YZH$ zBh-JN0JpP{#P0$R%d-ajI^?g3`}-1bJD*eXUjnx?3xr<8gu4OH>%mRnc3z?Q_k-KHO~Rj)e0;W)@E5@CY!2c2X3x&;5w1TwA4d2{k$7J5a9saU z;C6nd_!GhHY(U|&!0n7N;q$>mdpi-_&gT+;3AjCf7!kcMIum?P^1Ch0?_$aSu57QL z2e-2-l>V#Wb{3rQ>%i?yS>fLUAA`P2Vto&SPXRwN#y5f6IS-QmJ-D4|CHzfrJIg_M z4UcH-{1xFlfSX@_;k$v`xfsIt0iR2LpNaFE2yW*Di$4u~5&Q`;Up|EL;AgTfYJByG zAFTgpgWFkZO8+_VJ%jzk*TL< z@D1?yjpg44xATFeZ#y1QT?gOxcOML%*)@=+3B05adz}q#XEP}M0&qL0R(K1zotYv$ z4{qmE3DdbkD7Cg6FB2rwHWn{ybw8>(t+DrdY7lyg?&p=>J6SXz@g*1U^4w0ror`x0 z?fk)~@RAldjdv+y2j%jhO)lo{yX;UKV&D-QEaCe)C|9YJu@CEn?`iX@%&&P!8s>aE z8)ANU`{DQu4&(!$%>AXDJH^lguuBy9369l-6!{YllX$1WF(q~htcwX*`Mfh=^QGH3 zQEJTDuEouTZo&y}$=j_W&bMC4ovk^eMMKFIt&1;{A6j=}hCF-9ou@j%9L6TRz?#$7 zl546>pRDXr?F^ zCUjLB8%1Jh>J-lkjuzQ;k{p5f5eNm zw;w0s+t2tq@Er!@5gI-H>i2Jkm=|* zJ2|UjZooINi~2(t{1&Oy=;PIaJ%wzd(SihSC9_jC$^*q4Oc@UyVxzQ_fzP~O&6u~c zD{=z{p&4Jfgu#Z-DfHg+)7jFo2mQB5QTnL4^QKRmo1Qmo)^RhBPai*R`rMgmx7R7R z9J98L#c~y7UJ2$6ohDN%Hp2-A)QN?iKII&@P?zMj^@!)+a&!1<`|XL->c@*GyBRAU z?396Xrg{rq6|5ybw8_nSiwOQTgV7$@w?LtfaPEV-OamfQ`ck6xBukZtDxyKLdeJexOOJWN_- zxe~7B;_{Zx>~XlpaZr3eXZ1Hbzy1ezO%a93awJu<#PJrvTXDFJcR7_iSzD0ueJ%Ht Knrr$G`u`2%e-Il0 literal 0 HcmV?d00001 diff --git a/org.glite.jp/examples/pch06/reslice.sh b/org.glite.jp/examples/pch06/reslice.sh new file mode 100644 index 0000000..2d0407b --- /dev/null +++ b/org.glite.jp/examples/pch06/reslice.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +log_event() #1 - attr.name #2 attr.value +{ + GLITE_WMS_SEQUENCE_CODE=`$lb_logevent\ + --jobid="$GLITE_WMS_JOBID"\ + --source="Application"\ + --sequence="$GLITE_WMS_SEQUENCE_CODE"\ + --event="UserTag"\ + --node=$host\ + --name="$1"\ + --value="$2"\ + || echo $GLITE_WMS_SEQUENCE_CODE` +} + +init_log_event() +{ + lb_logevent=${GLITE_WMS_LOCATION}/bin/glite-lb-logevent + if [ ! -x "$lb_logevent" ]; then + lb_logevent="${EDG_WL_LOCATION}/bin/edg-wl-logev" + fi + host=`hostname -f` +} + + +set -ex + +hostname -f +date +echo $0 $* + +globus-url-copy $1.warp file://$PWD/warp +globus-url-copy $1.img file://$PWD/anatomy.img +globus-url-copy $1.hdr file://$PWD/anatomy.hdr + +chmod +x reslice +./reslice warp resliced + +globus-url-copy file://$PWD/resliced.img $1-resliced.img +globus-url-copy file://$PWD/resliced.hdr $1-resliced.hdr + + +# Log LB user_tags +init_log_event +log_event "IPAW_STAGE" "2" +log_event "IPAW_PROGRAM" "reslice" +log_event "IPAW_INPUT" "$1.warp" +log_event "IPAW_INPUT" "$1.img" +log_event "IPAW_INPUT" "$1.hdr" +log_event "IPAW_OUTPUT" "$1-resliced.img" +log_event "IPAW_OUTPUT" "$1-resliced.img" + diff --git a/org.glite.jp/examples/pch06/scanheader b/org.glite.jp/examples/pch06/scanheader new file mode 100644 index 0000000000000000000000000000000000000000..ddc75469cab7de14b04817af046ceca6972408e2 GIT binary patch literal 56023 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 tFY#21kG}iDML~WMmGMw(yAl- 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

nvV z&7qL6423vM#tlN!f`6~!-wxR?yU6gt1kxq^f&U6*4{OyYyq{>&;*>W)8e{yr$RjlU z!9j^{gh+z=+9as7&9Cl;XiFA1fdm2U=Q4rQl0brhG*=*jtF38@raghOAOy9V{&)t0 z2*_+(*!!|U1U~&5Rq5=p*(YWlk1n$&Ay%lurw(OV$wM8Zv_XEgmSrVFe5Q%I@7^tC zZQ_G*s=uBTYuD3&c5&umSy?Do*Cb=EBk#n?0+-jT8sjkn0)ADeV@MXNZbiAE zI^k)MgzKe)G@=%L1OGZf2sm>5@M)J#55QN%NW$|=HA#30wA96qyb7SF7!r>3_Vh7s zrIfNN=G@5o136Pzo)5KDN1Oj4LX>t?N+HT*O*g!1r=IwJOx8ja7&GOEYKIPoafntB zR0X#YE_#v>ApXfr&`6!YyAZJtL7I@4F&LD_TXHwkp9G&dqd&-uJX;e^XZ!KQc;+Lw zLP}$Nfr|AOEq|R2>&Yd$Qt@E!R0VwkRv;O%z(Q`uumZ^i%Xg?)DnPGh*%e5nQvu}L z@gC?k&xVFXS}%1BK^->DQB$}NdP!RvM{x15^BumxMOzr@=2(U^6Z)YjIJ!?ak#P~6U@y`+O7sr+2%Oaqt})()m+9AmV9^$JbFk?kBr zh7ZBYqun(9lP*7LgK`n6ZvBf;9t=!AZrld?Q{s=UO zm(AF^hobd@ewr_Nov?XhTIh@Fo6R*$0NLR~5Fk~L4aBQ<;K&o_Q%DfDFs9nsw0S^i zMhvcD0Z?_X*oVxid$9*D%D~AS2h9MEssS8TXRgtt;cuEox;dpAS9ABIS^TQbM&c=@w6HspKx(y z>d*057hBV$V|gILA$$xE;o2(WEojnp5Wm4M_ z;oA;!(jnHATOmKqHA@GXhf$!~Qyz+2m2}%2d37F~kwN7TmYAUrU}fBzzoiP#Z$u>| ze@pe}p!qH?J*a+s71?JzXY9txLI2=N`ONop&-=SXJgXy&u>F22sBW{fgy(rA$5nO? ztzQ&W=i2G5^G-%5%-~>Lrbu5ykRs=AsP4w_c-uIwlFV^X4Y#{z5AaaC zcNpMXlHPuWo`A5{p9-o+bVR;0zT4~!&iKmg^rYhp;vqdBZkJ>frDojf9$&Q9kq3OA z@#OV7p6PaX?D6E=y@`z{-A<2<=WSptRya1EwffuE2g7>W=?5E6-uD~N8S(WI;5!oQ z2`Nw13K4E4~za3;55=^a48TvsQoSx6aEu zApGI})=Y;hBqJ*t9v#J%p$5a7Twv(HA0#(1{2B`Awec%=etx9t81qPDt5K@fe|^%I zH5qUrxjrpFQvFenK|W=7(jH`;-N)D<{dPLv3gf+wogAJwLB7-MR1MK@{aP<*>%24f zAD|6@MZkPB)!1Nob~_!5ZWtYXz!~LlWt7hNX5&5u&*N8M>rGKNp?Yj-xM#Nzavr~4 zim+qEp;~u9s{oC~UyYe54YSDBFOWYjhvPue#VtY*Hf;oD6b-_s{;k^+rjPy3R>lsxD{A%BARKUaL{LR87RU5V6H* zrc9lxKl43{GZ#IC9!O+2IAzI0XAaAr6r*1`ey{2bjY8(D8voeMj@ z#xF?d-l_gL`f78^MM)oU7d|SiM?WTO?mXz7&JT4SZYpt^)z_slQ?v@~+XhUHnPTEH zYuK@7afZv)0IxXl(z@d@Tp>)gU&dsi$TYgNd3&YAYK@rz4}n_}9RX?td#4Mpi=|Id zoquG1;xA)XKOz?ksP-?Y02d4U9326f{8J&_&=6RFkOP642s;pX3c~2IRzaEzMo!B8 zELN_F<**!l^L?zV+!^k2#V7}$XAis1BQsb7ZDeTbSQE$u-LyCK#a#Vxd;b3ejP7R$IipKO*csiA5Ozja{{!(WGF8_O{CW++ zMEu(ABsQt{5KP3cOuJv6r78_UH-3GF%;*q6Rp$9+{h5egi=8|gzbth{dG7qw??{3=Y2U!7cZT--4^hF|

N~Eb0u-co;>KnU*W%Z@D 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

~M?8Mkrc4F)*J27^Zofx~yPK;e; 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. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb-utils.context/build.xml b/org.glite.lb-utils.context/build.xml deleted file mode 100644 index 81cd270..0000000 --- a/org.glite.lb-utils.context/build.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.context/project/build.number b/org.glite.lb-utils.context/project/build.number deleted file mode 100644 index 5cfec85..0000000 --- a/org.glite.lb-utils.context/project/build.number +++ /dev/null @@ -1 +0,0 @@ -module.build = 0 diff --git a/org.glite.lb-utils.context/project/build.properties b/org.glite.lb-utils.context/project/build.properties deleted file mode 100755 index e69de29..0000000 diff --git a/org.glite.lb-utils.context/project/configure.properties.xml b/org.glite.lb-utils.context/project/configure.properties.xml deleted file mode 100644 index 0b17304..0000000 --- a/org.glite.lb-utils.context/project/configure.properties.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/org.glite.lb-utils.context/project/properties.xml b/org.glite.lb-utils.context/project/properties.xml deleted file mode 100644 index 86c1f8a..0000000 --- a/org.glite.lb-utils.context/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.context/project/version.properties b/org.glite.lb-utils.context/project/version.properties deleted file mode 100755 index 6f1f8ab..0000000 --- a/org.glite.lb-utils.context/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version = 0.0.0 -module.age = 0 \ No newline at end of file diff --git a/org.glite.lb-utils.db/.cvsignore b/org.glite.lb-utils.db/.cvsignore deleted file mode 100755 index ff82493..0000000 --- a/org.glite.lb-utils.db/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -.project -.cdtproject -build -doc -reports diff --git a/org.glite.lb-utils.db/LICENSE b/org.glite.lb-utils.db/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.lb-utils.db/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb-utils.db/Makefile b/org.glite.lb-utils.db/Makefile deleted file mode 100644 index 362c7cb..0000000 --- a/org.glite.lb-utils.db/Makefile +++ /dev/null @@ -1,128 +0,0 @@ -# defaults -top_srcdir=. -builddir=build -stagedir=. -distdir=. -globalprefix=glite -lbutilsprefix=lb-utils -package=glite-lb-utils-db -version=0.2.0 -PREFIX=/opt/glite -flavour=gcc32thr - -glite_location=/opt/glite -mysql_prefix=/opt/mysql -mysql_version=4.1.11 -cppunit_prefix=/opt/cppunit -thrflavour=gcc32pthr -nothrflavour=gcc32 - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -CC=gcc - -VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/examples - -DEBUG:=-g -O0 -Wall - -CFLAGS:= \ - ${DEBUG} \ - -DVERSION=\"${version}\" \ - -I${stagedir}/include -I${top_srcdir}/src -I. \ - -I${top_srcdir}/interface \ - ${COVERAGE_FLAGS} \ - -I${mysql_prefix}/include -I${mysql_prefix}/include/mysql \ - -D_GNU_SOURCE - -ifdef LBS_DB_PROFILE - CFLAGS:=${CFLAGS} -DLBS_DB_PROFILE -endif - -TEST_LIBS:=-L${cppunit_prefix}/lib -lcppunit -TEST_INC:=-I${cppunit_prefix}/include - -LDFLAGS:=-L${stagedir}/lib ${COVERAGE_FLAGS} - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/lib ${LDFLAGS} -INSTALL:=libtool --mode=install install - -ifneq (${mysql_prefix},/usr) - ifeq ($(shell echo ${mysql_version} | cut -d. -f1,2),4.1) - mysqlib := -L${mysql_prefix}/lib/mysql - else - mysqlib := -L${mysql_prefix}/lib - endif -endif - -EXT_LIBS:=${mysqlib} -lmysqlclient -lglite_lbu_trio -OBJS:=db.o -TESTOBJS:=dbtest.o -HDRS:=db.h -LOBJS:=${OBJS:.o=.lo} -LTESTOBJS:=${TESTOBJS:.o=.lo} - -libglite_lbu_db.la: ${LOBJS} - ${LINK} -o $@ $< ${EXT_LIBS} - -libglite_lbu_dbtest.la: ${LTESTOBJS} - ${LINK} -o $@ $< ${EXT_LIBS} - -dbtest.lo dbtest.o: db.c db.h - ${COMPILE} -DGLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH=10 -c $< -o $@ - -db_test: db_test.lo libglite_lbu_dbtest.la - ${LINK} -o $@ $+ ${EXT_LIBS} - -default all: compile - -compile: libglite_lbu_db.la - -check: - -echo No checks here 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 ${OBJS} | tr ' ' '\012' | sort -u`; do gcov $$i ; done - -examples: db_test - -doc: - doxygen C.dox - -stage: compile - $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes - -dist: distsrc distbin - -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir} - save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir - rm -rf tmpbuilddir - -install: - -mkdir -p ${PREFIX}/lib - -mkdir -p ${PREFIX}/include/${globalprefix}/${lbutilsprefix} -# ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - ${INSTALL} -m 755 "libglite_lbu_db.la" "${PREFIX}/lib/libglite_lbu_db.la"; \ - ${INSTALL} -m 644 ${top_srcdir}/interface/${HDRS} ${PREFIX}/include/${globalprefix}/${lbutilsprefix} - -clean: - -%.o %.lo: %.c - ${COMPILE} -c $< - -db.lo: db.c db.h -db_test.lo: libglite_lbu_dbtest.la db.h db_test.c - -.PHONY: default all compile check examples doc stage dist distsrc distbin install clean test_coverage diff --git a/org.glite.lb-utils.db/build.xml b/org.glite.lb-utils.db/build.xml deleted file mode 100644 index 14d4d7e..0000000 --- a/org.glite.lb-utils.db/build.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.db/examples/db_test.c b/org.glite.lb-utils.db/examples/db_test.c deleted file mode 100644 index 725fbf7..0000000 --- a/org.glite.lb-utils.db/examples/db_test.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Example (and quick test) of this DB module. - * - * Requires existing database with appropriate access: - * - * mysqladmin -u root -p create test - * mysql -u root -p -e 'GRANT ALL on test.* to testuset@localhost' - * - * Use CS environment variable when using different user/pwd@machine:dbname. - */ - -#include -#include -#include - -#include "db.h" - -#define CS "testuser/@localhost:test" -#define CREATE_CMD "CREATE TABLE data (\n\ - id INT NOT NULL,\n\ - user VARCHAR(32) NOT NULL,\n\ - info BLOB,\n\ - PRIMARY KEY (id),\n\ - INDEX(user)\n\ -) engine=innodb" -#define DROP_CMD "DROP TABLE data" -#define INSERT_TRIO_CMD "INSERT INTO data (id, user, info) VALUES (%d, %s, %s)" -#define SELECT_TRIO_CMD "SELECT id, user, info FROM data WHERE user = '%s'" -#define INSERT_CMD "INSERT INTO data (id, user, info) VALUES (?, ?, ?)" -#define SELECT_CMD "SELECT id, user, info FROM data WHERE user = ?" - -#define dprintf(ARGS) { printf("%s: ", name); printf ARGS; } - - -static void print_blob(unsigned long len, char *blob) { - int i; - for (i = 0; i < len; i++) printf("%02X ", blob[i]); - printf("(='"); - for (i = 0; i < len; i++) printf("%c", blob[i]); - printf("')"); -} - - -static void print_free_result(const char *name, unsigned long *lens, char **res) { - dprintf((" id='%s'=%d\n", res[0], atoi(res[0]))); - - dprintf((" user='%s'\n", res[1])); - - dprintf((" blob=")); - if (res[2] && lens) print_blob(lens[2], res[2]); - else printf("null"); - printf("\n"); - - free(res[0]); - free(res[1]); - free(res[2]); -} - - -int main(int argn, char *argv[]) { - char *name, *cmd; - const char *cs; - glite_lbu_DBContext ctx; - glite_lbu_Statement stmt; - int caps; - - char blob1[] = "Guess: blob or \000string?"; - char blob2[] = {0, 1, 2, 3, 4, 5}; - - int nr; - char *res[3]; - unsigned long lens[3]; - - if ((name = strrchr(argv[0], '/')) != NULL) name++; - else name = argv[0]; - if ((cs = getenv("CS")) == NULL) cs = CS; - cmd = NULL; - - // init - dprintf(("connecting to %s...\n", cs)); - if (glite_lbu_DBConnect(&ctx, cs, 0) != 0) goto fail; - if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) goto failctx; - if ((caps & GLITE_LBU_DB_CAP_PREPARED) == 0) { - dprintf(("can't do prepared commands, exiting.")); - goto failctx; - } - // caps - glite_lbu_DBSetCaps(ctx, caps); - dprintf(("capabilities: %d\n", caps)); - // create all needed tables and data - dprintf(("creating tables...\n")); - glite_lbu_ExecSQL(ctx, DROP_CMD, NULL); - if (glite_lbu_ExecSQL(ctx, CREATE_CMD, NULL) == -1) goto failctx; - // trio-insert - dprintf(("trio-insert...\n")); - asprintf(&cmd, INSERT_TRIO_CMD, 1, "'hyperochus'", "NULL"); - if (glite_lbu_ExecSQL(ctx, cmd, NULL) != 1) goto failctx; - free(cmd); cmd = NULL; - // prepared-insert - dprintf(("prepare-insert...\n")); - if (glite_lbu_PrepareStmt(ctx, INSERT_CMD, &stmt) != 0) goto failctx; - dprintf(("execute 1. insert...\n")); - if (glite_lbu_ExecStmt(stmt, 3, - GLITE_LBU_DB_TYPE_INT, 2, - GLITE_LBU_DB_TYPE_VARCHAR, "cicomexocitl.civ", - GLITE_LBU_DB_TYPE_BLOB, blob1, sizeof(blob1) - 1) != 1) goto failstmt; - dprintf(("execute 2. insert...\n")); - if (glite_lbu_ExecStmt(stmt, 3, - GLITE_LBU_DB_TYPE_INT, 3, - GLITE_LBU_DB_TYPE_VARCHAR, "tartarus", - GLITE_LBU_DB_TYPE_NULL) != 1) goto failstmt; - dprintf(("execute 3. insert...\n")); - if (glite_lbu_ExecStmt(stmt, 3, - GLITE_LBU_DB_TYPE_INT, 4, - GLITE_LBU_DB_TYPE_VARCHAR, "harpia", - GLITE_LBU_DB_TYPE_BLOB, blob2, sizeof(blob2)) != 1) goto failstmt; - glite_lbu_FreeStmt(stmt); - dprintf(("\n")); - - // trio-query -{ - const char *user; - - user = "harpia"; - dprintf(("selecting '%s'...\n", user)); - asprintf(&cmd, SELECT_TRIO_CMD, user); - if (glite_lbu_ExecSQL(ctx, cmd, &stmt) == -1) goto failctx; - free(cmd); cmd = NULL; - dprintf(("fetching '%s'...\n", user)); - while ((nr = glite_lbu_FetchRow(stmt, 3, lens, res)) > 0) { - dprintf(("Result: n=%d, res=%p\n", nr, res)); - print_free_result(name, lens, res); - } - if (nr < 0) dprintf(("fetch '%s' failed\n", user)); - dprintf(("closing stmt...\n")); - glite_lbu_FreeStmt(stmt); - dprintf(("\n")); - - user = "nobody"; - dprintf(("selecting '%s'...\n", user)); - asprintf(&cmd, SELECT_TRIO_CMD, user); - if (glite_lbu_ExecSQL(ctx, cmd, &stmt) == -1) goto failctx; - free(cmd); cmd = NULL; - dprintf(("fetching '%s'...\n", user)); - while ((nr = glite_lbu_FetchRow(stmt, 3, lens, res)) > 0) { - dprintf(("Result: n=%d, res=%p\n", nr, res)); - print_free_result(name, lens, res); - } - if (nr < 0) dprintf(("fetch '%s' failed\n", user)); - dprintf(("closing stmt...\n")); - glite_lbu_FreeStmt(stmt); - dprintf(("\n")); -} - - // "param" queries -{ - const char *user; - - dprintf(("preparing...\n", user)); - if ((glite_lbu_PrepareStmt(ctx, SELECT_CMD, &stmt)) != 0) goto failctx; - - user = "cicomexocitl.civ"; - dprintf(("executing '%s'...\n", user)); - if (glite_lbu_ExecStmt(stmt, 1, GLITE_LBU_DB_TYPE_VARCHAR, user) == -1) goto failstmt; - dprintf(("fetching '%s'...\n", user)); - while ((nr = glite_lbu_FetchRow(stmt, 3, lens, res)) > 0) { - dprintf(("Result: n=%d, res=%p\n", nr, res)); - print_free_result(name, lens, res); - } - if (nr < 0) dprintf(("fetch '%s' failed\n", user)); - dprintf(("\n")); - - dprintf(("closing stmt...\n")); - glite_lbu_FreeStmt(stmt); - dprintf(("\n")); -} - - dprintf(("closing...\n")); - glite_lbu_DBClose(ctx); - return 0; - -failstmt: - printf("closing stmt...\n"); - glite_lbu_FreeStmt(stmt); -failctx: - dprintf(("closing...\n")); - glite_lbu_DBClose(ctx); -fail: - free(cmd); - dprintf(("failed\n")); - return 1; -} diff --git a/org.glite.lb-utils.db/interface/db.h b/org.glite.lb-utils.db/interface/db.h deleted file mode 100644 index af197f4..0000000 --- a/org.glite.lb-utils.db/interface/db.h +++ /dev/null @@ -1,322 +0,0 @@ -#ifndef GLITE_LBU_DB_H -#define GLITE_LBU_DB_H - -#ident "$Header$" - - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * \file db.h - * \defgroup database Database module - * - * Database modul module API (LB & JP Utils). - * - * There are two ways to access DB here: - * - simple: - * - * SQL commands as single string. All values are incorporated in the SQL command strings. Proper escaping is required. - * - enhanced: - * - * Prepared SQL commands with separated parameters, functions PrepareStmt() and ExecStmt(). All values are delivered in separated buffers. Its faster for multiple using and more secure. - * @{ - */ - - -/** - * Enable transaction support if available. - * - * With disabled transaction can be used transaction functions, they are just ignored. - */ -#define GLITE_LBU_DB_CAP_TRANSACTIONS 1 - -/** - * Check prepared parameters support. - */ -#define GLITE_LBU_DB_CAP_PREPARED 2 - -/** - * Check for getting indexes support. - * - * Needed for QueryIndices call. - */ -#define GLITE_LBU_DB_CAP_INDEX 4 - - -/** - * Database connection context. - */ -typedef struct glite_lbu_DBContext_s *glite_lbu_DBContext; - - -/** - * Prepared statement, used for SQL statement with parameters. - */ -typedef struct glite_lbu_Statement_s *glite_lbu_Statement; - - -/** - * Structure holds date for multi-rows insert. - */ -typedef struct glite_lbu_bufInsert_s *glite_lbu_bufInsert; - - - -/** - * All types of parameteres, they match to the SQL types. - */ -typedef enum { - GLITE_LBU_DB_TYPE_NULL = 0, - GLITE_LBU_DB_TYPE_TINYINT = 1, - GLITE_LBU_DB_TYPE_INT = 2, - GLITE_LBU_DB_TYPE_TINYBLOB = 3, - GLITE_LBU_DB_TYPE_TINYTEXT = 4, - GLITE_LBU_DB_TYPE_BLOB = 5, - GLITE_LBU_DB_TYPE_TEXT = 6, - GLITE_LBU_DB_TYPE_MEDIUMBLOB = 7, - GLITE_LBU_DB_TYPE_MEDIUMTEXT = 8, - GLITE_LBU_DB_TYPE_LONGBLOB = 9, - GLITE_LBU_DB_TYPE_LONGTEXT = 10, - GLITE_LBU_DB_TYPE_VARCHAR = 11, - GLITE_LBU_DB_TYPE_CHAR = 12, - GLITE_LBU_DB_TYPE_DATE = 13, - GLITE_LBU_DB_TYPE_TIME = 14, - GLITE_LBU_DB_TYPE_DATETIME = 15, - GLITE_LBU_DB_TYPE_TIMESTAMP = 16, - GLITE_LBU_DB_TYPE_LAST = 17 -} glite_lbu_DBType; - - - -/** - * Get error state from DB context. - * - * \param[in] ctx context to work with - * \param[out] text error name - * \param[out] desc error description - */ -int glite_lbu_DBError(glite_lbu_DBContext ctx, char **text, char **desc); - - -/** - * Create the context and connect to the database. - * - * \param[out] ctx context to work with - * \param[in] cs connect string user/password\@host:database - * - * \return error code, 0 = OK - */ -int glite_lbu_DBConnect(glite_lbu_DBContext *ctx, const char *cs); - - -/** - * Close the connection and free the context. - * - * \param[in,out] ctx context to work with - */ -void glite_lbu_DBClose(glite_lbu_DBContext ctx); - - -/** - * Check database version and capabilities. - * - * \param[in,out] ctx context to work with - * - * \return capabilities - * \retval -1 error occured - */ -int glite_lbu_DBQueryCaps(glite_lbu_DBContext ctx); - - -/** - * Set the database capabilities on already initialized context. - * - * It should be find out by DBQueryCaps() first. - * - * \param[in,out] ctx context to work with - * \param[in] caps capabilities to use, should be found out by QueryCaps() - */ -void glite_lbu_DBSetCaps(glite_lbu_DBContext ctx, int caps); - - -/** - * Start transaction. - */ -int glite_lbu_Transaction(glite_lbu_DBContext ctx); - - -/** - * Commit (end) transaction. - */ -int glite_lbu_Commit(glite_lbu_DBContext ctx); - - -/** - * Cancel transaction. - */ -int glite_lbu_Rollback(glite_lbu_DBContext ctx); - - -/** - * \param[in,out] stmt executed SQL statement - * \param[in] n number of items for sure there is enough space in lengths and results - * \param[out] lengths array with lengths (good for data blobs), may be NULL - * \param[out] results array with results, all items are allocated - * - * \retval >0 number of fields of the retrieved row - * \retval 0 no more rows - * \retval -1 error - */ -int glite_lbu_FetchRow(glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results); - - -/** - * Free the statement structure and destroy its parameters. - * - * Statement will be set to NULL and multiple calls are allowed. - * - * \param[in,out] stmt statement - */ -void glite_lbu_FreeStmt(glite_lbu_Statement *stmt); - - -/** - * Parse and execute one simple SQL statement. - * All values are incorporated int the SQL command string. - * - * \param[in,out] ctx context to work with - * \param[in] cmd SQL command - * \param[out] stmt statement handle with results (makes sense for selects only) - * - * \return number of rows selected, created or affected by update, -1 on error - */ -int glite_lbu_ExecSQL(glite_lbu_DBContext ctx, const char *cmd, glite_lbu_Statement *stmt); - - -/** - * Query for column names of the statement. - * - * It work only for simple API, so only after ExecSQL(). - * - * \param[in,out] stmt the statement handle - * \param[out] cols result array of names - * - * \return error code - */ -int glite_lbu_QueryColumns(glite_lbu_Statement stmt, char **cols); - - -/** - * Retrieve column names of a query simple SQL statement. - * - * \param[in,out] ctx context to work with - * \param[in] table table name - * \param[out] key_names one-dimensional index names array - * \param[out] column_names two-dimensional column names array - * - * \return 0 if OK, nonzero on error - */ -int glite_lbu_QueryIndices(glite_lbu_DBContext ctx, const char *table, char ***key_names, char ****column_names); - - -/** - * Convert time_t into database-specific time string. - * - * The result string can be used directly in SQL commands. - * - * \param[in] t the converted time - * \param[out] str result allocated string - */ -void glite_lbu_TimeToDB(time_t t, char **str); - - -/** - * Convert database-specific time string to time_t. - * - * String is expected in database for (ISO format). - * - * \param[in] str the converted string - * \return result time - */ -time_t glite_lbu_DBToTime(const char *str); - - -/** - * Init data structure for buffered insert - * - * takes table_name and columns string for future multirow insert - * when insert string oversize size_limit or number of rows to be inserted - * overcome record_limit, the real insert is triggered - */ -int glite_lbu_bufferedInsertInit(glite_lbu_DBContext ctx, glite_lbu_bufInsert *bi, void *mysql, const char *table_name, long size_limit, long record_limit, const char * columns); - - -/** - * adds row of n values into n columns into an insert buffer - * if num. of rows or size of data oversteps the limits, real - * multi-row insert is done - */ -int glite_lbu_bufferedInsert(glite_lbu_bufInsert bi, const char *row); - - -/** - * Flush buffered data and free bi structure. - */ -int glite_lbu_bufferedInsertClose(glite_lbu_bufInsert bi); - - -/** - * Prepare the SQL statement. Use glite_lbu_FreeStmt() to free it. - * - * \param[in,out] ctx context to work with - * \param[in] sql SQL command - * \param[out] stmt returned SQL statement - * - * \return error code - */ -int glite_lbu_PrepareStmt(glite_lbu_DBContext ctx, const char *sql, glite_lbu_Statement *stmt); - - -/** - * Execute prepared SQL statement. - * - * \param[in,out] stmt SQL statement - * \param[in] n number of items - * - * Variable parameters (n-times): - * - * always: - * - * \param type DB item type - * - * then one of them: - * - * \param GLITE_LBU_DB_TYPE_TINYINT int c - * \param GLITE_LBU_DB_TYPE_INT long int i - * \param GLITE_LBU_DB_TYPE_...BLOB/TEXT void *b, unsigned long len - * \param GLITE_LBU_DB_TYPE_[VAR]CHAR char *str - * \param GLITE_LBU_DB_TYPE_DATE/TIME/DATETIME time_t t - * \param GLITE_LBU_DB_TYPE_TIMESTAMP time_t t - * \param GLITE_LBU_DB_TYPE_NULL - - * - * \return number of affected rows, -1 on error - */ -int glite_lbu_ExecStmt(glite_lbu_Statement stmt, int n, ...); - - -/** - * @} database group - */ - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/org.glite.lb-utils.db/project/build.number b/org.glite.lb-utils.db/project/build.number deleted file mode 100644 index 5cfec85..0000000 --- a/org.glite.lb-utils.db/project/build.number +++ /dev/null @@ -1 +0,0 @@ -module.build = 0 diff --git a/org.glite.lb-utils.db/project/build.properties b/org.glite.lb-utils.db/project/build.properties deleted file mode 100755 index 1df02e3..0000000 --- a/org.glite.lb-utils.db/project/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -lb-utils.subsystem.name = org.glite.lb-utils -lb-utils.subsystem.prefix = lb-utils - diff --git a/org.glite.lb-utils.db/project/configure.properties.xml b/org.glite.lb-utils.db/project/configure.properties.xml deleted file mode 100644 index 276b497..0000000 --- a/org.glite.lb-utils.db/project/configure.properties.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbutilsprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} -flavour=${with.globus.thr.flavor} - -glite_location=${with.glite.location} -mysql_prefix=${with.mysql.prefix} -mysql_version=${ext.mysql.version} -cppunit_prefix=${with.cppunit.prefix} - - -PROJECT_NAME = "Glite LB/JP Utils: Database Module" -PROJECT_NUMBER = ${module.version} -OUTPUT_DIRECTORY = ${component.dir}/doc/C -OPTIMIZE_OUTPUT_FOR_C = YES -INPUT = ../interface/db.h -SHOW_DIRECTORIES = NO -FULL_PATH_NAMES = NO -EXTRACT_ALL = YES -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -MACRO_EXPANSION = YES -EXPAND_ONLY_PREDEF = YES -#PREDEFINED = _EDG_WLL_EVENT_COMMON -HAVE_DOT = NO - - - - diff --git a/org.glite.lb-utils.db/project/properties.xml b/org.glite.lb-utils.db/project/properties.xml deleted file mode 100644 index d01c359..0000000 --- a/org.glite.lb-utils.db/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.db/project/tar_exclude b/org.glite.lb-utils.db/project/tar_exclude deleted file mode 100644 index e1fcd1a..0000000 --- a/org.glite.lb-utils.db/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure.properties.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.lb-utils.db/project/version.properties b/org.glite.lb-utils.db/project/version.properties deleted file mode 100755 index 6f1f8ab..0000000 --- a/org.glite.lb-utils.db/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version = 0.0.0 -module.age = 0 \ No newline at end of file diff --git a/org.glite.lb-utils.db/src/db.c b/org.glite.lb-utils.db/src/db.c deleted file mode 100644 index 9698362..0000000 --- a/org.glite.lb-utils.db/src/db.c +++ /dev/null @@ -1,1031 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "glite/lb-utils/trio.h" -#include "db.h" - - -#define GLITE_LBU_MYSQL_INDEX_VERSION 40001 -#define GLITE_LBU_MYSQL_PREPARED_VERSION 40102 -#define BUF_INSERT_ROW_ALLOC_BLOCK 1000 -#ifndef GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH -#define GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH 256 -#endif - - -#define CLR_ERR(CTX) lbu_clrerr((CTX)) -#define ERR(CTX, CODE, DESC) lbu_err((CTX), (CODE), (DESC), __FUNCTION__, __LINE__) -#define STATUS(CTX) ((CTX)->err.code) -#define MY_ERR(CTX) myerr((CTX), __FUNCTION__, __LINE__) -#define MY_ERRSTMT(STMT) myerrstmt((STMT), __FUNCTION__, __LINE__) -#define MY_ISOKSTMT(STMT, RETRY) myisokstmt((STMT), __FUNCTION__, __LINE__, (RETRY)) - -#define USE_TRANS(CTX) ((CTX->caps & GLITE_LBU_DB_CAP_TRANSACTIONS) != 0) - - - -struct glite_lbu_DBContext_s { - MYSQL *mysql; - const char *cs; - int have_caps; - int caps; - struct { - int code; - char *desc; - } err; -}; - - -struct glite_lbu_Statement_s { - glite_lbu_DBContext ctx; - - /* for simple commands */ - MYSQL_RES *result; - - /* for prepared commands */ - MYSQL_STMT *stmt; - unsigned long nrfields; -}; - - -struct glite_lbu_bufInsert_s { - glite_lbu_DBContext ctx; - char *table_name; - char *columns; /* names of columns to be inserted into - * (values separated with commas) */ - char **rows; /* each row hold string of one row to be inserted - * (values separated with commas) */ - long rec_num, /* actual number of rows in structure */ - rec_size; /* approx. size of a real insert string */ - long size_limit, /* size and # of records limit which trigger */ - record_limit; /* real insert; zero means unlimitted */ -}; - - -/* - * mapping glite DB types to mysql types - */ -int glite_type_to_mysql[] = { - MYSQL_TYPE_NULL, - MYSQL_TYPE_TINY, - MYSQL_TYPE_LONG, - MYSQL_TYPE_TINY_BLOB, - MYSQL_TYPE_TINY_BLOB, - MYSQL_TYPE_BLOB, - MYSQL_TYPE_BLOB, - MYSQL_TYPE_MEDIUM_BLOB, - MYSQL_TYPE_MEDIUM_BLOB, - MYSQL_TYPE_LONG_BLOB, - MYSQL_TYPE_LONG_BLOB, - MYSQL_TYPE_VAR_STRING, - MYSQL_TYPE_STRING, - MYSQL_TYPE_DATE, - MYSQL_TYPE_TIME, - MYSQL_TYPE_DATETIME, - MYSQL_TYPE_TIMESTAMP, -}; - - - -static int lbu_clrerr(glite_lbu_DBContext ctx); -static int lbu_err(glite_lbu_DBContext ctx, int code, const char *desc, const char *func, int line); -static int myerr(glite_lbu_DBContext ctx, const char *source, int line); -static int myerrstmt(glite_lbu_Statement stmt, const char *source, int line); -static int myisokstmt(glite_lbu_Statement stmt, const char *source, int line, int *retry); -static int db_connect(glite_lbu_DBContext ctx, const char *cs, MYSQL **mysql); -static void db_close(MYSQL *mysql); -static int transaction_test(glite_lbu_DBContext ctx, MYSQL *m2, int *have_transactions); -static int FetchRowSimple(glite_lbu_DBContext ctx, MYSQL_RES *result, unsigned long *lengths, char **results); -static int FetchRowPrepared(glite_lbu_DBContext ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results); -void set_time(MYSQL_TIME *mtime, const time_t time); -time_t get_time(const MYSQL_TIME *mtime); - - -/* ---- common ---- */ - - -int glite_lbu_DBError(glite_lbu_DBContext ctx, char **text, char **desc) { - if (text) *text = strdup(strerror(ctx->err.code)); - if (desc) { - if (ctx->err.desc) *desc = strdup(ctx->err.desc); - else *desc = NULL; - } - - return ctx->err.code; -} - - -int glite_lbu_DBConnect(glite_lbu_DBContext *ctx, const char *cs) { - int err; - - *ctx = calloc(1, sizeof **ctx); - if (db_connect(*ctx, cs, &(*ctx)->mysql) != 0) { - err = STATUS(*ctx); - glite_lbu_DBClose(*ctx); - *ctx = NULL; - return err; - } - return 0; -} - - -void glite_lbu_DBClose(glite_lbu_DBContext ctx) { - db_close(ctx->mysql); - free(ctx->err.desc); - free(ctx); -} - - -int glite_lbu_DBQueryCaps(glite_lbu_DBContext ctx) { - MYSQL *m = ctx->mysql; - MYSQL *m2; - int major,minor,sub,version,caps,have_transactions=0; - const char *ver_s; - - if (ctx->have_caps) return ctx->caps; - - caps = 0; - - ver_s = mysql_get_server_info(m); - if (!ver_s || 3 != sscanf(ver_s,"%d.%d.%d",&major,&minor,&sub)) - return ERR(ctx, EINVAL, "problem retreiving MySQL version"); - version = 10000*major + 100*minor + sub; - - if (version >= GLITE_LBU_MYSQL_INDEX_VERSION) caps |= GLITE_LBU_DB_CAP_INDEX; - if (version >= GLITE_LBU_MYSQL_PREPARED_VERSION) caps |= GLITE_LBU_DB_CAP_PREPARED; - - CLR_ERR(ctx); - - if (db_connect(ctx, ctx->cs, &m2) == 0) { - transaction_test(ctx, m2, &have_transactions); - db_close(m2); - } - if (have_transactions) caps |= GLITE_LBU_DB_CAP_TRANSACTIONS; - - if (STATUS(ctx) == 0) { - ctx->have_caps = 1; - return caps; - } else return -1; -} - - -void glite_lbu_DBSetCaps(glite_lbu_DBContext ctx, int caps) { - ctx->caps = caps; -} - - -int glite_lbu_Transaction(glite_lbu_DBContext ctx) { - if (USE_TRANS(ctx)) { - if (glite_lbu_ExecSQL(ctx, "SET AUTOCOMMIT=0", NULL) < 0) goto err; - if (glite_lbu_ExecSQL(ctx, "BEGIN", NULL) < 0) goto err; - } -err: - return STATUS(ctx); -} - - -int glite_lbu_Commit(glite_lbu_DBContext ctx) { - if (USE_TRANS(ctx)) { - if (glite_lbu_ExecSQL(ctx, "COMMIT", NULL) < 0) goto err; - if (glite_lbu_ExecSQL(ctx, "SET AUTOCOMMIT=1", NULL) < 0) goto err; - } -err: - return STATUS(ctx); -} - - -int glite_lbu_Rollback(glite_lbu_DBContext ctx) { - if (USE_TRANS(ctx)) { - if (glite_lbu_ExecSQL(ctx, "ROLLBACK", NULL) < 0) goto err; - if (glite_lbu_ExecSQL(ctx, "SET AUTOCOMMIT=1", NULL) < 0) goto err; - } -err: - return STATUS(ctx); -} - - -int glite_lbu_FetchRow(glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results) { - memset(results, 0, n * sizeof(*results)); - if (stmt->result) return FetchRowSimple(stmt->ctx, stmt->result, lengths, results); - else return FetchRowPrepared(stmt->ctx, stmt, n, lengths, results); -} - - -void glite_lbu_FreeStmt(glite_lbu_Statement *stmt) { - if (*stmt) { - if ((*stmt)->result) mysql_free_result((*stmt)->result); - if ((*stmt)->stmt) mysql_stmt_close((*stmt)->stmt); - free(*stmt); - *stmt = NULL; - } -} - - -int glite_lbu_QueryIndices(glite_lbu_DBContext ctx, const char *table, char ***key_names, char ****column_names) { - glite_lbu_Statement stmt = NULL; - - int i,j,ret; - -/* XXX: "show index from" columns. Matches at least MySQL 4.0.11 */ - char *showcol[12]; - int Key_name,Seq_in_index,Column_name,Sub_part; - - char **keys = NULL; - int *cols = NULL; - char **col_names = NULL; - - int nkeys = 0; - - char ***idx = NULL; - - Key_name = Seq_in_index = Column_name = Sub_part = -1; - - if (glite_lbu_ExecSQL(ctx,"show index from states",&stmt)<0) - return STATUS(ctx); - - while ((ret = glite_lbu_FetchRow(stmt,sizeof(showcol)/sizeof(showcol[0]),NULL,showcol)) > 0) { - assert(ret <= sizeof showcol/sizeof showcol[0]); - - if (!col_names) { - col_names = malloc(ret * sizeof col_names[0]); - glite_lbu_QueryColumns(stmt,col_names); - for (i=0; i= 0 && Seq_in_index >= 0 && - Column_name >= 0 && Sub_part >= 0); - - } - - for (i=0; imysql, cmd)) { - /* error occured */ - switch (merr = mysql_errno(ctx->mysql)) { - case 0: - break; - case ER_DUP_ENTRY: - ERR(ctx, EEXIST, mysql_error(ctx->mysql)); - return -1; - break; - case CR_SERVER_LOST: - if (retry_nr <= 0) - do_reconnect = 1; - break; - default: - MY_ERR(ctx); - return -1; - break; - } - } - retry_nr++; - } - - if (stmt) { - *stmt = calloc(1, sizeof(**stmt)); - if (!*stmt) { - ERR(ctx, ENOMEM, NULL); - return -1; - } - (**stmt).ctx = ctx; - (**stmt).result = mysql_store_result(ctx->mysql); - if (!(**stmt).result) { - if (mysql_errno(ctx->mysql)) { - MY_ERR(ctx); - *stmt = NULL; - return -1; - } - } - } else { - MYSQL_RES *r = mysql_store_result(ctx->mysql); - mysql_free_result(r); - } -#ifdef LBS_DB_PROFILE - pid = getpid(); - gettimeofday(&end,NULL); - end.tv_usec -= start.tv_usec; - end.tv_sec -= start.tv_sec; - if (end.tv_usec < 0) { end.tv_sec--; end.tv_usec += 1000000; } - - sum.tv_usec += end.tv_usec; - sum.tv_sec += end.tv_sec + sum.tv_usec / 1000000; - sum.tv_usec -= 1000000 * (sum.tv_usec / 1000000); - fprintf(stderr,"[%d] %s\n[%d] %3ld.%06ld (sum: %3ld.%06ld)\n",pid,txt,pid,end.tv_sec,end.tv_usec,sum.tv_sec,sum.tv_usec); -#endif - - return mysql_affected_rows(ctx->mysql); -} - - -int glite_lbu_QueryColumns(glite_lbu_Statement stmt, char **cols) -{ - int i = 0; - MYSQL_FIELD *f; - - if (!stmt->result) return ERR(stmt->ctx, EINVAL, "QueryColumns implemented only for simple API"); - while ((f = mysql_fetch_field(stmt->result))) cols[i++] = f->name; - return i == 0; -} - - -void glite_lbu_TimeToDB(time_t t, char **str) { - struct tm *tm = gmtime(&t); - - asprintf(str,"'%4d-%02d-%02d %02d:%02d:%02d'",tm->tm_year+1900,tm->tm_mon+1, - tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec); -} - - -time_t glite_lbu_DBToTime(const char *str) { - struct tm tm; - - memset(&tm,0,sizeof(tm)); - setenv("TZ","UTC",1); tzset(); - sscanf(str,"%4d-%02d-%02d %02d:%02d:%02d", - &tm.tm_year,&tm.tm_mon,&tm.tm_mday, - &tm.tm_hour,&tm.tm_min,&tm.tm_sec); - tm.tm_year -= 1900; - tm.tm_mon--; - - return mktime(&tm); -} - -/* ---- prepared --- */ - -int glite_lbu_PrepareStmt(glite_lbu_DBContext ctx, const char *sql, glite_lbu_Statement *stmt) { - int ret, retry; - MYSQL_RES *meta; - - // init - *stmt = calloc(1, sizeof(**stmt)); - (*stmt)->ctx = ctx; - - // create the SQL command - if (((*stmt)->stmt = mysql_stmt_init(ctx->mysql)) == NULL) - return MY_ERRSTMT(*stmt); - - // prepare the SQL command - retry = 1; - do { - mysql_stmt_prepare((*stmt)->stmt, sql, strlen(sql)); - ret = MY_ISOKSTMT(*stmt, &retry); - } while (ret == 0); - if (ret == -1) goto failed; - - // number of fields (0 for no results) - if ((meta = mysql_stmt_result_metadata((*stmt)->stmt)) != NULL) { - (*stmt)->nrfields = mysql_num_fields(meta); - mysql_free_result(meta); - } else - (*stmt)->nrfields = 0; - - return CLR_ERR(ctx); - -failed: - glite_lbu_FreeStmt(stmt); - return STATUS(ctx); -} - - -int glite_lbu_ExecStmt(glite_lbu_Statement stmt, int n, ...) { - int i; - va_list ap; - glite_lbu_DBType type; - char *pchar; - long int *plint; - MYSQL_TIME *ptime; - glite_lbu_DBContext ctx; - int ret, retry; - MYSQL_BIND *binds = NULL; - void **data = NULL; - unsigned long *lens; - - // gather parameters - if (n) { - binds = calloc(n, sizeof(MYSQL_BIND)); - data = calloc(n, sizeof(void *)); - lens = calloc(n, sizeof(unsigned long *)); - } - va_start(ap, n); - for (i = 0; i < n; i++) { - type = va_arg(ap, glite_lbu_DBType); - switch (type) { - case GLITE_LBU_DB_TYPE_TINYINT: - pchar = binds[i].buffer = data[i] = malloc(sizeof(char)); - *pchar = va_arg(ap, int); - break; - - case GLITE_LBU_DB_TYPE_INT: - plint = binds[i].buffer = data[i] = malloc(sizeof(long int)); - *plint = va_arg(ap, long int); - break; - - case GLITE_LBU_DB_TYPE_TINYBLOB: - case GLITE_LBU_DB_TYPE_TINYTEXT: - case GLITE_LBU_DB_TYPE_BLOB: - case GLITE_LBU_DB_TYPE_TEXT: - case GLITE_LBU_DB_TYPE_MEDIUMBLOB: - case GLITE_LBU_DB_TYPE_MEDIUMTEXT: - case GLITE_LBU_DB_TYPE_LONGBLOB: - case GLITE_LBU_DB_TYPE_LONGTEXT: - binds[i].buffer = va_arg(ap, void *); - binds[i].length = &lens[i]; - lens[i] = va_arg(ap, unsigned long); - break; - - case GLITE_LBU_DB_TYPE_VARCHAR: - case GLITE_LBU_DB_TYPE_CHAR: - binds[i].buffer = va_arg(ap, char *); - binds[i].length = &lens[i]; - lens[i] = binds[i].buffer ? strlen((char *)binds[i].buffer) : 0; - break; - - case GLITE_LBU_DB_TYPE_DATE: - case GLITE_LBU_DB_TYPE_TIME: - case GLITE_LBU_DB_TYPE_DATETIME: - case GLITE_LBU_DB_TYPE_TIMESTAMP: - ptime = binds[i].buffer = data[i] = malloc(sizeof(MYSQL_TIME)); - set_time(ptime, va_arg(ap, time_t)); - break; - - case GLITE_LBU_DB_TYPE_NULL: - break; - - default: - assert("unimplemented parameter assign" == NULL); - break; - } - binds[i].buffer_type = glite_type_to_mysql[type]; - } - va_end(ap); - - // bind parameters - if (mysql_stmt_bind_param(stmt->stmt, binds) != 0) { - MY_ERRSTMT(stmt); - goto failed; - } - - // run - ctx = stmt->ctx; - retry = 1; - do { - mysql_stmt_execute(stmt->stmt); - ret = MY_ISOKSTMT(stmt, &retry); - } while (ret == 0); - if (ret == -1) goto failed; - - // result - retry = 1; - do { - mysql_stmt_store_result(stmt->stmt); - ret = MY_ISOKSTMT(stmt, &retry); - } while (ret == 0); - if (ret == -1) goto failed; - - // free params - for (i = 0; i < n; i++) free(data[i]); - free(data); - free(binds); - free(lens); - CLR_ERR(ctx); - return mysql_stmt_affected_rows(stmt->stmt); - -failed: - for (i = 0; i < n; i++) free(data[i]); - free(data); - free(binds); - free(lens); - return -1; -} - - -int glite_lbu_bufferedInsertInit(glite_lbu_DBContext ctx, glite_lbu_bufInsert *bi, void *mysql, const char *table_name, long size_limit, long record_limit, const char *columns) -{ - *bi = calloc(1, sizeof(*bi)); - (*bi)->ctx = ctx; - (*bi)->table_name = strdup(table_name); - (*bi)->columns = strdup(columns); - (*bi)->rec_num = 0; - (*bi)->rec_size = 0; - (*bi)->rows = calloc(record_limit, sizeof(*((*bi)->rows)) ); - (*bi)->size_limit = size_limit; - (*bi)->record_limit = record_limit; - - return CLR_ERR(ctx); -} - - -static int flush_bufferd_insert(glite_lbu_bufInsert bi) -{ - char *stmt, *vals, *temp; - long i; - - - if (!bi->rec_num) - return STATUS(bi->ctx); - - asprintf(&vals,"(%s)", bi->rows[0]); - for (i=1; i < bi->rec_num; i++) { - // XXX: use string add (preallocated memory) - asprintf(&temp,"%s,(%s)", vals, bi->rows[i]); - free(vals); vals = temp; temp = NULL; - free(bi->rows[i]); - bi->rows[i] = NULL; - } - - trio_asprintf(&stmt, "insert into %|Ss(%|Ss) values %s;", - bi->table_name, bi->columns, vals); - - if (glite_lbu_ExecSQL(bi->ctx,stmt,NULL) < 0) { - if (STATUS(bi->ctx) == EEXIST) - CLR_ERR(bi->ctx); - } - - /* reset bi counters */ - bi->rec_size = 0; - bi->rec_num = 0; - - free(vals); - free(stmt); - - return STATUS(bi->ctx); -} - - -int glite_lbu_bufferedInsert(glite_lbu_bufInsert bi, const char *row) -{ - bi->rows[bi->rec_num++] = strdup(row); - bi->rec_size += strlen(row); - - if ((bi->size_limit && bi->rec_size >= bi->size_limit) || - (bi->record_limit && bi->rec_num >= bi->record_limit)) - { - if (flush_bufferd_insert(bi)) - return STATUS(bi->ctx); - } - - return CLR_ERR(bi->ctx); -} - - -static void free_buffered_insert(glite_lbu_bufInsert bi) { - long i; - - free(bi->table_name); - free(bi->columns); - for (i=0; i < bi->rec_num; i++) { - free(bi->rows[i]); - } - free(bi->rows); -} - - -int glite_lbu_bufferedInsertClose(glite_lbu_bufInsert bi) -{ - if (flush_bufferd_insert(bi)) - return STATUS(bi->ctx); - free_buffered_insert(bi); - - return CLR_ERR(bi->ctx); -} - - -/* - * helping compatibility function: clear error from the context - */ -static int lbu_clrerr(glite_lbu_DBContext ctx) { - ctx->err.code = 0; - if (ctx->err.desc) { - free(ctx->err.desc); - ctx->err.desc = NULL; - } - return 0; -} - - -/* - * helping compatibility function: sets error on the context - */ -static int lbu_err(glite_lbu_DBContext ctx, int code, const char *desc, const char *func, int line) { - if (code) { - ctx->err.code = code; - free(ctx->err.desc); - ctx->err.desc = desc ? strdup(desc) : NULL; - fprintf(stderr, "[db] %s:%d %s\n", func, line, desc); - return code; - } else - return ctx->err.code; -} - - -/* - * helping function: find oud mysql error and sets on the context - */ -static int myerr(glite_lbu_DBContext ctx, const char *source, int line) { - return lbu_err(ctx, EIO, mysql_error(ctx->mysql), source, line); -} - - -/* - * helping function: find oud mysql stmt error and sets on the context - */ -static int myerrstmt(glite_lbu_Statement stmt, const char *source, int line) { - return lbu_err(stmt->ctx, EIO, mysql_stmt_error(stmt->stmt), source, line); -} - - -/* - * Ehelping function: error handle - * - * \return -1 failed - * \return 0 retry - * \return 1 OK - */ -static int myisokstmt(glite_lbu_Statement stmt, const char *source, int line, int *retry) { - switch (mysql_stmt_errno(stmt->stmt)) { - case 0: - return 1; - break; - case ER_DUP_ENTRY: - lbu_err(stmt->ctx, EEXIST, mysql_stmt_error(stmt->stmt), source, line); - return -1; - break; - case CR_SERVER_LOST: - if (*retry > 0) { - (*retry)--; - return 0; - } else - return -1; - break; - default: - myerrstmt(stmt, source, line); - return -1; - break; - } -} - - -/* - * mysql connect - */ -static int db_connect(glite_lbu_DBContext ctx, const char *cs, MYSQL **mysql) { - char *buf = NULL; - char *host,*user,*pw,*db; - char *slash,*at,*colon; - int ret; - - // needed for SQL result parameters - assert(sizeof(int) >= sizeof(my_bool)); - - if (!cs) return ERR(ctx, EINVAL, "connect string not specified"); - - if (!(*mysql = mysql_init(NULL))) return ERR(ctx, ENOMEM, NULL); - - mysql_options(*mysql, MYSQL_READ_DEFAULT_FILE, "my"); - - host = user = pw = db = NULL; - - buf = strdup(cs); - slash = strchr(buf,'/'); - at = strrchr(buf,'@'); - colon = strrchr(buf,':'); - - if (!slash || !at || !colon) { - free(buf); - db_close(*mysql); - *mysql = NULL; - return ERR(ctx, EINVAL, "Invalid DB connect string"); - } - - *slash = *at = *colon = 0; - host = at+1; - user = buf; - pw = slash+1; - db = colon+1; - - /* ljocha: CLIENT_FOUND_ROWS added to make authorization check - * working in update_notif(). - * Hope it does not break anything else */ - if (!mysql_real_connect(*mysql,host,user,pw,db,0,NULL,CLIENT_FOUND_ROWS)) { - free(buf); - ret = MY_ERR(ctx); - glite_lbu_DBClose(ctx); - return ret; - } - free(buf); - - ctx->cs = cs; - return 0; -} - - -/* - * mysql close - */ -static void db_close(MYSQL *mysql) { - if (mysql) mysql_close(mysql); -} - - -/* - * test transactions capability: - * - * 1) with connection 1 create testing table test - * 2) with connection 1 insert a value - * 3) with connection 2 look for a value, transactions are for no error and - * no items found - * 4) with connection 1 commit and drop the table - */ -static int transaction_test(glite_lbu_DBContext ctx, MYSQL *m2, int *have_transactions) { - MYSQL *m1; - char *desc, *cmd_create, *cmd_insert, *cmd_select, *cmd_drop; - int retval; - int err; - pid_t pid; - - ctx->caps |= GLITE_LBU_DB_CAP_TRANSACTIONS; - pid = getpid(); - *have_transactions = 0; - - asprintf(&cmd_create, "CREATE TABLE test%d (item INT)", pid); - asprintf(&cmd_insert, "INSERT INTO test%d (item) VALUES (1)", pid); - asprintf(&cmd_select, "SELECT item FROM test%d", pid); - asprintf(&cmd_drop, "DROP TABLE test%d", pid); - - m1 = ctx->mysql; - glite_lbu_ExecSQL(ctx, cmd_drop, NULL); - if (glite_lbu_ExecSQL(ctx, cmd_create, NULL) != 0) goto err1; - if (glite_lbu_Transaction(ctx) != 0) goto err2; - if (glite_lbu_ExecSQL(ctx, cmd_insert, NULL) != 1) goto err2; - - ctx->mysql = m2; - if ((retval = glite_lbu_ExecSQL(ctx, cmd_select, NULL)) == -1) goto err2; - - ctx->mysql = m1; - if (glite_lbu_Commit(ctx) != 0) goto err2; - if (glite_lbu_ExecSQL(ctx, cmd_drop, NULL) != 0) goto err1; - -#ifdef LBS_DB_PROFILE - fprintf(stderr, "[%d] use_transactions = %d\n", getpid(), USE_TRANS(ctx)); -#endif - - *have_transactions = retval == 0; - goto ok; -err2: - err = ctx->err.code; - desc = ctx->err.desc; - glite_lbu_ExecSQL(ctx, cmd_drop, NULL); - ctx->err.code = err; - ctx->err.desc = desc; -err1: -ok: - free(cmd_create); - free(cmd_insert); - free(cmd_select); - free(cmd_drop); - return STATUS(ctx); -} - - -/* - * simple version of the fetch - */ -static int FetchRowSimple(glite_lbu_DBContext ctx, MYSQL_RES *result, unsigned long *lengths, char **results) { - MYSQL_ROW row; - int nr, i; - unsigned long *len; - - CLR_ERR(ctx); - - if (!(row = mysql_fetch_row(result))) { - if (mysql_errno((MYSQL *) ctx->mysql)) { - MY_ERR(ctx); - return -1; - } else return 0; - } - - nr = mysql_num_fields(result); - len = mysql_fetch_lengths(result); - for (i=0; inrfields) { - ERR(ctx, EINVAL, "bad number of result fields"); - return -1; - } - - // space for results - if (n) binds = calloc(n, sizeof(MYSQL_BIND)); - if (!lengths) { - lens = calloc(n, sizeof(unsigned long)); - lengths = lens; - } - for (i = 0; i < n; i++) { - binds[i].buffer_type = MYSQL_TYPE_VAR_STRING; - binds[i].buffer_length = GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH - 1; - binds[i].length = &lengths[i]; - binds[i].buffer = results[i] = calloc(1, GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH); - } - if (mysql_stmt_bind_result(stmt->stmt, binds) != 0) goto failedstmt; - - // fetch data, all can be truncated - retry = 1; - do { - switch(mysql_stmt_fetch(stmt->stmt)) { -#ifdef MYSQL_DATA_TRUNCATED - case MYSQL_DATA_TRUNCATED: -#endif - case 0: - ret = 1; break; - case 1: ret = MY_ISOKSTMT(stmt, &retry); break; - case MYSQL_NO_DATA: ret = 0; goto quit; /* it's OK */ - default: ERR(ctx, EIO, "other fetch error"); goto failed; - } - } while (ret == 0); - if (ret == -1) goto failed; - - // check if all fileds had enough buffer space - for (i = 0; i < n; i++) { - // fetch the rest if needed - if (lengths[i] > binds[i].buffer_length) { - unsigned int fetched; - - fetched = binds[i].buffer_length; - if ((results[i] = realloc(results[i], lengths[i] + 1)) == NULL) { - ERR(ctx, ENOMEM, "insufficient memory for field data"); - goto failed; - } - results[i][lengths[i]] = '\000'; - binds[i].buffer = results[i] + fetched; - binds[i].buffer_length = lengths[i] - fetched; - - retry = 1; - do { - switch (mysql_stmt_fetch_column(stmt->stmt, binds + i, i, fetched)) { - case 0: ret = 1; break; - case 1: ret = MY_ISOKSTMT(stmt, &retry); break; - case MYSQL_NO_DATA: ret = 0; goto quit; /* it's OK */ - default: ERR(ctx, EIO, "other fetch error"); goto failed; - } - } while (ret == 0); - if (ret == -1) goto failed; - } - } - - CLR_ERR(ctx); - free(binds); - free(lens); - return n; - -failedstmt: - MY_ERRSTMT(stmt); -failed: - ret = -1; -quit: - free(binds); - free(lens); - for (i = 0; i < n; i++) { - free(results[i]); - results[i] = NULL; - } - return ret; -} - - -void set_time(MYSQL_TIME *mtime, const time_t time) { - struct tm tm; - - gmtime_r(&time, &tm); - mtime->year = tm.tm_year + 1900; - mtime->month = tm.tm_mon + 1; - mtime->day = tm.tm_mday; - mtime->hour = tm.tm_hour; - mtime->minute = tm.tm_min; - mtime->second = tm.tm_sec; -} - - -time_t get_time(const MYSQL_TIME *mtime) { - struct tm tm; - - memset(&tm, 0, sizeof(tm)); - setenv("TZ","UTC",1); tzset(); - tm.tm_year = mtime->year - 1900; - tm.tm_mon = mtime->month - 1; - tm.tm_mday = mtime->day; - tm.tm_hour = mtime->hour; - tm.tm_min = mtime->minute; - tm.tm_sec = mtime->second; - - return mktime(&tm); -} diff --git a/org.glite.lb-utils.jobid/.cvsignore b/org.glite.lb-utils.jobid/.cvsignore deleted file mode 100755 index 1df717b..0000000 --- a/org.glite.lb-utils.jobid/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.lb-utils.jobid/LICENSE b/org.glite.lb-utils.jobid/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.lb-utils.jobid/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb-utils.jobid/Makefile b/org.glite.lb-utils.jobid/Makefile deleted file mode 100644 index e05e3e7..0000000 --- a/org.glite.lb-utils.jobid/Makefile +++ /dev/null @@ -1,98 +0,0 @@ -# Default values -top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -distdir=. -globalprefix=glite -package=glite-lb-utils-jobid -version=0.0.0 -PREFIX=/opt/glite -lbuprefix=lbu - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -VPATH=${top_srcdir}/src:${top_srcdir}/test::${top_srcdir}/doc - -CC=gcc - -DEBUG:=-g -O0 -Wall - -CFLAGS:=${DEBUG} -I${top_srcdir}/src -I${top_srcdir}/interface -I. -D_GNU_SOURCE - -COMPILE:=libtool --mode=compile ${CC} -LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/lib ${LDFLAGS} -INSTALL:=libtool --mode=install install - -OBJS:=cjobid.o strmd5.o -LOBJS:=${OBJS:.o=.lo} - -HDRS:=cjobid.h strmd5.h - -STATICLIB:=libglite_lbu_jobid.a -LTLIB:=libglite_lbu_jobid.la - -default: all - -all compile: ${STATICLIB} ${LTLIB} - -# to use libtool versioning correcty, we should have: -# -# current = major + minor + offset -# revision = patch -# age = minor -# -# where offset is a sum of maximal released minor's of all previous major's -# -# version_info=-version-info `echo ${version} | cut -d. -f1,2 | tr . :` - -# counted minors: n/a -offset=0 - -version_info:=-version-info ${shell \ - perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } - -${STATICLIB}: ${OBJS} - ar crv $@ ${OBJS} - ranlib $@ - -${LTLIB}: ${OBJS} - ${LINK} ${version_info} -o $@ ${LOBJS} - -stage: compile - $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes - -check: - @true - -dist: distsrc distbin - -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir} - save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir - rm -rf tmpbuilddir - -install: - mkdir -p ${PREFIX}/lib - mkdir -p ${PREFIX}/share/doc/${package}-${version} - ${INSTALL} -m 644 ${LTLIB} ${PREFIX}/lib - ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - if [ x${DOSTAGE} = xyes ]; then \ - mkdir -p ${PREFIX}/include/${globalprefix}/${lbuprefix} ; \ - (cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${lbuprefix}) ; \ - install -m 644 ${STATICLIB} ${PREFIX}/lib; \ - fi - -clean: - -%.o: %.c - ${COMPILE} ${CFLAGS} -c $< diff --git a/org.glite.lb-utils.jobid/build.xml b/org.glite.lb-utils.jobid/build.xml deleted file mode 100644 index e6cc422..0000000 --- a/org.glite.lb-utils.jobid/build.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.jobid/interface/cjobid.h b/org.glite.lb-utils.jobid/interface/cjobid.h deleted file mode 100755 index f802ce7..0000000 --- a/org.glite.lb-utils.jobid/interface/cjobid.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef _GLITE_JOBID_H -#define _GLITE_JOBID_H - -/*! - * \file cjobid.h - * \brief L&B consumer API - */ - -#ident "$Header$" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _glite_lbu_JobId *glite_lbu_JobId; - -#define GLITE_WMSC_JOBID_DEFAULT_PORT 9000 /**< Default port where bookkeeping server listens */ -#define GLITE_WMSC_JOBID_PROTO_PREFIX "https://" /**< JobId protocol prefix */ - - -/* All the pointer functions return malloc'ed objects (or NULL on error) */ - -/** - * Create a Job ID. - * See the lb_draft document for details on its construction and components - * \param bkserver book keeping server hostname - * \param port port for the bk service - * \param jobid new created job id - * \ret al 0 success - * \retval EINVAL invalid bkserver - * \retval ENOMEM if memory allocation fails - */ -int glite_lbu_JobIdCreate(const char * bkserver, int port, glite_lbu_JobId * jobid); - -/** - * Recreate a Job ID - * \param bkserver bookkeeping server hostname - * \param port port for the bk service - * \param unique string which represent created jobid (if NULL then new - * one is created) - * \param jobid new created job id - * \retval 0 success - * \retval EINVAL invalid bkserver - * \retval ENOMEM if memory allocation fails - */ -int glite_lbu_JobIdRecreate(const char *bkserver, int port, const char * unique, glite_lbu_JobId * jobid); - -/** - * Create copy of Job ID - * \param in jobid for duplication - * \param jobid duplicated jobid - * \retval 0 for success - * \retval EINVAL invalid jobid - * \retval ENOMEM if memory allocation fails - */ -int glite_lbu_JobIdDup(const glite_lbu_JobId in, glite_lbu_JobId * jobid); - -/* - * Free jobid structure - * \param jobid for dealocation - */ -void glite_lbu_JobIdFree(glite_lbu_JobId jobid); - -/** - * Parse Job ID string and creates jobid structure - * \param jobidstr string representation of jobid - * \param jobid parsed job id - * \retval 0 for success - * \retval EINVAL jobidstr can't be parsed - * \retval ENOMEM if memory allocation fails - */ -int glite_lbu_JobIdParse(const char* jobidstr, glite_lbu_JobId * jobid); - -/** - * Unparse Job ID (produce the string form of JobId). - * \param jobid to be converted to string - * \return allocated string which represents jobid - */ -char* glite_lbu_JobIdUnparse(const glite_lbu_JobId jobid); - -/** - * Extract bookkeeping server address (address:port) - * \param jobid from which the bkserver address should be extracted - * \retval pointer to allocated string with bkserver address - * \retval NULL if jobid is 0 or memory allocation fails - */ -char* glite_lbu_JobIdGetServer(const glite_lbu_JobId jobid); - -/** - * Extract bookkeeping server address and port - * \param jobid from which the bkserver address should be extracted - * \param srvName pointer where to return server name - * \param srvPort pointer where to return server port - * */ -void glite_lbu_JobIdGetServerParts(const glite_lbu_JobId jobid, char **srvName, unsigned int *srvPort); - -/** - * Extract unique string - * \param jobid - * \retval pointer to allocated unique string representing jobid - * \retval NULL if jobid is 0 or memory allocation fails - */ -char* glite_lbu_JobIdGetUnique(const glite_lbu_JobId jobid); - -#ifdef __cplusplus -} -#endif - -#endif /* _GLITE_JOBID_H */ diff --git a/org.glite.lb-utils.jobid/interface/strmd5.h b/org.glite.lb-utils.jobid/interface/strmd5.h deleted file mode 100755 index 27d8544..0000000 --- a/org.glite.lb-utils.jobid/interface/strmd5.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _GLITE_STRMD5_H -#define _GLITE_STRMD5_H - -#ident "$Header$" - -/* Compute MD5 sum of the first argument. - * The sum is returned in the 16-byte array pointed to by 2nd argument - * (if not NULL) - * - * Return value: ASCII string of the sum, i.e. 32 characters [0-9a-f] - * (pointer to static area, changed by subsequent calls) - */ - -#ifdef USE_MBUF -char *strmd5(const char *src, unsigned char *dst); -#endif - -/** - * Returns: allocated 32bytes long ASCII string with md5 sum - * of the first argument - */ -char *str2md5(const char *src); - -/** - * Returns: allocated 22bytes long ASCII string with md5 sum in base64 - * format of the source argument - */ -char *str2md5base64(const char *src); - -#endif /* _GLITE_STRMD5_H */ diff --git a/org.glite.lb-utils.jobid/project/build.number b/org.glite.lb-utils.jobid/project/build.number deleted file mode 100644 index 5cfec85..0000000 --- a/org.glite.lb-utils.jobid/project/build.number +++ /dev/null @@ -1 +0,0 @@ -module.build = 0 diff --git a/org.glite.lb-utils.jobid/project/build.properties b/org.glite.lb-utils.jobid/project/build.properties deleted file mode 100755 index 89232f3..0000000 --- a/org.glite.lb-utils.jobid/project/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -# temporary hack before lb-utils are integrated - -lb-utils.subsystem.name = org.glite.lb-utils -lb-utils.subsystem.prefix = lb-utils diff --git a/org.glite.lb-utils.jobid/project/configure.properties.xml b/org.glite.lb-utils.jobid/project/configure.properties.xml deleted file mode 100644 index 23ba931..0000000 --- a/org.glite.lb-utils.jobid/project/configure.properties.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbuprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} - - - - diff --git a/org.glite.lb-utils.jobid/project/properties.xml b/org.glite.lb-utils.jobid/project/properties.xml deleted file mode 100644 index 1adf343..0000000 --- a/org.glite.lb-utils.jobid/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.jobid/project/tar_exclude b/org.glite.lb-utils.jobid/project/tar_exclude deleted file mode 100644 index e1fcd1a..0000000 --- a/org.glite.lb-utils.jobid/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure.properties.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.lb-utils.jobid/project/version.properties b/org.glite.lb-utils.jobid/project/version.properties deleted file mode 100755 index 52a0f68..0000000 --- a/org.glite.lb-utils.jobid/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version = 1.0.0 -module.age = 0 diff --git a/org.glite.lb-utils.jobid/src/cjobid.c b/org.glite.lb-utils.jobid/src/cjobid.c deleted file mode 100755 index 6d6a73f..0000000 --- a/org.glite.lb-utils.jobid/src/cjobid.c +++ /dev/null @@ -1,260 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include "cjobid.h" -#include "strmd5.h" - -struct _glite_lbu_JobId { - char *id; /* unique job identification */ - /* additional information */ - char *BShost;/* bookkeeping server hostname */ - unsigned int BSport; /* bookkeeping server port */ - char *info; /* additional information (after ? in URI) */ -}; - -int glite_lbu_JobIdCreate(const char *bkserver, int port, glite_lbu_JobId *jobId) -{ - return glite_lbu_JobIdRecreate(bkserver, port, NULL, jobId); -} - - -int glite_lbu_JobIdRecreate(const char* bkserver, int port, const char *unique, glite_lbu_JobId *jobId) -{ - glite_lbu_JobId out; - char hostname[200]; /* used to hold string for encrypt */ - struct timeval tv; - int skip; - char* portbeg; - - struct hostent* he; - - if (!bkserver) - return EINVAL; - - if (unique == NULL) { - gethostname(hostname, 100); - he = gethostbyname(hostname); - assert(he->h_length > 0); - gettimeofday(&tv, NULL); - srandom(tv.tv_usec); - - skip = strlen(hostname); - skip += sprintf(hostname + skip, "-IP:0x%x-pid:%d-rnd:%d-time:%d:%d", - *((int*)he->h_addr_list[0]), getpid(), (int)random(), - (int)tv.tv_sec, (int)tv.tv_usec); - } - - *jobId = NULL; - out = (glite_lbu_JobId) malloc (sizeof(*out)); - if (!out) - return ENOMEM; - - memset(out, 0, sizeof(*out)); - - /* check if it begins with prefix */ - /* unsupported */ - if (strncmp(bkserver, GLITE_WMSC_JOBID_PROTO_PREFIX, sizeof(GLITE_WMSC_JOBID_PROTO_PREFIX)-1) == 0) - return EINVAL; - - out->BShost = strdup(bkserver); - portbeg = strchr(out->BShost, ':'); - if (portbeg) { - *portbeg = 0; - /* try to get port number */ - if (port == 0) - port = atoi(portbeg + 1); - } - - if (port == 0) - port = GLITE_WMSC_JOBID_DEFAULT_PORT; - - out->BSport = port; - - out->id = (unique) ? strdup(unique) : str2md5base64(hostname); - //printf("Encrypt: %s\nBASE64 %s\n", hostname, out->id); - - if (!out->id || !out->BShost) { - glite_lbu_JobIdFree(out); - return ENOMEM; - } - - *jobId = out; - return 0; -} - - -int glite_lbu_JobIdDup(const glite_lbu_JobId in, glite_lbu_JobId *out) -{ - glite_lbu_JobId jid; - *out = NULL; - if (in == NULL) - return 0; - - jid = malloc(sizeof(*jid)); - if (!jid) - return ENOMEM; - - memset(jid, 0,sizeof(*jid)); - jid->BShost = strdup(in->BShost); - jid->id = strdup(in->id); - if (in->info) - jid->info = strdup(in->info); - - if (jid->BShost == NULL || jid->id == NULL) { - glite_lbu_JobIdFree(jid); - return ENOMEM; - } - - jid->BSport = in->BSport; - *out = jid; - return 0; -} - - -// XXX -// use recreate -// parse name, port, unique -int glite_lbu_JobIdParse(const char *idString, glite_lbu_JobId *jobId) -{ - char *pom, *pom1, *pom2; - glite_lbu_JobId out; - - *jobId = NULL; - - out = (glite_lbu_JobId) malloc (sizeof(*out)); - if (out == NULL ) - return ENOMEM; - - memset(out,0,sizeof(*out)); - - if (strncmp(idString, GLITE_WMSC_JOBID_PROTO_PREFIX, sizeof(GLITE_WMSC_JOBID_PROTO_PREFIX) - 1)) { - out->BShost = (char *) NULL; - out->BSport = 0; - - free(out); - return EINVAL; - } - - pom = strdup(idString + sizeof(GLITE_WMSC_JOBID_PROTO_PREFIX) - 1); - pom1 = strchr(pom, '/'); - pom2 = strchr(pom, ':'); - - if (!pom1) { free(pom); free(out); return EINVAL; } - - if ( pom2 && (pom1 > pom2)) { - pom[pom2-pom] = '\0'; - out->BShost = strdup(pom); - pom[pom1-pom] = '\0'; - out->BSport = (unsigned int) strtoul(pom2 + 1,NULL,10); - } else { - pom[pom1-pom] = '\0'; - out->BShost = strdup(pom); - out->BSport = GLITE_WMSC_JOBID_DEFAULT_PORT; - } - - /* XXX: localhost not supported in jobid - if (!strncmp(out->BShost,"localhost",9) { - free(pom); - free(out->BShost); - free(out); - return EINVAL; - } - */ - - /* additional info from URI */ - pom2 = strchr(pom1+1,'?'); - if (pom2) { - *pom2 = 0; - out->info = strdup(pom2+1); - } - - /* extract the unique part */ - out->id = strdup(pom1+1); - - for (pom1 = out->BShost; *pom1; pom1++) - if (isspace(*pom1)) break; - - for (pom2 = out->id; *pom2; pom2++) - if (isspace(*pom2)) break; - - if (*pom1 || *pom2) { - free(pom); - glite_lbu_JobIdFree(out); - return EINVAL; - } - - free(pom); - *jobId = out; - return 0; -} - - -void glite_lbu_JobIdFree(glite_lbu_JobId job) -{ - if (job) { - free(job->id); - free(job->BShost); - free(job->info); - free(job); - } -} - - -char* glite_lbu_JobIdUnparse(const glite_lbu_JobId jobid) -{ - char *out, port[40]; - - if (!jobid) - return NULL; - - if (jobid->BSport) - sprintf(port,":%d",jobid->BSport); - else - *port = 0; - - asprintf(&out, GLITE_WMSC_JOBID_PROTO_PREFIX"%s%s/%s%s%s", - jobid->BShost,port, - jobid->id, - (jobid->info ? "?" : ""), - (jobid->info ? jobid->info : "")); - - return out; -} - - -char* glite_lbu_JobIdGetServer(const glite_lbu_JobId jobid) -{ - char *bs = NULL; - - if (jobid) - asprintf(&bs, "%s:%u", jobid->BShost, - jobid->BSport ? jobid->BSport : GLITE_WMSC_JOBID_DEFAULT_PORT); - - return bs; -} - - -void glite_lbu_JobIdGetServerParts(const glite_lbu_JobId jobid, char **srvName, unsigned int *srvPort) -{ - if (jobid) { - *srvName = strdup(jobid->BShost); - *srvPort = jobid->BSport ? jobid->BSport : GLITE_WMSC_JOBID_DEFAULT_PORT; - } -} - - -char* glite_lbu_JobIdGetUnique(const glite_lbu_JobId jobid) -{ - return jobid ? strdup(jobid->id) : NULL; -} diff --git a/org.glite.lb-utils.jobid/src/strmd5.c b/org.glite.lb-utils.jobid/src/strmd5.c deleted file mode 100755 index 775aee8..0000000 --- a/org.glite.lb-utils.jobid/src/strmd5.c +++ /dev/null @@ -1,122 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include - -#include "strmd5.h" - -#if USE_MBUF /* let's try without it */ -#warning Thread unsafe! -static char mbuf[33]; -#endif - -static int base64_encode(const void *enc, int enc_size, char *out, int out_max_size) -{ - static const char* b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - - unsigned char* enc_buf = (unsigned char*)enc; - int out_size = 0; - unsigned int bits = 0; - unsigned int shift = 0; - - while ( out_size < out_max_size ) { - if ( enc_size>0 ) { - // Shift in byte - bits <<= 8; - bits |= *enc_buf; - shift += 8; - // Next byte - enc_buf++; - enc_size--; - } else if ( shift>0 ) { - // Pad last bits to 6 bits - will end next loop - bits <<= 6 - shift; - shift = 6; - } else { - // Terminate with Mime style '=' - *out = '='; - out_size++; - - return out_size; - } - - // Encode 6 bit segments - while ( shift>=6 ) { - shift -= 6; - *out = b64[ (bits >> shift) & 0x3F ]; - out++; - out_size++; - } - } - - // Output overflow - return -1; -} - -#ifdef USE_MBUF -char *strmd5(const char *s, unsigned char *digest) -{ - MD5_CTX md5; - unsigned char d[16]; - int i; - - MD5_Init(&md5); - MD5_Update(&md5,s,strlen(s)); - MD5_Final(d,&md5); - - if (digest) memcpy(digest,d,sizeof(d)); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - mbuf[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - mbuf[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - mbuf[32] = 0; - return (char *) mbuf; -} -#endif - -char *str2md5(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char* ret = malloc(33); - int i; - - if (!ret) - return NULL; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - ret[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - ret[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - ret[32] = 0; - return ret; -} - -char *str2md5base64(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char buf[50]; - int l; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - l = base64_encode(d, 16, buf, sizeof(buf) - 1); - if (l < 1) - return NULL; - buf[l - 1] = 0; - return strdup(buf); -} diff --git a/org.glite.lb-utils.server-bones/.cvsignore b/org.glite.lb-utils.server-bones/.cvsignore deleted file mode 100755 index 1df717b..0000000 --- a/org.glite.lb-utils.server-bones/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.lb-utils.server-bones/LICENSE b/org.glite.lb-utils.server-bones/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.lb-utils.server-bones/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb-utils.server-bones/build.xml b/org.glite.lb-utils.server-bones/build.xml deleted file mode 100644 index efe49ad..0000000 --- a/org.glite.lb-utils.server-bones/build.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.server-bones/project/build.number b/org.glite.lb-utils.server-bones/project/build.number deleted file mode 100644 index 5cfec85..0000000 --- a/org.glite.lb-utils.server-bones/project/build.number +++ /dev/null @@ -1 +0,0 @@ -module.build = 0 diff --git a/org.glite.lb-utils.server-bones/project/build.properties b/org.glite.lb-utils.server-bones/project/build.properties deleted file mode 100755 index e69de29..0000000 diff --git a/org.glite.lb-utils.server-bones/project/configure.properties.xml b/org.glite.lb-utils.server-bones/project/configure.properties.xml deleted file mode 100644 index 6ad627b..0000000 --- a/org.glite.lb-utils.server-bones/project/configure.properties.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/org.glite.lb-utils.server-bones/project/properties.xml b/org.glite.lb-utils.server-bones/project/properties.xml deleted file mode 100644 index a76d544..0000000 --- a/org.glite.lb-utils.server-bones/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.server-bones/project/version.properties b/org.glite.lb-utils.server-bones/project/version.properties deleted file mode 100755 index 6f1f8ab..0000000 --- a/org.glite.lb-utils.server-bones/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version = 0.0.0 -module.age = 0 \ No newline at end of file diff --git a/org.glite.lb-utils.trio/.cvsignore b/org.glite.lb-utils.trio/.cvsignore deleted file mode 100755 index 1df717b..0000000 --- a/org.glite.lb-utils.trio/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.lb-utils.trio/LICENSE b/org.glite.lb-utils.trio/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.lb-utils.trio/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb-utils.trio/Makefile b/org.glite.lb-utils.trio/Makefile deleted file mode 100644 index 96a8386..0000000 --- a/org.glite.lb-utils.trio/Makefile +++ /dev/null @@ -1,114 +0,0 @@ -# Default values -top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -distdir=. -globalprefix=glite -package=glite-lb-utils-trio -version=0.0.0 -PREFIX=/opt/glite -lbuprefix=lbu - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -VPATH=${top_srcdir}/src:${top_srcdir}/test::${top_srcdir}/doc - -CC=gcc - -DEBUG:=-g -O0 -Wall - -CFLAGS:=${DEBUG} -I${top_srcdir}/src -I${top_srcdir}/interface -I. -DDATAGRID_EXTENSION - -COMPILE:=libtool --mode=compile ${CC} -LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/lib ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} -rpath ${stagedir}/lib ${LDFLAGS} -INSTALL:=libtool --mode=install install - -REPORTS:=${top_srcdir}/reports -TEST_LIBS:=-L${cppunit_prefix}/lib -lcppunit -ldl -TEST_INC:=-I${cppunit_prefix}/include - - -OBJS:=trio.o strio.o escape.o -LOBJS:=${OBJS:.o=.lo} - -HDRS:=trio.h escape.h - -STATICLIB:=libglite_lbu_trio.a -LTLIB:=libglite_lbu_trio.la - -default: all - -all compile: ${STATICLIB} ${LTLIB} - -# to use libtool versioning correcty, we should have: -# -# current = major + minor + offset -# revision = patch -# age = minor -# -# where offset is a sum of maximal released minor's of all previous major's -# -# version_info=-version-info `echo ${version} | cut -d. -f1,2 | tr . :` - -# counted minors: n/a -offset=0 - -version_info:=-version-info ${shell \ - perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } - -${STATICLIB}: ${OBJS} - ar crv $@ ${OBJS} - ranlib $@ - -${LTLIB}: ${OBJS} - ${LINK} ${version_info} -o $@ ${LOBJS} - -stage: compile - $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes - -check: compile mkreports runtest - -mkreports: - -mkdir ${REPORTS} - -runtest: trio_test - ./trio_test ${REPORTS}/trio.xml - -trio_test: trio_test.cpp - ${CXX} -c ${CFLAGS} ${TEST_INC} $< - ${LINKXX} -o $@ trio_test.o ${LTLIB} ${TEST_LIBS} - - -dist: distsrc distbin - -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir} - save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir - rm -rf tmpbuilddir - -install: - mkdir -p ${PREFIX}/lib - mkdir -p ${PREFIX}/share/doc/${package}-${version} - ${INSTALL} -m 644 ${LTLIB} ${PREFIX}/lib - ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - if [ x${DOSTAGE} = xyes ]; then \ - mkdir -p ${PREFIX}/include/${globalprefix}/${lbuprefix} ; \ - (cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${lbuprefix}) ; \ - install -m 644 ${STATICLIB} ${PREFIX}/lib; \ - fi - -clean: - -%.o: %.c - ${COMPILE} ${CFLAGS} -c $< diff --git a/org.glite.lb-utils.trio/build.xml b/org.glite.lb-utils.trio/build.xml deleted file mode 100644 index 7e38dda..0000000 --- a/org.glite.lb-utils.trio/build.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.trio/interface/escape.h b/org.glite.lb-utils.trio/interface/escape.h deleted file mode 100644 index 4795f68..0000000 --- a/org.glite.lb-utils.trio/interface/escape.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef __EDG_WORKLOAD_LOGGING_COMMON_ESCAPE_H__ -#define __EDG_WORKLOAD_LOGGING_COMMON_ESCAPE_H__ -/*! - * \file escape.h - */ - -#ident "$Header$" - - -/*! - * \fn char *glite_lbu_EscapeULM(const char *str) - * \param str a string to escape - * \return new (allocated) escaped string - * \brief in given string (ULM) escape all ULM_QM, ULM_BS and ULM_LF by ULM_BS - */ - -char *glite_lbu_EscapeULM(const char *); - - -/*! - * \fn char *glite_lbu_UnescapeULM(const char *str) - * \param str a string to unescape - * \return new (allocated) unescaped string - * \brief in given string (ULM) unescape all escaped ULM_QM, ULM_BS and ULM_LF - */ - -char *glite_lbu_UnescapeULM(const char *); - - -/*! - * \fn char *glite_lbu_EscapeXML(const char *str); - * \param str a string to escape - * \return new (allocated) escaped string - * \brief in given string (XML) escape all unwanted characters - */ - -char *glite_lbu_EscapeXML(const char *); - - -/*! - * \fn char *glite_lbu_UnescapeXML(const char *str) - * \param str a string to unescape - * \return new (allocated) unescaped string - * \brief in given string (XML) unescape all escaped characters - */ - -char *glite_lbu_UnescapeXML(const char *); - - -/*! - * \fn char *glite_lbu_EscapeSQL(const char *str) - * \param str a string to escape - * \return new (allocated) escaped string - * \briefin given string (SQL) escape all unwanted characters - */ - -char *glite_lbu_EscapeSQL(const char *); - -#endif /* __EDG_WORKLOAD_LOGGING_COMMON_ESCAPE_H__ */ diff --git a/org.glite.lb-utils.trio/interface/trio.h b/org.glite.lb-utils.trio/interface/trio.h deleted file mode 100644 index 04f133c..0000000 --- a/org.glite.lb-utils.trio/interface/trio.h +++ /dev/null @@ -1,187 +0,0 @@ -/************************************************************************* - * - * $Id$ - * - * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -#ifndef TRIO_TRIO_H -#define TRIO_TRIO_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* make utility and C++ compiler in Windows NT fails to find this symbol */ -#if defined(WIN32) && !defined(isascii) -# define isascii ((unsigned)(x) < 0x80) -#endif - -/* - * Error codes. - * - * Remember to add a textual description to trio_strerror. - */ -enum { - TRIO_EOF = 1, - TRIO_EINVAL = 2, - TRIO_ETOOMANY = 3, - TRIO_EDBLREF = 4, - TRIO_EGAP = 5, - TRIO_ENOMEM = 6, - TRIO_ERANGE = 7 -}; - -/* Error macros */ -#define TRIO_ERROR_CODE(x) ((-(x)) & 0x00FF) -#define TRIO_ERROR_POSITION(x) ((-(x)) >> 8) -#define TRIO_ERROR_NAME(x) trio_strerror(x) - -const char *trio_strerror(int); - -/************************************************************************* - * Print Functions - */ - -int trio_printf(const char *format, ...); -int trio_vprintf(const char *format, va_list args); -int trio_printfv(const char *format, void **args); - -int trio_fprintf(FILE *file, const char *format, ...); -int trio_vfprintf(FILE *file, const char *format, va_list args); -int trio_fprintfv(FILE *file, const char *format, void **args); - -int trio_dprintf(int fd, const char *format, ...); -int trio_vdprintf(int fd, const char *format, va_list args); -int trio_dprintfv(int fd, const char *format, void **args); - -/* trio_sprintf(target, format, ...) - * trio_snprintf(target, maxsize, format, ...) - * - * Build 'target' according to 'format' and succesive - * arguments. This is equal to the sprintf() and - * snprintf() functions. - */ -int trio_sprintf(char *buffer, const char *format, ...); -int trio_vsprintf(char *buffer, const char *format, va_list args); -int trio_sprintfv(char *buffer, const char *format, void **args); - -int trio_snprintf(char *buffer, size_t max, const char *format, ...); -int trio_vsnprintf(char *buffer, size_t bufferSize, const char *format, - va_list args); -int trio_snprintfv(char *buffer, size_t bufferSize, const char *format, - void **args); - -int trio_snprintfcat(char *buffer, size_t max, const char *format, ...); -int trio_vsnprintfcat(char *buffer, size_t bufferSize, const char *format, - va_list args); - -char *trio_aprintf(const char *format, ...); -char *trio_vaprintf(const char *format, va_list args); - -int trio_asprintf(char **ret, const char *format, ...); -int trio_vasprintf(char **ret, const char *format, va_list args); - -/************************************************************************* - * Scan Functions - */ -int trio_scanf(const char *format, ...); -int trio_vscanf(const char *format, va_list args); -int trio_scanfv(const char *format, void **args); - -int trio_fscanf(FILE *file, const char *format, ...); -int trio_vfscanf(FILE *file, const char *format, va_list args); -int trio_fscanfv(FILE *file, const char *format, void **args); - -int trio_dscanf(int fd, const char *format, ...); -int trio_vdscanf(int fd, const char *format, va_list args); -int trio_dscanfv(int fd, const char *format, void **args); - -int trio_sscanf(const char *buffer, const char *format, ...); -int trio_vsscanf(const char *buffer, const char *format, va_list args); -int trio_sscanfv(const char *buffer, const char *format, void **args); - -/************************************************************************* - * Renaming - */ -#ifdef TRIO_REPLACE_STDIO -/* Replace the functions */ -#ifndef HAVE_PRINTF -# define printf trio_printf -#endif -#ifndef HAVE_VPRINTF -# define vprintf trio_vprintf -#endif -#ifndef HAVE_FPRINTF -# define fprintf trio_fprintf -#endif -#ifndef HAVE_VFPRINTF -# define vfprintf trio_vfprintf -#endif -#ifndef HAVE_SPRINTF -# define sprintf trio_sprintf -#endif -#ifndef HAVE_VSPRINTF -# define vsprintf trio_vsprintf -#endif -#ifndef HAVE_SNPRINTF -# define snprintf trio_snprintf -#endif -#ifndef HAVE_VSNPRINTF -# define vsnprintf trio_vsnprintf -#endif -#ifndef HAVE_SCANF -# define scanf trio_scanf -#endif -#ifndef HAVE_VSCANF -# define vscanf trio_vscanf -#endif -#ifndef HAVE_FSCANF -# define fscanf trio_fscanf -#endif -#ifndef HAVE_VFSCANF -# define vfscanf trio_vfscanf -#endif -#ifndef HAVE_SSCANF -# define sscanf trio_sscanf -#endif -#ifndef HAVE_VSSCANF -# define vsscanf trio_vsscanf -#endif -/* These aren't stdio functions, but we make them look similar */ -#define dprintf trio_dprintf -#define vdprintf trio_vdprintf -#define aprintf trio_aprintf -#define vaprintf trio_vaprintf -#define asprintf trio_asprintf -#define vasprintf trio_vasprintf -#define dscanf trio_dscanf -#define vdscanf trio_vdscanf -#endif - -/* strio compatible names */ -#define StrScan trio_sscanf -#define StrFormat trio_sprintf -#define StrFormatMax trio_snprintf -#define StrFormatAlloc trio_aprintf -#define StrFormatAppendMax trio_snprintfcat - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* TRIO_TRIO_H */ diff --git a/org.glite.lb-utils.trio/project/build.number b/org.glite.lb-utils.trio/project/build.number deleted file mode 100644 index 5cfec85..0000000 --- a/org.glite.lb-utils.trio/project/build.number +++ /dev/null @@ -1 +0,0 @@ -module.build = 0 diff --git a/org.glite.lb-utils.trio/project/build.properties b/org.glite.lb-utils.trio/project/build.properties deleted file mode 100755 index 89232f3..0000000 --- a/org.glite.lb-utils.trio/project/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -# temporary hack before lb-utils are integrated - -lb-utils.subsystem.name = org.glite.lb-utils -lb-utils.subsystem.prefix = lb-utils diff --git a/org.glite.lb-utils.trio/project/configure.properties.xml b/org.glite.lb-utils.trio/project/configure.properties.xml deleted file mode 100644 index d743f4b..0000000 --- a/org.glite.lb-utils.trio/project/configure.properties.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbuprefix=${subsystem.prefix} -package=${module.package.name} -cppunit_prefix=${with.cppunit.prefix} -PREFIX=${install.dir} - - - - - diff --git a/org.glite.lb-utils.trio/project/properties.xml b/org.glite.lb-utils.trio/project/properties.xml deleted file mode 100644 index e472152..0000000 --- a/org.glite.lb-utils.trio/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils.trio/project/version.properties b/org.glite.lb-utils.trio/project/version.properties deleted file mode 100755 index 6f1f8ab..0000000 --- a/org.glite.lb-utils.trio/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version = 0.0.0 -module.age = 0 \ No newline at end of file diff --git a/org.glite.lb-utils.trio/src/escape.c b/org.glite.lb-utils.trio/src/escape.c deleted file mode 100644 index 9a1d545..0000000 --- a/org.glite.lb-utils.trio/src/escape.c +++ /dev/null @@ -1,224 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include - -#include "escape.h" - -#define ULM_QM '"' -#define ULM_BS '\\' -#define ULM_LF '\n' - -/* - *---------------------------------------------------------------------- - * - * \fn char *glite_lbu_EscapeULM(const char *str) - * \param str a string to escape - * \return new (allocated) escaped string - * \brief in given string escape all ULM_QM, ULM_BS and ULM_LF by ULM_BS - * - * Calls: malloc, strlen - * - * Algorithm: array lookup - * - the new string will be allocated - * - *---------------------------------------------------------------------- - */ - -char *glite_lbu_EscapeULM(const char *str) -{ -unsigned int i,j; -size_t size; -char *ret; - -if (str == NULL) return NULL; -if ((size = strlen(str)) == 0) return strdup(""); - -ret = (char*) malloc(1+2*size*sizeof(char)); - -j = 0; -for (i=0; i',"gt" }, - { '&',"amp" }, - { '"',"quot" }, - { '\'',"apos" }, - { 0, NULL } -}; - -#define XML_ESCAPE_SET "<>&\"'" - -char *glite_lbu_EscapeXML(const char *in) -{ - const char* tmp_in; - char *out; - int cnt,i,j,k; - - if (!in) return NULL; - - for (cnt = 0, tmp_in = in; *tmp_in != '\0'; ++tmp_in) { - if (strchr(XML_ESCAPE_SET, *tmp_in) || - (*tmp_in & 0x7f) < 0x20 /* control character */ || - (*tmp_in == '%')) cnt++; - } - - out = malloc(strlen(in)+1+cnt*5); - - for (i=j=0; in[i]; i++) { - for (k=0; xml_etab[k].c && xml_etab[k].c != in[i]; k++); - if (xml_etab[k].c) { - int l; - - out[j++] = '&'; - memcpy(out+j,xml_etab[k].e,l=strlen(xml_etab[k].e)); - j += l; - out[j++] = ';'; - } else if ((in[i] & 0x7f) < 0x20 || in[i] == '%') { - sprintf(out+j, "%%%02x", (unsigned char)in[i]); - j+=3; - } else { - out[j++] = in[i]; - } - } - out[j] = 0; - return out; -} - -char *glite_lbu_UnescapeXML(const char *in) -{ - char *out; - int i,j,k; - char xtmp[3]; - unsigned char origchar; - - if (!in) return NULL; - out = malloc(strlen(in)+1); - - for (i=j=0; in[i]; j++) if (in[i] == '&') { - char *s = strchr(in+i,';'); - if (s) { - int l = s-in-i+1; - for (k=0; xml_etab[k].c && strncasecmp(in+i+1,xml_etab[k].e,l-2); k++); - if (xml_etab[k].c) { - out[j] = xml_etab[k].c; - i += l; - } else out[j] = in[i++]; - } else out[j] = in[i++]; - } else if (in[i] == '%') { - if (isxdigit(xtmp[0]=in[i+1]) && isxdigit(xtmp[1]=in[i+2])) { - xtmp[2] = '\0'; - origchar = (unsigned char) strtol(xtmp, NULL, 16); - if ((origchar & 0x7f) < 0x20 || origchar == '%') { - out[j] = origchar; - i += 3; - } else out[j] = in[i++]; - } else out[j] = in[i++]; - } else { - out[j] = in[i++]; - } - out[j] = 0; - return out; -} - -char *glite_lbu_EscapeSQL(const char *in) -{ - const char* tmp_in; - char *out = NULL; - int i,j,cnt; - - if (!in) return NULL; - - for (cnt = 0, tmp_in = in; (tmp_in = strchr(tmp_in,'\'')) != NULL; ++tmp_in) { - ++cnt; - } - for (tmp_in = in; (tmp_in = strchr(tmp_in,'\\')) != NULL; ++tmp_in) { - ++cnt; - } - - out = malloc(strlen(in)+1+cnt); - - for (i=j=0; in[i]; i++) { - if (in[i] == '\\') out[j++] = '\\'; - if (in[i] == '\'') out[j++] = '\''; - out[j++] = in[i]; - } - out[j] = 0; - - return out; -} diff --git a/org.glite.lb-utils.trio/src/strio.c b/org.glite.lb-utils.trio/src/strio.c deleted file mode 100644 index f1ab5b8..0000000 --- a/org.glite.lb-utils.trio/src/strio.c +++ /dev/null @@ -1,581 +0,0 @@ -/************************************************************************* - * - * $Id$ - * - * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -/* - * TODO - * - StrToLongDouble - */ - -static const char rcsid[] = "@(#)$Id$"; - -#if defined(unix) || defined(__xlC__) || defined(__QNX__) -# define PLATFORM_UNIX -#elif defined(WIN32) || defined(_WIN32) -# define PLATFORM_WIN32 -#elif defined(AMIGA) && defined(__GNUC__) -# define PLATFORM_UNIX -#endif - -#if defined(__STDC__) && (__STDC_VERSION__ >= 199901L) -# define TRIO_C99 -#endif - -#include "strio.h" -#include -#include -#include -#include -#include -#include -#ifndef DEBUG -# define NDEBUG -#endif -#include - -#ifndef NULL -# define NULL 0 -#endif -#define NIL ((char)0) -#ifndef FALSE -# define FALSE (1 == 0) -# define TRUE (! FALSE) -#endif - -#define VALID(x) (NULL != (x)) -#define INVALID(x) (NULL == (x)) - -#if defined(PLATFORM_UNIX) -# define USE_STRCASECMP -# define USE_STRNCASECMP -# define USE_STRERROR -# if defined(__QNX__) -# define strcasecmp(x,y) stricmp(x,y) -# define strncasecmp(x,y,n) strnicmp(x,y,n) -# endif -#elif defined(PLATFORM_WIN32) -# define USE_STRCASECMP -# define strcasecmp(x,y) strcmpi(x,y) -#endif - -/************************************************************************* - * StrAppendMax - */ -char *StrAppendMax(char *target, size_t max, const char *source) -{ - assert(VALID(target)); - assert(VALID(source)); - assert(max > 0); - - max -= StrLength(target) + 1; - return (max > 0) ? strncat(target, source, max) : target; -} - -/************************************************************************* - * StrCopyMax - */ -char *StrCopyMax(char *target, size_t max, const char *source) -{ - assert(VALID(target)); - assert(VALID(source)); - assert(max > 0); /* Includes != 0 */ - - target = strncpy(target, source, max - 1); - target[max - 1] = (char)0; - return target; -} - -/************************************************************************* - * StrDuplicate - */ -char *StrDuplicate(const char *source) -{ - char *target; - - assert(VALID(source)); - - target = StrAlloc(StrLength(source) + 1); - if (target) - { - StrCopy(target, source); - } - return target; -} - -/************************************************************************* - * StrDuplicateMax - */ -char *StrDuplicateMax(const char *source, size_t max) -{ - char *target; - size_t len; - - assert(VALID(source)); - assert(max > 0); - - /* Make room for string plus a terminating zero */ - len = StrLength(source) + 1; - if (len > max) - { - len = max; - } - target = StrAlloc(len); - if (target) - { - StrCopyMax(target, len, source); - } - return target; -} - -/************************************************************************* - * StrEqual - */ -int StrEqual(const char *first, const char *second) -{ - assert(VALID(first)); - assert(VALID(second)); - - if (VALID(first) && VALID(second)) - { -#if defined(USE_STRCASECMP) - return (0 == strcasecmp(first, second)); -#else - while ((*first != NIL) && (*second != NIL)) - { - if (toupper(*first) != toupper(*second)) - { - break; - } - first++; - second++; - } - return ((*first == NIL) && (*second == NIL)); -#endif - } - return FALSE; -} - -/************************************************************************* - * StrEqualCase - */ -int StrEqualCase(const char *first, const char *second) -{ - assert(VALID(first)); - assert(VALID(second)); - - if (VALID(first) && VALID(second)) - { - return (0 == strcmp(first, second)); - } - return FALSE; -} - -/************************************************************************* - * StrEqualCaseMax - */ -int StrEqualCaseMax(const char *first, size_t max, const char *second) -{ - assert(VALID(first)); - assert(VALID(second)); - - if (VALID(first) && VALID(second)) - { - return (0 == strncmp(first, second, max)); - } - return FALSE; -} - -/************************************************************************* - * StrEqualLocale - */ -int StrEqualLocale(const char *first, const char *second) -{ - assert(VALID(first)); - assert(VALID(second)); - -#if defined(LC_COLLATE) - return (strcoll(first, second) == 0); -#else - return StrEqual(first, second); -#endif -} - -/************************************************************************* - * StrEqualMax - */ -int StrEqualMax(const char *first, size_t max, const char *second) -{ - assert(VALID(first)); - assert(VALID(second)); - - if (VALID(first) && VALID(second)) - { -#if defined(USE_STRNCASECMP) - return (0 == strncasecmp(first, second, max)); -#else - /* Not adequately tested yet */ - size_t cnt = 0; - while ((*first != NIL) && (*second != NIL) && (cnt <= max)) - { - if (toupper(*first) != toupper(*second)) - { - break; - } - first++; - second++; - cnt++; - } - return ((cnt == max) || ((*first == NIL) && (*second == NIL))); -#endif - } - return FALSE; -} - -/************************************************************************* - * StrError - */ -const char *StrError(int errorNumber) -{ -#if defined(USE_STRERROR) - return strerror(errorNumber); -#else - return "unknown"; -#endif -} - -/************************************************************************* - * StrFormatDate - */ -size_t StrFormatDateMax(char *target, - size_t max, - const char *format, - const struct tm *datetime) -{ - assert(VALID(target)); - assert(VALID(format)); - assert(VALID(datetime)); - assert(max > 0); - - return strftime(target, max, format, datetime); -} - -/************************************************************************* - * StrHash - */ -unsigned long StrHash(const char *string, int type) -{ - unsigned long value = 0L; - char ch; - - assert(VALID(string)); - - switch (type) - { - case STRIO_HASH_PLAIN: - while ( (ch = *string++) != NIL ) - { - value *= 31; - value += (unsigned long)ch; - } - break; - default: - assert(FALSE); - break; - } - return value; -} - -/************************************************************************* - * StrMatch - */ -int StrMatch(char *string, char *pattern) -{ - assert(VALID(string)); - assert(VALID(pattern)); - - for (; ('*' != *pattern); ++pattern, ++string) - { - if (NIL == *string) - { - return (NIL == *pattern); - } - if ((toupper((int)*string) != toupper((int)*pattern)) - && ('?' != *pattern)) - { - return FALSE; - } - } - /* two-line patch to prevent *too* much recursiveness: */ - while ('*' == pattern[1]) - pattern++; - - do - { - if ( StrMatch(string, &pattern[1]) ) - { - return TRUE; - } - } - while (*string++); - - return FALSE; -} - -/************************************************************************* - * StrMatchCase - */ -int StrMatchCase(char *string, char *pattern) -{ - assert(VALID(string)); - assert(VALID(pattern)); - - for (; ('*' != *pattern); ++pattern, ++string) - { - if (NIL == *string) - { - return (NIL == *pattern); - } - if ((*string != *pattern) - && ('?' != *pattern)) - { - return FALSE; - } - } - /* two-line patch to prevent *too* much recursiveness: */ - while ('*' == pattern[1]) - pattern++; - - do - { - if ( StrMatchCase(string, &pattern[1]) ) - { - return TRUE; - } - } - while (*string++); - - return FALSE; -} - -/************************************************************************* - * StrSpanFunction - * - * Untested - */ -size_t StrSpanFunction(char *source, int (*Function)(int)) -{ - size_t count = 0; - - assert(VALID(source)); - assert(VALID(Function)); - - while (*source != NIL) - { - if (Function(*source)) - break; /* while */ - source++; - count++; - } - return count; -} - -/************************************************************************* - * StrSubstringMax - */ -char *StrSubstringMax(const char *string, size_t max, const char *find) -{ - size_t count; - size_t size; - char *result = NULL; - - assert(VALID(string)); - assert(VALID(find)); - - size = StrLength(find); - if (size <= max) - { - for (count = 0; count <= max - size; count++) - { - if (StrEqualMax(find, size, &string[count])) - { - result = (char *)&string[count]; - break; - } - } - } - return result; -} - -/************************************************************************* - * StrToDouble - * - * double ::= [ ] - * ( | - * | - * ) - * [ [ ] ] - * number ::= 1*( ) - * digit ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ) - * exponential ::= ( 'e' | 'E' ) - * sign ::= ( '-' | '+' ) - * decimal_point ::= '.' - */ -double StrToDouble(const char *source, const char **endp) -{ -#if defined(TRIO_C99) - return strtod(source, endp); -#else - /* Preliminary code */ - int isNegative = FALSE; - int isExponentNegative = FALSE; - unsigned long integer = 0; - unsigned long fraction = 0; - unsigned long fracdiv = 1; - unsigned long exponent = 0; - double value = 0.0; - - /* First try hex-floats */ - if ((source[0] == '0') && ((source[1] == 'x') || (source[1] == 'X'))) - { - source += 2; - while (isxdigit((int)*source)) - { - integer *= 16; - integer += (isdigit((int)*source) - ? (*source - '0') - : 10 + (toupper((int)*source) - 'A')); - source++; - } - if (*source == '.') - { - source++; - while (isxdigit((int)*source)) - { - fraction *= 16; - fraction += (isdigit((int)*source) - ? (*source - '0') - : 10 + (toupper((int)*source) - 'A')); - fracdiv *= 16; - source++; - } - if ((*source == 'p') || (*source == 'P')) - { - source++; - if ((*source == '+') || (*source == '-')) - { - isExponentNegative = (*source == '-'); - source++; - } - while (isdigit((int)*source)) - { - exponent *= 10; - exponent += (*source - '0'); - source++; - } - } - } - } - else /* Then try normal decimal floats */ - { - isNegative = (*source == '-'); - /* Skip sign */ - if ((*source == '+') || (*source == '-')) - source++; - - /* Integer part */ - while (isdigit((int)*source)) - { - integer *= 10; - integer += (*source - '0'); - source++; - } - - if (*source == '.') - { - source++; /* skip decimal point */ - while (isdigit((int)*source)) - { - fraction *= 10; - fraction += (*source - '0'); - fracdiv *= 10; - source++; - } - } - if ((*source == 'e') || (*source == 'E')) - { - source++; /* Skip exponential indicator */ - isExponentNegative = (*source == '-'); - if ((*source == '+') || (*source == '-')) - source++; - while (isdigit((int)*source)) - { - exponent *= 10; - exponent += (*source - '0'); - source++; - } - } - } - - value = (double)integer; - if (fraction != 0) - { - value += (double)fraction / (double)fracdiv; - } - if (exponent != 0) - { - if (isExponentNegative) - value /= pow((double)10, (double)exponent); - else - value *= pow((double)10, (double)exponent); - } - if (isNegative) - value = -value; - - if (endp) - *endp = source; - return value; -#endif -} - -/************************************************************************* - * StrToFloat - */ -float StrToFloat(const char *source, const char **endp) -{ -#if defined(TRIO_C99) - return strtof(source, endp); -#else - return (float)StrToDouble(source, endp); -#endif -} - -/************************************************************************* - * StrToUpper - */ -int StrToUpper(char *target) -{ - int i = 0; - - assert(VALID(target)); - - while (NIL != *target) - { - *target = toupper((int)*target); - target++; - i++; - } - return i; -} diff --git a/org.glite.lb-utils.trio/src/strio.h b/org.glite.lb-utils.trio/src/strio.h deleted file mode 100644 index 68845a3..0000000 --- a/org.glite.lb-utils.trio/src/strio.h +++ /dev/null @@ -1,227 +0,0 @@ -/************************************************************************* - * - * $Id$ - * - * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -#ifndef TRIO_STRIO_H -#define TRIO_STRIO_H - -#if !(defined(DEBUG) || defined(NDEBUG)) -# define NDEBUG -#endif -#include -#include -#include -#include - -#ifndef STRIO_MALLOC -# define STRIO_MALLOC(n) malloc(n) -#endif -#ifndef STRIO_FREE -# define STRIO_FREE(x) free(x) -#endif - -/* - * StrAppend(target, source) - * StrAppendMax(target, maxsize, source) - * - * Append 'source' to 'target' - * - * target = StrAlloc(size) - * - * Allocate a new string - * - * StrContains(target, substring) - * - * Find out if the string 'substring' is - * contained in the string 'target' - * - * StrCopy(target, source) - * StrCopyMax(target, maxsize, source) - * - * Copy 'source' to 'target' - * - * target = StrDuplicate(source) - * target = StrDuplicateMax(source, maxsize) - * - * Allocate and copy 'source' to 'target' - * - * StrEqual(first, second) - * StrEqualMax(first, maxsize, second) - * - * Compare if 'first' is equal to 'second'. - * Case-independent. - * - * StrEqualCase(first, second) - * StrEqualCaseMax(first, maxsize, second) - * - * Compare if 'first' is equal to 'second' - * Case-dependent. Please note that the use of the - * word 'case' has the opposite meaning as that of - * strcasecmp(). - * - * StrFormat(target, format, ...) - * StrFormatMax(target, maxsize, format, ...) - * - * Build 'target' according to 'format' and succesive - * arguments. This is equal to the sprintf() and - * snprintf() functions. - * - * StrFormatDate(target, format, ...) - * - * StrFree(target) - * - * De-allocates a string - * - * StrHash(string, type) - * - * Calculates the hash value of 'string' based on the - * 'type'. - * - * StrIndex(target, character) - * StrIndexLast(target, character) - * - * Find the first/last occurrence of 'character' in - * 'target' - * - * StrLength(target) - * - * Return the length of 'target' - * - * StrMatch(string, pattern) - * StrMatchCase(string, pattern) - * - * Find 'pattern' within 'string'. 'pattern' may contain - * wildcards such as * (asterics) and ? (question mark) - * which matches zero or more characters and exactly - * on character respectively - * - * StrScan(source, format, ...) - * - * Equal to sscanf() - * - * StrSubstring(target, substring) - * - * Find the first occurrence of the string 'substring' - * within the string 'target' - * - * StrTokenize(target, list) - * - * Split 'target' into the first token delimited by - * one of the characters in 'list'. If 'target' is - * NULL then next token will be returned. - * - * StrToUpper(target) - * - * Convert all lower case characters in 'target' into - * upper case characters. - */ - -enum { - STRIO_HASH_NONE = 0, - STRIO_HASH_PLAIN, - STRIO_HASH_TWOSIGNED -}; - -#if !defined(DEBUG) || defined(__DECC) -#define StrAlloc(n) (char *)STRIO_MALLOC(n) -#define StrAppend(x,y) strcat((x), (y)) -#define StrContains(x,y) (0 != strstr((x), (y))) -#define StrCopy(x,y) strcpy((x), (y)) -#define StrIndex(x,y) strchr((x), (y)) -#define StrIndexLast(x,y) strrchr((x), (y)) -#define StrFree(x) STRIO_FREE(x) -#define StrLength(x) strlen((x)) -#define StrSubstring(x,y) strstr((x), (y)) -#define StrTokenize(x,y) strtok((x), (y)) -#define StrToLong(x,y,n) strtol((x), (y), (n)) -#define StrToUnsignedLong(x,y,n) strtoul((x), (y), (n)) -#else /* DEBUG */ - /* - * To be able to use these macros everywhere, including in - * if() sentences, the assertions are put first in a comma - * seperated list. - * - * Unfortunately the DECC compiler does not seem to like this - * so it will use the un-asserted functions above for the - * debugging case too. - */ -#define StrAlloc(n) \ - (assert((n) > 0),\ - (char *)STRIO_MALLOC(n)) -#define StrAppend(x,y) \ - (assert((x) != NULL),\ - assert((y) != NULL),\ - strcat((x), (y))) -#define StrContains(x,y) \ - (assert((x) != NULL),\ - assert((y) != NULL),\ - (0 != strstr((x), (y)))) -#define StrCopy(x,y) \ - (assert((x) != NULL),\ - assert((y) != NULL),\ - strcpy((x), (y))) -#define StrIndex(x,c) \ - (assert((x) != NULL),\ - strchr((x), (c))) -#define StrIndexLast(x,c) \ - (assert((x) != NULL),\ - strrchr((x), (c))) -#define StrFree(x) \ - (assert((x) != NULL),\ - STRIO_FREE(x)) -#define StrLength(x) \ - (assert((x) != NULL),\ - strlen((x))) -#define StrSubstring(x,y) \ - (assert((x) != NULL),\ - assert((y) != NULL),\ - strstr((x), (y))) -#define StrTokenize(x,y) \ - (assert((y) != NULL),\ - strtok((x), (y))) -#define StrToLong(x,y,n) \ - (assert((x) != NULL),\ - assert((y) != NULL),\ - assert((n) >= 2 && (n) <= 36),\ - strtol((x), (y), (n))) -#define StrToUnsignedLong(x,y,n) \ - (assert((x) != NULL),\ - assert((y) != NULL),\ - assert((n) >= 2 && (n) <= 36),\ - strtoul((x), (y), (n))) -#endif /* DEBUG */ - -char *StrAppendMax(char *target, size_t max, const char *source); -char *StrCopyMax(char *target, size_t max, const char *source); -char *StrDuplicate(const char *source); -char *StrDuplicateMax(const char *source, size_t max); -int StrEqual(const char *first, const char *second); -int StrEqualCase(const char *first, const char *second); -int StrEqualCaseMax(const char *first, size_t max, const char *second); -int StrEqualLocale(const char *first, const char *second); -int StrEqualMax(const char *first, size_t max, const char *second); -const char *StrError(int); -size_t StrFormatDateMax(char *target, size_t max, const char *format, const struct tm *datetime); -unsigned long StrHash(const char *string, int type); -int StrMatch(char *string, char *pattern); -int StrMatchCase(char *string, char *pattern); -size_t StrSpanFunction(char *source, int (*Function)(int)); -char *StrSubstringMax(const char *string, size_t max, const char *find); -float StrToFloat(const char *source, const char **target); -double StrToDouble(const char *source, const char **target); -int StrToUpper(char *target); - -#endif /* TRIO_STRIO_H */ diff --git a/org.glite.lb-utils.trio/src/trio.c b/org.glite.lb-utils.trio/src/trio.c deleted file mode 100644 index 6e4211e..0000000 --- a/org.glite.lb-utils.trio/src/trio.c +++ /dev/null @@ -1,5706 +0,0 @@ - -/************************************************************************* - * - * $Id$ - * - * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************* - * - * A note to trio contributors: - * - * Avoid heap allocation at all costs to ensure that the trio functions - * are async-safe. The exceptions are the printf/fprintf functions, which - * uses fputc, and the asprintf functions and the modifier, which - * by design are required to allocate form the heap. - * - ************************************************************************/ - -/* - * TODO: - * - Scan is probably too permissive about its modifiers. - * - C escapes in %#[] ? - * - C99 support has not been properly tested. - * - Multibyte characters (done for format parsing, except scan groups) - * - Complex numbers? (C99 _Complex) - * - Boolean values? (C99 _Bool) - * - C99 NaN(n-char-sequence) missing - * - Should we support the GNU %a alloc modifier? GNU has an ugly hack - * for %a, because C99 used %a for other purposes. If specified as - * %as or %a[ it is interpreted as the alloc modifier, otherwise as - * the C99 hex-float. This means that you cannot scan %as as a hex-float - * immediately followed by an 's'. - * - Scanning of collating symbols. - */ - -static const char rcsid[] = "@(#)$Id$"; - -/************************************************************************* - * Trio include files - */ -#include "trio.h" -#include "triop.h" -#include "strio.h" - -#ifdef DATAGRID_EXTENSION -#include "escape.h" -#endif - -/* - * Encode the error code and the position. This is decoded - * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION. - */ -#if TRIO_ERRORS -# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8))) -#else -# define TRIO_ERROR_RETURN(x,y) (-1) -#endif - - -/************************************************************************* - * Platform and compiler support detection - */ -#if defined(unix) || defined(__xlC__) || defined(_AIX) || defined(__QNX__) -# define PLATFORM_UNIX -#elif defined(AMIGA) && defined(__GNUC__) -# define PLATFORM_UNIX -#elif defined(WIN32) || defined(_WIN32) || defined(_MSC_VER) -# define PLATFORM_WIN32 -# define TRIO_MSVC_5 1100 -#endif - -#if defined(__STDC__) && defined(__STDC_VERSION__) -# if (__STDC_VERSION__ >= 199409L) -# define TRIO_COMPILER_SUPPORTS_ISO94 -# endif -# if (__STDC_VERSION__ >= 199901L) -# define TRIO_COMPILER_SUPPORTS_C99 -# endif -#endif - -#if defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED) -# define TRIO_COMPILER_SUPPORTS_UNIX98 -#endif - -#if defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) || defined(USE_MULTIBYTE) || TRIO_WIDECHAR -# define TRIO_COMPILER_SUPPORTS_MULTIBYTE -# if !defined(MB_LEN_MAX) -# define MB_LEN_MAX 6 -# endif -#endif - - -/************************************************************************* - * Generic definitions - */ - -#if !(defined(DEBUG) || defined(NDEBUG)) -# define NDEBUG -#endif -#include -#include -#if !defined(TRIO_COMPILER_SUPPORTS_C99) && !defined(isblank) -# define isblank(x) (((x)==32) || ((x)==9)) -#endif -#include -#include -#include -#include -#include -#include - -#ifndef NULL -# define NULL 0 -#endif -#define NIL ((char)0) -#ifndef FALSE -# define FALSE (1 == 0) -# define TRUE (! FALSE) -#endif -#define BOOLEAN_T int - -/* mincore() can be used for debugging purposes */ -#define VALID(x) (NULL != (x)) - -/* xlC crashes on log10(0) */ -#define guarded_log10(x) (((x) == 0.0) ? -HUGE_VAL : log10(x)) -#define guarded_log16(x) (guarded_log10(x) / log10(16.0)) - - -/************************************************************************* - * Platform specific definitions - */ -#if defined(PLATFORM_UNIX) -# include -# include -# include -# define USE_LOCALE -#endif /* PLATFORM_UNIX */ -#if defined(PLATFORM_WIN32) -# include -# define read _read -# define write _write -#endif /* PLATFORM_WIN32 */ - -#if TRIO_WIDECHAR -# if defined(TRIO_COMPILER_SUPPORTS_ISO94) -# include -# include -# else -typedef char wchar_t; -typedef int wint_t; -# define WEOF EOF -# define iswalnum(x) isalnum(x) -# define iswalpha(x) isalpha(x) -# define iswblank(x) isblank(x) -# define iswcntrl(x) iscntrl(x) -# define iswdigit(x) isdigit(x) -# define iswgraph(x) isgraph(x) -# define iswlower(x) islower(x) -# define iswprint(x) isprint(x) -# define iswpunct(x) ispunct(x) -# define iswspace(x) isspace(x) -# define iswupper(x) isupper(x) -# define iswxdigit(x) isxdigit(x) -# endif -#endif - - -/************************************************************************* - * Compiler dependent definitions - */ - -/* Support for long long */ -#ifndef __cplusplus -# if !defined(USE_LONGLONG) -# if defined(__GNUC__) && !defined(__STRICT_ANSI__) -# define USE_LONGLONG -# elif defined(__SUNPRO_C) -# define USE_LONGLONG -# elif defined(_LONG_LONG) || defined(_LONGLONG) -# define USE_LONGLONG -# endif -# endif -#endif - -/* The extra long numbers */ -#if defined(USE_LONGLONG) -typedef signed long long int trio_longlong_t; -typedef unsigned long long int trio_ulonglong_t; -#elif defined(_MSC_VER) -# if (_MSC_VER >= TRIO_MSVC_5) -typedef signed __int64 trio_longlong_t; -typedef unsigned __int64 trio_ulonglong_t; -# else -typedef signed long int trio_longlong_t; -typedef unsigned long int trio_ulonglong_t; -# endif -#else -typedef signed long int trio_longlong_t; -typedef unsigned long int trio_ulonglong_t; -#endif - -/* Maximal and fixed integer types */ -#if defined(TRIO_COMPILER_SUPPORTS_C99) -# include -typedef intmax_t trio_intmax_t; -typedef uintmax_t trio_uintmax_t; -typedef int8_t trio_int8_t; -typedef int16_t trio_int16_t; -typedef int32_t trio_int32_t; -typedef int64_t trio_int64_t; -#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) -# include -typedef intmax_t trio_intmax_t; -typedef uintmax_t trio_uintmax_t; -typedef int8_t trio_int8_t; -typedef int16_t trio_int16_t; -typedef int32_t trio_int32_t; -typedef int64_t trio_int64_t; -#elif defined(_MSC_VER) && (_MSC_VER >= TRIO_MSVC_5) -typedef trio_longlong_t trio_intmax_t; -typedef trio_ulonglong_t trio_uintmax_t; -typedef __int8 trio_int8_t; -typedef __int16 trio_int16_t; -typedef __int32 trio_int32_t; -typedef __int64 trio_int64_t; -#else -typedef trio_longlong_t trio_intmax_t; -typedef trio_ulonglong_t trio_uintmax_t; -# if defined(TRIO_INT8_T) -typedef TRIO_INT8_T trio_int8_t; -# else -typedef signed char trio_int8_t; -# endif -# if defined(TRIO_INT16_T) -typedef TRIO_INT16_T trio_int16_t; -# else -typedef signed short trio_int16_t; -# endif -# if defined(TRIO_INT32_T) -typedef TRIO_INT32_T trio_int32_t; -# else -typedef signed int trio_int32_t; -# endif -# if defined(TRIO_INT64_T) -typedef TRIO_INT64_T trio_int64_t; -# else -typedef trio_longlong_t trio_int64_t; -# endif -#endif - - -/************************************************************************* - * Internal definitions - */ - -/* Long double sizes */ -#ifdef LDBL_DIG -# define MAX_MANTISSA_DIGITS LDBL_DIG -# define MAX_EXPONENT_DIGITS 4 -#else -# define MAX_MANTISSA_DIGITS DBL_DIG -# define MAX_EXPONENT_DIGITS 3 -#endif - -/* The maximal number of digits is for base 2 */ -#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT) -/* The width of a pointer. The number of bits in a hex digit is 4 */ -#define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(void *) * CHAR_BIT / 4) - -/* Infinite and Not-A-Number for floating-point */ -#define INFINITE_LOWER "inf" -#define INFINITE_UPPER "INF" -#define LONG_INFINITE_LOWER "infinite" -#define LONG_INFINITE_UPPER "INFINITE" -#define NAN_LOWER "nan" -#define NAN_UPPER "NAN" - -/* Various constants */ -enum { - TYPE_PRINT = 1, - TYPE_SCAN = 2, - - /* Flags. Use maximum 32 */ - FLAGS_NEW = 0, - FLAGS_STICKY = 1, - FLAGS_SPACE = 2 * FLAGS_STICKY, - FLAGS_SHOWSIGN = 2 * FLAGS_SPACE, - FLAGS_LEFTADJUST = 2 * FLAGS_SHOWSIGN, - FLAGS_ALTERNATIVE = 2 * FLAGS_LEFTADJUST, - FLAGS_SHORT = 2 * FLAGS_ALTERNATIVE, - FLAGS_SHORTSHORT = 2 * FLAGS_SHORT, - FLAGS_LONG = 2 * FLAGS_SHORTSHORT, - FLAGS_QUAD = 2 * FLAGS_LONG, - FLAGS_LONGDOUBLE = 2 * FLAGS_QUAD, - FLAGS_SIZE_T = 2 * FLAGS_LONGDOUBLE, - FLAGS_PTRDIFF_T = 2 * FLAGS_SIZE_T, - FLAGS_INTMAX_T = 2 * FLAGS_PTRDIFF_T, - FLAGS_NILPADDING = 2 * FLAGS_INTMAX_T, - FLAGS_UNSIGNED = 2 * FLAGS_NILPADDING, - FLAGS_UPPER = 2 * FLAGS_UNSIGNED, - FLAGS_WIDTH = 2 * FLAGS_UPPER, - FLAGS_WIDTH_PARAMETER = 2 * FLAGS_WIDTH, - FLAGS_PRECISION = 2 * FLAGS_WIDTH_PARAMETER, - FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION, - FLAGS_BASE = 2 * FLAGS_PRECISION_PARAMETER, - FLAGS_BASE_PARAMETER = 2 * FLAGS_BASE, - FLAGS_FLOAT_E = 2 * FLAGS_BASE_PARAMETER, - FLAGS_FLOAT_G = 2 * FLAGS_FLOAT_E, - FLAGS_QUOTE = 2 * FLAGS_FLOAT_G, - FLAGS_WIDECHAR = 2 * FLAGS_QUOTE, - FLAGS_ALLOC = 2 * FLAGS_WIDECHAR, - FLAGS_IGNORE = 2 * FLAGS_ALLOC, - FLAGS_IGNORE_PARAMETER = 2 * FLAGS_IGNORE, - FLAGS_VARSIZE_PARAMETER = 2 * FLAGS_IGNORE_PARAMETER, - FLAGS_FIXED_SIZE = 2 * FLAGS_VARSIZE_PARAMETER, - /* Reused flags */ - FLAGS_EXCLUDE = FLAGS_SHORT, - FLAGS_USER_DEFINED = FLAGS_IGNORE, - /* Compounded flags */ - FLAGS_ALL_VARSIZES = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T, - FLAGS_ALL_SIZES = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT, - - NO_POSITION = -1, - NO_WIDTH = 0, - NO_PRECISION = -1, - NO_SIZE = -1, - - NO_BASE = -1, - MIN_BASE = 2, - MAX_BASE = 36, - BASE_BINARY = 2, - BASE_OCTAL = 8, - BASE_DECIMAL = 10, - BASE_HEX = 16, - - /* Maximal number of allowed parameters */ - MAX_PARAMETERS = 64, - /* Maximal number of characters in class */ - MAX_CHARACTER_CLASS = UCHAR_MAX, - - /* Maximal string lengths for user-defined specifiers */ - MAX_USER_NAME = 64, - MAX_USER_DATA = 256, - - /* Maximal length of locale separator strings */ - MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX, - /* Maximal number of integers in grouping */ - MAX_LOCALE_GROUPS = 64 -}; - -#define NO_GROUPING ((int)CHAR_MAX) - -/* Fundamental formatting parameter types */ -#define FORMAT_UNKNOWN 0 -#define FORMAT_INT 1 -#define FORMAT_DOUBLE 2 -#define FORMAT_CHAR 3 -#define FORMAT_STRING 4 -#define FORMAT_POINTER 5 -#define FORMAT_COUNT 6 -#define FORMAT_PARAMETER 7 -#define FORMAT_GROUP 8 -#if TRIO_GNU -# define FORMAT_ERRNO 9 -#endif -#if TRIO_EXTENSION -# define FORMAT_USER_DEFINED 10 -#endif - -/* Character constants */ -#define CHAR_IDENTIFIER '%' -#define CHAR_BACKSLASH '\\' -#define CHAR_QUOTE '\"' -#define CHAR_ADJUST ' ' - -/* Character class expressions */ -#define CLASS_ALNUM ":alnum:" -#define CLASS_ALPHA ":alpha:" -#define CLASS_CNTRL ":cntrl:" -#define CLASS_DIGIT ":digit:" -#define CLASS_GRAPH ":graph:" -#define CLASS_LOWER ":lower:" -#define CLASS_PRINT ":print:" -#define CLASS_PUNCT ":punct:" -#define CLASS_SPACE ":space:" -#define CLASS_UPPER ":upper:" -#define CLASS_XDIGIT ":xdigit:" - -/* - * SPECIFIERS: - * - * - * a Hex-float - * A Hex-float - * c Character - * C Widechar character (wint_t) - * d Decimal - * e Float - * E Float - * F Float - * F Float - * g Float - * G Float - * i Integer - * m Error message - * n Count - * o Octal - * p Pointer - * s String - * S Widechar string (wchar_t *) - * u Unsigned - * x Hex - * X Hex - * [] Group - * <> User-defined - * - * Reserved: - * - * D Binary Coded Decimal %D(length,precision) (OS/390) - */ -#define SPECIFIER_CHAR 'c' -#define SPECIFIER_STRING 's' -#define SPECIFIER_DECIMAL 'd' -#define SPECIFIER_INTEGER 'i' -#define SPECIFIER_UNSIGNED 'u' -#define SPECIFIER_OCTAL 'o' -#define SPECIFIER_HEX 'x' -#define SPECIFIER_HEX_UPPER 'X' -#define SPECIFIER_FLOAT_E 'e' -#define SPECIFIER_FLOAT_E_UPPER 'E' -#define SPECIFIER_FLOAT_F 'f' -#define SPECIFIER_FLOAT_F_UPPER 'F' -#define SPECIFIER_FLOAT_G 'g' -#define SPECIFIER_FLOAT_G_UPPER 'G' -#define SPECIFIER_POINTER 'p' -#define SPECIFIER_GROUP '[' -#define SPECIFIER_UNGROUP ']' -#define SPECIFIER_COUNT 'n' -#if TRIO_UNIX98 -# define SPECIFIER_CHAR_UPPER 'C' -# define SPECIFIER_STRING_UPPER 'S' -#endif -#if TRIO_C99 -# define SPECIFIER_HEXFLOAT 'a' -# define SPECIFIER_HEXFLOAT_UPPER 'A' -#endif -#if TRIO_GNU -# define SPECIFIER_ERRNO 'm' -#endif -#if TRIO_EXTENSION -# define SPECIFIER_BINARY 'b' -# define SPECIFIER_BINARY_UPPER 'B' -# define SPECIFIER_USER_DEFINED_BEGIN '<' -# define SPECIFIER_USER_DEFINED_END '>' -# define SPECIFIER_USER_DEFINED_SEPARATOR ':' -#endif - -/* - * QUALIFIERS: - * - * - * Numbers = d,i,o,u,x,X - * Float = a,A,e,E,f,F,g,G - * String = s - * Char = c - * - * - * 9$ Position - * Use the 9th parameter. 9 can be any number between 1 and - * the maximal argument - * - * 9 Width - * Set width to 9. 9 can be any number, but must not be postfixed - * by '$' - * - * h Short - * Numbers: - * (unsigned) short int - * - * hh Short short - * Numbers: - * (unsigned) char - * - * l Long - * Numbers: - * (unsigned) long int - * String: - * as the S specifier - * Char: - * as the C specifier - * - * ll Long Long - * Numbers: - * (unsigned) long long int - * - * L Long Double - * Float - * long double - * - * # Alternative - * Float: - * Decimal-point is always present - * String: - * non-printable characters are handled as \number - * - * Spacing - * - * + Sign - * - * - Alignment - * - * . Precision - * - * * Parameter - * print: use parameter - * scan: no parameter (ignore) - * - * q Quad - * - * Z size_t - * - * w Widechar - * - * ' Thousands/quote - * Numbers: - * Integer part grouped in thousands - * Binary numbers: - * Number grouped in nibbles (4 bits) - * String: - * Quoted string - * - * j intmax_t - * t prtdiff_t - * z size_t - * - * ! Sticky - * @ Parameter (for both print and scan) - * - * I n-bit Integer - * Numbers: - * The following options exists - * I8 = 8-bit integer - * I16 = 16-bit integer - * I32 = 32-bit integer - * I64 = 64-bit integer - */ -#define QUALIFIER_POSITION '$' -#define QUALIFIER_SHORT 'h' -#define QUALIFIER_LONG 'l' -#define QUALIFIER_LONG_UPPER 'L' -#define QUALIFIER_ALTERNATIVE '#' -#define QUALIFIER_SPACE ' ' -#define QUALIFIER_PLUS '+' -#define QUALIFIER_MINUS '-' -#define QUALIFIER_DOT '.' -#define QUALIFIER_STAR '*' -#define QUALIFIER_CIRCUMFLEX '^' -#if TRIO_C99 -# define QUALIFIER_SIZE_T 'z' -# define QUALIFIER_PTRDIFF_T 't' -# define QUALIFIER_INTMAX_T 'j' -#endif -#if TRIO_BSD || TRIO_GNU -# define QUALIFIER_QUAD 'q' -#endif -#if TRIO_GNU -# define QUALIFIER_SIZE_T_UPPER 'Z' -#endif -#if TRIO_MISC -# define QUALIFIER_WIDECHAR 'w' -#endif -#if TRIO_MICROSOFT -# define QUALIFIER_FIXED_SIZE 'I' -#endif -#if TRIO_EXTENSION -# define QUALIFIER_QUOTE '\'' -# define QUALIFIER_STICKY '!' -# define QUALIFIER_VARSIZE '&' /* This should remain undocumented */ -# define QUALIFIER_PARAM '@' /* Experimental */ -# define QUALIFIER_COLON ':' /* For scanlists */ -# define QUALIFIER_EQUAL '=' /* For scanlists */ -#endif -#if DATAGRID_EXTENSION -# define QUALIFIER_ESCAPE '|' -#endif - - -/************************************************************************* - * Internal structures - */ - -/* Parameters */ -typedef struct { - int type; - unsigned long flags; - int width; - int precision; - int base; - int varsize; -#ifdef QUALIFIER_ESCAPE - enum dg_escape { ESCAPE_NONE, ESCAPE_ULM, ESCAPE_XML, ESCAPE_SQL } escape; -#endif - int indexAfterSpecifier; - union { - char *string; -#if TRIO_WIDECHAR - wchar_t *wstring; -#endif - void *pointer; - union { - trio_uintmax_t as_signed; - trio_intmax_t as_unsigned; - } number; - double doubleNumber; - double *doublePointer; - long double longdoubleNumber; - long double *longdoublePointer; - int errorNumber; - } data; - /* For the user-defined specifier */ - char user_name[MAX_USER_NAME]; - char user_data[MAX_USER_DATA]; -} parameter_T; - -/* General trio "class" */ -typedef struct _trio_T { - void *location; - void (*OutStream)(struct _trio_T *, int); - void (*InStream)(struct _trio_T *, int *); - /* - * The number of characters that would have been written/read if - * there had been sufficient space. - */ - int processed; - /* - * The number of characters that are actually written/read. - * Processed and committed with only differ for the *nprintf - * and *nscanf functions. - */ - int committed; - int max; - int current; -} trio_T; - -/* References (for user-defined callbacks) */ -typedef struct _reference_T { - trio_T *data; - parameter_T *parameter; -} reference_T; - -/* Registered entries (for user-defined callbacks) */ -typedef struct _userdef_T { - struct _userdef_T *next; - trio_callback_t callback; - char *name; -} userdef_T; - - -/************************************************************************* - * Internal variables - */ - -static const char null[] = "(nil)"; - -#if defined(USE_LOCALE) -static struct lconv *internalLocaleValues = NULL; -#endif - -/* - * UNIX98 says "in a locale where the radix character is not defined, - * the radix character defaults to a period (.)" - */ -static char internalDecimalPoint[MAX_LOCALE_SEPARATOR_LENGTH + 1] = "."; -static char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ","; -static char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING }; - -static const char internalDigitsLower[] = "0123456789abcdefghijklmnopqrstuvwxyz"; -static const char internalDigitsUpper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -static BOOLEAN_T internalDigitsUnconverted = TRUE; -static int internalDigitArray[128]; -#if TRIO_EXTENSION -static BOOLEAN_T internalCollationUnconverted = TRUE; -static char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS]; -#endif - -static volatile trio_callback_t internalEnterCriticalRegion = NULL; -static volatile trio_callback_t internalLeaveCriticalRegion = NULL; -static userdef_T *internalUserDef = NULL; - - -/************************************************************************* - * trio_strerror [public] - */ -const char *trio_strerror(int errorcode) -{ - /* Textual versions of the error codes */ - switch (TRIO_ERROR_CODE(errorcode)) - { - case TRIO_EOF: - return "End of file"; - case TRIO_EINVAL: - return "Invalid argument"; - case TRIO_ETOOMANY: - return "Too many arguments"; - case TRIO_EDBLREF: - return "Double reference"; - case TRIO_EGAP: - return "Reference gap"; - case TRIO_ENOMEM: - return "Out of memory"; - case TRIO_ERANGE: - return "Invalid range"; - default: - return "Unknown"; - } -} - -/************************************************************************* - * TrioIsQualifier [private] - * - * Description: - * Remember to add all new qualifiers to this function. - * QUALIFIER_POSITION must not be added. - */ -static BOOLEAN_T -TrioIsQualifier(const char ch) -{ - /* QUALIFIER_POSITION is not included */ - switch (ch) - { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case QUALIFIER_PLUS: - case QUALIFIER_MINUS: - case QUALIFIER_SPACE: - case QUALIFIER_DOT: - case QUALIFIER_STAR: - case QUALIFIER_ALTERNATIVE: - case QUALIFIER_SHORT: - case QUALIFIER_LONG: - case QUALIFIER_LONG_UPPER: - case QUALIFIER_CIRCUMFLEX: -#if defined(QUALIFIER_SIZE_T) - case QUALIFIER_SIZE_T: -#endif -#if defined(QUALIFIER_PTRDIFF_T) - case QUALIFIER_PTRDIFF_T: -#endif -#if defined(QUALIFIER_INTMAX_T) - case QUALIFIER_INTMAX_T: -#endif -#if defined(QUALIFIER_QUAD) - case QUALIFIER_QUAD: -#endif -#if defined(QUALIFIER_SIZE_T_UPPER) - case QUALIFIER_SIZE_T_UPPER: -#endif -#if defined(QUALIFIER_WIDECHAR) - case QUALIFIER_WIDECHAR: -#endif -#if defined(QUALIFIER_QUOTE) - case QUALIFIER_QUOTE: -#endif -#if defined(QUALIFIER_STICKY) - case QUALIFIER_STICKY: -#endif -#if defined(QUALIFIER_VARSIZE) - case QUALIFIER_VARSIZE: -#endif -#if defined(QUALIFIER_PARAM) - case QUALIFIER_PARAM: -#endif -#if defined(QUALIFIER_FIXED_SIZE) - case QUALIFIER_FIXED_SIZE: -#endif -#ifdef QUALIFIER_ESCAPE - case QUALIFIER_ESCAPE: -#endif - return TRUE; - default: - return FALSE; - } -} - -/************************************************************************* - * TrioGenerateNan [private] - * - * Calculating NaN portably is difficult. Some compilers will emit - * warnings about divide by zero, and others will simply fail to - * generate a NaN. - */ -static double -TrioGenerateNaN(void) -{ -#if defined(TRIO_COMPILER_SUPPORTS_C99) - return nan(NULL); -#elif defined(DBL_QNAN) - return DBL_QNAN; -#elif defined(PLATFORM_UNIX) - double value; - void (*signal_handler)(int); - - signal_handler = signal(SIGFPE, SIG_IGN); - value = 0.0 / 0.0; - signal(SIGFPE, signal_handler); - return value; -#else - return 0.0 / 0.0; -#endif -} - -/************************************************************************* - * TrioIsNan [private] - */ -static int -TrioIsNan(double number) -{ -#ifdef isnan - /* C99 defines isnan() as a macro */ - return isnan(number); -#else - double integral, fraction; - - return (/* NaN is the only number which does not compare to itself */ - (number != number) || - /* Fallback solution if NaN compares to NaN */ - ((number != 0.0) && - (fraction = modf(number, &integral), - integral == fraction))); -#endif -} - -/************************************************************************* - * TrioIsInfinite [private] - */ -static int -TrioIsInfinite(double number) -{ -#ifdef isinf - /* C99 defines isinf() as a macro */ - return isinf(number); -#else - return ((number == HUGE_VAL) ? 1 : ((number == -HUGE_VAL) ? -1 : 0)); -#endif -} - -/************************************************************************* - * TrioSetLocale [private] - */ -#if defined(USE_LOCALE) -static void -TrioSetLocale(void) -{ - internalLocaleValues = (struct lconv *)localeconv(); - if (internalLocaleValues) - { - if ((internalLocaleValues->decimal_point) && - (internalLocaleValues->decimal_point[0] != NIL)) - { - StrCopyMax(internalDecimalPoint, - sizeof(internalDecimalPoint), - internalLocaleValues->decimal_point); - } - if ((internalLocaleValues->thousands_sep) && - (internalLocaleValues->thousands_sep[0] != NIL)) - { - StrCopyMax(internalThousandSeparator, - sizeof(internalThousandSeparator), - internalLocaleValues->thousands_sep); - } - if ((internalLocaleValues->grouping) && - (internalLocaleValues->grouping[0] != NIL)) - { - StrCopyMax(internalGrouping, - sizeof(internalGrouping), - internalLocaleValues->grouping); - } - } -} -#endif /* defined(USE_LOCALE) */ - -/************************************************************************* - * TrioGetPosition [private] - * - * Get the %n$ position. - */ -static int -TrioGetPosition(const char *format, - int *indexPointer) -{ - char *tmpformat; - int number = 0; - int index = *indexPointer; - - number = (int)StrToLong(&format[index], &tmpformat, BASE_DECIMAL); - index = (int)(tmpformat - format); - if ((number != 0) && (QUALIFIER_POSITION == format[index++])) - { - *indexPointer = index; - /* - * number is decreased by 1, because n$ starts from 1, whereas - * the array it is indexing starts from 0. - */ - return number - 1; - } - return NO_POSITION; -} - -/************************************************************************* - * TrioFindNamespace [private] - * - * Find registered user-defined specifier. - * The prev argument is used for optimisation only. - */ -static userdef_T * -TrioFindNamespace(const char *name, userdef_T **prev) -{ - userdef_T *def; - - if (internalEnterCriticalRegion) - (void)internalEnterCriticalRegion(NULL); - - for (def = internalUserDef; def; def = def->next) - { - /* Case-sensitive string comparison */ - if (StrEqualCase(def->name, name)) - break; - - if (prev) - *prev = def; - } - - if (internalLeaveCriticalRegion) - (void)internalLeaveCriticalRegion(NULL); - - return def; -} - -/************************************************************************* - * TrioPreprocess [private] - * - * Description: - * Parse the format string - */ -static int -TrioPreprocess(int type, - const char *format, - parameter_T *parameters, - va_list arglist, - void **argarray) -{ -#if TRIO_ERRORS - /* Count the number of times a parameter is referenced */ - unsigned short usedEntries[MAX_PARAMETERS]; -#endif - /* Parameter counters */ - int parameterPosition; - int currentParam; - int maxParam = -1; - /* Utility variables */ - unsigned long flags; - int width; - int precision; - int varsize; -#ifdef QUALIFIER_ESCAPE - enum dg_escape escape; -#endif - int base; - int index; /* Index into formatting string */ - int dots; /* Count number of dots in modifier part */ - BOOLEAN_T positional; /* Does the specifier have a positional? */ - BOOLEAN_T got_sticky = FALSE; /* Are there any sticky modifiers at all? */ - /* - * indices specifies the order in which the parameters must be - * read from the va_args (this is necessary to handle positionals) - */ - int indices[MAX_PARAMETERS]; - int pos = 0; - /* Various variables */ - char ch; -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - int charlen; -#endif - int i = -1; - int num; - char *tmpformat; - - -#if TRIO_ERRORS - /* - * The 'parameters' array is not initialized, but we need to - * know which entries we have used. - */ - memset(usedEntries, 0, sizeof(usedEntries)); -#endif - - index = 0; - parameterPosition = 0; -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - mblen(NULL, 0); -#endif - - while (format[index]) - { -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - if (! isascii(format[index])) - { - /* - * Multibyte characters cannot be legal specifiers or - * modifiers, so we skip over them. - */ - charlen = mblen(&format[index], MB_LEN_MAX); - index += (charlen > 0) ? charlen : 1; - continue; /* while */ - } -#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ - if (CHAR_IDENTIFIER == format[index++]) - { - if (CHAR_IDENTIFIER == format[index]) - { - index++; - continue; /* while */ - } - - flags = FLAGS_NEW; - dots = 0; - currentParam = TrioGetPosition(format, &index); - positional = (NO_POSITION != currentParam); - if (!positional) - { - /* We have no positional, get the next counter */ - currentParam = parameterPosition; - } - if(currentParam >= MAX_PARAMETERS) - { - /* Bail out completely to make the error more obvious */ - return TRIO_ERROR_RETURN(TRIO_ETOOMANY, index); - } - - if (currentParam > maxParam) - maxParam = currentParam; - - /* Default values */ - width = NO_WIDTH; - precision = NO_PRECISION; - base = NO_BASE; - varsize = NO_SIZE; -#ifdef QUALIFIER_ESCAPE - escape = ESCAPE_NONE; -#endif - - while (TrioIsQualifier(format[index])) - { - ch = format[index++]; - - switch (ch) - { - case QUALIFIER_SPACE: - flags |= FLAGS_SPACE; - break; - - case QUALIFIER_PLUS: - flags |= FLAGS_SHOWSIGN; - break; - - case QUALIFIER_MINUS: - flags |= FLAGS_LEFTADJUST; - flags &= ~FLAGS_NILPADDING; - break; - - case QUALIFIER_ALTERNATIVE: - flags |= FLAGS_ALTERNATIVE; - break; - - case QUALIFIER_DOT: - if (dots == 0) /* Precision */ - { - dots++; - - /* Skip if no precision */ - if (QUALIFIER_DOT == format[index]) - break; - - /* After the first dot we have the precision */ - flags |= FLAGS_PRECISION; - if ((QUALIFIER_STAR == format[index]) || - (QUALIFIER_PARAM == format[index])) - { - index++; - flags |= FLAGS_PRECISION_PARAMETER; - - precision = TrioGetPosition(format, &index); - if (precision == NO_POSITION) - { - parameterPosition++; - if (positional) - precision = parameterPosition; - else - { - precision = currentParam; - currentParam = precision + 1; - } - } - else - { - if (! positional) - currentParam = precision + 1; - if (width > maxParam) - maxParam = precision; - } - if (currentParam > maxParam) - maxParam = currentParam; - } - else - { - precision = StrToLong(&format[index], &tmpformat, BASE_DECIMAL); - index = (int)(tmpformat - format); - } - } - else if (dots == 1) /* Base */ - { - dots++; - - /* After the second dot we have the base */ - flags |= FLAGS_BASE; - if ((QUALIFIER_STAR == format[index]) || - (QUALIFIER_PARAM == format[index])) - { - index++; - flags |= FLAGS_BASE_PARAMETER; - base = TrioGetPosition(format, &index); - if (base == NO_POSITION) - { - parameterPosition++; - if (positional) - base = parameterPosition; - else - { - base = currentParam; - currentParam = base + 1; - } - } - else - { - if (! positional) - currentParam = base + 1; - if (base > maxParam) - maxParam = base; - } - if (currentParam > maxParam) - maxParam = currentParam; - } - else - { - base = StrToLong(&format[index], &tmpformat, BASE_DECIMAL); - if (base > MAX_BASE) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - index = (int)(tmpformat - format); - } - } - else - { - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - break; /* QUALIFIER_DOT */ - - case QUALIFIER_PARAM: - type = TYPE_PRINT; - /* FALLTHROUGH */ - case QUALIFIER_STAR: - /* This has different meanings for print and scan */ - if (TYPE_PRINT == type) - { - /* Read with from parameter */ - flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER); - width = TrioGetPosition(format, &index); - if (width == NO_POSITION) - { - parameterPosition++; - if (positional) - width = parameterPosition; - else - { - width = currentParam; - currentParam = width + 1; - } - } - else - { - if (! positional) - currentParam = width + 1; - if (width > maxParam) - maxParam = width; - } - if (currentParam > maxParam) - maxParam = currentParam; - } - else - { - /* Scan, but do not store result */ - flags |= FLAGS_IGNORE; - } - - break; /* QUALIFIER_STAR */ - - case '0': - if (! (flags & FLAGS_LEFTADJUST)) - flags |= FLAGS_NILPADDING; - /* FALLTHROUGH */ - case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - flags |= FLAGS_WIDTH; - /* &format[index - 1] is used to "rewind" the read - * character from format - */ - width = StrToLong(&format[index - 1], &tmpformat, BASE_DECIMAL); - index = (int)(tmpformat - format); - break; - - case QUALIFIER_SHORT: - if (flags & FLAGS_SHORTSHORT) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - else if (flags & FLAGS_SHORT) - flags |= FLAGS_SHORTSHORT; - else - flags |= FLAGS_SHORT; - break; - - case QUALIFIER_LONG: - if (flags & FLAGS_QUAD) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - else if (flags & FLAGS_LONG) - flags |= FLAGS_QUAD; - else - flags |= FLAGS_LONG; - break; - - case QUALIFIER_LONG_UPPER: - flags |= FLAGS_LONGDOUBLE; - break; - -#if defined(QUALIFIER_SIZE_T) - case QUALIFIER_SIZE_T: - flags |= FLAGS_SIZE_T; - /* Modify flags for later truncation of number */ - if (sizeof(size_t) == sizeof(trio_ulonglong_t)) - flags |= FLAGS_QUAD; - else if (sizeof(size_t) == sizeof(long)) - flags |= FLAGS_LONG; - break; -#endif - -#if defined(QUALIFIER_PTRDIFF_T) - case QUALIFIER_PTRDIFF_T: - flags |= FLAGS_PTRDIFF_T; - if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t)) - flags |= FLAGS_QUAD; - else if (sizeof(ptrdiff_t) == sizeof(long)) - flags |= FLAGS_LONG; - break; -#endif - -#if defined(QUALIFIER_INTMAX_T) - case QUALIFIER_INTMAX_T: - flags |= FLAGS_INTMAX_T; - if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t)) - flags |= FLAGS_QUAD; - else if (sizeof(trio_intmax_t) == sizeof(long)) - flags |= FLAGS_LONG; - break; -#endif - -#if defined(QUALIFIER_QUAD) - case QUALIFIER_QUAD: - flags |= FLAGS_QUAD; - break; -#endif - -#if defined(QUALIFIER_FIXED_SIZE) - case QUALIFIER_FIXED_SIZE: - if (flags & FLAGS_FIXED_SIZE) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - - if (flags & (FLAGS_ALL_SIZES | FLAGS_LONGDOUBLE | - FLAGS_WIDECHAR | FLAGS_VARSIZE_PARAMETER)) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - - if ((format[index] == '6') && - (format[index + 1] == '4')) - { - varsize = sizeof(trio_int64_t); - index += 2; - } - else if ((format[index] == '3') && - (format[index + 1] == '2')) - { - varsize = sizeof(trio_int32_t); - index += 2; - } - else if ((format[index] == '1') && - (format[index + 1] == '6')) - { - varsize = sizeof(trio_int16_t); - index += 2; - } - else if (format[index] == '8') - { - varsize = sizeof(trio_int8_t); - index++; - } - else - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - - flags |= FLAGS_FIXED_SIZE; - break; -#endif - -#ifdef QUALIFIER_ESCAPE - case QUALIFIER_ESCAPE: - switch (format[index++]) { - case 'U': escape = ESCAPE_ULM; break; - case 'X': escape = ESCAPE_XML; break; - case 'S': escape = ESCAPE_SQL; break; - default: return TRIO_ERROR_RETURN(TRIO_EINVAL,index); - } - break; -#endif - - -#if defined(QUALIFIER_WIDECHAR) - case QUALIFIER_WIDECHAR: - flags |= FLAGS_WIDECHAR; - break; -#endif - -#if defined(QUALIFIER_SIZE_T_UPPER) - case QUALIFIER_SIZE_T_UPPER: - break; -#endif - -#if defined(QUALIFIER_QUOTE) - case QUALIFIER_QUOTE: - flags |= FLAGS_QUOTE; - break; -#endif - -#if defined(QUALIFIER_STICKY) - case QUALIFIER_STICKY: - flags |= FLAGS_STICKY; - got_sticky = TRUE; - break; -#endif - -#if defined(QUALIFIER_VARSIZE) - case QUALIFIER_VARSIZE: - flags |= FLAGS_VARSIZE_PARAMETER; - parameterPosition++; - if (positional) - varsize = parameterPosition; - else - { - varsize = currentParam; - currentParam = varsize + 1; - } - if (currentParam > maxParam) - maxParam = currentParam; - break; -#endif - - default: - /* Bail out completely to make the error more obvious */ - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - } /* while qualifier */ - - /* - * Parameters only need the type and value. The value is - * read later. - */ - if (flags & FLAGS_WIDTH_PARAMETER) - { -#if TRIO_ERRORS - usedEntries[width] += 1; -#endif - parameters[pos].type = FORMAT_PARAMETER; - indices[width] = pos; - width = pos++; - } - if (flags & FLAGS_PRECISION_PARAMETER) - { -#if TRIO_ERRORS - usedEntries[precision] += 1; -#endif - parameters[pos].type = FORMAT_PARAMETER; - indices[precision] = pos; - precision = pos++; - } - if (flags & FLAGS_BASE_PARAMETER) - { -#if TRIO_ERRORS - usedEntries[base] += 1; -#endif - parameters[pos].type = FORMAT_PARAMETER; - indices[base] = pos; - base = pos++; - } - if (flags & FLAGS_VARSIZE_PARAMETER) - { -#if TRIO_ERRORS - usedEntries[varsize] += 1; -#endif - parameters[pos].type = FORMAT_PARAMETER; - indices[varsize] = pos; - varsize = pos++; - } - - indices[currentParam] = pos; - - switch (format[index++]) - { -#if defined(SPECIFIER_CHAR_UPPER) - case SPECIFIER_CHAR_UPPER: - flags |= FLAGS_WIDECHAR; - /* FALLTHROUGH */ -#endif - case SPECIFIER_CHAR: - if (flags & FLAGS_LONG) - flags |= FLAGS_WIDECHAR; - else if (flags & FLAGS_SHORT) - flags &= ~FLAGS_WIDECHAR; - parameters[pos].type = FORMAT_CHAR; - break; - -#if defined(SPECIFIER_STRING_UPPER) - case SPECIFIER_STRING_UPPER: - flags |= FLAGS_WIDECHAR; - /* FALLTHROUGH */ -#endif - case SPECIFIER_STRING: - if (flags & FLAGS_LONG) - flags |= FLAGS_WIDECHAR; - else if (flags & FLAGS_SHORT) - flags &= ~FLAGS_WIDECHAR; - parameters[pos].type = FORMAT_STRING; - break; - - - case SPECIFIER_GROUP: - if (TYPE_SCAN == type) - { - int depth = 1; - parameters[pos].type = FORMAT_GROUP; - if (format[index] == QUALIFIER_CIRCUMFLEX) - index++; - if (format[index] == SPECIFIER_UNGROUP) - index++; - if (format[index] == QUALIFIER_MINUS) - index++; - /* Skip nested brackets */ - while (format[index] != NIL) - { - if (format[index] == SPECIFIER_GROUP) - { - depth++; - } - else if (format[index] == SPECIFIER_UNGROUP) - { - if (--depth <= 0) - { - index++; - break; - } - } - index++; - } - } - break; - - case SPECIFIER_INTEGER: - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_UNSIGNED: - flags |= FLAGS_UNSIGNED; - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_DECIMAL: - /* Disable base modifier */ - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_DECIMAL; - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_OCTAL: - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_OCTAL; - parameters[pos].type = FORMAT_INT; - break; - -#if defined(SPECIFIER_BINARY) - case SPECIFIER_BINARY_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_BINARY: - flags |= FLAGS_NILPADDING; - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_BINARY; - parameters[pos].type = FORMAT_INT; - break; -#endif - - case SPECIFIER_HEX_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_HEX: - flags |= FLAGS_UNSIGNED; - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_HEX; - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_FLOAT_E_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_FLOAT_E: - flags |= FLAGS_FLOAT_E; - parameters[pos].type = FORMAT_DOUBLE; - break; - - case SPECIFIER_FLOAT_G_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_FLOAT_G: - flags |= FLAGS_FLOAT_G; - parameters[pos].type = FORMAT_DOUBLE; - break; - - case SPECIFIER_FLOAT_F_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_FLOAT_F: - parameters[pos].type = FORMAT_DOUBLE; - break; - - case SPECIFIER_POINTER: - parameters[pos].type = FORMAT_POINTER; - break; - - case SPECIFIER_COUNT: - parameters[pos].type = FORMAT_COUNT; - break; - -#if defined(SPECIFIER_HEXFLOAT) -# if defined(SPECIFIER_HEXFLOAT_UPPER) - case SPECIFIER_HEXFLOAT_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ -# endif - case SPECIFIER_HEXFLOAT: - base = BASE_HEX; - parameters[pos].type = FORMAT_DOUBLE; - break; -#endif - -#if defined(FORMAT_ERRNO) - case SPECIFIER_ERRNO: - parameters[pos].type = FORMAT_ERRNO; - break; -#endif - -#if defined(SPECIFIER_USER_DEFINED_BEGIN) - case SPECIFIER_USER_DEFINED_BEGIN: - { - unsigned int max; - int without_namespace = TRUE; - - parameters[pos].type = FORMAT_USER_DEFINED; - parameters[pos].user_name[0] = NIL; - tmpformat = (char *)&format[index]; - - while ((ch = format[index])) - { - index++; - if (ch == SPECIFIER_USER_DEFINED_END) - { - if (without_namespace) - { - /* We must get the handle first */ - parameters[pos].type = FORMAT_PARAMETER; - parameters[pos].indexAfterSpecifier = index; - parameters[pos].flags = FLAGS_USER_DEFINED; - /* Adjust parameters for insertion of new one */ - pos++; -# if TRIO_ERRORS - usedEntries[currentParam] += 1; -# endif - parameters[pos].type = FORMAT_USER_DEFINED; - currentParam++; - indices[currentParam] = pos; - if (currentParam > maxParam) - maxParam = currentParam; - } - /* Copy the user data */ - max = (unsigned int)(&format[index] - tmpformat); - if (max > MAX_USER_DATA) - max = MAX_USER_DATA; - StrCopyMax(parameters[pos].user_data, - max, - tmpformat); - break; /* while */ - } - if (ch == SPECIFIER_USER_DEFINED_SEPARATOR) - { - without_namespace = FALSE; - /* Copy the namespace for later looking-up */ - max = (int)(&format[index] - tmpformat); - if (max > MAX_USER_NAME) - max = MAX_USER_NAME; - StrCopyMax(parameters[pos].user_name, - max, - tmpformat); - tmpformat = (char *)&format[index]; - } - } - if (ch != SPECIFIER_USER_DEFINED_END) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - break; -#endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */ - - default: - /* Bail out completely to make the error more obvious */ - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - -#if TRIO_ERRORS - /* Count the number of times this entry has been used */ - usedEntries[currentParam] += 1; -#endif - - /* Find last sticky parameters */ - if (got_sticky && !(flags & FLAGS_STICKY)) - { - for (i = pos - 1; i >= 0; i--) - { - if (parameters[i].type == FORMAT_PARAMETER) - continue; - if ((parameters[i].flags & FLAGS_STICKY) && - (parameters[i].type == parameters[pos].type)) - { - /* Do not overwrite current qualifiers */ - flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY); - if (width == NO_WIDTH) - width = parameters[i].width; - if (precision == NO_PRECISION) - precision = parameters[i].precision; - if (base == NO_BASE) - base = parameters[i].base; - break; - } - } - } - - parameters[pos].indexAfterSpecifier = index; - parameters[pos].flags = flags; - parameters[pos].width = width; - parameters[pos].precision = precision; - parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base; - parameters[pos].varsize = varsize; -#ifdef QUALIFIER_ESCAPE - parameters[pos].escape = escape; -#endif - pos++; - - if (! positional) - parameterPosition++; - - } /* if identifier */ - - } /* while format characters left */ - - for (num = 0; num <= maxParam; num++) - { -#if TRIO_ERRORS - if (usedEntries[num] != 1) - { - if (usedEntries[num] == 0) /* gap detected */ - return TRIO_ERROR_RETURN(TRIO_EGAP, num); - else /* double references detected */ - return TRIO_ERROR_RETURN(TRIO_EDBLREF, num); - } -#endif - - i = indices[num]; - - /* - * FORMAT_PARAMETERS are only present if they must be read, - * so it makes no sense to check the ignore flag (besides, - * the flags variable is not set for that particular type) - */ - if ((parameters[i].type != FORMAT_PARAMETER) && - (parameters[i].flags & FLAGS_IGNORE)) - continue; /* for all arguments */ - - /* - * The stack arguments are read according to ANSI C89 - * default argument promotions: - * - * char = int - * short = int - * unsigned char = unsigned int - * unsigned short = unsigned int - * float = double - * - * In addition to the ANSI C89 these types are read (the - * default argument promotions of C99 has not been - * considered yet) - * - * long long - * long double - * size_t - * ptrdiff_t - * intmax_t - */ - switch (parameters[i].type) - { - case FORMAT_GROUP: - case FORMAT_STRING: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - parameters[i].data.wstring = (argarray == NULL) - ? va_arg(arglist, wchar_t *) - : (wchar_t *)(argarray[num]); - } - else -#endif - { - parameters[i].data.string = (argarray == NULL) - ? va_arg(arglist, char *) - : (char *)(argarray[num]); - } - break; - - case FORMAT_POINTER: - case FORMAT_COUNT: - case FORMAT_USER_DEFINED: - case FORMAT_UNKNOWN: - parameters[i].data.pointer = (argarray == NULL) - ? va_arg(arglist, void *) - : argarray[num]; - break; - - case FORMAT_CHAR: - case FORMAT_INT: - if (TYPE_SCAN == type) - { - if (argarray == NULL) - parameters[i].data.pointer = - (trio_uintmax_t *)va_arg(arglist, void *); - else - { - if (parameters[i].type == FORMAT_CHAR) - parameters[i].data.pointer = - (trio_uintmax_t *)((char *)argarray[num]); - else if (parameters[i].flags & FLAGS_SHORT) - parameters[i].data.pointer = - (trio_uintmax_t *)((short *)argarray[num]); - else - parameters[i].data.pointer = - (trio_uintmax_t *)((int *)argarray[num]); - } - } - else - { -#if defined(QUALIFIER_VARSIZE) || defined(QUALIFIER_FIXED_SIZE) - if ((parameters[i].flags & FLAGS_VARSIZE_PARAMETER) || - (parameters[i].flags & FLAGS_FIXED_SIZE)) - { - if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER) - { - /* - * Variable sizes are mapped onto the fixed sizes, in - * accordance with integer promotion. - * - * Please note that this may not be portable, as we - * only guess the size, not the layout of the numbers. - * For example, if int is little-endian, and long is - * big-endian, then this will fail. - */ - varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned; - } - else - { - /* Used for the I modifiers */ - varsize = parameters[i].varsize; - } - parameters[i].flags &= ~FLAGS_ALL_VARSIZES; - - if (varsize <= (int)sizeof(int)) - ; - else if (varsize <= (int)sizeof(long)) - parameters[i].flags |= FLAGS_LONG; -#if defined(QUALIFIER_INTMAX_T) - else if (varsize <= (int)sizeof(trio_longlong_t)) - parameters[i].flags |= FLAGS_QUAD; - else - parameters[i].flags |= FLAGS_INTMAX_T; -#else - else - parameters[i].flags |= FLAGS_QUAD; -#endif - } -#endif /* defined(QUALIFIER_VARSIZE) */ -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (parameters[i].flags & FLAGS_SIZE_T) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(arglist, size_t) - : (trio_uintmax_t)(*((size_t *)argarray[num])); - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (parameters[i].flags & FLAGS_PTRDIFF_T) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(arglist, ptrdiff_t) - : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num])); - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (parameters[i].flags & FLAGS_INTMAX_T) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(arglist, trio_intmax_t) - : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num])); - else -#endif - if (parameters[i].flags & FLAGS_QUAD) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(arglist, trio_ulonglong_t) - : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num])); - else if (parameters[i].flags & FLAGS_LONG) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(arglist, long) - : (trio_uintmax_t)(*((long *)argarray[num])); - else - { - if (argarray == NULL) - parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(arglist, int); - else - { - if (parameters[i].type == FORMAT_CHAR) - parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((char *)argarray[num])); - else if (parameters[i].flags & FLAGS_SHORT) - parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((short *)argarray[num])); - else - parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((int *)argarray[num])); - } - } - } - break; - - case FORMAT_PARAMETER: - /* - * The parameter for the user-defined specifier is a pointer, - * whereas the rest (width, precision, base) uses an integer. - */ - if (parameters[i].flags & FLAGS_USER_DEFINED) - parameters[i].data.pointer = (argarray == NULL) - ? va_arg(arglist, void *) - : argarray[num]; - else - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(arglist, int) - : (trio_uintmax_t)(*((int *)argarray[num])); - break; - - case FORMAT_DOUBLE: - if (TYPE_SCAN == type) - { - if (parameters[i].flags & FLAGS_LONG) - parameters[i].data.longdoublePointer = (argarray == NULL) - ? va_arg(arglist, long double *) - : (long double *)((long double *)argarray[num]); - else - { - if (argarray == NULL) - parameters[i].data.doublePointer = - va_arg(arglist, double *); - else - { - if (parameters[i].flags & FLAGS_SHORT) - parameters[i].data.doublePointer = - (double *)((float *)argarray[num]); - else - parameters[i].data.doublePointer = - (double *)((double *)argarray[num]); - } - } - } - else - { - if (parameters[i].flags & FLAGS_LONG) - parameters[i].data.longdoubleNumber = (argarray == NULL) - ? va_arg(arglist, long double) - : (long double)(*((long double *)argarray[num])); - else - { - if (argarray == NULL) - parameters[i].data.longdoubleNumber = (long double)va_arg(arglist, double); - else - { - if (parameters[i].flags & FLAGS_SHORT) - parameters[i].data.longdoubleNumber = (long double)(*((float *)argarray[num])); - else - parameters[i].data.longdoubleNumber = (long double)(long double)(*((double *)argarray[num])); - } - } - } - break; - -#if defined(FORMAT_ERRNO) - case FORMAT_ERRNO: - parameters[i].data.errorNumber = errno; - break; -#endif - - default: - break; - } - } /* for all specifiers */ - return num; -} - - -/************************************************************************* - * - * @FORMATTING - * - ************************************************************************/ - - -/************************************************************************* - * TrioWriteNumber [private] - * - * Description: - * Output a number. - * The complexity of this function is a result of the complexity - * of the dependencies of the flags. - */ -static void -TrioWriteNumber(trio_T *self, - trio_uintmax_t number, - unsigned long flags, - int width, - int precision, - int base) -{ - BOOLEAN_T isNegative; - char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1]; - char *bufferend; - char *pointer; - const char *digits; - int i; - int length; - char *p; - int charsPerThousand; - int groupingIndex; - int count; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE)); - - digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; - - isNegative = (flags & FLAGS_UNSIGNED) - ? FALSE - : ((trio_intmax_t)number < 0); - if (isNegative) - number = -number; - - if (flags & FLAGS_QUAD) - number &= (trio_ulonglong_t)-1; - else if (flags & FLAGS_LONG) - number &= (unsigned long)-1; - else - number &= (unsigned int)-1; - - /* Build number */ - pointer = bufferend = &buffer[sizeof(buffer) - 1]; - *pointer-- = NIL; - charsPerThousand = (int)internalGrouping[0]; - groupingIndex = 1; - for (i = 1; i < (int)sizeof(buffer); i++) - { - *pointer-- = digits[number % base]; - number /= base; - if (number == 0) - break; - - if ((flags & FLAGS_QUOTE) - && (charsPerThousand != NO_GROUPING) - && (i % charsPerThousand == 0)) - { - /* - * We are building the number from the least significant - * to the most significant digit, so we have to copy the - * thousand separator backwards - */ - length = StrLength(internalThousandSeparator); - if (((int)(pointer - buffer) - length) > 0) - { - p = &internalThousandSeparator[length - 1]; - while (length-- > 0) - *pointer-- = *p--; - } - - /* Advance to next grouping number */ - switch (internalGrouping[groupingIndex]) - { - case CHAR_MAX: /* Disable grouping */ - charsPerThousand = NO_GROUPING; - break; - case 0: /* Repeat last group */ - break; - default: - charsPerThousand = (int)internalGrouping[groupingIndex++]; - break; - } - } - } - - /* Adjust width */ - width -= (bufferend - pointer) - 1; - - /* Adjust precision */ - if (NO_PRECISION != precision) - { - precision -= (bufferend - pointer) - 1; - if (precision < 0) - precision = 0; - flags |= FLAGS_NILPADDING; - } - - /* Adjust width further */ - if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) - width--; - if (flags & FLAGS_ALTERNATIVE) - { - switch (base) - { - case BASE_BINARY: - case BASE_HEX: - width -= 2; - break; - case BASE_OCTAL: - width--; - break; - default: - break; - } - } - - /* Output prefixes spaces if needed */ - if (! ((flags & FLAGS_LEFTADJUST) || - ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION)))) - { - count = (precision == NO_PRECISION) ? 0 : precision; - while (width-- > count) - self->OutStream(self, CHAR_ADJUST); - } - - /* width has been adjusted for signs and alternatives */ - if (isNegative) - self->OutStream(self, '-'); - else if (flags & FLAGS_SHOWSIGN) - self->OutStream(self, '+'); - else if (flags & FLAGS_SPACE) - self->OutStream(self, ' '); - - if (flags & FLAGS_ALTERNATIVE) - { - switch (base) - { - case BASE_BINARY: - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b'); - break; - - case BASE_OCTAL: - self->OutStream(self, '0'); - break; - - case BASE_HEX: - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); - break; - - default: - break; - } /* switch base */ - } - - /* Output prefixed zero padding if needed */ - if (flags & FLAGS_NILPADDING) - { - if (precision == NO_PRECISION) - precision = width; - while (precision-- > 0) - { - self->OutStream(self, '0'); - width--; - } - } - - /* Output the number itself */ - while (*(++pointer)) - { - self->OutStream(self, *pointer); - } - - /* Output trailing spaces if needed */ - if (flags & FLAGS_LEFTADJUST) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } -} - -/************************************************************************* - * TrioWriteStringCharacter [private] - * - * Description: - * Output a single character of a string - */ -static void -TrioWriteStringCharacter(trio_T *self, - int ch, - unsigned long flags) -{ - if (flags & FLAGS_ALTERNATIVE) - { - if (! (isprint(ch) || isspace(ch))) - { - /* - * Non-printable characters are converted to C escapes or - * \number, if no C escape exists. - */ - self->OutStream(self, CHAR_BACKSLASH); - switch (ch) - { - case '\007': self->OutStream(self, 'a'); break; - case '\b': self->OutStream(self, 'b'); break; - case '\f': self->OutStream(self, 'f'); break; - case '\n': self->OutStream(self, 'n'); break; - case '\r': self->OutStream(self, 'r'); break; - case '\t': self->OutStream(self, 't'); break; - case '\v': self->OutStream(self, 'v'); break; - case '\\': self->OutStream(self, '\\'); break; - default: - self->OutStream(self, 'x'); - TrioWriteNumber(self, (trio_intmax_t)ch, - FLAGS_UNSIGNED | FLAGS_NILPADDING, - 2, 2, BASE_HEX); - break; - } - } - else if (ch == CHAR_BACKSLASH) - { - self->OutStream(self, CHAR_BACKSLASH); - self->OutStream(self, CHAR_BACKSLASH); - } - else - { - self->OutStream(self, ch); - } - } - else - { - self->OutStream(self, ch); - } -} - -/************************************************************************* - * TrioWriteString [private] - * - * Description: - * Output a string - */ -static void -TrioWriteString(trio_T *self, - const char *string, - unsigned long flags, - int width, - int precision) -{ - int length; - int ch; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - - if (string == NULL) - { - string = null; - length = sizeof(null) - 1; - /* Disable quoting for the null pointer */ - flags &= (~FLAGS_QUOTE); - width = 0; - } - else - { - length = StrLength(string); - } - if ((NO_PRECISION != precision) && - (precision < length)) - { - length = precision; - } - width -= length; - - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); - - if (! (flags & FLAGS_LEFTADJUST)) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - - while (length-- > 0) - { - /* The ctype parameters must be an unsigned char (or EOF) */ - ch = (int)((unsigned char)(*string++)); - TrioWriteStringCharacter(self, ch, flags); - } - - if (flags & FLAGS_LEFTADJUST) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); -} - -/************************************************************************* - * TrioWriteWideStringCharacter [private] - * - * Description: - * Output a wide string as a multi-byte sequence - */ -#if TRIO_WIDECHAR -static int -TrioWriteWideStringCharacter(trio_T *self, - wchar_t wch, - unsigned long flags, - int width) -{ - int size; - int i; - int ch; - char *string; - char buffer[MB_LEN_MAX + 1]; - - if (width == NO_WIDTH) - width = sizeof(buffer); - - size = wctomb(buffer, wch); - if ((size <= 0) || (size > width) || (buffer[0] == NIL)) - return 0; - - string = buffer; - i = size; - while ((width >= i) && (width-- > 0) && (i-- > 0)) - { - /* The ctype parameters must be an unsigned char (or EOF) */ - ch = (int)((unsigned char)(*string++)); - TrioWriteStringCharacter(self, ch, flags); - } - return size; -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioWriteString [private] - * - * Description: - * Output a wide character string as a multi-byte string - */ -#if TRIO_WIDECHAR -static void -TrioWriteWideString(trio_T *self, - const wchar_t *wstring, - unsigned long flags, - int width, - int precision) -{ - int length; - int size; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - mblen(NULL, 0); -#endif - - if (wstring == NULL) - { - TrioWriteString(self, NULL, flags, width, precision); - return; - } - - if (NO_PRECISION == precision) - { - length = INT_MAX; - } - else - { - length = precision; - width -= length; - } - - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); - - if (! (flags & FLAGS_LEFTADJUST)) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - - while (length > 0) - { - size = TrioWriteWideStringCharacter(self, *wstring++, flags, length); - if (size == 0) - break; /* while */ - length -= size; - } - - if (flags & FLAGS_LEFTADJUST) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioWriteDouble [private] - */ -static void -TrioWriteDouble(trio_T *self, - long double longdoubleNumber, - unsigned long flags, - int width, - int precision, - int base) -{ - int charsPerThousand; - int length; - double number; - double workNumber; - int integerDigits; - int fractionDigits; - int exponentDigits; - int expectedWidth; - int exponent; - unsigned int uExponent = 0; - double dblBase; - BOOLEAN_T isNegative; - BOOLEAN_T isExponentNegative = FALSE; - BOOLEAN_T isHex; - const char *digits; - char numberBuffer[MAX_MANTISSA_DIGITS - * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1]; - char *numberPointer; - char exponentBuffer[MAX_EXPONENT_DIGITS + 1]; - char *exponentPointer = NULL; - int groupingIndex; - char *work; - int i; - BOOLEAN_T onlyzero; - int zeroes = 0; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - assert(base == BASE_DECIMAL || base == BASE_HEX); - - number = (double)longdoubleNumber; - - /* Look for infinite numbers and non-a-number first */ - switch (TrioIsInfinite(number)) - { - case 1: - /* Positive infinity */ - TrioWriteString(self, - (flags & FLAGS_UPPER) - ? INFINITE_UPPER - : INFINITE_LOWER, - flags, width, precision); - return; - - case -1: - /* Negative infinity */ - TrioWriteString(self, - (flags & FLAGS_UPPER) - ? "-" INFINITE_UPPER - : "-" INFINITE_LOWER, - flags, width, precision); - return; - - default: - /* Finitude */ - break; - } - if (TrioIsNan(number)) - { - TrioWriteString(self, - (flags & FLAGS_UPPER) - ? NAN_UPPER - : NAN_LOWER, - flags, width, precision); - return; - } - - /* Normal numbers */ - digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; - isHex = (base == BASE_HEX); - dblBase = (double)base; - - if (precision == NO_PRECISION) - precision = FLT_DIG; - - isNegative = (number < 0.0); - if (isNegative) - number = -number; - - if ((flags & FLAGS_FLOAT_G) || isHex) - { - if (precision == 0) - precision = 1; - - if ((number < 1.0e-4) || (number > pow(10.0, (double)precision))) - { - /* Use scientific notation */ - flags |= FLAGS_FLOAT_E; - } - else if (number < 1.0) - { - /* - * Use normal notation. If the integer part of the number is - * zero, then adjust the precision to include leading fractional - * zeros. - */ - workNumber = fabs(guarded_log10(number)); - if (workNumber - floor(workNumber) < 0.001) - workNumber--; - zeroes = (int)floor(workNumber); - } - } - - if (flags & FLAGS_FLOAT_E) - { - /* Scale the number */ - workNumber = guarded_log10(number); - if (workNumber == -HUGE_VAL) - { - exponent = 0; - /* Undo setting */ - if (flags & FLAGS_FLOAT_G) - flags &= ~FLAGS_FLOAT_E; - } - else - { - exponent = (int)floor(workNumber); - number /= pow(10.0, (double)exponent); - isExponentNegative = (exponent < 0); - uExponent = (isExponentNegative) ? -exponent : exponent; - /* No thousand separators */ - flags &= ~FLAGS_QUOTE; - } - } - - /* - * Truncated number. - * - * precision is number of significant digits for FLOAT_G - * and number of fractional digits for others - */ - integerDigits = (floor(number) > DBL_EPSILON) - ? 1 + (int)guarded_log10(floor(number)) - : 1; - fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0)) - ? precision - integerDigits - : zeroes + precision; - - number = floor(0.5 + number * pow(dblBase, (double)fractionDigits)); - workNumber = (isHex - ? guarded_log16(0.5 + number) - : guarded_log10(0.5 + number)); - if ((int)workNumber + 1 > integerDigits + fractionDigits) - { - if (flags & FLAGS_FLOAT_E) - { - /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */ - exponent--; - uExponent -= (isExponentNegative) ? 1 : -1; - number /= dblBase; - } - else - { - /* Adjust if number was rounded up one digit (ie. 99 to 100) */ - integerDigits++; - } - } - - /* Build the fraction part */ - numberPointer = &numberBuffer[sizeof(numberBuffer) - 1]; - *numberPointer = NIL; - onlyzero = TRUE; - for (i = 0; i < fractionDigits; i++) - { - *(--numberPointer) = digits[(int)fmod(number, dblBase)]; - number = floor(number / dblBase); - - if ((flags & FLAGS_FLOAT_G) && !(flags & FLAGS_ALTERNATIVE)) - { - /* Prune trailing zeroes */ - if (numberPointer[0] != digits[0]) - onlyzero = FALSE; - else if (onlyzero && (numberPointer[0] == digits[0])) - numberPointer++; - } - else - onlyzero = FALSE; - } - - /* Insert decimal point */ - if ((flags & FLAGS_ALTERNATIVE) || ((fractionDigits > 0) && !onlyzero)) - { - i = StrLength(internalDecimalPoint); - while (i> 0) - { - *(--numberPointer) = internalDecimalPoint[--i]; - } - } - /* Insert the integer part and thousand separators */ - charsPerThousand = (int)internalGrouping[0]; - groupingIndex = 1; - for (i = 1; i < integerDigits + 1; i++) - { - *(--numberPointer) = digits[(int)fmod(number, dblBase)]; - number = floor(number / dblBase); - if (number < DBL_EPSILON) - break; - - if ((i > 0) - && ((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE) - && (charsPerThousand != NO_GROUPING) - && (i % charsPerThousand == 0)) - { - /* - * We are building the number from the least significant - * to the most significant digit, so we have to copy the - * thousand separator backwards - */ - length = StrLength(internalThousandSeparator); - integerDigits += length; - if (((int)(numberPointer - numberBuffer) - length) > 0) - { - work = &internalThousandSeparator[length - 1]; - while (length-- > 0) - *(--numberPointer) = *work--; - } - - /* Advance to next grouping number */ - if (charsPerThousand != NO_GROUPING) - { - switch (internalGrouping[groupingIndex]) - { - case CHAR_MAX: /* Disable grouping */ - charsPerThousand = NO_GROUPING; - break; - case 0: /* Repeat last group */ - break; - default: - charsPerThousand = (int)internalGrouping[groupingIndex++]; - break; - } - } - } - } - - /* Build the exponent */ - exponentDigits = 0; - if (flags & FLAGS_FLOAT_E) - { - exponentPointer = &exponentBuffer[sizeof(exponentBuffer) - 1]; - *exponentPointer-- = NIL; - do { - *exponentPointer-- = digits[uExponent % base]; - uExponent /= base; - exponentDigits++; - } while (uExponent); - } - - /* - * Calculate expected width. - * sign + integer part + thousands separators + decimal point - * + fraction + exponent - */ - expectedWidth = StrLength(numberPointer); - if (isNegative || (flags & FLAGS_SHOWSIGN)) - expectedWidth += sizeof("-") - 1; - if (exponentDigits > 0) - expectedWidth += exponentDigits + - ((exponentDigits > 1) ? sizeof("E+") : sizeof("E+0")) - 1; - if (isHex) - expectedWidth += sizeof("0X") - 1; - - /* Output prefixing */ - if (flags & FLAGS_NILPADDING) - { - /* Leading zeros must be after sign */ - if (isNegative) - self->OutStream(self, '-'); - else if (flags & FLAGS_SHOWSIGN) - self->OutStream(self, '+'); - if (isHex) - { - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); - } - if (!(flags & FLAGS_LEFTADJUST)) - { - for (i = expectedWidth; i < width; i++) - { - self->OutStream(self, '0'); - } - } - } - else - { - /* Leading spaces must be before sign */ - if (!(flags & FLAGS_LEFTADJUST)) - { - for (i = expectedWidth; i < width; i++) - { - self->OutStream(self, CHAR_ADJUST); - } - } - if (isNegative) - self->OutStream(self, '-'); - else if (flags & FLAGS_SHOWSIGN) - self->OutStream(self, '+'); - if (isHex) - { - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); - } - } - /* Output number */ - for (i = 0; numberPointer[i]; i++) - { - self->OutStream(self, numberPointer[i]); - } - /* Output exponent */ - if (exponentDigits > 0) - { - self->OutStream(self, - isHex - ? ((flags & FLAGS_UPPER) ? 'P' : 'p') - : ((flags & FLAGS_UPPER) ? 'E' : 'e')); - self->OutStream(self, (isExponentNegative) ? '-' : '+'); - - /* The exponent must contain at least two digits */ - if (exponentDigits == 1) - self->OutStream(self, '0'); - - for (i = 0; i < exponentDigits; i++) - { - self->OutStream(self, exponentPointer[i + 1]); - } - } - /* Output trailing spaces */ - if (flags & FLAGS_LEFTADJUST) - { - for (i = expectedWidth; i < width; i++) - { - self->OutStream(self, CHAR_ADJUST); - } - } -} - -/************************************************************************* - * TrioFormatProcess [private] - */ -static int -TrioFormatProcess(trio_T *data, - const char *format, - parameter_T *parameters) - -{ -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - int charlen; -#endif - int i; - const char *string; - void *pointer; - unsigned long flags; - int width; - int precision; - int base; - int index; - - index = 0; - i = 0; -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - mblen(NULL, 0); -#endif - - while (format[index]) - { -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - if (! isascii(format[index])) - { - charlen = mblen(&format[index], MB_LEN_MAX); - while (charlen-- > 0) - { - data->OutStream(data, format[index++]); - } - continue; /* while */ - } -#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ - if (CHAR_IDENTIFIER == format[index]) - { - if (CHAR_IDENTIFIER == format[index + 1]) - { - data->OutStream(data, CHAR_IDENTIFIER); - index += 2; - } - else - { - /* Skip the parameter entries */ - while (parameters[i].type == FORMAT_PARAMETER) - i++; - - flags = parameters[i].flags; - - /* Find width */ - width = parameters[i].width; - if (flags & FLAGS_WIDTH_PARAMETER) - { - /* Get width from parameter list */ - width = (int)parameters[width].data.number.as_signed; - } - - /* Find precision */ - if (flags & FLAGS_PRECISION) - { - precision = parameters[i].precision; - if (flags & FLAGS_PRECISION_PARAMETER) - { - /* Get precision from parameter list */ - precision = (int)parameters[precision].data.number.as_signed; - } - } - else - { - precision = NO_PRECISION; - } - - /* Find base */ - base = parameters[i].base; - if (flags & FLAGS_BASE_PARAMETER) - { - /* Get base from parameter list */ - base = (int)parameters[base].data.number.as_signed; - } - - switch (parameters[i].type) - { - case FORMAT_CHAR: - if (flags & FLAGS_QUOTE) - data->OutStream(data, CHAR_QUOTE); - if (! (flags & FLAGS_LEFTADJUST)) - { - while (--width > 0) - data->OutStream(data, CHAR_ADJUST); - } -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - TrioWriteWideStringCharacter(data, - (wchar_t)parameters[i].data.number.as_signed, - flags, - NO_WIDTH); - } - else -#endif - TrioWriteStringCharacter(data, - (int)parameters[i].data.number.as_signed, - flags); - - if (flags & FLAGS_LEFTADJUST) - { - while(--width > 0) - data->OutStream(data, CHAR_ADJUST); - } - if (flags & FLAGS_QUOTE) - data->OutStream(data, CHAR_QUOTE); - - break; /* FORMAT_CHAR */ - - case FORMAT_INT: - if (base == NO_BASE) - base = BASE_DECIMAL; - - TrioWriteNumber(data, - parameters[i].data.number.as_signed, - flags, - width, - precision, - base); - - break; /* FORMAT_INT */ - - case FORMAT_DOUBLE: - TrioWriteDouble(data, - parameters[i].data.longdoubleNumber, - flags, - width, - precision, - base); - break; /* FORMAT_DOUBLE */ - - case FORMAT_STRING: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - TrioWriteWideString(data, - parameters[i].data.wstring, - flags, - width, - precision); - } - else -#endif -#ifdef QUALIFIER_ESCAPE - { - char *s = NULL; - static const char* empty = "(null)"; - switch (parameters[i].escape) - { - case ESCAPE_ULM: - s = glite_lbu_EscapeULM(parameters[i].data.string); - break; - case ESCAPE_XML: - s = glite_lbu_EscapeXML(parameters[i].data.string); - break; - case ESCAPE_SQL: - s = glite_lbu_EscapeSQL(parameters[i].data.string); - break; - case ESCAPE_NONE: - s = strdup(parameters[i].data.string ? parameters[i].data.string : empty); - break; - } - TrioWriteString(data,s,flags,width,precision); - free(s); - } -#else - { - TrioWriteString(data, - parameters[i].data.string, - flags, - width, - precision); - } -#endif - break; /* FORMAT_STRING */ - - case FORMAT_POINTER: - { - reference_T reference; - - reference.data = data; - reference.parameter = ¶meters[i]; - trio_print_pointer(&reference, parameters[i].data.pointer); - } - break; /* FORMAT_POINTER */ - - case FORMAT_COUNT: - pointer = parameters[i].data.pointer; - if (NULL != pointer) - { - /* - * C99 paragraph 7.19.6.1.8 says "the number of - * characters written to the output stream so far by - * this call", which is data->committed - */ -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (flags & FLAGS_SIZE_T) - *(size_t *)pointer = (size_t)data->committed; - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (flags & FLAGS_PTRDIFF_T) - *(ptrdiff_t *)pointer = (ptrdiff_t)data->committed; - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (flags & FLAGS_INTMAX_T) - *(trio_intmax_t *)pointer = (trio_intmax_t)data->committed; - else -#endif - if (flags & FLAGS_QUAD) - { - *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->committed; - } - else if (flags & FLAGS_LONG) - { - *(long int *)pointer = (long int)data->committed; - } - else if (flags & FLAGS_SHORT) - { - *(short int *)pointer = (short int)data->committed; - } - else - { - *(int *)pointer = (int)data->committed; - } - } - break; /* FORMAT_COUNT */ - - case FORMAT_PARAMETER: - break; /* FORMAT_PARAMETER */ - -#if defined(FORMAT_ERRNO) - case FORMAT_ERRNO: - string = StrError(parameters[i].data.errorNumber); - if (string) - { - TrioWriteString(data, - string, - flags, - width, - precision); - } - else - { - data->OutStream(data, '#'); - TrioWriteNumber(data, - (trio_intmax_t)parameters[i].data.errorNumber, - flags, - width, - precision, - BASE_DECIMAL); - } - break; /* FORMAT_ERRNO */ -#endif /* defined(FORMAT_ERRNO) */ - -#if defined(FORMAT_USER_DEFINED) - case FORMAT_USER_DEFINED: - { - reference_T reference; - userdef_T *def = NULL; - - if (parameters[i].user_name[0] == NIL) - { - /* Use handle */ - if ((i > 0) || - (parameters[i - 1].type == FORMAT_PARAMETER)) - def = (userdef_T *)parameters[i - 1].data.pointer; - } - else - { - /* Look up namespace */ - def = TrioFindNamespace(parameters[i].user_name, NULL); - } - if (def) { - reference.data = data; - reference.parameter = ¶meters[i]; - def->callback(&reference); - } - } - break; -#endif /* defined(FORMAT_USER_DEFINED) */ - - default: - break; - } /* switch parameter type */ - - /* Prepare for next */ - index = parameters[i].indexAfterSpecifier; - i++; - } - } - else /* not identifier */ - { - data->OutStream(data, format[index++]); - } - } - return data->processed; -} - -/************************************************************************* - * TrioFormatRef [private] - */ -static int -TrioFormatRef(reference_T *reference, - const char *format, - va_list arglist, - void **argarray) -{ - int status; - parameter_T parameters[MAX_PARAMETERS]; - - status = TrioPreprocess(TYPE_PRINT, format, parameters, arglist, argarray); - if (status < 0) - return status; - - return TrioFormatProcess(reference->data, format, parameters); -} - -/************************************************************************* - * TrioFormat [private] - * - * Description: - * This is the main engine for formatting output - */ -static int -TrioFormat(void *destination, - size_t destinationSize, - void (*OutStream)(trio_T *, int), - const char *format, - va_list arglist, - void **argarray) -{ - int status; - trio_T data; - parameter_T parameters[MAX_PARAMETERS]; - - assert(VALID(OutStream)); - assert(VALID(format)); - - memset(&data, 0, sizeof(data)); - data.OutStream = OutStream; - data.location = destination; - data.max = destinationSize; - -#if defined(USE_LOCALE) - if (NULL == internalLocaleValues) - { - TrioSetLocale(); - } -#endif - - status = TrioPreprocess(TYPE_PRINT, format, parameters, arglist, argarray); - if (status < 0) - return status; - - return TrioFormatProcess(&data, format, parameters); -} - -/************************************************************************* - * TrioOutStreamFile [private] - */ -static void -TrioOutStreamFile(trio_T *self, - int output) -{ - FILE *file = (FILE *)self->location; - - assert(VALID(self)); - assert(VALID(file)); - - self->processed++; - self->committed++; - (void)fputc(output, file); -} - -/************************************************************************* - * TrioOutStreamFileDescriptor [private] - */ -static void -TrioOutStreamFileDescriptor(trio_T *self, - int output) -{ - int fd = *((int *)self->location); - char ch; - - assert(VALID(self)); - - ch = (char)output; - (void)write(fd, &ch, sizeof(char)); - self->processed++; - self->committed++; -} - -/************************************************************************* - * TrioOutStreamString [private] - */ -static void -TrioOutStreamString(trio_T *self, - int output) -{ - char **buffer = (char **)self->location; - - assert(VALID(self)); - assert(VALID(buffer)); - - **buffer = (char)output; - (*buffer)++; - self->processed++; - self->committed++; -} - -/************************************************************************* - * TrioOutStreamStringMax [private] - */ -static void -TrioOutStreamStringMax(trio_T *self, - int output) -{ - char **buffer; - - assert(VALID(self)); - buffer = (char **)self->location; - assert(VALID(buffer)); - - if (self->processed < self->max) - { - **buffer = (char)output; - (*buffer)++; - self->committed++; - } - self->processed++; -} - -/************************************************************************* - * TrioOutStreamStringDynamic [private] - */ -#define DYNAMIC_START_SIZE 32 -struct dynamicBuffer { - char *buffer; - size_t length; - size_t allocated; -}; - -static void -TrioOutStreamStringDynamic(trio_T *self, - int output) -{ - struct dynamicBuffer *infop; - - assert(VALID(self)); - assert(VALID(self->location)); - - infop = (struct dynamicBuffer *)self->location; - - if (infop->buffer == NULL) - { - /* Start with a reasonable size */ - infop->buffer = (char *)TRIO_MALLOC(DYNAMIC_START_SIZE); - if (infop->buffer == NULL) - return; /* fail */ - - infop->allocated = DYNAMIC_START_SIZE; - self->processed = 0; - self->committed = 0; - } - else if (self->committed + sizeof(NIL) >= infop->allocated) - { - char *newptr; - - /* Allocate increasing chunks */ - newptr = (char *)TRIO_REALLOC(infop->buffer, infop->allocated * 2); - - if (newptr == NULL) - return; - - infop->buffer = newptr; - infop->allocated *= 2; - } - - infop->buffer[self->committed] = (char)output; - self->committed++; - self->processed++; - - infop->length = self->committed; -} - -/************************************************************************* - * printf - */ -int -trio_printf(const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(format)); - - va_start(args, format); - status = TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL); - va_end(args); - return status; -} - -int -trio_vprintf(const char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL); -} - -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -static void shutup_unitialized(va_list *dummy UNUSED_VAR) { -} - -int -trio_printfv(const char *format, - void ** args) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(format)); - - return TrioFormat(stdout, 0, TrioOutStreamFile, format, dummy, args); -} - -/************************************************************************* - * fprintf - */ -int -trio_fprintf(FILE *file, - const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(file)); - assert(VALID(format)); - - va_start(args, format); - status = TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL); - va_end(args); - return status; -} - -int -trio_vfprintf(FILE *file, - const char *format, - va_list args) -{ - assert(VALID(file)); - assert(VALID(format)); - - return TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL); -} - -int -trio_fprintfv(FILE *file, - const char *format, - void ** args) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(file)); - assert(VALID(format)); - - return TrioFormat(file, 0, TrioOutStreamFile, format, dummy, args); -} - -/************************************************************************* - * dprintf - */ -int -trio_dprintf(int fd, - const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(format)); - - va_start(args, format); - status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL); - va_end(args); - return status; -} - -int -trio_vdprintf(int fd, - const char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL); -} - -int -trio_dprintfv(int fd, - const char *format, - void **args) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(format)); - - return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, dummy, args); -} - -/************************************************************************* - * sprintf - */ -int -trio_sprintf(char *buffer, - const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(buffer)); - assert(VALID(format)); - - va_start(args, format); - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL); - *buffer = NIL; /* Terminate with NIL character */ - va_end(args); - return status; -} - -int -trio_vsprintf(char *buffer, - const char *format, - va_list args) -{ - int status; - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL); - *buffer = NIL; - return status; -} - -int -trio_sprintfv(char *buffer, - const char *format, - void **args) -{ - int status; - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, dummy, args); - *buffer = NIL; - return status; -} - -/************************************************************************* - * snprintf - */ -int -trio_snprintf(char *buffer, - size_t bufferSize, - const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(buffer)); - assert(VALID(format)); - - va_start(args, format); - status = TrioFormat(&buffer, bufferSize > 0 ? bufferSize - 1 : 0, - TrioOutStreamStringMax, format, args, NULL); - if (bufferSize > 0) - *buffer = NIL; - va_end(args); - return status; -} - -int -trio_vsnprintf(char *buffer, - size_t bufferSize, - const char *format, - va_list args) -{ - int status; - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, bufferSize > 0 ? bufferSize - 1 : 0, - TrioOutStreamStringMax, format, args, NULL); - if (bufferSize > 0) - *buffer = NIL; - return status; -} - -int -trio_snprintfv(char *buffer, - size_t bufferSize, - const char *format, - void **args) -{ - int status; - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, bufferSize > 0 ? bufferSize - 1 : 0, - TrioOutStreamStringMax, format, dummy, args); - if (bufferSize > 0) - *buffer = NIL; - return status; -} - -/************************************************************************* - * snprintfcat - * Appends the new string to the buffer string overwriting the '\0' - * character at the end of buffer. - */ -int -trio_snprintfcat(char *buffer, - size_t bufferSize, - const char *format, - ...) -{ - int status; - va_list args; - size_t buf_len; - - va_start(args, format); - - assert(VALID(buffer)); - assert(VALID(format)); - - buf_len = strlen(buffer); - buffer = &buffer[buf_len]; - - status = TrioFormat(&buffer, bufferSize - 1 - buf_len, - TrioOutStreamStringMax, format, args, NULL); - va_end(args); - *buffer = NIL; - return status; -} - -int -trio_vsnprintfcat(char *buffer, - size_t bufferSize, - const char *format, - va_list args) -{ - int status; - size_t buf_len; - assert(VALID(buffer)); - assert(VALID(format)); - - buf_len = strlen(buffer); - buffer = &buffer[buf_len]; - status = TrioFormat(&buffer, bufferSize - 1 - buf_len, - TrioOutStreamStringMax, format, args, NULL); - *buffer = NIL; - return status; -} - -/************************************************************************* - * trio_aprintf - */ - -/* Deprecated */ -char * -trio_aprintf(const char *format, - ...) -{ - va_list args; - struct dynamicBuffer info; - - assert(VALID(format)); - - info.buffer = NULL; - info.length = 0; - info.allocated = 0; - - va_start(args, format); - (void)TrioFormat(&info, 0, TrioOutStreamStringDynamic, format, args, NULL); - va_end(args); - if (info.length) { - info.buffer[info.length] = NIL; /* we terminate this with a zero byte */ - return info.buffer; - } - else - return NULL; -} - -/* Deprecated */ -char * -trio_vaprintf(const char *format, - va_list args) -{ - struct dynamicBuffer info; - - assert(VALID(format)); - - info.buffer = NULL; - info.length = 0; - info.allocated = 0; - - (void)TrioFormat(&info, 0, TrioOutStreamStringDynamic, format, args, NULL); - if (info.length) { - info.buffer[info.length] = NIL; /* we terminate this with a zero byte */ - return info.buffer; - } - else - return NULL; -} - -int -trio_asprintf(char **result, - const char *format, - ...) -{ - va_list args; - int status; - struct dynamicBuffer info; - - assert(VALID(format)); - - info.buffer = NULL; - info.length = 0; - info.allocated = 0; - - va_start(args, format); - status = TrioFormat(&info, 0, TrioOutStreamStringDynamic, format, args, NULL); - va_end(args); - if (status < 0) { - *result = NULL; - return status; - } - if (info.length == 0) { - /* - * If the length is zero, no characters have been written and therefore - * no memory has been allocated, but we must to allocate and return an - * empty string. - */ - info.buffer = (char *)TRIO_MALLOC(sizeof(char)); - if (info.buffer == NULL) { - *result = NULL; - return TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); - } - } - info.buffer[info.length] = NIL; /* we terminate this with a zero byte */ - *result = info.buffer; - - return status; -} - -int -trio_vasprintf(char **result, - const char *format, - va_list args) -{ - int status; - struct dynamicBuffer info; - - assert(VALID(format)); - - info.buffer = NULL; - info.length = 0; - info.allocated = 0; - - status = TrioFormat(&info, 0, TrioOutStreamStringDynamic, format, args, NULL); - if (status < 0) { - *result = NULL; - return status; - } - if (info.length == 0) { - info.buffer = (char *)TRIO_MALLOC(sizeof(char)); - if (info.buffer == NULL) { - *result = NULL; - return TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); - } - } - info.buffer[info.length] = NIL; /* we terminate this with a zero byte */ - *result = info.buffer; - - return status; -} - - -/************************************************************************* - * - * @CALLBACK - * - ************************************************************************/ - - -/************************************************************************* - * trio_register [public] - */ -void * -trio_register(trio_callback_t callback, - const char *name) -{ - userdef_T *def; - userdef_T *prev = NULL; - - if (callback == NULL) - return NULL; - - if (name) - { - /* Handle built-in namespaces */ - if (name[0] == ':') - { - if (StrEqual(name, ":enter")) - { - internalEnterCriticalRegion = callback; - } - else if (StrEqual(name, ":leave")) - { - internalLeaveCriticalRegion = callback; - } - return NULL; - } - - /* Bail out if namespace is too long */ - if (StrLength(name) >= MAX_USER_NAME) - return NULL; - - /* Bail out if namespace already is registered */ - def = TrioFindNamespace(name, &prev); - if (def) - return NULL; - } - - def = (userdef_T *)TRIO_MALLOC(sizeof(userdef_T)); - if (def) - { - if (internalEnterCriticalRegion) - (void)internalEnterCriticalRegion(NULL); - - if (name) - { - /* Link into internal list */ - if (prev == NULL) - internalUserDef = def; - else - prev->next = def; - } - /* Initialize */ - def->callback = callback; - def->name = (name == NULL) - ? NULL - : StrDuplicate(name); - def->next = NULL; - - if (internalLeaveCriticalRegion) - (void)internalLeaveCriticalRegion(NULL); - } - return def; -} - -/************************************************************************* - * trio_unregister [public] - */ -void -trio_unregister(void *handle) -{ - userdef_T *self = (userdef_T *)handle; - userdef_T *def; - userdef_T *prev = NULL; - - assert(VALID(self)); - - if (self->name) - { - def = TrioFindNamespace(self->name, &prev); - if (def) - { - if (internalEnterCriticalRegion) - (void)internalEnterCriticalRegion(NULL); - - if (prev == NULL) - internalUserDef = NULL; - else - prev->next = def->next; - - if (internalLeaveCriticalRegion) - (void)internalLeaveCriticalRegion(NULL); - } - StrFree(self->name); - } - TRIO_FREE(self); -} - -/************************************************************************* - * trio_get_format [public] - */ -const char * -trio_get_format(void *ref) -{ - assert(((reference_T *)ref)->parameter->type == FORMAT_USER_DEFINED); - - return (((reference_T *)ref)->parameter->user_data); -} - -/************************************************************************* - * trio_get_argument [public] - */ -void * -trio_get_argument(void *ref) -{ - assert(((reference_T *)ref)->parameter->type == FORMAT_USER_DEFINED); - - return ((reference_T *)ref)->parameter->data.pointer; -} - -/************************************************************************* - * trio_get_width / trio_set_width [public] - */ -int -trio_get_width(void *ref) -{ - return ((reference_T *)ref)->parameter->width; -} - -void -trio_set_width(void *ref, - int width) -{ - ((reference_T *)ref)->parameter->width = width; -} - -/************************************************************************* - * trio_get_precision / trio_set_precision [public] - */ -int -trio_get_precision(void *ref) -{ - return (((reference_T *)ref)->parameter->precision); -} - -void -trio_set_precision(void *ref, - int precision) -{ - ((reference_T *)ref)->parameter->precision = precision; -} - -/************************************************************************* - * trio_get_base / trio_set_base [public] - */ -int -trio_get_base(void *ref) -{ - return (((reference_T *)ref)->parameter->base); -} - -void -trio_set_base(void *ref, - int base) -{ - ((reference_T *)ref)->parameter->base = base; -} - -/************************************************************************* - * trio_get_long / trio_set_long [public] - */ -int -trio_get_long(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_LONG); -} - -void -trio_set_long(void *ref, - int is_long) -{ - if (is_long) - ((reference_T *)ref)->parameter->flags |= FLAGS_LONG; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_LONG; -} - -/************************************************************************* - * trio_get_longlong / trio_set_longlong [public] - */ -int -trio_get_longlong(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_QUAD); -} - -void -trio_set_longlong(void *ref, - int is_longlong) -{ - if (is_longlong) - ((reference_T *)ref)->parameter->flags |= FLAGS_QUAD; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_QUAD; -} - -/************************************************************************* - * trio_get_longdouble / trio_set_longdouble [public] - */ -int -trio_get_longdouble(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_LONGDOUBLE); -} - -void -trio_set_longdouble(void *ref, - int is_longdouble) -{ - if (is_longdouble) - ((reference_T *)ref)->parameter->flags |= FLAGS_LONGDOUBLE; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE; -} - -/************************************************************************* - * trio_get_short / trio_set_short [public] - */ -int -trio_get_short(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_SHORT); -} - -void -trio_set_short(void *ref, - int is_short) -{ - if (is_short) - ((reference_T *)ref)->parameter->flags |= FLAGS_SHORT; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_SHORT; -} - -/************************************************************************* - * trio_get_shortshort / trio_set_shortshort [public] - */ -int -trio_get_shortshort(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_SHORTSHORT); -} - -void -trio_set_shortshort(void *ref, - int is_shortshort) -{ - if (is_shortshort) - ((reference_T *)ref)->parameter->flags |= FLAGS_SHORTSHORT; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT; -} - -/************************************************************************* - * trio_get_alternative / trio_set_alternative [public] - */ -int -trio_get_alternative(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_ALTERNATIVE); -} - -void -trio_set_alternative(void *ref, - int is_alternative) -{ - if (is_alternative) - ((reference_T *)ref)->parameter->flags |= FLAGS_ALTERNATIVE; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE; -} - -/************************************************************************* - * trio_get_alignment / trio_set_alignment [public] - */ -int -trio_get_alignment(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_LEFTADJUST); -} - -void -trio_set_alignment(void *ref, - int is_leftaligned) -{ - if (is_leftaligned) - ((reference_T *)ref)->parameter->flags |= FLAGS_LEFTADJUST; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST; -} - -/************************************************************************* - * trio_get_spacing /trio_set_spacing [public] - */ -int -trio_get_spacing(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_SPACE); -} - -void -trio_set_spacing(void *ref, - int is_space) -{ - if (is_space) - ((reference_T *)ref)->parameter->flags |= FLAGS_SPACE; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_SPACE; -} - -/************************************************************************* - * trio_get_sign / trio_set_sign [public] - */ -int -trio_get_sign(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_SHOWSIGN); -} - -void -trio_set_sign(void *ref, - int is_sign) -{ - if (is_sign) - ((reference_T *)ref)->parameter->flags |= FLAGS_SHOWSIGN; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN; -} - -/************************************************************************* - * trio_get_padding / trio_set_padding [public] - */ -int -trio_get_padding(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_NILPADDING); -} - -void -trio_set_padding(void *ref, - int is_padding) -{ - if (is_padding) - ((reference_T *)ref)->parameter->flags |= FLAGS_NILPADDING; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_NILPADDING; -} - -/************************************************************************* - * trio_get_quote / trio_set_quote [public] - */ -int -trio_get_quote(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_QUOTE); -} - -void -trio_set_quote(void *ref, - int is_quote) -{ - if (is_quote) - ((reference_T *)ref)->parameter->flags |= FLAGS_QUOTE; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_QUOTE; -} - -/************************************************************************* - * trio_get_upper / trio_set_upper [public] - */ -int -trio_get_upper(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_UPPER); -} - -void -trio_set_upper(void *ref, - int is_upper) -{ - if (is_upper) - ((reference_T *)ref)->parameter->flags |= FLAGS_UPPER; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_UPPER; -} - -/************************************************************************* - * trio_get_largest / trio_set_largest [public] - */ -#if TRIO_C99 -int -trio_get_largest(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_INTMAX_T); -} - -void -trio_set_largest(void *ref, - int is_largest) -{ - if (is_largest) - ((reference_T *)ref)->parameter->flags |= FLAGS_INTMAX_T; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_INTMAX_T; -} -#endif - -/************************************************************************* - * trio_get_ptrdiff / trio_set_ptrdiff [public] - */ -int -trio_get_ptrdiff(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_PTRDIFF_T); -} - -void -trio_set_ptrdiff(void *ref, - int is_ptrdiff) -{ - if (is_ptrdiff) - ((reference_T *)ref)->parameter->flags |= FLAGS_PTRDIFF_T; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T; -} - -/************************************************************************* - * trio_get_size / trio_set_size [public] - */ -#if TRIO_C99 -int -trio_get_size(void *ref) -{ - return (((reference_T *)ref)->parameter->flags & FLAGS_SIZE_T); -} - -void -trio_set_size(void *ref, - int is_size) -{ - if (is_size) - ((reference_T *)ref)->parameter->flags |= FLAGS_SIZE_T; - else - ((reference_T *)ref)->parameter->flags &= ~FLAGS_SIZE_T; -} -#endif - -/************************************************************************* - * trio_print_int [public] - */ -void -trio_print_int(void *ref, - int number) -{ - reference_T *self = (reference_T *)ref; - - TrioWriteNumber(self->data, - (trio_intmax_t)number, - self->parameter->flags, - self->parameter->width, - self->parameter->precision, - self->parameter->base); -} - -/************************************************************************* - * trio_print_uint [public] - */ -void -trio_print_uint(void *ref, - unsigned int number) -{ - reference_T *self = (reference_T *)ref; - - TrioWriteNumber(self->data, - (trio_intmax_t)number, - self->parameter->flags | FLAGS_UNSIGNED, - self->parameter->width, - self->parameter->precision, - self->parameter->base); -} - -/************************************************************************* - * trio_print_double [public] - */ -void -trio_print_double(void *ref, - double number) -{ - reference_T *self = (reference_T *)ref; - - TrioWriteDouble(self->data, - number, - self->parameter->flags, - self->parameter->width, - self->parameter->precision, - self->parameter->base); -} - -/************************************************************************* - * trio_print_string [public] - */ -void -trio_print_string(void *ref, - char *string) -{ - reference_T *self = (reference_T *)ref; - - TrioWriteString(self->data, - string, - self->parameter->flags, - self->parameter->width, - self->parameter->precision); -} - -/************************************************************************* - * trio_print_pointer [public] - */ -void -trio_print_pointer(void *ref, - void *pointer) -{ - reference_T *self = (reference_T *)ref; - unsigned long flags; - trio_uintmax_t number; - - if (NULL == pointer) - { - const char *string = null; - while (*string) - self->data->OutStream(self->data, *string++); - } - else - { - /* - * The subtraction of the null pointer is a workaround - * to avoid a compiler warning. The performance overhead - * is negligible (and likely to be removed by an - * optimising compiler). The (char *) casting is done - * to please ANSI C++. - */ - number = (trio_uintmax_t)((char *)pointer - (char *)0); - /* Shrink to size of pointer */ - number &= (trio_uintmax_t)-1; - flags = self->parameter->flags; - flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | - FLAGS_NILPADDING); - TrioWriteNumber(self->data, - (trio_intmax_t)number, - flags, - POINTER_WIDTH, - NO_PRECISION, - BASE_HEX); - } -} - -/************************************************************************* - * trio_print_ref [public] - */ -int -trio_print_ref(void *ref, - const char *format, - ...) -{ - int status; - va_list arglist; - - assert(VALID(format)); - - va_start(arglist, format); - status = TrioFormatRef((reference_T *)ref, format, arglist, NULL); - va_end(arglist); - return status; -} - -/************************************************************************* - * trio_vprint_ref [public] - */ -int -trio_vprint_ref(void *ref, - const char *format, - va_list arglist) -{ - assert(VALID(format)); - - return TrioFormatRef((reference_T *)ref, format, arglist, NULL); -} - -/************************************************************************* - * trio_printv_ref [public] - */ -int -trio_printv_ref(void *ref, - const char *format, - void **argarray) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(format)); - - return TrioFormatRef((reference_T *)ref, format, dummy, argarray); -} - - -/************************************************************************* - * - * @SCANNING - * - ************************************************************************/ - - -/************************************************************************* - * TrioSkipWhitespaces [private] - */ -static int -TrioSkipWhitespaces(trio_T *self) -{ - int ch; - - ch = self->current; - while (isspace(ch)) - { - self->InStream(self, &ch); - } - return ch; -} - -/************************************************************************* - * TrioGetCollation [private] - */ -#if TRIO_EXTENSION -static void -TrioGetCollation() -{ - int i; - int j; - int k; - char first[2]; - char second[2]; - - /* This is computational expensive */ - first[1] = NIL; - second[1] = NIL; - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - { - k = 0; - first[0] = (char)i; - for (j = 0; j < MAX_CHARACTER_CLASS; j++) - { - second[0] = (char)j; - if (StrEqualLocale(first, second)) - internalCollationArray[i][k++] = (char)j; - } - internalCollationArray[i][k] = NIL; - } -} -#endif - -/************************************************************************* - * TrioGetCharacterClass [private] - * - * FIXME: - * multibyte - */ -static int -TrioGetCharacterClass(const char *format, - int *indexPointer, - unsigned long *flagsPointer, - int *characterclass) -{ - int index = *indexPointer; - int i; - char ch; - char range_begin; - char range_end; - - *flagsPointer &= ~FLAGS_EXCLUDE; - - if (format[index] == QUALIFIER_CIRCUMFLEX) - { - *flagsPointer |= FLAGS_EXCLUDE; - index++; - } - /* - * If the ungroup character is at the beginning of the scanlist, - * it will be part of the class, and a second ungroup character - * must follow to end the group. - */ - if (format[index] == SPECIFIER_UNGROUP) - { - characterclass[(int)SPECIFIER_UNGROUP]++; - index++; - } - /* - * Minus is used to specify ranges. To include minus in the class, - * it must be at the beginning of the list - */ - if (format[index] == QUALIFIER_MINUS) - { - characterclass[(int)QUALIFIER_MINUS]++; - index++; - } - /* Collect characters */ - for (ch = format[index]; - (ch != SPECIFIER_UNGROUP) && (ch != NIL); - ch = format[++index]) - { - switch (ch) - { - case QUALIFIER_MINUS: /* Scanlist ranges */ - - /* - * Both C99 and UNIX98 describes ranges as implementation- - * defined. - * - * We support the following behaviour (although this may - * change as we become wiser) - * - only increasing ranges, ie. [a-b] but not [b-a] - * - transitive ranges, ie. [a-b-c] == [a-c] - * - trailing minus, ie. [a-] is interpreted as an 'a' - * and a '-' - * - duplicates (although we can easily convert these - * into errors) - */ - range_begin = format[index - 1]; - range_end = format[++index]; - if (range_end == SPECIFIER_UNGROUP) - { - /* Trailing minus is included */ - characterclass[(int)ch]++; - ch = range_end; - break; /* for */ - } - if (range_end == NIL) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - if (range_begin > range_end) - return TRIO_ERROR_RETURN(TRIO_ERANGE, index); - - for (i = (int)range_begin; i <= (int)range_end; i++) - characterclass[i]++; - - ch = range_end; - break; - -#if TRIO_EXTENSION - - case SPECIFIER_GROUP: - - switch (format[index + 1]) - { - case QUALIFIER_DOT: /* Collating symbol */ - /* - * FIXME: This will be easier to implement when multibyte - * characters have been implemented. Until now, we ignore - * this feature. - */ - for (i = index + 2; ; i++) - { - if (format[i] == NIL) - /* Error in syntax */ - return -1; - else if (format[i] == QUALIFIER_DOT) - break; /* for */ - } - if (format[++i] != SPECIFIER_UNGROUP) - return -1; - - index = i; - break; - - case QUALIFIER_EQUAL: /* Equivalence class expressions */ - { - unsigned int j; - unsigned int k; - - if (internalCollationUnconverted) - { - /* Lazy evalutation of collation array */ - TrioGetCollation(); - internalCollationUnconverted = FALSE; - } - for (i = index + 2; ; i++) - { - if (format[i] == NIL) - /* Error in syntax */ - return -1; - else if (format[i] == QUALIFIER_EQUAL) - break; /* for */ - else - { - /* Mark any equivalent character */ - k = (unsigned int)format[i]; - for (j = 0; internalCollationArray[k][j] != NIL; j++) - characterclass[(int)internalCollationArray[k][j]]++; - } - } - if (format[++i] != SPECIFIER_UNGROUP) - return -1; - - index = i; - } - break; - - case QUALIFIER_COLON: /* Character class expressions */ - - if (StrEqualMax(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isalnum(i)) - characterclass[i]++; - index += sizeof(CLASS_ALNUM) - 1; - } - else if (StrEqualMax(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isalpha(i)) - characterclass[i]++; - index += sizeof(CLASS_ALPHA) - 1; - } - else if (StrEqualMax(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (iscntrl(i)) - characterclass[i]++; - index += sizeof(CLASS_CNTRL) - 1; - } - else if (StrEqualMax(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isdigit(i)) - characterclass[i]++; - index += sizeof(CLASS_DIGIT) - 1; - } - else if (StrEqualMax(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isgraph(i)) - characterclass[i]++; - index += sizeof(CLASS_GRAPH) - 1; - } - else if (StrEqualMax(CLASS_LOWER, sizeof(CLASS_LOWER) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (islower(i)) - characterclass[i]++; - index += sizeof(CLASS_LOWER) - 1; - } - else if (StrEqualMax(CLASS_PRINT, sizeof(CLASS_PRINT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isprint(i)) - characterclass[i]++; - index += sizeof(CLASS_PRINT) - 1; - } - else if (StrEqualMax(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (ispunct(i)) - characterclass[i]++; - index += sizeof(CLASS_PUNCT) - 1; - } - else if (StrEqualMax(CLASS_SPACE, sizeof(CLASS_SPACE) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isspace(i)) - characterclass[i]++; - index += sizeof(CLASS_SPACE) - 1; - } - else if (StrEqualMax(CLASS_UPPER, sizeof(CLASS_UPPER) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isupper(i)) - characterclass[i]++; - index += sizeof(CLASS_UPPER) - 1; - } - else if (StrEqualMax(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isxdigit(i)) - characterclass[i]++; - index += sizeof(CLASS_XDIGIT) - 1; - } - else - { - characterclass[(int)ch]++; - } - break; - - default: - characterclass[(int)ch]++; - break; - } - break; - -#endif /* TRIO_EXTENSION */ - - default: - characterclass[(int)ch]++; - break; - } - } - return 0; -} - -/************************************************************************* - * TrioReadNumber [private] - * - * We implement our own number conversion in preference of strtol and - * strtoul, because we must handle 'long long' and thousand separators. - */ -static BOOLEAN_T -TrioReadNumber(trio_T *self, - trio_uintmax_t *target, - unsigned long flags, - int width, - int base) -{ - trio_uintmax_t number = 0; - int digit; - int count; - BOOLEAN_T isNegative = FALSE; - int j; - - assert(VALID(self)); - assert(VALID(self->InStream)); - assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE)); - - if (internalDigitsUnconverted) - { - /* Lazy evaluation of digits array */ - memset(internalDigitArray, -1, sizeof(internalDigitArray)); - for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++) - { - internalDigitArray[(int)internalDigitsLower[j]] = j; - internalDigitArray[(int)internalDigitsUpper[j]] = j; - } - internalDigitsUnconverted = FALSE; - } - - TrioSkipWhitespaces(self); - - if (!(flags & FLAGS_UNSIGNED)) - { - /* Leading sign */ - if (self->current == '+') - { - self->InStream(self, NULL); - } - else if (self->current == '-') - { - self->InStream(self, NULL); - isNegative = TRUE; - } - } - - count = self->processed; - - if (flags & FLAGS_ALTERNATIVE) - { - switch (base) - { - case NO_BASE: - case BASE_OCTAL: - case BASE_HEX: - case BASE_BINARY: - if (self->current == '0') - { - self->InStream(self, NULL); - if (self->current) - { - if ((base == BASE_HEX) && - (toupper(self->current) == 'X')) - { - self->InStream(self, NULL); - } - else if ((base == BASE_BINARY) && - (toupper(self->current) == 'B')) - { - self->InStream(self, NULL); - } - } - } - else - return FALSE; - break; - default: - break; - } - } - - while (((width == NO_WIDTH) || (self->processed - count < width)) && - (! ((self->current == EOF) || isspace(self->current)))) - { - if (isascii(self->current)) - { - digit = internalDigitArray[self->current]; - /* Abort if digit is not allowed in the specified base */ - if ((digit == -1) || (digit >= base)) - break; - } - else if (flags & FLAGS_QUOTE) - { - /* Compare with thousands separator */ - for (j = 0; internalThousandSeparator[j] && self->current; j++) - { - if (internalThousandSeparator[j] != self->current) - break; - - self->InStream(self, NULL); - } - if (internalThousandSeparator[j]) - break; /* Mismatch */ - else - continue; /* Match */ - } - else - break; - - number *= base; - number += digit; - - self->InStream(self, NULL); - } - - /* Was anything read at all? */ - if (self->processed == count) - return FALSE; - - if (target) - *target = (isNegative) ? -number : number; - return TRUE; -} - -/************************************************************************* - * TrioReadChar [private] - */ -static int -TrioReadChar(trio_T *self, - char *target, - unsigned long flags, - int width) -{ - int i; - char ch; - trio_uintmax_t number; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - for (i = 0; - (self->current != EOF) && (i < width); - i++) - { - ch = (char)self->current; - self->InStream(self, NULL); - if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH)) - { - switch (self->current) - { - case '\\': ch = '\\'; break; - case 'a': ch = '\007'; break; - case 'b': ch = '\b'; break; - case 'f': ch = '\f'; break; - case 'n': ch = '\n'; break; - case 'r': ch = '\r'; break; - case 't': ch = '\t'; break; - case 'v': ch = '\v'; break; - default: - if (isdigit(self->current)) - { - /* Read octal number */ - if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL)) - return 0; - ch = (char)number; - } - else if (toupper(self->current) == 'X') - { - /* Read hexadecimal number */ - self->InStream(self, NULL); - if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX)) - return 0; - ch = (char)number; - } - else - { - ch = (char)self->current; - } - break; - } - } - - if (target) - target[i] = ch; - } - return i + 1; -} - -/************************************************************************* - * TrioReadString [private] - */ -static BOOLEAN_T -TrioReadString(trio_T *self, - char *target, - unsigned long flags, - int width) -{ - int i; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - TrioSkipWhitespaces(self); - - /* - * Continue until end of string is reached, a whitespace is encountered, - * or width is exceeded - */ - for (i = 0; - ((width == NO_WIDTH) || (i < width)) && - (! ((self->current == EOF) || isspace(self->current))); - i++) - { - if (TrioReadChar(self, &target[i], flags, 1) == 0) - break; /* for */ - } - if (target) - target[i] = NIL; - return TRUE; -} - -/************************************************************************* - * TrioReadWideChar [private] - */ -#if TRIO_WIDECHAR -static int -TrioReadWideChar(trio_T *self, - wchar_t *target, - unsigned long flags, - int width) -{ - int i; - int j; - int size; - int amount = 0; - wchar_t wch; - char buffer[MB_LEN_MAX + 1]; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - for (i = 0; - (self->current != EOF) && (i < width); - i++) - { - if (isascii(self->current)) - { - if (TrioReadChar(self, buffer, flags, 1) == 0) - return 0; - buffer[1] = NIL; - } - else - { - /* - * Collect a multibyte character, by enlarging buffer until - * it contains a fully legal multibyte character, or the - * buffer is full. - */ - j = 0; - do - { - buffer[j++] = (char)self->current; - buffer[j] = NIL; - self->InStream(self, NULL); - } - while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j)); - } - if (target) - { - size = mbtowc(&wch, buffer, sizeof(buffer)); - if (size > 0) - target[i] = wch; - } - amount += size; - self->InStream(self, NULL); - } - return amount; -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioReadWideString [private] - */ -#if TRIO_WIDECHAR -static BOOLEAN_T -TrioReadWideString(trio_T *self, - wchar_t *target, - unsigned long flags, - int width) -{ - int i; - int size; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - TrioSkipWhitespaces(self); - -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - mblen(NULL, 0); -#endif - - /* - * Continue until end of string is reached, a whitespace is encountered, - * or width is exceeded - */ - for (i = 0; - ((width == NO_WIDTH) || (i < width)) && - (! ((self->current == EOF) || isspace(self->current))); - ) - { - size = TrioReadWideChar(self, &target[i], flags, 1); - if (size == 0) - break; /* for */ - - i += size; - } - if (target) - target[i] = L'\0'; - return TRUE; -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioReadGroup [private] - * - * FIXME: characterclass does not work with multibyte characters - */ -static BOOLEAN_T -TrioReadGroup(trio_T *self, - char *target, - int *characterclass, - unsigned long flags, - int width) -{ - int ch; - int i; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - ch = self->current; - for (i = 0; - ((width == NO_WIDTH) || (i < width)) && - (! ((ch == EOF) || - (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0)))); - i++) - { - if (target) - target[i] = (char)ch; - self->InStream(self, &ch); - } - - if (target) - target[i] = NIL; - return TRUE; -} - -/************************************************************************* - * TrioReadDouble [private] - * - * FIXME: - * add long double - */ -static BOOLEAN_T -TrioReadDouble(trio_T *self, - double *target, - unsigned long flags, - int width) -{ - int ch; - char doubleString[512] = ""; - int index = 0; - int start; - int j; - BOOLEAN_T isHex = FALSE; - - if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1)) - width = sizeof(doubleString) - 1; - - TrioSkipWhitespaces(self); - - /* - * Read entire double number from stream. StrToDouble requires a - * string as input, but InStream can be anything, so we have to - * collect all characters. - */ - ch = self->current; - if ((ch == '+') || (ch == '-')) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - width--; - } - - start = index; - switch (ch) - { - case 'n': - case 'N': - /* Not-a-number */ - if (index != 0) - break; - /* FALLTHROUGH */ - case 'i': - case 'I': - /* Infinity */ - while (isalpha(ch) && (index - start < width)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - doubleString[index] = NIL; - - /* Case insensitive string comparison */ - if (StrEqual(&doubleString[start], INFINITE_UPPER) || - StrEqual(&doubleString[start], LONG_INFINITE_UPPER)) - { - *target = ((start == 1 && doubleString[0] == '-')) - ? -HUGE_VAL - : HUGE_VAL; - return TRUE; - } - if (StrEqual(doubleString, NAN_LOWER)) - { - /* NaN must not have a preceeding + nor - */ - *target = TrioGenerateNaN(); - return TRUE; - } - return FALSE; - - default: - break; - } - - if (ch == '0') - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - if (toupper(ch) == 'X') - { - isHex = TRUE; - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - } - while ((ch != EOF) && (index - start < width)) - { - /* Integer part */ - if (isHex ? isxdigit(ch) : isdigit(ch)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - else if (flags & FLAGS_QUOTE) - { - /* Compare with thousands separator */ - for (j = 0; internalThousandSeparator[j] && self->current; j++) - { - if (internalThousandSeparator[j] != self->current) - break; - - self->InStream(self, &ch); - } - if (internalThousandSeparator[j]) - break; /* Mismatch */ - else - continue; /* Match */ - } - else - break; /* while */ - } - if (ch == '.') - { - /* Decimal part */ - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - while ((isHex ? isxdigit(ch) : isdigit(ch)) && - (index - start < width)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - if (isHex ? (toupper(ch) == 'P') : (toupper(ch) == 'E')) - { - /* Exponent */ - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - if ((ch == '+') || (ch == '-')) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - while ((isHex ? isxdigit(ch) : isdigit(ch)) && - (index - start < width)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - } - } - - if ((index == start) || (*doubleString == NIL)) - return FALSE; - - if (flags & FLAGS_LONGDOUBLE) -/* *longdoublePointer = StrToLongDouble()*/ - return FALSE; /* FIXME: Remove when long double is implemented */ - else - { - *target = StrToDouble(doubleString, NULL); - } - return TRUE; -} - -/************************************************************************* - * TrioReadPointer [private] - */ -static BOOLEAN_T -TrioReadPointer(trio_T *self, - void **target, - unsigned long flags) -{ - trio_uintmax_t number; - char buffer[sizeof(null)]; - - flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING); - - if (TrioReadNumber(self, - &number, - flags, - POINTER_WIDTH, - BASE_HEX)) - { - /* - * The strange assignment of number is a workaround for a compiler - * warning - */ - if (target) - *target = (char *)0 + number; - return TRUE; - } - else if (TrioReadString(self, - (flags & FLAGS_IGNORE) - ? NULL - : buffer, - 0, - sizeof(null) - 1)) - { - if (StrEqualCase(buffer, null)) - { - if (target) - *target = NULL; - return TRUE; - } - } - return FALSE; -} - -/************************************************************************* - * TrioScan [private] - */ -static int -TrioScan(const void *source, - size_t sourceSize, - void (*InStream)(trio_T *, int *), - const char *format, - va_list arglist, - void **argarray) -{ -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - int charlen; -#endif - int status; - int assignment; - parameter_T parameters[MAX_PARAMETERS]; - trio_T internalData; - trio_T *data; - int ch; -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - int cnt; -#endif - int index; /* Index of format string */ - int i; /* Index of current parameter */ - unsigned long flags; - int width; - int base; - void *pointer; - - assert(VALID(InStream)); - assert(VALID(format)); - - memset(&internalData, 0, sizeof(internalData)); - data = &internalData; - data->InStream = InStream; - data->location = (void *)source; - data->max = sourceSize; - -#if defined(USE_LOCALE) - if (NULL == internalLocaleValues) - { - TrioSetLocale(); - } -#endif - - status = TrioPreprocess(TYPE_SCAN, format, parameters, arglist, argarray); - if (status < 0) - return status; - - assignment = 0; - i = 0; - index = 0; - data->InStream(data, &ch); - -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - mblen(NULL, 0); -#endif - - while (format[index]) - { -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - if (! isascii(format[index])) - { - charlen = mblen(&format[index], MB_LEN_MAX); - /* Compare multibyte characters in format string */ - for (cnt = 0; cnt < charlen - 1; cnt++) - { - if (ch != format[index + cnt]) - { - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - data->InStream(data, &ch); - } - continue; /* while */ - } -#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ - if (EOF == ch) - return EOF; - - if (CHAR_IDENTIFIER == format[index]) - { - if (CHAR_IDENTIFIER == format[index + 1]) - { - /* Two % in format matches one % in input stream */ - if (CHAR_IDENTIFIER == ch) - { - data->InStream(data, &ch); - index += 2; - continue; /* while format chars left */ - } - else - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - - /* Skip the parameter entries */ - while (parameters[i].type == FORMAT_PARAMETER) - i++; - - flags = parameters[i].flags; - /* Find width */ - width = parameters[i].width; - if (flags & FLAGS_WIDTH_PARAMETER) - { - /* Get width from parameter list */ - width = (int)parameters[width].data.number.as_signed; - } - /* Find base */ - base = parameters[i].base; - if (flags & FLAGS_BASE_PARAMETER) - { - /* Get base from parameter list */ - base = (int)parameters[base].data.number.as_signed; - } - - switch (parameters[i].type) - { - case FORMAT_INT: - { - trio_uintmax_t number; - - if (0 == base) - base = BASE_DECIMAL; - - if (!TrioReadNumber(data, - &number, - flags, - width, - base)) - return assignment; - assignment++; - - if (!(flags & FLAGS_IGNORE)) - { - pointer = parameters[i].data.pointer; -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (flags & FLAGS_SIZE_T) - *(size_t *)pointer = (size_t)number; - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (flags & FLAGS_PTRDIFF_T) - *(ptrdiff_t *)pointer = (ptrdiff_t)number; - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (flags & FLAGS_INTMAX_T) - *(trio_intmax_t *)pointer = (trio_intmax_t)number; - else -#endif - if (flags & FLAGS_QUAD) - *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number; - else if (flags & FLAGS_LONG) - *(long int *)pointer = (long int)number; - else if (flags & FLAGS_SHORT) - *(short int *)pointer = (short int)number; - else - *(int *)pointer = (int)number; - } - } - break; /* FORMAT_INT */ - - case FORMAT_STRING: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - if (!TrioReadWideString(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.wstring, - flags, - width)) - return assignment; - } - else -#endif - { - if (!TrioReadString(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.string, - flags, - width)) - return assignment; - } - assignment++; - break; /* FORMAT_STRING */ - - case FORMAT_DOUBLE: - if (!TrioReadDouble(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.doublePointer, - flags, - width)) - return assignment; - assignment++; - break; /* FORMAT_DOUBLE */ - - case FORMAT_GROUP: - { - int characterclass[MAX_CHARACTER_CLASS + 1]; - int rc; - - /* Skip over modifiers */ - while (format[index] != SPECIFIER_GROUP) - { - index++; - } - /* Skip over group specifier */ - index++; - - memset(characterclass, 0, sizeof(characterclass)); - rc = TrioGetCharacterClass(format, - &index, - &flags, - characterclass); - if (rc < 0) - return rc; - - if (!TrioReadGroup(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.string, - characterclass, - flags, - parameters[i].width)) - return assignment; - assignment++; - } - break; /* FORMAT_GROUP */ - - case FORMAT_COUNT: - pointer = parameters[i].data.pointer; - if (NULL != pointer) - { -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (flags & FLAGS_SIZE_T) - *(size_t *)pointer = (size_t)data->committed; - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (flags & FLAGS_PTRDIFF_T) - *(ptrdiff_t *)pointer = (ptrdiff_t)data->committed; - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (flags & FLAGS_INTMAX_T) - *(trio_intmax_t *)pointer = (trio_intmax_t)data->committed; - else -#endif - if (flags & FLAGS_QUAD) - { - *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->committed; - } - else if (flags & FLAGS_LONG) - { - *(long int *)pointer = (long int)data->committed; - } - else if (flags & FLAGS_SHORT) - { - *(short int *)pointer = (short int)data->committed; - } - else - { - *(int *)pointer = (int)data->committed; - } - } - break; /* FORMAT_COUNT */ - - case FORMAT_CHAR: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - if (TrioReadWideChar(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.wstring, - flags, - (width == NO_WIDTH) ? 1 : width) > 0) - return assignment; - } - else -#endif - { - if (TrioReadChar(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.string, - flags, - (width == NO_WIDTH) ? 1 : width) > 0) - return assignment; - } - assignment++; - break; /* FORMAT_CHAR */ - - case FORMAT_POINTER: - if (!TrioReadPointer(data, - (flags & FLAGS_IGNORE) - ? NULL - : (void **)parameters[i].data.pointer, - flags)) - return assignment; - assignment++; - break; /* FORMAT_POINTER */ - - case FORMAT_PARAMETER: - break; /* FORMAT_PARAMETER */ - - default: - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - ch = data->current; - index = parameters[i].indexAfterSpecifier; - i++; - } - else /* Not an % identifier */ - { - if (isspace((int)format[index])) - { - /* Whitespaces may match any amount of whitespaces */ - ch = TrioSkipWhitespaces(data); - } - else if (ch == format[index]) - { - data->InStream(data, &ch); - } - else - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - - index++; - } - } - return assignment; -} - -/************************************************************************* - * TrioInStreamFile [private] - */ -static void -TrioInStreamFile(trio_T *self, - int *intPointer) -{ - FILE *file = (FILE *)self->location; - - assert(VALID(self)); - assert(VALID(file)); - - self->current = fgetc(file); - self->processed++; - self->committed++; - - if (VALID(intPointer)) - { - *intPointer = self->current; - } -} - -/************************************************************************* - * TrioInStreamFileDescriptor [private] - */ -static void -TrioInStreamFileDescriptor(trio_T *self, - int *intPointer) -{ - int fd = *((int *)self->location); - int size; - unsigned char input; - - assert(VALID(self)); - - size = read(fd, &input, sizeof(char)); - self->current = (size == 0) ? EOF : input; - self->processed++; - self->committed++; - - if (VALID(intPointer)) - { - *intPointer = self->current; - } -} - -/************************************************************************* - * TrioInStreamString [private] - */ -static void -TrioInStreamString(trio_T *self, - int *intPointer) -{ - unsigned char **buffer; - - assert(VALID(self)); - assert(VALID(self->InStream)); - assert(VALID(self->location)); - - buffer = (unsigned char **)self->location; - self->current = (*buffer)[0]; - if (self->current == NIL) - self->current = EOF; - (*buffer)++; - self->processed++; - self->committed++; - - if (VALID(intPointer)) - { - *intPointer = self->current; - } -} - -/************************************************************************* - * scanf - */ -int -trio_scanf(const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(format)); - - va_start(args, format); - status = TrioScan(stdin, 0, TrioInStreamFile, format, args, NULL); - va_end(args); - return status; -} - -int -trio_vscanf(const char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioScan(stdin, 0, TrioInStreamFile, format, args, NULL); -} - -int -trio_scanfv(const char *format, - void **args) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(format)); - - return TrioScan(stdin, 0, TrioInStreamFile, format, dummy, args); -} - -/************************************************************************* - * fscanf - */ -int -trio_fscanf(FILE *file, - const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(file)); - assert(VALID(format)); - - va_start(args, format); - status = TrioScan(file, 0, TrioInStreamFile, format, args, NULL); - va_end(args); - return status; -} - -int -trio_vfscanf(FILE *file, - const char *format, - va_list args) -{ - assert(VALID(file)); - assert(VALID(format)); - - return TrioScan(file, 0, TrioInStreamFile, format, args, NULL); -} - -int -trio_fscanfv(FILE *file, - const char *format, - void **args) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(file)); - assert(VALID(format)); - - return TrioScan(file, 0, TrioInStreamFile, format, dummy, args); -} - -/************************************************************************* - * dscanf - */ -int -trio_dscanf(int fd, - const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(format)); - - va_start(args, format); - status = TrioScan(&fd, 0, TrioInStreamFileDescriptor, format, args, NULL); - va_end(args); - return status; -} - -int -trio_vdscanf(int fd, - const char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioScan(&fd, 0, TrioInStreamFileDescriptor, format, args, NULL); -} - -int -trio_dscanfv(int fd, - const char *format, - void **args) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(format)); - - return TrioScan(&fd, 0, TrioInStreamFileDescriptor, format, dummy, args); -} - -/************************************************************************* - * sscanf - */ -int -trio_sscanf(const char *buffer, - const char *format, - ...) -{ - int status; - va_list args; - - assert(VALID(buffer)); - assert(VALID(format)); - - va_start(args, format); - status = TrioScan(&buffer, 0, TrioInStreamString, format, args, NULL); - va_end(args); - return status; -} - -int -trio_vsscanf(const char *buffer, - const char *format, - va_list args) -{ - assert(VALID(buffer)); - assert(VALID(format)); - - return TrioScan(&buffer, 0, TrioInStreamString, format, args, NULL); -} - -int -trio_sscanfv(const char *buffer, - const char *format, - void **args) -{ - va_list dummy; - shutup_unitialized(&dummy); - - assert(VALID(buffer)); - assert(VALID(format)); - - return TrioScan(&buffer, 0, TrioInStreamString, format, dummy, args); -} - diff --git a/org.glite.lb-utils.trio/src/triop.h b/org.glite.lb-utils.trio/src/triop.h deleted file mode 100644 index ca49fab..0000000 --- a/org.glite.lb-utils.trio/src/triop.h +++ /dev/null @@ -1,138 +0,0 @@ -/************************************************************************* - * - * $Id$ - * - * Copyright (C) 2000 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************ - * - * Private functions, types, etc. used for callback functions. - * - * The ref pointer is an opaque type and should remain as such. - * Private data must only be accessible through the getter and - * setter functions. - * - ************************************************************************/ - -#ifndef TRIO_TRIOP_H -#define TRIO_TRIOP_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef TRIO_C99 -# define TRIO_C99 1 -#endif -#ifndef TRIO_BSD -# define TRIO_BSD 1 -#endif -#ifndef TRIO_GNU -# define TRIO_GNU 1 -#endif -#ifndef TRIO_MISC -# define TRIO_MISC 1 -#endif -#ifndef TRIO_UNIX98 -# define TRIO_UNIX98 1 -#endif -#ifndef TRIO_MICROSOFT -# define TRIO_MICROSOFT 1 -#endif -#ifndef TRIO_EXTENSION -# define TRIO_EXTENSION 1 -#endif -#ifndef TRIO_WIDECHAR -# define TRIO_WIDECHAR 0 -#endif -#ifndef TRIO_ERRORS -# define TRIO_ERRORS 1 -#endif - -#ifndef TRIO_MALLOC -# define TRIO_MALLOC(n) malloc(n) -#endif -#ifndef TRIO_REALLOC -# define TRIO_REALLOC(x,n) realloc((x),(n)) -#endif -#ifndef TRIO_FREE -# define TRIO_FREE(x) free(x) -#endif - -typedef int (*trio_callback_t)(void *ref); - -void *trio_register(trio_callback_t callback, const char *name); -void trio_unregister(void *handle); - -const char *trio_get_format(void *ref); -void *trio_get_argument(void *ref); - -/* Modifiers */ -int trio_get_width(void *ref); -void trio_set_width(void *ref, int width); -int trio_get_precision(void *ref); -void trio_set_precision(void *ref, int precision); -int trio_get_base(void *ref); -void trio_set_base(void *ref, int base); -int trio_get_padding(void *ref); -void trio_set_padding(void *ref, int is_padding); -int trio_get_short(void *ref); /* h */ -void trio_set_shortshort(void *ref, int is_shortshort); -int trio_get_shortshort(void *ref); /* hh */ -void trio_set_short(void *ref, int is_short); -int trio_get_long(void *ref); /* l */ -void trio_set_long(void *ref, int is_long); -int trio_get_longlong(void *ref); /* ll */ -void trio_set_longlong(void *ref, int is_longlong); -int trio_get_longdouble(void *ref); /* L */ -void trio_set_longdouble(void *ref, int is_longdouble); -int trio_get_alternative(void *ref); /* # */ -void trio_set_alternative(void *ref, int is_alternative); -int trio_get_alignment(void *ref); /* - */ -void trio_set_alignment(void *ref, int is_leftaligned); -int trio_get_spacing(void *ref); /* (space) */ -void trio_set_spacing(void *ref, int is_space); -int trio_get_sign(void *ref); /* + */ -void trio_set_sign(void *ref, int is_showsign); -int trio_get_quote(void *ref); /* ' */ -void trio_set_quote(void *ref, int is_quote); -int trio_get_upper(void *ref); -void trio_set_upper(void *ref, int is_upper); -#if TRIO_C99 -int trio_get_largest(void *ref); /* j */ -void trio_set_largest(void *ref, int is_largest); -int trio_get_ptrdiff(void *ref); /* t */ -void trio_set_ptrdiff(void *ref, int is_ptrdiff); -int trio_get_size(void *ref); /* z / Z */ -void trio_set_size(void *ref, int is_size); -#endif - -/* Printing */ -int trio_print_ref(void *ref, const char *format, ...); -int trio_vprint_ref(void *ref, const char *format, va_list args); -int trio_printv_ref(void *ref, const char *format, void **args); - -void trio_print_int(void *ref, int number); -void trio_print_uint(void *ref, unsigned int number); -/* void trio_print_long(void *ref, long number); */ -/* void trio_print_ulong(void *ref, unsigned long number); */ -void trio_print_double(void *ref, double number); -void trio_print_string(void *ref, char *string); -void trio_print_pointer(void *ref, void *pointer); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* TRIO_TRIOP_H */ diff --git a/org.glite.lb-utils.trio/test/trio_test.cpp b/org.glite.lb-utils.trio/test/trio_test.cpp deleted file mode 100644 index 3ba4b9c..0000000 --- a/org.glite.lb-utils.trio/test/trio_test.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include - -#include -#include - -#include "trio.h" - -class TrioTest: public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TrioTest); - CPPUNIT_TEST(escapeULM); - CPPUNIT_TEST(escapeXML); - CPPUNIT_TEST(escapeSQL); - CPPUNIT_TEST_SUITE_END(); - -public: - void escapeULM(); - void escapeXML(); - void escapeSQL(); -}; - -void TrioTest::escapeULM() -{ - char *e, *r = "START we have =, \\\", and \\n in the string END"; - - trio_asprintf(&e,"START %|Us END", "we have =, \", and \n in the string"), - std::cerr << e << std::endl; - - CPPUNIT_ASSERT_MESSAGE("escape ULM failed",!strcmp(e,r)); -} - -void TrioTest::escapeXML() -{ - char *e, *r = "START there is a <tag> containing &something; </tag> END"; - - trio_asprintf(&e,"START %|Xs END", "there is a containing &something; "), - std::cerr << e << std::endl; - - CPPUNIT_ASSERT_MESSAGE("escape XML failed",!strcmp(e,r)); -} - -void TrioTest::escapeSQL() -{ - char *e, *r = "START SQL doesn''t like '' END"; - - trio_asprintf(&e,"START %|Ss END", "SQL doesn't like '"), - std::cerr << e << std::endl; - - CPPUNIT_ASSERT_MESSAGE("escape SQL failed",!strcmp(e,r)); -} - -CPPUNIT_TEST_SUITE_REGISTRATION( TrioTest ); - -#include -#include - -#include -#include -#include -#include -#include -#include - -int main (int argc,const char *argv[]) -{ - CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); - - assert(argc == 2); - std::ofstream xml(argv[1]); - - CppUnit::TestResult controller; - CppUnit::TestResultCollector result; - controller.addListener( &result ); - - CppUnit::TestRunner runner; - runner.addTest(suite); - runner.run(controller); - - CppUnit::XmlOutputter xout( &result, xml ); - CppUnit::CompilerOutputter tout( &result, std::cout); - xout.write(); - tout.write(); - - return result.wasSuccessful() ? 0 : 1 ; -} diff --git a/org.glite.lb-utils/.cvsignore b/org.glite.lb-utils/.cvsignore deleted file mode 100644 index 3a4edf6..0000000 --- a/org.glite.lb-utils/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project diff --git a/org.glite.lb-utils/LICENSE b/org.glite.lb-utils/LICENSE deleted file mode 100755 index 259a91f..0000000 --- a/org.glite.lb-utils/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb-utils/build.xml b/org.glite.lb-utils/build.xml deleted file mode 100644 index 85553ce..0000000 --- a/org.glite.lb-utils/build.xml +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - Ant build file to build the lb-utils subsystem. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Preparing directories ... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/> - - - - diff --git a/org.glite.lb-utils/project/build.number b/org.glite.lb-utils/project/build.number deleted file mode 100644 index 5cfec85..0000000 --- a/org.glite.lb-utils/project/build.number +++ /dev/null @@ -1 +0,0 @@ -module.build = 0 diff --git a/org.glite.lb-utils/project/build.properties b/org.glite.lb-utils/project/build.properties deleted file mode 100755 index e69de29..0000000 diff --git a/org.glite.lb-utils/project/dependencies.properties b/org.glite.lb-utils/project/dependencies.properties deleted file mode 100644 index c590a39..0000000 --- a/org.glite.lb-utils/project/dependencies.properties +++ /dev/null @@ -1,13 +0,0 @@ - -################################################################### -# System dependencies -################################################################### - -org.glite.version = HEAD -org.glite.lb-utils.version = HEAD - -# Component dependencies tag = do not remove this line = -org.glite.lb-utils.db.version = HEAD -#org.glite.lb-utils.jobid.version = HEAD -#org.glite.lb-utils.server-bones.version = HEAD -#org.glite.lb-utils.trio.version = HEAD diff --git a/org.glite.lb-utils/project/glite.lb-utils.csf.xml b/org.glite.lb-utils/project/glite.lb-utils.csf.xml deleted file mode 100644 index 98945b8..0000000 --- a/org.glite.lb-utils/project/glite.lb-utils.csf.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The org.glite and org.glite.lb-utils modules have been updated, please rerun the configuration file - - - - - The org.glite and org.glite.lb-utils modules have been updated, please rerun the configuration file - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils/project/properties.xml b/org.glite.lb-utils/project/properties.xml deleted file mode 100644 index 5f9597f..0000000 --- a/org.glite.lb-utils/project/properties.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb-utils/project/taskdefs.xml b/org.glite.lb-utils/project/taskdefs.xml deleted file mode 100644 index 7963150..0000000 --- a/org.glite.lb-utils/project/taskdefs.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - diff --git a/org.glite.lb-utils/project/version.properties b/org.glite.lb-utils/project/version.properties deleted file mode 100755 index 6f1f8ab..0000000 --- a/org.glite.lb-utils/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version = 0.0.0 -module.age = 0 \ No newline at end of file diff --git a/org.glite.lb.client-interface/Makefile b/org.glite.lb.client-interface/Makefile index ee12a59..0d22906 100644 --- a/org.glite.lb.client-interface/Makefile +++ b/org.glite.lb.client-interface/Makefile @@ -65,22 +65,25 @@ distbin: rm -rf ${top_srcdir}/tmpbuilddir doc: generate + cp ${top_srcdir}/doc/*.dox . + echo "PROJECT_NUMBER = ${version}" >> C.dox + echo "PROJECT_NUMBER = ${version}" >> CPP.dox doxygen C.dox doxygen CPP.dox -install: generate +install: generate doc -mkdir -p ${PREFIX}/${STAGETO} -mkdir -p ${PREFIX}/share/doc/${package}-${version} install -m 644 ${GEN_H} ${PREFIX}/${STAGETO} install -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} cd ${top_srcdir}/interface && install -m 644 ${STATIC_H} ${PREFIX}/${STAGETO} ifndef LB_STANDALONE - cd ${top_srcdir}/doc && cp -r C CPP ${PREFIX}/share/doc/${package}-${version} + cp -r C CPP ${PREFIX}/share/doc/${package}-${version} endif if [ x${DOSTAGE} = xyes ]; then \ cd ${top_srcdir}/interface && install -m 644 ${FAKE_H} ${PREFIX}/${STAGETO} ; \ fi clean: - rm -f *.h + rm -f *.h *.dox diff --git a/org.glite.lb.client-interface/doc/C.dox b/org.glite.lb.client-interface/doc/C.dox new file mode 100644 index 0000000..5ec7442 --- /dev/null +++ b/org.glite.lb.client-interface/doc/C.dox @@ -0,0 +1,19 @@ +PROJECT_NAME = "Glite LB Client: C - Interface" +OUTPUT_DIRECTORY = C +OPTIMIZE_OUTPUT_FOR_C = YES +INPUT = ./events.h \ + ./jobstat.h \ + ./producer.h \ + ../interface/context.h \ + ../interface/notifid.h \ + ../interface/notification.h \ + ../interface/consumer.h +SHOW_DIRECTORIES = NO +FULL_PATH_NAMES = NO +EXTRACT_ALL = YES +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +PREDEFINED = _EDG_WLL_EVENT_COMMON +HAVE_DOT = NO diff --git a/org.glite.lb.client-interface/doc/CPP.dox b/org.glite.lb.client-interface/doc/CPP.dox new file mode 100644 index 0000000..1ee044c --- /dev/null +++ b/org.glite.lb.client-interface/doc/CPP.dox @@ -0,0 +1,16 @@ +PROJECT_NAME = "Glite LB Client: CPP - Interface" +OUTPUT_DIRECTORY = CPP +INPUT = ../build/Event.h \ + ../build/JobStatus.h \ + ../interface/Job.h \ + ../interface/CountRef.h \ + ../interface/LoggingExceptions.h \ + ../interface/ServerConnection.h \ + ../interface/Notification.h +SHOW_DIRECTORIES = NO +FULL_PATH_NAMES = NO +EXTRACT_ALL = YES +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +#HAVE_DOT = YES +#CALL_GRAPH = YES diff --git a/org.glite.lb.client/Makefile b/org.glite.lb.client/Makefile index 69601b2..422e9f3 100644 --- a/org.glite.lb.client/Makefile +++ b/org.glite.lb.client/Makefile @@ -1,31 +1,32 @@ # Default values top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} stagedir=. distdir=. globalprefix=glite lbprefix=lb package=glite-lb-client version=0.0.0 -PREFIX=/opt/glite glite_location=/opt/glite globus_prefix=/opt/globus nothrflavour=gcc32 thrflavour=gcc32pthr + CC:=gcc CXX:=g++ -include Makefile.inc -include ../project/version.properties +PREFIX?=${glite_location} + version=${module.version} VPATH=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/examples:${top_srcdir}/doc AT3=perl -I${top_srcdir}/project ${top_srcdir}/project/at3 GENSAM=${top_srcdir}/examples/gen_sample_job +CHECK_VERSION:=VERSION=${version} VERSION_AHEAD=0 perl ${top_srcdir}/project/check_version.pl SUFFIXES = .T .l @@ -60,8 +61,11 @@ l_SRC = \ sh_PROGS = $(l_SRC:.l=.sh) - -DEBUG:=-g -O0 -Wall +ifdef DEBUG + DEBUG:=-g -O0 -Wall -DEDG_WLL_LOG_STUB +else + DEBUG:=-g -O0 -Wall +endif GLOBUSINC:= -I${globus_prefix}/include/${nothrflavour} GLOBUSTHRINC:= -I${globus_prefix}/include/${thrflavour} @@ -141,37 +145,37 @@ MAN = $(MAN_GZ:.gz=) # version_info=-version-info `echo ${version} | cut -d. -f1,2 | tr . :` -# counted minor versions: 2.1 -offset=1 +# counted minor versions: +offset=0 version_info:=-version-info ${shell \ perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } ${LIB}: ${LIBOBJS} - ${LINK} ${version_info} -o $@ ${LIBLOBJS} -rpath ${glite_location}/lib \ + ${LINK} ${version_info} -o $@ ${LIBLOBJS} -rpath ${PREFIX}/lib \ ${COMMON_LIB} \ -lglite_security_gss_${nothrflavour} ${THRLIB}: ${LIBTHROBJS} - ${LINK} ${version_info} -o $@ ${LIBTHRLOBJS} -rpath ${glite_location}/lib \ + ${LINK} ${version_info} -o $@ ${LIBTHRLOBJS} -rpath ${PREFIX}/lib \ ${COMMON_LIB_THR} \ -lglite_security_gss_${thrflavour} ${FAKELIB}: ${FAKELIBOBJS} - ${LINK} ${version_info} -o $@ ${FAKELIBLOBJS} -rpath ${glite_location}/lib \ + ${LINK} ${version_info} -o $@ ${FAKELIBLOBJS} -rpath ${PREFIX}/lib \ ${COMMON_LIB} \ -lglite_security_gss_${nothrflavour} ${FAKETHRLIB}: ${FAKELIBTHROBJS} - ${LINK} ${version_info} -o $@ ${FAKELIBTHRLOBJS} -rpath ${glite_location}/lib \ + ${LINK} ${version_info} -o $@ ${FAKELIBTHRLOBJS} -rpath ${PREFIX}/lib \ ${COMMON_LIB_THR} \ -lglite_security_gss_${thrflavour} ${PLUSLIB}: ${PLUSOBJS} - ${LINK} ${version_info} -o $@ ${PLUSLOBJS} -rpath ${glite_location}/lib ${LIB} + ${LINK} ${version_info} -o $@ ${PLUSLOBJS} -rpath ${PREFIX}/lib ${LIB} ${THRPLUSLIB}: ${PLUSTHROBJS} - ${LINK} ${version_info} -o $@ ${PLUSTHRLOBJS} -rpath ${glite_location}/lib ${THRLIB} + ${LINK} ${version_info} -o $@ ${PLUSTHRLOBJS} -rpath ${PREFIX}/lib ${THRLIB} logevent: logevent.o args.o ${LINK} -o $@ logevent.o args.o ${LIB} ${EXT_LIB} @@ -304,13 +308,6 @@ endif clean: check_version: - @perl -ne '/#define GLITE_LB_CLIENT_INTERFACE "(\d+)\.\d+\.\d+"/; \ - $$iface=$$1; \ - $$_="${version}"; /(\d+)\.\d+\.\d+/; \ - if ($$iface != $$1) { \ - print "error: Major version of the interface ($$iface) does not match implementation ($$1)\n" ;\ - exit 1; \ - } \ - ' ${stagedir}/include/glite/lb/interface_version.h + ${CHECK_VERSION} ${stagedir}/include/glite/lb/interface_version.h .PHONY: default all compile examples fake check stage dist distsrc distbin install clean check_version diff --git a/org.glite.lb.client/build.xml b/org.glite.lb.client/build.xml index b1eb812..01b529b 100755 --- a/org.glite.lb.client/build.xml +++ b/org.glite.lb.client/build.xml @@ -20,6 +20,9 @@ Revision history: $Log$ + Revision 1.6 2005/05/26 15:13:40 zurek + inserted module.build.file + Revision 1.5 2004/10/18 19:16:09 zsalvet RPM descriptions @@ -104,6 +107,7 @@ + diff --git a/org.glite.lb.client/examples/gen_begin b/org.glite.lb.client/examples/gen_begin index bcc5083..024f343 100755 --- a/org.glite.lb.client/examples/gen_begin +++ b/org.glite.lb.client/examples/gen_begin @@ -31,7 +31,7 @@ while test -n "$1" do case "$1" in "-m") shift; BKSERVER_HOST="$1" ;; - "-x") LBPROXY="-x -S $1" ;; + "-x") LBPROXY="-x" ;; "-X") shift; LBPROXY="-x"; LBPROXY_STORE_SOCK="-S $1" ;; "-j") shift; EDG_JOBID="$1" ;; "-l") shift; LARGE_STRESS="-l $1" ;; diff --git a/org.glite.lb.client/examples/job_status.c b/org.glite.lb.client/examples/job_status.c index 696202d..9a244ab 100644 --- a/org.glite.lb.client/examples/job_status.c +++ b/org.glite.lb.client/examples/job_status.c @@ -131,7 +131,7 @@ int main(int argc,char *argv[]) static void usage(char *name) { - fprintf(stderr,"Usage: %s job_id [-x lb_proxy_serve_sock] [job_id [...]]\n", name); + fprintf(stderr,"Usage: %s [-x lb_proxy_serve_sock] job_id [job_id...]\n", name); fprintf(stderr," %s -all\n", name); } @@ -175,7 +175,7 @@ dgerr(edg_wll_Context ctx,char *where) static void printstat(edg_wll_JobStat stat, int level) { - char *s, *j, ind[10]; + char *s, *j1,*j2, ind[10]; int i; @@ -186,11 +186,11 @@ static void printstat(edg_wll_JobStat stat, int level) s = edg_wll_StatToString(stat.state); /* print whole flat structure */ printf("%sstate : %s\n", ind, s); - printf("%sjobId : %s\n", ind, j = edg_wlc_JobIdUnparse(stat.jobId)); + printf("%sjobId : %s\n", ind, j1 = edg_wlc_JobIdUnparse(stat.jobId)); printf("%sowner : %s\n", ind, stat.owner); printf("%sjobtype : %s\n", ind, (stat.jobtype ? "DAG" : "SIMPLE") ); printf("%sparent_job : %s\n", ind, - j = edg_wlc_JobIdUnparse(stat.parent_job)); + j2 = edg_wlc_JobIdUnparse(stat.parent_job)); if (stat.jobtype) {; printf("%sseed : %s\n", ind, stat.seed); printf("%schildren_num : %d\n", ind, stat.children_num); @@ -257,7 +257,8 @@ static void printstat(edg_wll_JobStat stat, int level) printf("\n"); - free(j); + free(j1); + free(j2); free(s); } diff --git a/org.glite.lb.client/project/configure.properties.xml b/org.glite.lb.client/project/configure.properties.xml index 4ca504f..fc29565 100644 --- a/org.glite.lb.client/project/configure.properties.xml +++ b/org.glite.lb.client/project/configure.properties.xml @@ -20,6 +20,9 @@ Revision history: $Log$ + Revision 1.8 2006/09/20 10:50:08 zsalvet + Remove CVS conflict section. + Revision 1.7 2006/09/19 20:27:40 akrenek Builds after merge _RC31 @@ -61,7 +64,7 @@ distdir=${dist.dir} globalprefix=${global.prefix} lbprefix=${subsystem.prefix} package=${module.package.name} -PREFIX=${install.dir} +# PREFIX=${install.dir} version=${module.version} glite_location=${with.glite.location} globus_prefix=${with.globus.prefix} diff --git a/org.glite.lb.client/project/version.properties b/org.glite.lb.client/project/version.properties index c4facf2..0441055 100644 --- a/org.glite.lb.client/project/version.properties +++ b/org.glite.lb.client/project/version.properties @@ -1,4 +1,4 @@ #Fri Sep 02 14:17:41 CEST 2005 # glite-lb-client_branch_3_0_0_RC15 tag is taken! -module.version=2.2.3 -module.age=0 +module.version=2.2.6 +module.age=2 diff --git a/org.glite.lb.client/src/prod_proto.c b/org.glite.lb.client/src/prod_proto.c index a652916..456f3f2 100644 --- a/org.glite.lb.client/src/prod_proto.c +++ b/org.glite.lb.client/src/prod_proto.c @@ -23,7 +23,10 @@ int edg_wll_log_proto_handle_gss_failures(edg_wll_Context context, int code, edg_wll_GssStatus *gss_code, const char *text) { static char err[256]; - int ret = 0; + int myerrno, ret; + + myerrno = errno; + ret = 0; edg_wll_ResetError(context); @@ -40,8 +43,14 @@ int edg_wll_log_proto_handle_gss_failures(edg_wll_Context context, int code, edg ret = edg_wll_SetError(context,ENOTCONN,err); break; case EDG_WLL_GSS_ERROR_ERRNO: - snprintf(err, sizeof(err), "%s;; GSS Error: system error occured;", text); - ret = edg_wll_SetError(context,ENOTCONN,err); + { + const char *msg1; + char *msg2; + msg1 = strerror(myerrno); + asprintf(&msg2, "%s;; System Error: %s", text, msg1); + ret = edg_wll_SetError(context,ENOTCONN,msg2); + free(msg2); + } break; case EDG_WLL_GSS_ERROR_GSS: snprintf(err, sizeof(err), "%s;; GSS Error: GSS failure occured", text); @@ -51,7 +60,7 @@ int edg_wll_log_proto_handle_gss_failures(edg_wll_Context context, int code, edg { const char *msg1; char *msg2; - msg1 = hstrerror(errno); + msg1 = hstrerror(myerrno); asprintf(&msg2, "%s;; GSS Error: %s", text, msg1); ret = edg_wll_SetError(context,EDG_WLL_ERROR_DNS, msg2); free(msg2); @@ -80,8 +89,10 @@ plain_reader(void *user_data, char *buffer, int max_len) int len; len = edg_wll_plain_read_full(data->conn, buffer, max_len, &data->ctx->p_tmp_timeout); - if(len < 0) - edg_wll_SetError(data->ctx, EDG_WLL_IL_PROTO, "plain_reader(): error reading message data"); + if(len < 0) { + edg_wll_SetError(data->ctx, errno, "edg_wll_plain_read_full()"); + edg_wll_UpdateError(data->ctx, EDG_WLL_IL_PROTO, "plain_reader(): error reading message data"); + } return(len); } @@ -152,12 +163,15 @@ get_reply_gss(edg_wll_Context context, edg_wll_GssConnection *conn, char **buf, data.conn = conn; code = read_il_data(&data, &msg, gss_reader); if(code < 0) { - edg_wll_SetError(context, EDG_WLL_IL_PROTO, "get_reply_gss(): error reading reply"); + edg_wll_UpdateError(context, EDG_WLL_IL_PROTO, "get_reply_gss(): error reading reply"); goto get_reply_gss_end; } if(decode_il_reply(code_maj, code_min, buf, msg) < 0) { - edg_wll_SetError(context, EDG_WLL_IL_PROTO, "get_reply_gss(): error decoding reply"); + char *et; + asprintf(&et,"get_reply_gss(): error decoding reply \"%s\"", msg); + edg_wll_UpdateError(context, EDG_WLL_IL_PROTO, et); + if (et) free(et); goto get_reply_gss_end; } @@ -296,7 +310,8 @@ int edg_wll_log_proto_client_proxy(edg_wll_Context context, edg_wll_PlainConnect len = encode_il_msg(&buffer, &ll); } if(len < 0) { - edg_wll_SetError(context,ENOMEM,"edg_wll_log_proto_client_proxy(): error encoding message"); + edg_wll_SetError(context,errno,"encode_il_msg()"); + edg_wll_UpdateError(context,ENOMEM,"edg_wll_log_proto_client_proxy(): error encoding message"); goto edg_wll_log_proto_client_proxy_end; } @@ -305,7 +320,8 @@ int edg_wll_log_proto_client_proxy(edg_wll_Context context, edg_wll_PlainConnect fprintf(stderr,"log_proto_client_proxy: sending message...\n"); #endif if (( count = edg_wll_plain_write_full(conn, buffer, len, &context->p_tmp_timeout)) < 0) { - edg_wll_SetError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_proxy(): error sending message to socket"); + edg_wll_SetError(context, errno, "edg_wll_plain_write_full()"); + edg_wll_UpdateError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_proxy(): error sending message to socket"); goto edg_wll_log_proto_client_proxy_end; } @@ -314,7 +330,7 @@ int edg_wll_log_proto_client_proxy(edg_wll_Context context, edg_wll_PlainConnect fprintf(stderr,"log_proto_client_proxy: reading answer from server...\n"); #endif if ((err = get_reply_plain(context, conn, &answer, &lbproto_code, &code)) != 0 ) { - edg_wll_SetError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_proxy(): error reading answer from L&B Proxy server"); + edg_wll_UpdateError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_proxy(): error reading answer from L&B Proxy server"); } else { #ifdef EDG_WLL_LOG_STUB fprintf(stderr,"log_proto_client_proxy: read answer \"%d:%d: %s\"\n",lbproto_code,code,answer); @@ -377,7 +393,8 @@ int edg_wll_log_proto_client_direct(edg_wll_Context context, edg_wll_GssConnecti len = encode_il_msg(&buffer, &ll); } if(len < 0) { - edg_wll_SetError(context, ENOMEM, "edg_wll_log_proto_client_direct(): error encoding message"); + edg_wll_SetError(context, errno, "encode_il_msg()"); + edg_wll_UpdateError(context, ENOMEM, "edg_wll_log_proto_client_direct(): error encoding message"); goto edg_wll_log_proto_client_direct_end; } @@ -396,7 +413,7 @@ int edg_wll_log_proto_client_direct(edg_wll_Context context, edg_wll_GssConnecti fprintf(stderr,"log_proto_client_direct: reading answer from server...\n"); #endif if ((err = get_reply_gss(context, con, &answer, &lbproto_code, &code)) != 0 ) { - edg_wll_SetError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_direct(): error reading answer from L&B direct server"); + edg_wll_UpdateError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_direct(): error reading answer from L&B direct server"); } else { #ifdef EDG_WLL_LOG_STUB fprintf(stderr,"log_proto_client_direct: read answer \"%d:%d: %s\"\n",lbproto_code,code,answer); diff --git a/org.glite.lb.common/Makefile b/org.glite.lb.common/Makefile index de0d012..76b088b 100644 --- a/org.glite.lb.common/Makefile +++ b/org.glite.lb.common/Makefile @@ -1,7 +1,5 @@ # Default values top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} stagedir=. distdir=. globalprefix=glite @@ -10,7 +8,6 @@ package=glite-lb-common version=0.0.0 PREFIX=/opt/glite -glite_location=/opt/glite globus_prefix=/opt/globus nothrflavour=gcc32 thrflavour=gcc32pthr @@ -48,7 +45,6 @@ CFLAGS:=${DEBUG} -I${top_srcdir}/src -I${top_srcdir}/interface \ -I. \ -I${top_srcdir}/test \ -I${stagedir}/include \ - -I${glite_location}/include \ -I${expat_prefix}/include \ ${COVERAGE_FLAGS} \ -D_GNU_SOURCE \ @@ -59,7 +55,8 @@ CFLAGS:=${DEBUG} -I${top_srcdir}/src -I${top_srcdir}/interface \ # major version more frequently. This variable specifies how many steps ahead # we are. -VERSION_AHEAD=1 +VERSION_AHEAD=2 +CHECK_VERSION:=VERSION=${version} VERSION_AHEAD=${VERSION_AHEAD} perl ${top_srcdir}/project/check_version.pl GLOBUS_LIBS:=-L${globus_prefix}/lib \ -lglobus_common_${nothrflavour} \ @@ -69,8 +66,6 @@ GLOBUS_THRLIBS:=-L${globus_prefix}/lib \ -lglobus_common_${thrflavour} \ -lglobus_gssapi_gsi_${thrflavour} \ -GLITE_LIBS:=-L${glite_location}/lib - ifneq (${expat_prefix},/usr) EXPAT_LIBS:=-L${expat_prefix}/lib endif @@ -131,10 +126,9 @@ endif default: all -#all compile: check_version ${STATICLIB} ${LTLIB} ${THRSTATICLIB} ${THRLTLIB} ${TRIO_LIB} ${MAILDIR_LIB} -all compile: ${STATICLIB} ${LTLIB} ${THRSTATICLIB} ${THRLTLIB} ${TRIO_LIB} ${MAILDIR_LIB} +all compile: check_version ${STATICLIB} ${LTLIB} ${THRSTATICLIB} ${THRLTLIB} ${TRIO_LIB} ${MAILDIR_LIB} -# FIXME: to use libtool versioning correcty, we should have: +# In order to use libtool versioning correcty, we must have: # # current = major + minor + offset # revision = patch @@ -142,11 +136,9 @@ all compile: ${STATICLIB} ${LTLIB} ${THRSTATICLIB} ${THRLTLIB} ${TRIO_LIB} ${MAI # # where offset is a sum of maximal released minor's of all previous major's # -# version_info=-version-info `echo ${version} | cut -d. -f1,2 | tr . :` - -# counted minors: 1.1 -offset=1 +# counted minors: 1.1, 3.1 +offset=2 version_info:=-version-info ${shell \ perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } @@ -244,6 +236,7 @@ install: fi clean: + rm -rf *.o *.lo .libs lib* %.o: %.c @@ -276,11 +269,4 @@ il_int_test.o il_string_test.o il_test.o il_msg_test.o: %.o: %.cpp chmod -w $@ >/dev/null check_version: - @perl -ne '/#define GLITE_LB_CLIENT_INTERFACE "(\d+)\.\d+\.\d+"/; \ - $$iface=$$1; \ - $$_="${version}"; /(\d+)\.\d+\.\d+/; \ - if ($$iface + ${VERSION_AHEAD} != $$1) { \ - print "error: Major version of the interface ($$iface+${VERSION_AHEAD}) does not match implementation ($$1)\n" ;\ - exit 1; \ - } \ - ' ${stagedir}/include/glite/lb/interface_version.h + ${CHECK_VERSION} ${stagedir}/include/glite/lb/interface_version.h diff --git a/org.glite.lb.common/build.xml b/org.glite.lb.common/build.xml index e3add29..a6f7224 100755 --- a/org.glite.lb.common/build.xml +++ b/org.glite.lb.common/build.xml @@ -20,6 +20,9 @@ Revision history: $Log$ + Revision 1.8 2005/08/03 09:30:17 akrenek + Merged the release 1.0 branch + Revision 1.7 2005/05/26 15:13:46 zurek inserted module.build.file @@ -114,6 +117,7 @@ + diff --git a/org.glite.lb.common/project/version.properties b/org.glite.lb.common/project/version.properties index 4523ba9..7cd00ba 100644 --- a/org.glite.lb.common/project/version.properties +++ b/org.glite.lb.common/project/version.properties @@ -1,3 +1,3 @@ #Fri Sep 02 14:17:07 CEST 2005 -module.version=4.0.0 -module.age=0 +module.version=4.0.2 +module.age=1 diff --git a/org.glite.lb.common/src/log_msg.c b/org.glite.lb.common/src/log_msg.c index 595ed19..9d01165 100644 --- a/org.glite.lb.common/src/log_msg.c +++ b/org.glite.lb.common/src/log_msg.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "context-int.h" @@ -119,8 +121,9 @@ int edg_wll_log_event_write( struct flock filelock; int filedesc, i, filelock_status=-1; + struct stat statbuf; - +try_again: if ( (outfile = fopen(event_file, "a")) == NULL ) { edg_wll_SetError(ctx, errno, "fopen()"); goto event_write_end; @@ -128,7 +131,6 @@ int edg_wll_log_event_write( if ( (filedesc = fileno(outfile)) == -1 ) { edg_wll_SetError(ctx, errno, "fileno()"); - fclose(outfile); goto cleanup; } @@ -149,7 +151,23 @@ int edg_wll_log_event_write( edg_wll_SetError(ctx, errno, "fcntl()"); goto cleanup; } - } else break; + } else { + /* check that the file still exists */ + if(stat(event_file, &statbuf)) { + if(errno == ENOENT) { + /* not there anymore - reopen it */ + fclose(outfile); + goto try_again; + } else { + /* could not stat the output file */ + edg_wll_SetError(ctx, errno, "stat()"); + goto cleanup; + } + } else { + /* file exists and is locked */ + break; + } + } } if (i == fcntl_attempts) { edg_wll_SetError(ctx, ETIMEDOUT, "timed out trying to lock event file"); diff --git a/org.glite.lb.logger/Makefile b/org.glite.lb.logger/Makefile index b141272..59ebe41 100644 --- a/org.glite.lb.logger/Makefile +++ b/org.glite.lb.logger/Makefile @@ -1,7 +1,5 @@ # defaults top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} stagedir=. distdir=. globalprefix=glite @@ -14,7 +12,6 @@ glite_location=/opt/glite globus_prefix=/opt/globus nothrflavour=gcc32 thrflavour=gcc32pthr -expat_prefix=/opt/expat -include Makefile.inc -include ../project/version.properties @@ -71,12 +68,12 @@ GLOBUS_THRLIBS:= -L${globus_prefix}/lib \ -lglobus_common_${thrflavour} \ -lglobus_gssapi_gsi_${thrflavour} -ifneq (${expat_prefix},/usr) - EXPAT_LIBS:=-L${expat_prefix}/lib -endif -EXPAT_LIBS:=${EXPAT_LIBS} -lexpat - -EXT_LIBS:= ${EXPAT_LIBS} +#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 diff --git a/org.glite.lb.logger/project/version.properties b/org.glite.lb.logger/project/version.properties index c3dfb91..da0cd2f 100644 --- a/org.glite.lb.logger/project/version.properties +++ b/org.glite.lb.logger/project/version.properties @@ -1,3 +1,3 @@ #Fri Sep 02 14:18:17 CEST 2005 -module.version=1.3.3 -module.age=0 +module.version=1.3.6 +module.age=1 diff --git a/org.glite.lb.logger/src/event_store.c b/org.glite.lb.logger/src/event_store.c index 365406b..6b7b3ce 100644 --- a/org.glite.lb.logger/src/event_store.c +++ b/org.glite.lb.logger/src/event_store.c @@ -280,6 +280,65 @@ event_store_write_ctl(struct event_store *es) /* + * 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 @@ -296,6 +355,7 @@ event_store_recover(struct event_store *es) FILE *ef; struct flock efl; char err_msg[128]; + struct stat stbuf; assert(es != NULL); @@ -344,6 +404,22 @@ event_store_recover(struct event_store *es) 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 */ @@ -435,8 +511,12 @@ event_store_recover(struct event_store *es) free(event_s); } if(msg == NULL) { - il_log(LOG_ALERT, " event file corrupted! Please move it to quarantine (ie. somewhere else) and restart interlogger.\n"); - break; + 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; @@ -482,6 +562,7 @@ event_store_recover(struct event_store *es) /* 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) @@ -509,6 +590,16 @@ event_store_sync(struct event_store *es, long offset) 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(es); + ret = (ret < 0) ? ret : 0; + return(ret); + +#if 0 event_store_lock_ro(es); if(es->offset == offset) /* we are up to date */ @@ -548,6 +639,7 @@ event_store_sync(struct event_store *es, long offset) } event_store_unlock(es); return(ret); +#endif } @@ -556,6 +648,12 @@ 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:! @@ -567,6 +665,7 @@ event_store_next(struct event_store *es, long offset, int len) es->offset += len; } event_store_unlock(es); +#endif return(0); } @@ -686,6 +785,11 @@ event_store_clean(struct event_store *es) 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 */ @@ -711,7 +815,6 @@ event_store_clean(struct event_store *es) } - /* -------------------------------- * event store management functions * -------------------------------- @@ -805,6 +908,11 @@ event_store_from_file(char *filename) 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"); @@ -1129,7 +1237,7 @@ event_store_cleanup() 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); + /* event_store_release(sl->es); */ clear_error(); /* go on to the next */ diff --git a/org.glite.lb.logger/src/il_error.c b/org.glite.lb.logger/src/il_error.c index e608b1c..1fe9bb9 100644 --- a/org.glite.lb.logger/src/il_error.c +++ b/org.glite.lb.logger/src/il_error.c @@ -143,6 +143,8 @@ set_error(int code, long minor, char *msg) 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); } diff --git a/org.glite.lb.logger/src/interlogd.c b/org.glite.lb.logger/src/interlogd.c index a8527b9..010a8bc 100644 --- a/org.glite.lb.logger/src/interlogd.c +++ b/org.glite.lb.logger/src/interlogd.c @@ -57,7 +57,7 @@ static void usage (int status) " -b, --book send events to bookkeeping server only\n" " -l, --log-server specify address of log server\n" " -s, --socket non-default path of local socket\n" - " -L, --lazy [] be lazy when closing connections to servers\n" + " -L, --lazy [] be lazy when closing connections to servers (default, timeout==0 means turn lazy off)\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" @@ -78,7 +78,7 @@ static int debug; static int verbose = 0; char *file_prefix = DEFAULT_PREFIX; int bs_only = 0; -int lazy_close = 0; +int lazy_close = 1; int default_close_timeout; #ifdef LB_PERF int nosend = 0, norecover=0, nosync=0, noparse=0; @@ -204,6 +204,10 @@ decode_switches (int argc, char **argv) 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; diff --git a/org.glite.lb.logger/src/interlogd.h b/org.glite.lb.logger/src/interlogd.h index 9ec0d55..810314e 100644 --- a/org.glite.lb.logger/src/interlogd.h +++ b/org.glite.lb.logger/src/interlogd.h @@ -92,6 +92,7 @@ struct event_store { 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 recovering; /* flag for recovery mode */ pthread_rwlock_t update_lock; /* lock to prevent simultaneous updates */ pthread_rwlock_t use_lock; /* lock to prevent struct deallocation */ diff --git a/org.glite.lb.logger/src/logd.c b/org.glite.lb.logger/src/logd.c index 775f789..5ab58e0 100644 --- a/org.glite.lb.logger/src/logd.c +++ b/org.glite.lb.logger/src/logd.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -157,12 +158,16 @@ doit(int socket, gss_cred_id_t cred_handle, char *file_name_prefix, int noipc, i OM_uint32 min_stat; gss_OID name_type = GSS_C_NO_OID; + struct sockaddr_in peer; + socklen_t alen = sizeof peer; + + getpeername(socket,(struct sockaddr *) &peer,&alen); /* authentication */ - edg_wll_ll_log(LOG_INFO,"Processing authentication:\n"); + edg_wll_ll_log(LOG_INFO,"%s: Processing authentication:\n",inet_ntoa(peer.sin_addr)); // FIXME - put here some meaningfull value of timeout + do somthing if timeouted ret = edg_wll_gss_accept(cred_handle,socket,&timeout,&con, &gss_stat); if (ret) { - edg_wll_ll_log(LOG_ERR,"edg_wll_gss_accept() failed\n"); + edg_wll_ll_log(LOG_ERR,"%s: edg_wll_gss_accept() failed\n",inet_ntoa(peer.sin_addr)); return(-1); } @@ -172,7 +177,7 @@ doit(int socket, gss_cred_id_t cred_handle, char *file_name_prefix, int noipc, i if (GSS_ERROR(gss_stat.major_status)) { char *gss_err; edg_wll_gss_get_error(&gss_stat, "Cannot read client identification", &gss_err); - edg_wll_ll_log(LOG_WARNING, "%s\n", gss_err); + edg_wll_ll_log(LOG_WARNING, "%s: %s\n", inet_ntoa(peer.sin_addr),gss_err); free(gss_err); } else { gss_stat.major_status = gss_display_name(&gss_stat.minor_status, client_name, @@ -180,7 +185,7 @@ doit(int socket, gss_cred_id_t cred_handle, char *file_name_prefix, int noipc, i if (GSS_ERROR(gss_stat.major_status)) { char *gss_err; edg_wll_gss_get_error(&gss_stat, "Cannot process client identification", &gss_err); - edg_wll_ll_log(LOG_WARNING, "%s\n", gss_err); + edg_wll_ll_log(LOG_WARNING, "%s: %s\n",inet_ntoa(peer.sin_addr),gss_err); free(gss_err); } } diff --git a/org.glite.lb.logger/src/send_event.c b/org.glite.lb.logger/src/send_event.c index 24e9e22..6a98039 100644 --- a/org.glite.lb.logger/src/send_event.c +++ b/org.glite.lb.logger/src/send_event.c @@ -231,6 +231,7 @@ event_queue_close(struct event_queue *eq) int event_queue_send(struct event_queue *eq) { + int events_sent = 0; assert(eq != NULL); #ifdef LB_PERF @@ -250,7 +251,6 @@ event_queue_send(struct event_queue *eq) size_t bytes_sent; struct timeval tv; edg_wll_GssStatus gss_stat; - int events_sent = 0; clear_error(); @@ -280,7 +280,10 @@ event_queue_send(struct event_queue *eq) if((code = get_reply(eq, &rep, &code_min)) < 0) { /* could not get the reply properly, so try again later */ il_log(LOG_ERR, " error reading server %s reply:\n %s\n", eq->dest_name, error_get_msg()); - eq->timeout = TIMEOUT; + if (events_sent>0) + eq->timeout = 1; + else + eq->timeout = TIMEOUT; return(0); } #ifdef LB_PERF diff --git a/org.glite.lb.proxy/project/version.properties b/org.glite.lb.proxy/project/version.properties index e2d64fb..81702af 100644 --- a/org.glite.lb.proxy/project/version.properties +++ b/org.glite.lb.proxy/project/version.properties @@ -1,3 +1,3 @@ #Fri Sep 02 14:18:53 CEST 2005 -module.version=1.3.3 +module.version=1.3.4 module.age=0 diff --git a/org.glite.lb.server-bones/Makefile b/org.glite.lb.server-bones/Makefile index 1f03996..100ef16 100644 --- a/org.glite.lb.server-bones/Makefile +++ b/org.glite.lb.server-bones/Makefile @@ -1,7 +1,5 @@ # defaults top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} stagedir=. distdir=. globalprefix=glite @@ -11,11 +9,6 @@ version=0.0.1 PREFIX=/opt/glite glite_location=/opt/glite -globus_prefix=/opt/globus -nothrflavour=gcc32 -thrflavour=gcc32pthr -expat_prefix=/opt/expat -cares_prefix=/opt/c-ares CC=gcc diff --git a/org.glite.lb.server-bones/project/version.properties b/org.glite.lb.server-bones/project/version.properties index eac2bae..f42d42a 100644 --- a/org.glite.lb.server-bones/project/version.properties +++ b/org.glite.lb.server-bones/project/version.properties @@ -1,3 +1,3 @@ #Fri Sep 02 14:17:59 CEST 2005 -module.version=2.2.2 -module.age=0 +module.version=2.2.3 +module.age=1 diff --git a/org.glite.lb.server-bones/src/srvbones.c b/org.glite.lb.server-bones/src/srvbones.c index cdac73e..fdb7ef0 100644 --- a/org.glite.lb.server-bones/src/srvbones.c +++ b/org.glite.lb.server-bones/src/srvbones.c @@ -472,6 +472,8 @@ static int slave(slave_data_init_hnd data_init_hnd, int sock) if ( newconn >= 0 ) { + int ret; + conn = newconn; srv = newsrv; gettimeofday(&client_start, NULL); @@ -506,12 +508,13 @@ static int slave(slave_data_init_hnd data_init_hnd, int sock) to = set_connect_to; if ( services[srv].on_new_conn_hnd - && services[srv].on_new_conn_hnd(conn, to.tv_sec >= 0 ? &to : NULL, clnt_data) ) + && (ret = services[srv].on_new_conn_hnd(conn, to.tv_sec >= 0 ? &to : NULL, clnt_data)) ) { - dprintf(("[%d] Connection not estabilished.\n", getpid())); - if ( !debug ) syslog(LOG_ERR, "Connection not estabilished.\n"); + dprintf(("[%d] Connection not estabilished, err = %d.\n", getpid(),ret)); + if ( !debug ) syslog(LOG_ERR, "Connection not estabilished, err = %d.\n",ret); close(conn); conn = srv = -1; + if (ret < 0) exit(1); continue; } gettimeofday(&client_done, NULL); diff --git a/org.glite.lb.server/Makefile b/org.glite.lb.server/Makefile index a81a14e..37e2cf9 100644 --- a/org.glite.lb.server/Makefile +++ b/org.glite.lb.server/Makefile @@ -41,9 +41,8 @@ else STATIC_LIB_BK:=libglite_lb_bkserver.a endif -ifdef LB_DAG_EMBRIONIC - LB_DAG_FLAGS:=-DLB_DAG_EMBRIONIC -endif +# Use embrionic DAG registration implicitely +LB_DAG_FLAGS:=-DLB_DAG_EMBRIONIC ifdef LB_BUF LB_BUF_FLAGS:=-DLB_BUF @@ -78,11 +77,11 @@ GRIDSITE_LIBS = -lgridsite_globus `xml2-config --libs` 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${gsoap_prefix}/include -I${gsoap_prefix}/ \ -I${classads_prefix}/include \ -I${voms_prefix}/include \ ${COVERAGE_FLAGS} \ @@ -308,7 +307,7 @@ test_soap_conv: test_soap_conv.cpp ${WS_CLIENT_OBJS} examples: ws_getversion ws_jobstat ws_query_ex ws_joblog ws_getversion: ws_getversion.o ${WS_CLIENT_OBJS} - ${LINK} -o $@ ws_getversion.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} + ${LINK} -o $@ ws_getversion.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} ws_jobstat: ws_jobstat.o ${WS_CLIENT_OBJS} ${LINK} -o $@ ws_jobstat.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} @@ -316,9 +315,6 @@ ws_jobstat: ws_jobstat.o ${WS_CLIENT_OBJS} ws_query_ex: ws_query_ex.o ${WS_CLIENT_OBJS} ${LINK} -o $@ ws_query_ex.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} -ws_query_ext: ws_query_ext.o ${WS_CLIENT_OBJS} - ${LINK} -o $@ ws_query_ext.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} - ws_joblog: ws_joblog.o ${WS_CLIENT_OBJS} ${LINK} -o $@ ws_joblog.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} diff --git a/org.glite.lb.server/config/startup b/org.glite.lb.server/config/startup index f39c10e..597ddaf 100755 --- a/org.glite.lb.server/config/startup +++ b/org.glite.lb.server/config/startup @@ -13,6 +13,7 @@ GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite} [ -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" unset creds port @@ -35,26 +36,31 @@ start() fi [ -z "$GLITE_LB_EXPORT_DUMPDIR" ] && GLITE_LB_EXPORT_DUMPDIR=/tmp/dump - purgedir="--dump-prefix $GLITE_LB_EXPORT_DUMPDIR" + 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_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=/tmp/jpreg - 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" + [ -z "$GLITE_LB_EXPORT_PURGEDIR" ] && GLITE_LB_EXPORT_PURGEDIR=/tmp/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 + [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=/tmp/jpreg + [ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPREG_MAILDIR" + maildir="--jpreg-dir $GLITE_LB_EXPORT_JPREG_MAILDIR" + fi + super="--super-users-file $GLITE_LOCATION/etc/LB-super-users" [ -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_SOCK" ] && GLITE_LB_NOTIF_SOCK="/tmp/glite-lb-notif.sock" [ -z "$GLITE_LB_NOTIF_FPREFIX" ] && GLITE_LB_NOTIF_FPREFIX="/var/tmp/glite-lb-notif" echo -n Starting glite-lb-bkserver ... su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-bkserverd \ --notif-il-sock=$GLITE_LB_NOTIF_SOCK \ --notif-il-fprefix=$GLITE_LB_NOTIF_FPREFIX \ - $creds -i $pidfile $port $wport $purgedir $maildir" \ + $super $creds -i $pidfile $port $wport $dumpdir $purgedir $maildir" \ && echo " done" || echo " FAILED" echo -n Starting glite-lb-notif-interlogd ... diff --git a/org.glite.lb.server/examples/ws_joblog.c b/org.glite.lb.server/examples/ws_joblog.c index fc86a38..a3bff54 100644 --- a/org.glite.lb.server/examples/ws_joblog.c +++ b/org.glite.lb.server/examples/ws_joblog.c @@ -1,16 +1,17 @@ #include #include -#include "glite/security/glite_gsplugin.h" #include "glite/lb/consumer.h" #include "glite/lb/events_parse.h" +#include "soap_version.h" +#include "glite/security/glite_gsplugin.h" +#include "glite/security/glite_gscompat.h" + #include "bk_ws_H.h" #include "ws_typeref.h" #include "ws_fault.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define soap_call___lb__QueryEvents soap_call___ns1__QueryEvents #endif @@ -41,8 +42,7 @@ int main(int argc,char** argv) struct soap *mydlo = soap_new(); struct _lbe__QueryEventsResponse out; struct _lbe__QueryEvents in; - edg_wll_QueryRec **jconds = NULL, - **econds = NULL; + edg_wll_QueryRec **jconds = NULL; edg_wll_QueryRec j[2], e[1]; int opt, err, i; edg_wlc_JobId job; @@ -86,7 +86,6 @@ int main(int argc,char** argv) glite_gsplugin_set_udata(mydlo, ctx); - /* prepare job log query */ memset(j,0,sizeof j); memset(e,0,sizeof e); diff --git a/org.glite.lb.server/examples/ws_jobstat.c b/org.glite.lb.server/examples/ws_jobstat.c index 2130a28..e6f2cf9 100644 --- a/org.glite.lb.server/examples/ws_jobstat.c +++ b/org.glite.lb.server/examples/ws_jobstat.c @@ -1,15 +1,15 @@ #include #include +#include "soap_version.h" #include "glite/security/glite_gsplugin.h" +#include "glite/security/glite_gscompat.h" #include "glite/lb/consumer.h" #include "bk_ws_H.h" #include "ws_typeref.h" #include "ws_fault.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define soap_call___lb__JobStatus soap_call___ns1__JobStatus #endif @@ -40,7 +40,6 @@ int main(int argc,char** argv) struct soap *mydlo = soap_new(); struct _lbe__JobStatusResponse out; struct _lbe__JobStatus in; - struct lbt__jobFlags flags = { 0, NULL }; int opt, err; char *server = "http://localhost:9003/", *jobid = NULL, @@ -77,9 +76,9 @@ int main(int argc,char** argv) glite_gsplugin_set_udata(mydlo, ctx); - in.jobid = jobid; - in.flags = &flags; - + in.jobid = soap_strdup(mydlo, jobid); + in.flags = soap_malloc(mydlo, sizeof(*in.flags)); + edg_wll_JobStatFlagsToSoap(mydlo, 0, in.flags); switch (err = soap_call___lb__JobStatus(mydlo, server, "",&in,&out)) { @@ -162,7 +161,9 @@ static void printstat(edg_wll_JobStat stat, int level) printf("%srsl : %s\n", ind, stat.rsl); printf("%sreason : %s\n", ind, stat.reason); printf("%slocation : %s\n", ind, stat.location); - printf("%ssubjob_failed : %d\n", ind, stat.subjob_failed); + printf("%sce_node : %s\n", ind, stat.ce_node); + printf("%ssubjob_failed : %d\n", ind, stat.subjob_failed); +// printf("%sdone_code : %d\n", ind, edg_wll_done_codeToString(stat.done_code)); printf("%sdone_code : %d\n", ind, stat.done_code); printf("%sexit_code : %d\n", ind, stat.exit_code); printf("%sresubmitted : %d\n", ind, stat.resubmitted); @@ -188,6 +189,17 @@ static void printstat(edg_wll_JobStat stat, int level) printf("%sexpectUpdate : %d\n", ind, stat.expectUpdate); printf("%sexpectFrom : %s\n", ind, stat.expectFrom); printf("%sacl : %s\n", ind, stat.acl); + printf("%spayload_running: %d\n", ind, stat.payload_running); + if (stat.possible_destinations) { + printf("%spossible_destinations : \n", ind); + for (i=0; stat.possible_destinations[i]; i++) + printf("%s\t%s \n", ind, stat.possible_destinations[i]); + } + if (stat.possible_ce_nodes) { + printf("%spossible_ce_nodes : \n", ind); + for (i=0; stat.possible_ce_nodes[i]; i++) + printf("%s\t%s \n", ind, stat.possible_ce_nodes[i]); + } printf("\n"); free(j1); diff --git a/org.glite.lb.server/examples/ws_query_ex.c b/org.glite.lb.server/examples/ws_query_ex.c index 1b627a4..b20e457 100644 --- a/org.glite.lb.server/examples/ws_query_ex.c +++ b/org.glite.lb.server/examples/ws_query_ex.c @@ -1,15 +1,16 @@ #include #include -#include "glite/security/glite_gsplugin.h" #include "glite/lb/consumer.h" +#include "soap_version.h" +#include "glite/security/glite_gsplugin.h" +#include "glite/security/glite_gscompat.h" + #include "bk_ws_H.h" #include "ws_fault.h" #include "ws_typeref.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define soap_call___lb__QueryJobs soap_call___ns1__QueryJobs #endif @@ -43,7 +44,7 @@ int main(int argc,char** argv) int opt, err; char *server = "http://localhost:9003/", *name = NULL; - int i, j; + int i; name = strrchr(argv[0],'/'); if (name) name++; else name = argv[0]; @@ -75,15 +76,18 @@ int main(int argc,char** argv) conditions[1] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); conditions[1][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conditions[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[1][0].value.c = NULL; +#warning FIXME: NULL should work, use optional in WSDL? +// conditions[1][0].op = EDG_WLL_QUERY_OP_EQUAL; +// conditions[1][0].value.c = NULL; + conditions[1][0].op = EDG_WLL_QUERY_OP_UNEQUAL; + conditions[1][0].value.c = "x"; qjobs = soap_malloc(soap, sizeof(*qjobs)); memset(qjobs, 0, sizeof(*qjobs)); qjobs->flags = soap_malloc(soap, sizeof(*qjobs->flags)); memset(qjobs->flags, 0, sizeof(*qjobs->flags)); if (!qjobs->flags || edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec **)conditions, &qjobs->__sizeconditions, &qjobs->conditions) - || edg_wll_JobStatFlagsToSoap(soap, 0, qjobs->flags) ) { + || edg_wll_JobStatFlagsToSoap(soap, EDG_WLL_STAT_CLASSADS || EDG_WLL_STAT_CHILDREN || EDG_WLL_STAT_CHILDSTAT, qjobs->flags) ) { char *et,*ed; fprintf(stderr, "%s: soap types conversion error...\n", argv[0]); @@ -107,7 +111,7 @@ int main(int argc,char** argv) edg_wll_JobStatCode statCode; - edg_wll_SoapToJobStatCode(out.states[i]->state, &statCode); + edg_wll_SoapToJobStatCode(GLITE_SECURITY_GSOAP_LIST_GET(out.states, i)->state, &statCode); char *s = edg_wll_StatToString(statCode); printf("%-65s%s\n", out.jobs[i], s); free(s); diff --git a/org.glite.lb.server/interface/job-record.xsd b/org.glite.lb.server/interface/job-record.xsd index 43b0bab..bee8e14 100644 --- a/org.glite.lb.server/interface/job-record.xsd +++ b/org.glite.lb.server/interface/job-record.xsd @@ -13,6 +13,9 @@ attributeFormDefault="unqualified" > + + diff --git a/org.glite.lb.server/project/version.properties b/org.glite.lb.server/project/version.properties index 86b1948..bd3ff52 100644 --- a/org.glite.lb.server/project/version.properties +++ b/org.glite.lb.server/project/version.properties @@ -1,3 +1,3 @@ #Fri Sep 02 14:18:35 CEST 2005 -module.version=1.4.3 -module.age=0 +module.version=1.4.6 +module.age=1 diff --git a/org.glite.lb.server/src/bkserverd.c b/org.glite.lb.server/src/bkserverd.c index d04f934..af8c756 100644 --- a/org.glite.lb.server/src/bkserverd.c +++ b/org.glite.lb.server/src/bkserverd.c @@ -742,17 +742,21 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) +/* don't care :-( 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, NULL, &gss_code) ) { dprintf(("[%d] reloading credentials\n", getpid())); gss_release_cred(&min_stat, &mycred); mycred = newcred; - } else { dprintf(("[%d] reloading credentials failed\n", getpid())); } + } 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) ) { @@ -811,6 +815,8 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) 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->connPool[ctx->connToUse].peerName); + ctx->connPool[ctx->connToUse].peerName = strdup(inet_ntoa(a.sin_addr)); break; } @@ -869,17 +875,32 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) 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->connPool[ctx->connToUse].gss, &gss_code)) ) { if ( ret == EDG_WLL_GSS_ERROR_TIMEOUT ) { - dprintf(("[%d] Client authentication failed - timeout reached, closing.\n", getpid())); - if (!debug) syslog(LOG_ERR, "Client authentication failed - timeout reached"); + dprintf(("[%d] %s: Client authentication failed - timeout reached, closing.\n", getpid(),ctx->connPool[ctx->connToUse].peerName)); + if (!debug) syslog(LOG_ERR, "%s: Client authentication failed - timeout reached",ctx->connPool[ctx->connToUse].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->connPool[ctx->connToUse].peerName,ctx->errDesc)); + if (!debug) syslog(LOG_ERR,"[%d] %s: false expired certificate: %s",getpid(),ctx->connPool[ctx->connToUse].peerName,ctx->errDesc); + edg_wll_FreeContext(ctx); + return -1; + } } else { - dprintf(("[%d] Client authentication failed, closing.\n", getpid())); - if (!debug) syslog(LOG_ERR, "Client authentication failed"); + dprintf(("[%d] %s: Client authentication failed, closing.\n", getpid(),ctx->connPool[ctx->connToUse].peerName)); + if (!debug) syslog(LOG_ERR, "%s: Client authentication failed",ctx->connPool[ctx->connToUse].peerName); } edg_wll_FreeContext(ctx); @@ -1404,8 +1425,9 @@ static int read_roots(const char *file) int cnt = 0; if (!roots) { - perror(file); - return 1; + 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 (!feof(roots)) { diff --git a/org.glite.lb.server/src/jobstat.c b/org.glite.lb.server/src/jobstat.c index d002abe..1dfec69 100644 --- a/org.glite.lb.server/src/jobstat.c +++ b/org.glite.lb.server/src/jobstat.c @@ -654,7 +654,6 @@ edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, edg_wll_JobStat *stat_out) { intJobStat *ijsp; - int intErr = 0; int flags = 0; int res; int be_strict = 0; @@ -663,11 +662,10 @@ edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, edg_wll_JobStat oldstat; char *oldstat_rgmaline = NULL; + memset(&oldstat,0,sizeof oldstat); - if (seq != 0) { - intErr = edg_wll_LoadIntState(ctx, job, seq - 1, &ijsp); - } - if (seq != 0 && !intErr) { + + if (!edg_wll_LoadIntState(ctx, job, seq - 1, &ijsp)) { edg_wll_CpyStatus(&ijsp->pub,&oldstat); if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(&ijsp->pub); diff --git a/org.glite.lb.server/src/lb_plugin.c b/org.glite.lb.server/src/lb_plugin.c index 0eb5afe..162dfa7 100644 --- a/org.glite.lb.server/src/lb_plugin.c +++ b/org.glite.lb.server/src/lb_plugin.c @@ -16,6 +16,7 @@ #include "glite/lb/events.h" #include "glite/lb/events_parse.h" #include "glite/lb/trio.h" +#include "glite/lb/producer.h" #include "jobstat.h" #include "get_events.h" @@ -48,7 +49,7 @@ typedef struct _lb_historyStatus { typedef struct _lb_handle { edg_wll_Event **events; edg_wll_JobStat status; - lb_historyStatus **fullStatusHistory, **lastStatusHistory; + lb_historyStatus **fullStatusHistory, **lastStatusHistory, *finalStatus; } lb_handle; #define check_strdup(s) ((s) ? strdup(s) : NULL) @@ -107,8 +108,9 @@ static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { char *line; int retval; edg_wll_Context context; - int nevents, maxnevents, i; - glite_jp_error_t err; + int nevents, maxnevents, i; + glite_jp_error_t err; + char *id0 = NULL,*id = NULL; glite_jp_clear_error(ctx); h = calloc(1, sizeof(lb_handle)); @@ -151,6 +153,24 @@ static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { free(ed); goto fail; } + if (nevents == 0) { + id0 = edg_wlc_JobIdGetUnique(h->events[nevents]->any.jobId ); + } else { + id = edg_wlc_JobIdGetUnique(h->events[nevents]->any.jobId ); + if (strcmp(id0,id) != 0) { + char et[BUFSIZ]; + retval = EINVAL; + err.code = retval; + snprintf(et,sizeof et,"Attempt to process different jobs. Id '%s' (event n.%d) differs from '%s'",id,nevents+1,id0); + et[BUFSIZ-1] = 0; + err.desc = et; + err.source = "lb_plugin.c:edg_wlc_JobIdGetUnique()"; + glite_jp_stack_error(ctx,&err); + goto fail; + } + } + + if (id) free(id); id = NULL; nevents++; } free(line); @@ -178,7 +198,7 @@ static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { fprintf(stderr,"lb_plugin: opened %d events\n", nevents); #endif - /* count state and status hiftory of the job given by the loaded events */ + /* count state and status history of the job given by the loaded events */ if ((retval = lb_status(h)) != 0) goto fail; *handle = (void *)h; @@ -186,12 +206,17 @@ static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { return 0; fail: +#ifdef PLUGIN_DEBUG + fprintf(stderr,"lb_plugin: open ERROR\n"); +#endif for (i = 0; i < nevents; i++) { edg_wll_FreeEvent(h->events[i]); free(h->events[i]); } free(h->events); free(buffer.buf); + if (id0) free(id0); + if (id) free(id); edg_wll_FreeContext(context); free(h); *handle = NULL; @@ -230,6 +255,9 @@ static int lb_close(void *fpctx,void *handle) { free (h->fullStatusHistory[i]); i++; } + h->fullStatusHistory = NULL; + h->lastStatusHistory = NULL; + h->finalStatus = NULL; } free(h); @@ -247,7 +275,7 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t glite_jp_context_t ctx = (glite_jp_context_t) fpctx; glite_jp_error_t err; glite_jp_attrval_t *av = NULL; - int i, n_tags; + int i, j, n_tags; const char *tag; glite_jp_clear_error(ctx); @@ -288,81 +316,66 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else if (strcmp(attr, GLITE_JP_LB_VO) == 0) { - i = 0; - while (h->events[i]) { - if (h->events[i]->type == EDG_WLL_EVENT_REGJOB) { - struct cclassad *ad; - char *string_vo = NULL; - - ad = cclassad_create(h->events[i]->regJob.jdl); - if (ad) { - if (cclassad_evaluate_to_string(ad, "VirtualOrganisation", &string_vo)) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(string_vo); - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - } - cclassad_delete(ad); - if (string_vo) free(string_vo); + if (h->status.jdl) { + struct cclassad *ad; + char *string_vo = NULL; + + ad = cclassad_create(h->status.jdl); + if (ad) { + if (cclassad_evaluate_to_string(ad, "VirtualOrganisation", &string_vo)) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = check_strdup(string_vo); + av[0].timestamp = h->status.lastUpdateTime.tv_sec; } - break; + cclassad_delete(ad); + if (string_vo) free(string_vo); } - i++; } } else if (strcmp(attr, GLITE_JP_LB_eNodes) == 0) { - i = 0; - while (h->events[i]) { - if (h->events[i]->type == EDG_WLL_EVENT_REGJOB) { - struct cclassad *ad; - char *string_nodes = NULL; - - ad = cclassad_create(h->events[i]->regJob.jdl); - if (ad) { - if (cclassad_evaluate_to_string(ad, "max_nodes_running", &string_nodes)) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(string_nodes); - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - } - cclassad_delete(ad); - if (string_nodes) free(string_nodes); + if (h->status.jdl) { + struct cclassad *ad; + char *string_nodes = NULL; + + ad = cclassad_create(h->status.jdl); + if (ad) { + if (cclassad_evaluate_to_string(ad, "max_nodes_running", &string_nodes)) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = check_strdup(string_nodes); + av[0].timestamp = h->status.lastUpdateTime.tv_sec; } - break; + cclassad_delete(ad); + if (string_nodes) free(string_nodes); } - i++; } } else if (strcmp(attr, GLITE_JP_LB_eProc) == 0) { - i = 0; - while (h->events[i]) { - if (h->events[i]->type == EDG_WLL_EVENT_REGJOB) { - struct cclassad *ad; - char *string_nodes = NULL; - - ad = cclassad_create(h->events[i]->regJob.jdl); - if (ad) { - if (cclassad_evaluate_to_string(ad, "NodeNumber", &string_nodes)) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(string_nodes); - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - } - cclassad_delete(ad); - if (string_nodes) free(string_nodes); + if (h->status.jdl) { + struct cclassad *ad; + char *string_nodes = NULL; + + ad = cclassad_create(h->status.jdl); + if (ad) { + if (cclassad_evaluate_to_string(ad, "NodeNumber", &string_nodes)) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = check_strdup(string_nodes); + av[0].timestamp = h->status.lastUpdateTime.tv_sec; } - break; + cclassad_delete(ad); + if (string_nodes) free(string_nodes); } - i++; } } else if (strcmp(attr, GLITE_JP_LB_aTag) == 0 || strcmp(attr, GLITE_JP_LB_rQType) == 0 || strcmp(attr, GLITE_JP_LB_eDuration) == 0) { /* have to be retrieved from JDL, but probably obsolete and not needed at all */ - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOSYS; - trio_asprintf(&et,"Attribute '%s' not implemented yet.",attr); - err.desc = strdup(et); - free(et); + snprintf(et,sizeof et,"Attribute '%s' not implemented yet.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } else if (strcmp(attr, GLITE_JP_LB_RB) == 0) { if (h->status.network_server) { @@ -389,13 +402,20 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else if (strcmp(attr, GLITE_JP_LB_UIHost) == 0) { - if (h->status.location) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.location); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } + i = 0; + while (h->events[i]) { + if (h->events[i]->type == EDG_WLL_EVENT_REGJOB) { + if (h->events[i]->any.host) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->events[i]->any.host); + av[0].size = -1; + av[0].timestamp = h->events[i]->any.timestamp.tv_sec; + } + break; + } + i++; + } } else if (strcmp(attr, GLITE_JP_LB_CPUTime) == 0) { if (h->status.cpuTime) { av = calloc(2, sizeof(glite_jp_attrval_t)); @@ -406,22 +426,38 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t } } else if (strcmp(attr, GLITE_JP_LB_NProc) == 0) { /* currently LB hasn't got the info */ - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOSYS; - trio_asprintf(&et,"Attribute '%s' not implemented yet.",attr); - err.desc = strdup(et); - free(et); + snprintf(et,sizeof et,"Attribute '%s' not implemented yet.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } else if (strcmp(attr, GLITE_JP_LB_finalStatus) == 0) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); - av[0].value = edg_wll_StatToString(h->status.state); + if (h->finalStatus) { + av[0].value = edg_wll_StatToString(h->finalStatus->state); + av[0].timestamp = h->finalStatus->timestamp.tv_sec; + } else { + av[0].value = edg_wll_StatToString(h->status.state); + av[0].timestamp = h->status.lastUpdateTime.tv_sec; + } av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; } else if (strcmp(attr, GLITE_JP_LB_finalStatusDate) == 0) { struct tm *t = NULL; - if ((t = gmtime(&h->status.lastUpdateTime.tv_sec)) != NULL) { + if ( (h->finalStatus) && + ((t = gmtime(&h->finalStatus->timestamp.tv_sec)) != NULL) ) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ + trio_asprintf(&av[0].value,"%04d-%02d-%02dT%02d:%02d:%02d.%06d", + 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, + t->tm_hour, t->tm_min, t->tm_sec, + h->finalStatus->timestamp.tv_usec); + av[0].size = -1; + av[0].timestamp = h->finalStatus->timestamp.tv_sec; + } else if ((t = gmtime(&h->status.lastUpdateTime.tv_sec)) != NULL) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ @@ -433,7 +469,13 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else if (strcmp(attr, GLITE_JP_LB_finalStatusReason) == 0) { - if (h->status.reason) { + if (h->finalStatus && h->finalStatus->reason) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->finalStatus->reason); + av[0].size = -1; + av[0].timestamp = h->finalStatus->timestamp.tv_sec; + } else if (h->status.reason) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); av[0].value = strdup(h->status.reason); @@ -441,26 +483,40 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else if (strcmp(attr, GLITE_JP_LB_LRMSDoneStatus) == 0) { + i = 0; + j = -1; + while (h->events[i]) { + if ( (h->events[i]->type == EDG_WLL_EVENT_DONE) && + (h->events[i]->any.source == EDG_WLL_SOURCE_LRMS) ) + j = i; + i++; + } av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); - av[0].value = edg_wll_DoneStatus_codeToString(h->status.done_code); av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; + if ( j != -1) { + av[0].value = edg_wll_DoneStatus_codeToString(h->events[j]->done.status_code); + av[0].timestamp = h->events[j]->any.timestamp.tv_sec; + } else { + av[0].value = edg_wll_DoneStatus_codeToString(h->status.done_code); + av[0].timestamp = h->status.lastUpdateTime.tv_sec; + } } else if (strcmp(attr, GLITE_JP_LB_LRMSStatusReason) == 0) { i = 0; + j = -1; while (h->events[i]) { - if (h->events[i]->type == EDG_WLL_EVENT_DONE) { - if (h->events[i]->done.reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->events[i]->done.reason); - av[0].size = -1; - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - } - break; - } + if ( (h->events[i]->type == EDG_WLL_EVENT_DONE) && + (h->events[i]->any.source == EDG_WLL_SOURCE_LRMS) ) + j = i; i++; } + if ( ( j != -1) && (h->events[j]->done.reason) ) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->events[j]->done.reason); + av[0].size = -1; + av[0].timestamp = h->events[j]->any.timestamp.tv_sec; + } } else if (strcmp(attr, GLITE_JP_LB_retryCount) == 0) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); @@ -469,12 +525,12 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t av[0].timestamp = h->status.lastUpdateTime.tv_sec; } else if (strcmp(attr, GLITE_JP_LB_additionalReason) == 0) { /* what is it? */ - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOSYS; - trio_asprintf(&et,"Attribute '%s' not implemented yet.",attr); - err.desc = strdup(et); - free(et); + snprintf(et,sizeof et,"Attribute '%s' not implemented yet.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } else if (strcmp(attr, GLITE_JP_LB_jobType) == 0) { av = calloc(2, sizeof(glite_jp_attrval_t)); @@ -502,8 +558,7 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t old_val = strdup (""); for (i=0; istatus.children_num; i++) { trio_asprintf(&val,"%s\t\t%s\n", - old_val, ""); -// FIXME: h->status.children[i] ? h->status.children[i] : ""); + old_val, h->status.children[i] ? h->status.children[i] : ""); if (old_val) free(old_val); old_val = val; val = NULL; } @@ -513,12 +568,12 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t av[0].size = -1; av[0].timestamp = h->status.lastUpdateTime.tv_sec; } else { - char *et; + char et[BUFSIZ]; *attrval = NULL; - err.code = 0; - trio_asprintf(&et,"Value unknown for attribute '%s', there are no subjobs.",attr); - err.desc = strdup(et); - free(et); + err.code = ENOENT; + snprintf(et,sizeof et,"Value unknown for attribute '%s', there are no subjobs.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } } else if (strcmp(attr, GLITE_JP_LB_lastStatusHistory) == 0) { @@ -654,26 +709,20 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t } } } else if (strcmp(attr, GLITE_JP_LB_JDL) == 0) { - i = 0; - while (h->events[i]) { - if ((h->events[i]->type == EDG_WLL_EVENT_REGJOB) && - (h->events[i]->regJob.jdl) ) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->events[i]->regJob.jdl); - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - av[0].size = -1; - break; - } - i++; + if (h->status.jdl) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->status.jdl); + av[0].size = -1; + av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else { - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = EINVAL; - trio_asprintf(&et,"No such attribute '%s'.",attr); - err.desc = strdup(et); - free(et); + snprintf(et,sizeof et,"No such attribute '%s'.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } @@ -682,12 +731,12 @@ static int lb_query(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t *attrval = av; return 0; } else { - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOENT; - trio_asprintf(&et,"Value unknown for attribute '%s'.",attr); - err.desc = strdup(et); - free(et); + snprintf(et,sizeof et,"Value unknown for attribute '%s'.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; if (av) glite_jp_attrval_free(av,1); // XXX: probably not needed return glite_jp_stack_error(ctx,&err); } @@ -698,7 +747,7 @@ static int lb_status(void *handle) { lb_handle *h = (lb_handle *) handle; intJobStat *js; - int maxnstates, nstates, i, be_strict = 0; + int maxnstates, nstates, i, be_strict = 0, retval; char *errstring; edg_wll_JobStatCode old_state = EDG_WLL_JOB_UNDEF; @@ -711,6 +760,7 @@ static int lb_status(void *handle) { nstates = 0; h->fullStatusHistory = calloc(maxnstates, sizeof(lb_historyStatus *)); h->lastStatusHistory = NULL; + h->finalStatus = NULL; i = 0; while (h->events[i]) { @@ -739,9 +789,14 @@ static int lb_status(void *handle) { h->fullStatusHistory[nstates]->timestamp.tv_sec = js->pub.stateEnterTime.tv_sec; h->fullStatusHistory[nstates]->timestamp.tv_usec = js->pub.stateEnterTime.tv_usec; h->fullStatusHistory[nstates]->reason = check_strdup(js->pub.reason); + /* lastStatusHistory starts from the last WAITING state */ if (js->pub.state == EDG_WLL_JOB_WAITING) { h->lastStatusHistory = &(h->fullStatusHistory[nstates]); } + /* finalStatus is the one preceeding the CLEARED state */ + if ( (js->pub.state == EDG_WLL_JOB_CLEARED) && (nstates > 0) ) { + h->finalStatus = h->fullStatusHistory[nstates-1]; + } old_state = js->pub.state; nstates++; } @@ -749,6 +804,31 @@ static int lb_status(void *handle) { i++; } h->fullStatusHistory[nstates] = NULL; + /* if there is no CLEARED state, finalStatus is just the last status + and if there is no such thing, leave h->finalStatus NULL and for the attribute + try to read something from the h->status */ + if ( (h->finalStatus == NULL) && (nstates > 0) ) { + h->finalStatus = h->fullStatusHistory[nstates-1]; + } + + /* fill in also subjobs */ + if (js->pub.children_num > 0) { + edg_wll_Context context; + edg_wlc_JobId *subjobs; + + if ((retval = edg_wll_InitContext(&context)) != 0) return retval; + subjobs = calloc(js->pub.children_num, sizeof (*subjobs)); + if ((retval = edg_wll_GenerateSubjobIds(context, + js->pub.jobId, js->pub.children_num, js->pub.seed, &subjobs) ) != 0 ) { + goto err; + } + js->pub.children = calloc(js->pub.children_num + 1, sizeof (*js->pub.children)); + for (i=0; ipub.children_num; i++) { + js->pub.children[i] = edg_wlc_JobIdUnparse(subjobs[i]); + } + edg_wll_FreeContext(context); + free(subjobs); + } memcpy(&h->status, &js->pub, sizeof(edg_wll_JobStat)); diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c index 0d77044..7cbcc6e 100644 --- a/org.glite.lb.server/src/query.c +++ b/org.glite.lb.server/src/query.c @@ -400,8 +400,10 @@ limit_cycle_cleanup: edg_wll_FreeStmt(&sh); } while ( limit_loop ); - if ( eperm && !*jobs_out ) - edg_wll_SetError(ctx, EPERM, "matching jobs found but authorization failed"); + 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) ) { diff --git a/org.glite.lb.server/src/ws_fault.c b/org.glite.lb.server/src/ws_fault.c index 90bb132..869cf01 100644 --- a/org.glite.lb.server/src/ws_fault.c +++ b/org.glite.lb.server/src/ws_fault.c @@ -2,32 +2,45 @@ #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 GFITEM reason + #define GFNUM SOAP_TYPE_lbt__genericFault +#else + #define GFITEM lbe__genericFault + #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 = soap_malloc(soap,sizeof *detail); +#if GSOAP_VERSION >= 20709 + struct lbt__genericFault *f = soap_malloc(soap,sizeof *f); +#else struct _genericFault *f = soap_malloc(soap,sizeof *f); +#endif + f->GFITEM = soap_malloc(soap,sizeof *f->GFITEM); + memset(f->GFITEM, 0, sizeof(*f->GFITEM)); - f->lbe__genericFault = soap_malloc(soap,sizeof *f->lbe__genericFault); - memset(f->lbe__genericFault, 0, sizeof(*f->lbe__genericFault)); - - f->lbe__genericFault->code = edg_wll_Error(ctx,&et,&ed); - f->lbe__genericFault->text = soap_malloc(soap,strlen(et)+1); - strcpy(f->lbe__genericFault->text,et); + f->GFITEM->code = edg_wll_Error(ctx,&et,&ed); + f->GFITEM->text = soap_malloc(soap,strlen(et)+1); + strcpy(f->GFITEM->text,et); free(et); if (ed) { - f->lbe__genericFault->description = soap_malloc(soap,strlen(ed)+1); - strcpy(f->lbe__genericFault->description,ed); + f->GFITEM->description = soap_malloc(soap,strlen(ed)+1); + strcpy(f->GFITEM->description,ed); free(ed); } - detail->__type = SOAP_TYPE__genericFault; + detail->__type = GFNUM; #if GSOAP_VERSION >= 20700 detail->fault = f; #else @@ -43,13 +56,19 @@ void edg_wll_ErrToFault(const edg_wll_Context ctx,struct soap *soap) void edg_wll_FaultToErr(const struct soap *soap,edg_wll_Context ctx) { - struct SOAP_ENV__Detail *detail = soap->version == 2 ? - soap->fault->SOAP_ENV__Detail : soap->fault->detail; - + struct SOAP_ENV__Detail *detail; struct lbt__genericFault *f; - if (detail->__type == SOAP_TYPE__genericFault) { -#if GSOAP_VERSION >= 20700 + 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 = detail->lbe__genericFault; +#elif GSOAP_VERSION >= 20700 f = ((struct _genericFault *) detail->fault) ->lbe__genericFault; #else @@ -62,7 +81,7 @@ void edg_wll_FaultToErr(const struct soap *soap,edg_wll_Context ctx) char *s; asprintf(&s,"SOAP: %s", soap->version == 2 ? - soap->fault->SOAP_ENV__Reason : soap->fault->faultstring); + GLITE_SECURITY_GSOAP_REASON(soap) : soap->fault->faultstring); edg_wll_SetError(ctx,EINVAL,s); free(s); } diff --git a/org.glite.lb.server/src/ws_query.c b/org.glite.lb.server/src/ws_query.c index 814f0ad..58086aa 100644 --- a/org.glite.lb.server/src/ws_query.c +++ b/org.glite.lb.server/src/ws_query.c @@ -1,10 +1,12 @@ #include -#include "glite/security/glite_gsplugin.h" - #include "glite/lb/context-int.h" #include "glite/lb/consumer.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" @@ -12,8 +14,6 @@ #include "ws_fault.h" #include "ws_typeref.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define __lb__GetVersion __ns1__GetVersion #define __lb__JobStatus __ns1__JobStatus @@ -66,7 +66,8 @@ SOAP_FMAC5 int SOAP_FMAC6 __lb__JobStatus( return SOAP_FAULT; } - edg_wll_StatusToSoap(soap, &s, &(out->stat)); + out->stat = soap_malloc(soap, sizeof(*out->stat)); + edg_wll_StatusToSoap(soap, &s, out->stat); return SOAP_OK; } diff --git a/org.glite.lb.server/src/ws_typeref.c.T b/org.glite.lb.server/src/ws_typeref.c.T index 5853f2a..2be99af 100644 --- a/org.glite.lb.server/src/ws_typeref.c.T +++ b/org.glite.lb.server/src/ws_typeref.c.T @@ -10,6 +10,16 @@ #include "glite/lb/consumer.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 @@ -32,7 +42,7 @@ sub eventFieldAssign { $soap_fn = $1.ucfirst($2); }; $source = "$src->$native_en.$native_fn"; - $dest = "$dst->$soap_en->$soap_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') { @@ -60,7 +70,8 @@ sub eventFieldAssign { } elsif ($tn eq 'string' || $tn eq 'notifid') { gen $indent."$dest = soap_strdup(soap, $source);\n"; } elsif ($tn eq 'jobstat') { - gen $indent."edg_wll_StatusToSoap(soap, $source, &$dest);\n"; + 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"; @@ -91,7 +102,7 @@ sub eventFieldFree { while ($soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) { $soap_fn = $1.ucfirst($2); }; - $dest = "$dst->$soap_en->$soap_fn"; + $dest = "VALUEEV_GET($dst, $soap_en)->$soap_fn"; if ($tn eq 'int' || $tn eq 'port' || $tn eq 'bool' || $tn eq 'logsrc') { if ($f->{optional}) { @@ -147,13 +158,11 @@ void edg_wll_SoapToJobStatCode(enum lbt__statName in, edg_wll_JobStatCode *out) } } -int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt__jobStatus **dest) +int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt__jobStatus *js) { int i,j; char *s; - struct lbt__jobStatus *js; - if ( !(js = soap_malloc(soap, sizeof(*js))) ) return SOAP_FAULT; memset(js, 0, sizeof(*js)); edg_wll_JobStatCodeToSoap(src->state, &(js->state)); @@@{ @@ -179,14 +188,14 @@ int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt gen qq{ ! /* XXX: don't count UNDEF */ ! if (src->$_) { -! struct lbt__${usuc}Item **h = soap_malloc(soap,sizeof *h * (EDG_WLL_NUMBER_OF_STATCODES-1)); -! js->__size$usuc = EDG_WLL_NUMBER_OF_STATCODES-1; +! 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; istate); -! h[i-1]->$fmap{$_} = src->$_\[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]; ! } -! js->$usuc = h; ! } ! else { ! js->__size$usuc = 0; @@ -196,30 +205,22 @@ int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt } elsif ($ft eq 'taglist') { gen qq{ ! { -! struct lbt__tagValue *t,**tl = NULL; +! 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 = soap_malloc(soap,sizeof *t); -! tl = realloc(tl,(i+1) * sizeof *tl); +! 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); -! tl[i] = t; ! } -! js->__size$usuc = i; -! if (i) { -! js->$usuc = soap_malloc(soap,i * sizeof *tl); -! memcpy(js->$usuc,tl,i * sizeof *tl); -! free(tl); -! } else js->$usuc = NULL; ! } }; } elsif ($ft eq 'stslist') { gen qq{ ! for (i=0; src->$_ && src->$_\[i].state; i++); -! if ((js->__size$usuc = i)) { -! js->$usuc = soap_malloc(soap,i * sizeof *js->$usuc); -! for (j=0; j$_+j,&js->$usuc\[j]); -! } -! else js->$usuc = NULL; +! GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, $usuc, struct lbt__jobStatus, i); +! for (j=0; j$_+j,GLITE_SECURITY_GSOAP_LIST_GET(js->$usuc, j)); }; } elsif ($ft eq 'timeval') { gen "\tjs->$usuc = soap_malloc(soap,sizeof *js->$usuc);\n"; @@ -231,7 +232,6 @@ int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt } @@@} - *dest = js; return SOAP_OK; } @@ -266,9 +266,9 @@ void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg ! dest->$_\[0] = src->__size$usuc; ! for (i=0; i__size$usuc; i++) { ! edg_wll_JobStatCode s; -! edg_wll_SoapToJobStatCode(src->$usuc\[i]->state,&s); +! edg_wll_SoapToJobStatCode(GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->state,&s); ! assert(s>=0); assert(s$_\[s+1] = src->$usuc\[i]->$fmap{$_}; +! dest->$_\[s+1] = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->$fmap{$_}; ! } ! } ! else dest->$_ = NULL; @@ -277,7 +277,7 @@ void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg gen qq{ ! if (src->__size$usuc) { ! dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_); -! for (i=0; i__size$usuc; i++) edg_wll_SoapToStatus(soap,src->$usuc\[i],dest->$_ + i); +! for (i=0; i__size$usuc; i++) edg_wll_SoapToStatus(soap,GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i),dest->$_ + i); ! } ! else dest->$_ = NULL; }; @@ -286,8 +286,8 @@ void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg if (src->__size$usuc) { dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_); for (i=0; i__size$usuc; i++) { - soap_unlink(soap,dest->$_\[i].tag = src->$usuc\[i]->tag); - soap_unlink(soap,dest->$_\[i].tag = src->$usuc\[i]->tag); + 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; @@ -421,18 +421,18 @@ int edg_wll_SoapToQueryVal( union edg_wll_QueryVal *out) { assert(in); assert(out); - if ( in->c ) { + if ( VALUEQR_ISTYPE(in, c) ) { if ( attr == EDG_WLL_QUERY_ATTR_JOBID || attr == EDG_WLL_QUERY_ATTR_PARENT ) { - if ( edg_wlc_JobIdParse(in->c, &(out->j)) ) return -1; + if ( edg_wlc_JobIdParse(VALUEQR_GET(in, c), &(out->j)) ) return -1; } else { - if ( !(out->c = strdup(in->c)) ) return -1; + if ( !(out->c = strdup(VALUEQR_GET(in, c))) ) return -1; } } - else if ( in->t ) { - out->t.tv_sec = in->t->tvSec; - out->t.tv_usec = in->t->tvUsec; + 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 ( in->i ) out->i = *(in->i); + else if ( VALUEQR_ISTYPE(in, i) ) out->i = *(VALUEQR_GET(in, i)); return 0; } @@ -452,21 +452,23 @@ int edg_wll_QueryValToSoap( case EDG_WLL_QUERY_ATTR_DESTINATION: case EDG_WLL_QUERY_ATTR_HOST: case EDG_WLL_QUERY_ATTR_INSTANCE: - if ( in->c && !(out->c = soap_strdup(soap, in->c)) ) return SOAP_FAULT; + 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); - out->c = soap_strdup(soap, s); + VALUEQR_SET(out, c, soap_strdup(soap, s)); free(s); - if ( !out->c ) return SOAP_FAULT; + if ( !VALUEQR_GET(out, c) ) return SOAP_FAULT; } break; case EDG_WLL_QUERY_ATTR_TIME: - out->t = soap_malloc(soap, sizeof(*(out->t))); - if ( !out->t ) return SOAP_FAULT; - out->t->tvSec = in->t.tv_sec; - out->t->tvUsec = in->t.tv_usec; + 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: @@ -475,9 +477,9 @@ int edg_wll_QueryValToSoap( case EDG_WLL_QUERY_ATTR_EVENT_TYPE: case EDG_WLL_QUERY_ATTR_RESUBMITTED: default: - out->i = soap_malloc(soap, sizeof(*(out->i))); - if ( !out->i ) return SOAP_FAULT; - *(out->i) = in->i; + 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; } @@ -522,13 +524,9 @@ err: int edg_wll_QueryRecToSoap( struct soap *soap, const edg_wll_QueryRec *in, - struct lbt__queryRecord **out) + struct lbt__queryRecord *qr) { - struct lbt__queryRecord *qr; - - - assert(in); assert(out); - if ( !(qr = soap_malloc(soap, sizeof(*qr))) ) return SOAP_FAULT; + assert(in); assert(qr); memset(qr, 0, sizeof(*qr)); if ( !in ) goto ret; edg_wll_QueryOpToSoap(in->op, &(qr->op)); @@ -544,7 +542,6 @@ int edg_wll_QueryRecToSoap( } ret: - *out = qr; return SOAP_OK; } @@ -562,7 +559,7 @@ int edg_wll_SoapToQueryConds(const struct lbt__queryConditions *in, edg_wll_Quer 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, in->record[i], qr+i) ) goto err; + if ( edg_wll_SoapToQueryRec(in, GLITE_SECURITY_GSOAP_LIST_GET(in->record, i), qr+i) ) goto err; *out = qr; return 0; @@ -577,15 +574,12 @@ err: int edg_wll_QueryCondsToSoap( struct soap *soap, const edg_wll_QueryRec *in, - struct lbt__queryConditions **out) + struct lbt__queryConditions *qc) { int i; - struct lbt__queryConditions *qc; - assert(out); - if ( !(qc = soap_malloc(soap, sizeof(*qc))) ) - return SOAP_FAULT; + assert(qc); memset(qc, 0, sizeof(*qc)); if ( !in ) goto ret; @@ -602,22 +596,21 @@ int edg_wll_QueryCondsToSoap( if ( !qc->tagName ) return SOAP_FAULT; } - qc->__sizerecord = 0; - while ( in[qc->__sizerecord].attr ) qc->__sizerecord++; + i = 0; + while ( in[i].attr ) i++; - if ( !qc->__sizerecord ) + if ( !i ) goto ret; - qc->record = soap_malloc(soap, sizeof(*(qc->record)) * qc->__sizerecord); + 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], &(qc->record[i])) ) + if ( edg_wll_QueryRecToSoap(soap, &in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc->record, i)) ) return SOAP_FAULT; ret: - *out = qc; return SOAP_OK; } @@ -627,7 +620,7 @@ ret: * \param IN in array of soap query condition * \param OUT out target array of queryRec */ -int edg_wll_SoapToQueryCondsExt(const struct lbt__queryConditions **in, int __sizecondition, edg_wll_QueryRec ***out) +int edg_wll_SoapToQueryCondsExt(GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) in, int __sizecondition, edg_wll_QueryRec ***out) { int i; edg_wll_QueryRec **qr; @@ -635,7 +628,7 @@ int edg_wll_SoapToQueryCondsExt(const struct lbt__queryConditions **in, int __si assert(out); if ( !(qr = calloc(__sizecondition + 1, sizeof(*qr))) ) return -1; for ( i = 0; i < __sizecondition; i++ ) - if ( edg_wll_SoapToQueryConds(in[i], qr+i) ) goto err; + if ( edg_wll_SoapToQueryConds(GLITE_SECURITY_GSOAP_LIST_GET(in, i), qr+i) ) goto err; *out = qr; return 0; @@ -665,12 +658,10 @@ int edg_wll_QueryCondsExtToSoap( struct soap *soap, const edg_wll_QueryRec **in, int *out_size, - struct lbt__queryConditions ***out) + GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *out) { int i, size; - struct lbt__queryConditions **qc; - - + GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) qc; assert(in); assert(out); size = 0; @@ -678,12 +669,11 @@ int edg_wll_QueryCondsExtToSoap( if ( !size ) goto ret; - - qc = soap_malloc(soap, sizeof(*qc) * size); + 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], &qc[i]) ) + if ( edg_wll_QueryCondsToSoap(soap, in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc, i)) ) return SOAP_FAULT; ret: @@ -722,12 +712,11 @@ int edg_wll_JobsQueryResToSoap( } if ( states ) { for ( i = 0; states[i].state; i++ ) ; - out->states = soap_malloc(soap, sizeof(*(out->states))*i); + GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, states, struct lbt__jobStatus, i); if ( !out->states ) return SOAP_FAULT; - out->__sizestates = i; for ( i = 0; states[i].state; i++ ) - if ( edg_wll_StatusToSoap(soap, states+i, out->states+i) ) + if ( edg_wll_StatusToSoap(soap, states+i, GLITE_SECURITY_GSOAP_LIST_GET(out->states, i)) ) return SOAP_FAULT; } @@ -878,13 +867,9 @@ static void edg_wll_SourceToSoap(edg_wll_Source in, enum lbt__eventSource *out) * \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) { +int edg_wll_EventToSoap(struct soap* soap, const edg_wll_Event *event, struct lbt__event *sevent) { char *s; - *sevent = soap_malloc(soap, sizeof(**sevent)); - memset(*sevent, 0, sizeof(**sevent)); - if (!*sevent) return 0; - switch (event->any.type) { @@@{ my ($soap_en); @@ -900,14 +885,14 @@ int edg_wll_EventToSoap(struct soap* soap, const edg_wll_Event *event, struct lb }; gen qq { ! case EDG_WLL_EVENT_$u: -! (*sevent)->$soap_en = soap_malloc(soap, sizeof(struct lbt__event$soap_en)); +! 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); + eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 1); } gen "\n"; @@ -917,7 +902,7 @@ gen qq { my ($f); $f = selectField $event $_; - eventFieldAssign("\t\t\t", "event", "(*sevent)", $e, $f, 0); + eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 0); } gen qq { ! break; @@ -948,7 +933,7 @@ void edg_wll_FreeSoapEvent(struct soap *soap, struct lbt__event *sevent) { $soap_en = $e; $soap_en = $1.ucfirst $2 while $soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen "\tif (sevent->$soap_en) {\n"; + gen "\tif (VALUEEV_ISTYPE(sevent, $soap_en)) {\n"; selectType $event '_common_'; for (getFieldsOrdered $event) { @@ -965,11 +950,14 @@ void edg_wll_FreeSoapEvent(struct soap *soap, struct lbt__event *sevent) { $f = selectField $event $_; eventFieldFree("\t\t", "sevent", $e, $f); } - gen qq "\t\tsoap_dealloc(soap, sevent->$soap_en);\n"; + 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 } @@ -999,7 +987,7 @@ int edg_wll_EventsQueryResToSoap( const edg_wll_Event *events, struct _lbe__QueryEventsResponse *out) { - int memsize, i; + int i; struct lbt__event *event; /* alloc the events array */ @@ -1007,23 +995,27 @@ int edg_wll_EventsQueryResToSoap( 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; - memsize = out->__sizeevents * sizeof(*out->events); - out->events = soap_malloc(soap, memsize); - memset(out->events, 0, memsize); + 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], &out->events[i])) goto err; + if (!edg_wll_EventToSoap(soap, &events[i], GLITE_SECURITY_GSOAP_LIST_GET(out->events, i))) goto err; } return SOAP_OK; err: - event = out->events[0]; + 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; @@ -1042,7 +1034,7 @@ static int edg_wll_SoapToEvent( { my $comment = getTypeComment $event $name; $name = $1.ucfirst $2 while $name =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen "\t\tif (in->$name) {\n"; + gen "\t\tif (VALUEEV_ISTYPE(in, $name)) {\n"; my $event_type = uc $name; gen "\t\t\tout->type = EDG_WLL_EVENT_$event_type;\n"; @@ -1064,37 +1056,38 @@ static int edg_wll_SoapToEvent( $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 (in->$name->$usuc)\n"; - gen "\t\t\t\tedg_wlc_JobIdParse(in->$name->$usuc,&out->$act.$fn);\n"; + 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 = in->$name->$usuc->tvSec;\n"; - gen "\t\t\tout->$act.$fn.tv_usec = in->$name->$usuc->tvUsec;\n"; + 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 = in->$name->$usuc;\n"; - gen "\t\t\tsoap_unlink(soap,in->$name->$usuc);\n"; + 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(in->$name->$usuc,&(out->$act.$fn));\n"; + gen "\t\t\tedg_wll_SoapTo$fuc($src,&(out->$act.$fn));\n"; } else { - gen "\t\t\tedg_wll_SoapTo$name$fuc(in->$name->$usuc,&(out->$act.$fn));\n"; + gen "\t\t\tedg_wll_SoapTo$name$fuc($src,&(out->$act.$fn));\n"; } } elsif ($f->{optional}) { - gen "\t\t\tout->$act.$fn = *in->$name->$usuc;\n"; + gen "\t\t\tout->$act.$fn = *$src;\n"; } else { - gen "\t\t\tout->$act.$fn = in->$name->$usuc;\n"; + gen "\t\t\tout->$act.$fn = $src;\n"; } } elsif ($ft eq 'logsrc') { - gen "\t\t\tedg_wll_SoapToSource(in->$name->$usuc, &(out->$act.$fn));\n"; + gen "\t\t\tedg_wll_SoapToSource($src, &(out->$act.$fn));\n"; } else { - gen "\t\t\tout->$act.$fn = in->$name->$usuc;\n"; + gen "\t\t\tout->$act.$fn = $src;\n"; } } } @@ -1127,7 +1120,7 @@ int edg_wll_SoapToEventsQueryRes( if (!events) return SOAP_FAULT; for (i=0; i < in.__sizeevents; i++) { - if (edg_wll_SoapToEvent(soap, in.events[i], &events[i]) != SOAP_OK) { + if (edg_wll_SoapToEvent(soap, GLITE_SECURITY_GSOAP_LIST_GET(in.events, i), &events[i]) != SOAP_OK) { free_events(events); return SOAP_FAULT; } diff --git a/org.glite.lb.server/src/ws_typeref.h b/org.glite.lb.server/src/ws_typeref.h index e458ab9..924cc51 100644 --- a/org.glite.lb.server/src/ws_typeref.h +++ b/org.glite.lb.server/src/ws_typeref.h @@ -8,7 +8,7 @@ extern "C" { 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_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 *); @@ -39,7 +39,7 @@ extern int edg_wll_SoapToQueryRec( edg_wll_QueryRec *out); extern int edg_wll_QueryRecToSoap(struct soap *, const edg_wll_QueryRec *, - struct lbt__queryRecord **); + struct lbt__queryRecord *); extern int edg_wll_SoapToQueryConds( @@ -47,16 +47,16 @@ extern int edg_wll_SoapToQueryConds( edg_wll_QueryRec **); extern int edg_wll_QueryCondsToSoap(struct soap *, const edg_wll_QueryRec *, - struct lbt__queryConditions **); + struct lbt__queryConditions *); extern int edg_wll_SoapToQueryCondsExt( - const struct lbt__queryConditions **, + 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 *, - struct lbt__queryConditions ***); + GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *); extern int edg_wll_JobsQueryResToSoap(struct soap *, edg_wlc_JobId *, @@ -72,7 +72,7 @@ extern int edg_wll_SoapToEventsQueryRes( edg_wll_Event **); -extern int edg_wll_EventToSoap(struct soap*, const edg_wll_Event *, struct lbt__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 diff --git a/org.glite.lb.server/test/test_soap_conv.cpp b/org.glite.lb.server/test/test_soap_conv.cpp index f57d744..10770dd 100644 --- a/org.glite.lb.server/test/test_soap_conv.cpp +++ b/org.glite.lb.server/test/test_soap_conv.cpp @@ -287,10 +287,12 @@ 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); + 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)); diff --git a/org.glite.lb.utils/Makefile b/org.glite.lb.utils/Makefile index 042d445..3537827 100644 --- a/org.glite.lb.utils/Makefile +++ b/org.glite.lb.utils/Makefile @@ -72,7 +72,7 @@ EXT_LIBS:= \ COMMON_LIB:=-lglite_lb_common_${nothrflavour} CLIENT_LIB:=-lglite_lb_client_${nothrflavour} BKSERVER_LIB:=-lglite_lb_bkserver -JP_LIBS:=-lglite_jp_common -lglite_jp_trio +JP_LIBS:=-lglite_jp_common_${nothrflavour} -lglite_jp_trio UTILS:=statistics mon mon-db diff --git a/org.glite.lb.utils/project/version.properties b/org.glite.lb.utils/project/version.properties index 2385f57..1f7bad5 100755 --- a/org.glite.lb.utils/project/version.properties +++ b/org.glite.lb.utils/project/version.properties @@ -1,2 +1,2 @@ module.version = 1.1.1 -module.age = 0 +module.age = 1 diff --git a/org.glite.lb.ws-interface/Makefile b/org.glite.lb.ws-interface/Makefile index e2e4105..50f02be 100644 --- a/org.glite.lb.ws-interface/Makefile +++ b/org.glite.lb.ws-interface/Makefile @@ -20,8 +20,8 @@ SUFFIXES = .T VPATH=${top_srcdir}/src AT3=perl -I${top_srcdir}/project ${top_srcdir}/project/at3 XSLTPROC:=xsltproc --nonet -TIDY=tidy XMLLINT:=xmllint --nonet +TIDY=tidy -i -q --show-warnings no --tidy-mark no --wrap 0 docbookxls:=http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl STAGETO=interface @@ -75,10 +75,13 @@ clean: ${WSDL}: %.wsdl: %.xml puke-wsdl.xsl ${XSLTPROC} ../src/puke-wsdl.xsl $< >$@ - -${TIDY} -wrap 10000 -xml -m -i -q $@ - -perl -i -n -e 'if (/^\s*$$/) { $$empty .= "\n"; } elsif (/^\s*<(xsd:)?(enumeration|element|input|output|fault)/) { print $$_; $$empty = "";} else { print "$$empty$$_"; $$empty=""; }; ' $@ + -${TIDY} -xml -m $@ +# XXX: obsolete: +# -perl -i -n -e 'if (/^\s*$$/) { $$empty .= "\n"; } elsif (/^\s*<(xsd:)?(enumeration|element|input|output|fault)/) { print $$_; $$empty = "";} else { print "$$empty$$_"; $$empty=""; }; ' $@ LB.html: doc.xml LBTypes.xml LB.xml puke-ug.xsl ${XSLTPROC} --novalid ../src/puke-ug.xsl $< >doc-html.xml + -${TIDY} -xml -m doc-html.xml ${XMLLINT} --valid --noout doc-html.xml ${XSLTPROC} --stringparam chapter.autolabel 0 ${docbookxls} doc-html.xml >$@ + -${TIDY} -asxhtml -m $@ diff --git a/org.glite.lb.ws-interface/project/version.properties b/org.glite.lb.ws-interface/project/version.properties index 142ad66..4a9a384 100755 --- a/org.glite.lb.ws-interface/project/version.properties +++ b/org.glite.lb.ws-interface/project/version.properties @@ -1,4 +1,4 @@ #Fri Sep 02 14:16:49 CEST 2005 # glite-lb-ws-interface_branch_3_0_0_RC15 tak is taken! module.version=2.2.1 -module.age=0 +module.age=1 diff --git a/org.glite.lb.ws-interface/src/doc.xml b/org.glite.lb.ws-interface/src/doc.xml index fd65f12..78cb6a5 100644 --- a/org.glite.lb.ws-interface/src/doc.xml +++ b/org.glite.lb.ws-interface/src/doc.xml @@ -1,5 +1,2 @@ - - - + diff --git a/org.glite.lb/.cvsignore b/org.glite.lb/.cvsignore deleted file mode 100644 index 1df717b..0000000 --- a/org.glite.lb/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.lb/LICENSE b/org.glite.lb/LICENSE deleted file mode 100644 index 259a91f..0000000 --- a/org.glite.lb/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb/build.xml b/org.glite.lb/build.xml deleted file mode 100755 index 3fff9a0..0000000 --- a/org.glite.lb/build.xml +++ /dev/null @@ -1,590 +0,0 @@ - - - - - - - Ant build file to build the GLite Logging and Bookkeping Subsystem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Preparing directories ... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/> - - - - diff --git a/org.glite.lb/deployment/README b/org.glite.lb/deployment/README deleted file mode 100644 index 9b104e6..0000000 --- a/org.glite.lb/deployment/README +++ /dev/null @@ -1,2 +0,0 @@ -deploy_all.diff - against RC31 -deploy_lb, deploy_jp - older patches diff --git a/org.glite.lb/deployment/deploy_all.diff b/org.glite.lb/deployment/deploy_all.diff deleted file mode 100644 index fe177ce..0000000 --- a/org.glite.lb/deployment/deploy_all.diff +++ /dev/null @@ -1,454 +0,0 @@ -Index: org.glite/project/global.dependencies.properties -=================================================================== -RCS file: /cvs/jra1mw/org.glite/project/global.dependencies.properties,v -retrieving revision 1.482.2.279 -diff -u -p -u -r1.482.2.279 global.dependencies.properties ---- org.glite/project/global.dependencies.properties 4 Aug 2006 12:21:59 -0000 1.482.2.279 -+++ org.glite/project/global.dependencies.properties 1 Sep 2006 14:23:09 -0000 -@@ -1819,7 +1819,25 @@ ext.globus-sdk.description = The Globus - ext.globus-sdk.rpm.name = vdt_globus_sdk - 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 -+ - # GPT - ext.gpt.name = gpt - ext.gpt.vendor = gpt -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 -p -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 1 Sep 2006 14:23:09 -0000 -@@ -1619,6 +1619,39 @@ - - - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -@@ -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.203 -diff -u -p -u -r1.526.2.5.2.127.2.415.2.203 dependencies.properties ---- org.glite.deployment/project/dependencies.properties 30 Aug 2006 07:41:36 -0000 1.526.2.5.2.127.2.415.2.203 -+++ org.glite.deployment/project/dependencies.properties 1 Sep 2006 14:23:09 -0000 -@@ -47,6 +47,8 @@ - org.glite.deployment.hydra.version = glite-deployment-hydra_R_1_0_3 - org.glite.deployment.io-client.version = glite-deployment-io-client_R_2_2_0 - org.glite.deployment.io-server.version = glite-deployment-io-server_R_2_1_8 -+ org.glite.deployment.jpps.version = HEAD -+ org.glite.deployment.jpis.version = HEAD - org.glite.deployment.lb.version = glite-deployment-lb_R_2_2_4 - org.glite.deployment.lcg-CE_torque.version = glite-deployment-lcg-CE_torque_R_3_0_4 - org.glite.deployment.lcg-CE.version = glite-deployment-lcg-CE_R_3_0_5 -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 -p -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 1 Sep 2006 14:23:09 -0000 -@@ -667,6 +667,14 @@ - - - -+ -+ -+ -+ -+ -+ -+ -+ - - - -@@ -1571,6 +1579,28 @@ - tag="${org.glite.deployment.lb.version}" /> - - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -@@ -1667,6 +1697,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.65.2.4 -diff -u -p -u -r1.65.2.4 glite-lb-config.py ---- org.glite.deployment.lb/config/scripts/glite-lb-config.py 26 May 2006 12:24:22 -0000 1.65.2.4 -+++ org.glite.deployment.lb/config/scripts/glite-lb-config.py 1 Sep 2006 14:23:10 -0000 -@@ -129,7 +129,12 @@ python %s-config [OPTION...]""" % (self. - - 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...' -@@ -142,7 +147,7 @@ python %s-config [OPTION...]""" % (self. - 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") -@@ -151,6 +156,36 @@ python %s-config [OPTION...]""" % (self. - 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 - #------------------------------------------------------------------- - -@@ -170,6 +205,10 @@ python %s-config [OPTION...]""" % (self. - 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 ', -@@ -180,6 +219,25 @@ python %s-config [OPTION...]""" % (self. - 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 - #------------------------------------------------------------------- - -@@ -204,6 +262,10 @@ python %s-config [OPTION...]""" % (self. - 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 - #------------------------------------------------------------------- -@@ -334,7 +396,29 @@ python %s-config [OPTION...]""" % (self. - 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/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 - #------------------------------------------------------------------- -@@ -420,6 +504,19 @@ def set_env(): - # 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_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 -p -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 1 Sep 2006 14:23:10 -0000 -@@ -17,9 +17,16 @@ - parameter. Leave it empty of comment it out to use the same as 'glite.user.name'" - value="changeme"/> - -- -+ -+ -+ -+ -+ - - - -@@ -55,6 +62,12 @@ - [Example: 17M][Type: Integer][Unit: MB]" - value="17M"/> - -+ -+ -+ - - - -@@ -67,7 +80,47 @@ - destination - - -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -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 -p -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 1 Sep 2006 14:23:10 -0000 -@@ -57,6 +57,12 @@ - build="@org.glite.lb.server-bones.info.build@" - arch="i386"/> - -+ -+ - - -+ -+ - - # - # 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 - 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 @@ - - - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -@@ -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 - - 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 @@ - - - -+ -+ -+ -+ -+ -+ -+ -+ - - - -@@ -1571,6 +1579,28 @@ - tag="${org.glite.deployment.lb.version}" /> - - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -@@ -1667,6 +1697,8 @@ - wn, - wms, - lb, -+ jpis, -+ jpps, - io-server, - io-client, - ce" /> diff --git a/org.glite.lb/deployment/deploy_lb.diff b/org.glite.lb/deployment/deploy_lb.diff deleted file mode 100644 index d6c74e2..0000000 --- a/org.glite.lb/deployment/deploy_lb.diff +++ /dev/null @@ -1,281 +0,0 @@ -This patch was merged to deploy_all.diff, don't use it anymore. - -Index: org.glite.deployment.lb/config/scripts/glite-lb-config.py -=================================================================== -RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/scripts/glite-lb-config.py,v -retrieving revision 1.65.2.3 -diff -u -r1.65.2.3 glite-lb-config.py ---- org.glite.deployment.lb/config/scripts/glite-lb-config.py 2 May 2006 10:36:16 -0000 1.65.2.3 -+++ org.glite.deployment.lb/config/scripts/glite-lb-config.py 30 Jun 2006 09:29:21 -0000 -@@ -127,7 +127,12 @@ - - if not os.path.exists('/tmp/mysql.sock'): - os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock') -- -+ -+ -+ #------------------------------------------------------------------- -+ # start bkserver -+ #------------------------------------------------------------------- -+ - pid = glib.getPID('bkserverd') - if pid != 0: - print 'The gLite LB Server service is already running. Restarting...' -@@ -140,7 +145,7 @@ - pid = glib.getPID('bkserverd') - - if (pid != 0): -- print "The gLite LB Server service has been started ", -+ print "The gLite LB Server service has been started ", - glib.printOkMessage() - else: - glib.printErrorMessage("Could not start the gLite LB Server service") -@@ -149,6 +154,36 @@ - return 1 - - #------------------------------------------------------------------- -+ # start jp-importer, if enabled -+ #------------------------------------------------------------------- -+ -+ lb_export = 0 -+ if params.has_key('lb.export.enabled'): -+ if params['lb.export.enabled'] == "true": -+ lb_export = 1 -+ -+ if lb_export: -+ pid = glib.getPID('jp-importer') -+ if pid != 0: -+ print 'The gLite JP Importer service is already running. Restarting...' -+ os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION']) -+ else: -+ print 'Starting the gLite JP Importer service...' -+ -+ os.system('%s/etc/init.d/glite-jp-importer start' % os.environ['GLITE_LOCATION']) -+ -+ pid = glib.getPID('jp-importer') -+ -+ if (pid != 0): -+ print "The gLite JP Importer service has been started ", -+ glib.printOkMessage() -+ else: -+ glib.printErrorMessage("Could not start the gLite JP Importer service") -+ glib.printErrorMessage("Please verify and re-run the script "), -+ glib.printFailedMessage() -+ return 1 -+ -+ #------------------------------------------------------------------- - # Start Servicetool - #------------------------------------------------------------------- - -@@ -168,6 +203,10 @@ - if (pid != 0): - os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION']) - -+ #------------------------------------------------------------------- -+ # Book Keeping Server -+ #------------------------------------------------------------------- -+ - pid = glib.getPID('bkserverd') - if (pid != 0): - print 'Could not stop the LB Server service ', -@@ -178,6 +217,25 @@ - glib.printOkMessage() - - #------------------------------------------------------------------- -+ # JP Importer -+ #------------------------------------------------------------------- -+ -+ pid = glib.getPID('jp-importer') -+ if (pid != 0): -+ os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION']) -+ -+ pid = glib.getPID('jp-importer') -+ if (pid != 0): -+ print 'Could not stop the JP Importer service ', -+ glib.printFailedMessage() -+ error_level = 1 -+ else: -+ if params.has_key('lb.export.enabled'): -+ if params['lb.export.enabled'] == "true": -+ print 'The JP Importer service has been stopped ', -+ glib.printOkMessage() -+ -+ #------------------------------------------------------------------- - # MySQL - #------------------------------------------------------------------- - -@@ -202,6 +260,10 @@ - if retval != 0: - error_level = 1 - -+ retval = os.system('%s/etc/init.d/glite-jp-importer status' % os.environ['GLITE_LOCATION']) -+ if retval != 0: -+ error_level = 1 -+ - #------------------------------------------------------------------- - # Servicetool - #------------------------------------------------------------------- -@@ -332,7 +394,27 @@ - print "\n==> MySQL database %s already exist\n" % params['lb.database.name'] - - self.mysql.stop() -- -+ -+ # ------------------------------------------------------------------ -+ # export from bkserver to cron -+ # ------------------------------------------------------------------ -+ if params['GLITE_LB_EXPORT_ENABLED'] == "true": -+ file = open('%s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'], 'w') -+ file.write('#! /bin/sh\n') -+ file.write('. %s\n' % glib.getInstallerExportFile()) -+ file.write('$GLITE_LOCATION/examples/glite-lb-export.sh\n') -+ file.close() -+ os.system('/bin/chmod 0755 %s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION']) -+ -+ file = open('/etc/cron.d/glite-lb-export.cron', 'w') -+ file.write('# periodically run purge and export jobs from bkserver\n') -+ file.write('00,30 * * * * %s %s/etc/glite-lb-export-cron-wrapper.sh\n' % (params['glite.user.name'], os.environ['GLITE_LOCATION'])) -+ file.close() -+ os.system('/bin/chmod 0755 /etc/cron.d/glite-lb-export.cron') -+ -+ # Touch cron spool directory to cause reloading of the crontabs -+ os.system("/bin/touch /var/spool/cron") -+ - #------------------------------------------------------------------- - # RGMA servicetool: configure servicetool - #------------------------------------------------------------------- -@@ -418,6 +500,17 @@ - # Perl - glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION'])) - -+ # LB export -+ glib.export('GLITE_LB_EXPORT_ENABLED', params['lb.export.enabled']); -+ glib.export('GLITE_LB_EXPORT_BKSERVER', params['lb.export.bkserver']); -+ glib.export('GLITE_LB_EXPORT_JPPS', params['lb.export.jpps']); -+ glib.export('GLITE_LB_EXPORT_JPREG_MAILDIR', params['lb.export.jpreg']); -+ glib.export('GLITE_LB_EXPORT_JPDUMP_MAILDIR', params['lb.export.jpdump']); -+ glib.export('GLITE_LB_EXPORT_DUMPDIR', params['lb.export.dump']); -+ glib.export('GLITE_LB_EXPORT_DUMPDIR_OLD', params['lb.export.dump.old']); -+ glib.export('GLITE_LB_EXPORT_EXPORTDIR', params['lb.export.export']); -+ glib.export('GLITE_LB_EXPORT_PURGE_ARGS', '"%s"' % params['lb.export.purgeargs']); -+ - # Set environment - glib.setUserEnv() - -Index: org.glite.deployment.lb/config/templates/glite-lb.cfg.xml -=================================================================== -RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml,v -retrieving revision 1.21 -diff -u -r1.21 glite-lb.cfg.xml ---- org.glite.deployment.lb/config/templates/glite-lb.cfg.xml 13 Mar 2006 15:19:21 -0000 1.21 -+++ org.glite.deployment.lb/config/templates/glite-lb.cfg.xml 30 Jun 2006 09:29:21 -0000 -@@ -17,9 +17,16 @@ - parameter. Leave it empty of comment it out to use the same as 'glite.user.name'" - value="changeme"/> - -- -+ -+ -+ -+ -+ - - - -@@ -55,6 +62,12 @@ - [Example: 17M][Type: Integer][Unit: MB]" - value="17M"/> - -+ -+ -+ - - - -@@ -67,7 +80,42 @@ - destination - - -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -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"/> - -+ -+ - - -+ -+ - &1 | tee log - -:) diff --git a/org.glite.lb/doc/copyright.tex b/org.glite.lb/doc/copyright.tex deleted file mode 100644 index d25979d..0000000 --- a/org.glite.lb/doc/copyright.tex +++ /dev/null @@ -1,24 +0,0 @@ -% -% Official text received on October 6, 2004 -% -\vfill{\bf Copyright }\copyright{\bf Members of the EGEE Collaboration. 2004. -See http://eu-egee.org/partners for details on the copyright holders. - -EGEE (``Enabling Grids for E-science in Europe'') is a project funded by -the European Union. For more information on the project, its partners -and contributors please see http://www.eu-egee.org. - -You are permitted to copy and distribute verbatim copies of this -document containing this copyright notice, but modifying this document -is not allowed. You are permitted to copy this document in whole or in -part into other documents if you attach the following reference to the -copied elements: ``Copyright }\copyright{\bf 2004. Members of the EGEE -Collaboration. http://www.eu-egee.org'' - -The information contained in this document represents the views of -EGEE as of the date they are published. EGEE does not guarantee that -any information contained herein is error-free, or up to date. - -EGEE MAKES NO WARRANTIES, EXPRESS, IMPLIED, OR STATUTORY, BY -PUBLISHING THIS DOCUMENT.} - diff --git a/org.glite.lb/doc/frontmatter.tex b/org.glite.lb/doc/frontmatter.tex deleted file mode 100644 index 0fba2c5..0000000 --- a/org.glite.lb/doc/frontmatter.tex +++ /dev/null @@ -1,41 +0,0 @@ -\begin{center} -{\bf Delivery Slip} -\end{center} -\begin{tabularx}{\textwidth}{|l|l|l|X|X|} -\hline - & {\bf Name} & {\bf Partner} & {\bf Date} & {\bf Signature} \\ -\hline -{\bf From} & Ale\v s K\v{r}enek et al.& CESNET & May 28, 2005 & \\ -\hline -{\bf Reviewed by} & & & & \\ - -\hline -{\bf Approved by} & & & & \\ -\hline -\end{tabularx} - -\begin{center} -{\bf Document Change Log} -\end{center} - -\begin{tabularx}{\textwidth}{|l|l|X|X|} -\hline -{\bf Issue } & {\bf Date } & {\bf Comment } & {\bf Author } \\ \hline -Initial version & Feb 28, 2005 & & A. K\v{r}enek \\ \hline -Reviewer's comments & Mar 25, 2005 & comments reflected & A. K\v{r}enek \\ -\hline -\end{tabularx} - -\begin{center} -{\bf Document Change Record} -\end{center} - -\begin{tabularx}{\textwidth}{|l|l|X|} -\hline -{\bf Issue } & {\bf Item } & {\bf Reason for Change } \\ \hline - - -\hline -\end{tabularx} - -\input{copyright} diff --git a/org.glite.lb/doc/perf_clear_proxy b/org.glite.lb/doc/perf_clear_proxy deleted file mode 100644 index 237df95..0000000 --- a/org.glite.lb/doc/perf_clear_proxy +++ /dev/null @@ -1 +0,0 @@ -CLPR=1; for jobid in `./stage/sbin/glite-lb-perftest_logjobs -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf|grep https`; do stage/bin/glite-lb-logevent -x -S /tmp/proxy_michal.perfstore.sock -c $SEQCODE -j $jobid -s UserInterface -e Abort --reason Purge; done diff --git a/org.glite.lb/doc/perf_purge b/org.glite.lb/doc/perf_purge deleted file mode 100644 index 4bcc881..0000000 --- a/org.glite.lb/doc/perf_purge +++ /dev/null @@ -1 +0,0 @@ -./stage/sbin/glite-lb-purge -j /tmp/perftest_1000.jobids -m scientific.civ.zcu.cz:10000 -s diff --git a/org.glite.lb/doc/perf_reg_jobs b/org.glite.lb/doc/perf_reg_jobs deleted file mode 100644 index 20923a1..0000000 --- a/org.glite.lb/doc/perf_reg_jobs +++ /dev/null @@ -1 +0,0 @@ - REG=1; for jobid in `./stage/sbin/glite-lb-perftest_logjobs -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf|grep https`; do stage/examples/glite-lb-job_reg -j $jobid -s UserInterface ; done diff --git a/org.glite.lb/doc/perf_results/il_sci_09062006.txt b/org.glite.lb/doc/perf_results/il_sci_09062006.txt deleted file mode 100644 index 503966e..0000000 --- a/org.glite.lb/doc/perf_results/il_sci_09062006.txt +++ /dev/null @@ -1,63 +0,0 @@ -./shared/egee/jra1-head/stage/sbin/perftest_il.sh 10 -------------------------------------------- -Logging test: - - events sent through IPC and/or files - - events discarded by IL immediately -------------------------------------------- -a) events sent only by IPC -b) events stored to files and sent by IPC - - small_job big_job small_dag big_dag -a) 154727793 11240340 101479915 621678 -[jobs/day] -b) 11540156 594389 10416164 402240 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events discarded in IL ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 14323607 547755 10158371 375594 -[jobs/day] -b) 6284230 364547 4554967 300055 -[jobs/day] -c) 7540122 412971 3186381 300417 -[jobs/day] -x) 9672327 418137 2567653 297477 -[jobs/day] -d) this test is not yet implemented -e) 9650719 410507 3651840 301687 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events consumed by empty BS ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 2639788 182196 2035014 246654 -[jobs/day] -b) 1170308 45973 759842 74898 -[jobs/day] -c) 1060595 42047 921386 76638 -[jobs/day] -x) 1091863 42247 518302 82129 -[jobs/day] -d) this test is not yet implemented -e) 1147040 41790 489257 76627 -[jobs/day] - diff --git a/org.glite.lb/doc/perf_results/il_sci_09062006_01.txt b/org.glite.lb/doc/perf_results/il_sci_09062006_01.txt deleted file mode 100644 index 04db72b..0000000 --- a/org.glite.lb/doc/perf_results/il_sci_09062006_01.txt +++ /dev/null @@ -1,129 +0,0 @@ -[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 10 -------------------------------------------- -Logging test: - - events sent through IPC and/or files - - events discarded by IL immediately -------------------------------------------- -a) events sent only by IPC -b) events stored to files and sent by IPC - - small_job big_job small_dag big_dag -a) 149765990 10933663 100162299 619924 -[jobs/day] -b) 11857056 479615 2753618 277679 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events discarded in IL ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 13813170 268900 6448242 244203 -[jobs/day] -b) 4525621 255055 6147103 241153 -[jobs/day] -c) 9338319 217855 5497442 248429 -[jobs/day] -x) 9335090 232292 3989195 236341 -[jobs/day] -d) this test is not yet implemented -e) 3283323 216013 7284868 256479 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events consumed by empty BS ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 4019651 44496 766972 95556 -[jobs/day] -b) 1366885 47501 564779 90055 -[jobs/day] -c) 1152594 47656 603774 97465 -[jobs/day] -x) 1049069 48779 607913 88692 -[jobs/day] -d) this test is not yet implemented -e) 942509 46271 523129 91103 -[jobs/day] - - -************************************************************************* - - -[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 100 -------------------------------------------- -Logging test: - - events sent through IPC and/or files - - events discarded by IL immediately -------------------------------------------- -a) events sent only by IPC -b) events stored to files and sent by IPC - - small_job big_job small_dag big_dag -a) 157966907 0 0 620546 -[jobs/day] -b) 13833450 558487 10210340 283454 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events discarded in IL ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 12884330 316703 4447489 151870 -[jobs/day] -b) 7980713 469667 4641283 244463 -[jobs/day] -c) 8458472 556919 5657712 253640 -[jobs/day] -x) 8149836 549678 4765300 257375 -[jobs/day] -d) this test is not yet implemented -e) 9687868 503933 4461079 247092 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events consumed by empty BS ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 9389344 97159 450483 68610 -[jobs/day] -b) 1195400 82681 560118 88216 -[jobs/day] -c) 1351879 88207 830072 102285 -[jobs/day] -x) 1173835 85897 562648 0 -[jobs/day] -d) this test is not yet implemented -e) 1205291 78355 567658 87770 -[jobs/day] diff --git a/org.glite.lb/doc/perf_results/il_sci_12062006.txt b/org.glite.lb/doc/perf_results/il_sci_12062006.txt deleted file mode 100644 index f3a1a79..0000000 --- a/org.glite.lb/doc/perf_results/il_sci_12062006.txt +++ /dev/null @@ -1,65 +0,0 @@ -[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 10 -------------------------------------------- -Logging test: - - events sent through IPC and/or files - - events discarded by IL immediately -------------------------------------------- -a) events sent only by IPC -b) events stored to files and sent by IPC - - small_job big_job small_dag big_dag -a) 153599999 11157889 101479915 539075 -[jobs/day] -b) 10835893 1059003 2577803 351095 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events discarded in IL ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 14148626 772362 11498383 376986 -[jobs/day] -b) 5348851 489142 5558879 292071 -[jobs/day] -c) 9042670 441000 5911613 287842 -[jobs/day] -x) 7730298 414784 6579748 289834 -[jobs/day] -d) this test is not applicable -e) 9288325 365701 7189156 299604 -[jobs/day] ------------------------------------ -Interlogger test: - - events sent through IPC & files - - events consumed by empty BS ------------------------------------ -a) disabled event parsing, the server address (jobid) is hardcoded -b) disabled event synchronization from files -c) disabled recovery thread -x) disabled sync and recovery -d) lazy bkserver connection close -e) normal operation - - small_job big_job small_dag big_dag -a) 2219003 185867 1785164 258615 -[jobs/day] -b) 1795503 48283 309380 77422 -[jobs/day] -c) 1201618 39001 850436 74771 -[jobs/day] -x) 1134249 48039 447017 74244 -[jobs/day] -d) 5335078 207059 2438095 96295 -[jobs/day] -e) 1019269 36465 875966 65565 -[jobs/day] - - diff --git a/org.glite.lb/doc/perf_results/ll_michal_21062006.txt b/org.glite.lb/doc/perf_results/ll_michal_21062006.txt deleted file mode 100644 index c13457f..0000000 --- a/org.glite.lb/doc/perf_results/ll_michal_21062006.txt +++ /dev/null @@ -1,20 +0,0 @@ -michal:~/shared/egee/jra1-head> ./stage/sbin/perftest_ll.sh 10 ----------------- -Locallogger test ----------------- -a) glite-lb-logd-perf-nofile --noParse --noIPC -b) glite-lb-logd-perf-nofile --noIPC -c) glite-lb-logd-perf --noIPC -d) glite-lb-logd-perf - -Number of jobs: 10 - - small_job big_job small_dag big_dag -a) 14.544066 14.590504 14.681760 9.264801 [events/sec] - 125660 8404 97577 25821 [jobs/day] -b) 14.614844 14.408043 14.279216 9.600877 [events/sec] - 126272 8298 94901 26758 [jobs/day] -c) 0.000000 0.000000 0.000000 0.000000 [events/sec] - 0 0 0 0 [jobs/day] -d) 13.331568 13.530218 13.420780 8.363152 [events/sec] - 115184 7793 89196 23308 [jobs/day] diff --git a/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt b/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt deleted file mode 100644 index d0a99c5..0000000 --- a/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt +++ /dev/null @@ -1,20 +0,0 @@ -------------------- -LB chain test -------------------- -- proxy & interlogger (lazy variant) running at umbar -- bkserver running at sci -- test variants: - a) 10 jobs - b) 100 jobs - c) 1000 jobs - - -Results: - - small_job big_job small_dag big_dag ---------------------------------------------------------------- -a) 3.0 x x x [mjobs/day] -b) 1.0 x x x [mjobs/day] -c) 0.6 x x x [mjobs/day] - - diff --git a/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt b/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt deleted file mode 100644 index 8097510..0000000 --- a/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt +++ /dev/null @@ -1,25 +0,0 @@ -------------------- -LB chain test -------------------- -- proxy & interlogger (lazy variant) running at umbar -- bkserver running at sci -- test variants: - a) 100 jobs, no background queries - b) 1000 jobs, no background queries - c) 10000 jobs, no background queries - d) 100 jobs, 10 parallel queries - e) 1000 jobs, 10 parallel queries, perf interlogger - f) 1000 jobs, 10 parallel queries, normal interlogger -- in d)-f) the server was queried by 10 independent clients for states - of all jobs periodically with random sleep between queries (0-5sec) - -Results: - - small_job big_job small_dag big_dag ---------------------------------------------------------------- -a) 1.0 x x x [mjobs/day] -b) 0.6 x x x [mjobs/day] -c) 0.5 x x x [mjobs/day] -d) 0.8 x x x [mjobs/day] -e) 0.45 x x x [mjobs/day] -f) 0.4 x x x [mjobs/day] diff --git a/org.glite.lb/doc/perf_results/proxy_sci_09062006.txt b/org.glite.lb/doc/perf_results/proxy_sci_09062006.txt deleted file mode 100644 index efa1a41..0000000 --- a/org.glite.lb/doc/perf_results/proxy_sci_09062006.txt +++ /dev/null @@ -1,21 +0,0 @@ ----------------------------------- -LB Proxy test ----------------------------------- -Events are consumed: -1) before parsing -2) after parsing, before storing into database -3) after storing into db, before computing state -4) after computing state, before sending to IL -5) by IL - - small_job big_job small_dag big_dag -1) 43005186.489600 2852512.156800 31859581.824000 502823.721600 -[jobs/day] -2) 37764713.548800 2438483.961600 26108871.523200 340065.648000 -[jobs/day] -3) 1754530.243200 272980.540800 2051218.684800 0.000000 -[jobs/day] -4) 1267110.000000 176052.182400 1506470.486400 0.000000 -[jobs/day] -5) 329471.452800 48787.747200 318152.275200 0.000000 -[jobs/day] diff --git a/org.glite.lb/doc/perf_run_interlogd b/org.glite.lb/doc/perf_run_interlogd deleted file mode 100644 index 00d60ed..0000000 --- a/org.glite.lb/doc/perf_run_interlogd +++ /dev/null @@ -1 +0,0 @@ - ./stage/bin/glite-lb-interlogd -d -s /tmp/perftest_michal.sock --file-prefix=/tmp/perftest_michal.log --lazy diff --git a/org.glite.lb/doc/perf_run_proxy b/org.glite.lb/doc/perf_run_proxy deleted file mode 100644 index 5d88382..0000000 --- a/org.glite.lb/doc/perf_run_proxy +++ /dev/null @@ -1 +0,0 @@ -./stage/bin/glite-lb-proxy -d --silent -p /tmp/proxy_michal.perf --proxy-il-sock /tmp/perftest_michal.sock --proxy-il-fprefix /tmp/perftest_michal.log diff --git a/org.glite.lb/doc/perf_run_server b/org.glite.lb/doc/perf_run_server deleted file mode 100644 index b11eb79..0000000 --- a/org.glite.lb/doc/perf_run_server +++ /dev/null @@ -1 +0,0 @@ -./stage/bin/glite-lb-bkserverd -d --perf-sink=4 -p 10000 -w 10003 -S /tmp/purge_michal -D /tmp/dump_michal --silent diff --git a/org.glite.lb/doc/perf_run_test b/org.glite.lb/doc/perf_run_test deleted file mode 100644 index 2e31b83..0000000 --- a/org.glite.lb/doc/perf_run_test +++ /dev/null @@ -1 +0,0 @@ -TEST=1; ./stage/sbin/glite-lb-perftest_logjobs -d proxy -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf diff --git a/org.glite.lb/doc/perftest.tex b/org.glite.lb/doc/perftest.tex deleted file mode 100644 index 241e1af..0000000 --- a/org.glite.lb/doc/perftest.tex +++ /dev/null @@ -1,524 +0,0 @@ -\documentclass{egee} -\usepackage{comment} - -\def\LB{L\&B} - -\title{\LB\ Performance Test Plan} -\author{CESNET EGEE JRA1 team} -\DocIdentifier{EGEE-JRA1-??} -\Date{\today} -\Activity{JRA1: Middleware Engineering and Integration} -\DocStatus{DRAFT} -\Dissemination{PUBLIC} -\DocumentLink{} - -%\def\req{\noindent\textbf{Prerequisities:}} -%\def\how{\noindent\textbf{How to run:}} -%\def\result{\noindent\textbf{Expected result:}} - -\def\path#1{{\normalfont\textsf{#1}}} -\def\code#1{\texttt{#1}} -\def\todo#1{\textbf{TODO:} #1} - -\begin{document} - -\input{frontmatter} -\newpage -\tableofcontents -\newpage - -\section{Rationale} -\todo{} - -\begin{verbatim} - -L&B Performance Testing -======================= - -- all source modifications for tests are in CVS, conditionaly compiled - only with appropriate symbol - -- binaries for all tests are built using special property - for ant target (or environment variable for Makefile), which - compiles sources using the right #define combinations - -- component tests are run by shell scripts located under component - directories, these tests may require binaries from other components, - though - -- all tests use sequence of events for typical jobs (small job, big - job, small DAG, big DAG) prepared beforehand. These events are - stored in files in ULM format in CVS. - -- events are generated by stresslog program, which reads ULM text of - events for particular test job and logs the event sequence directly - by calling *_DoLogEvent. The number of test jobs is - configurable. Stresslog inserts into every event timestamp when the - event was generated and sent.* - -- event are consumed by breaking normal event processing either in the - component being tested or the next component in chain, that is - instrumented to read and discard events immediately. The consumption - itself is done by calling special function which takes current time, - extracts timestamp from event and prints the difference (ie. the - event processing time).* These "break points" are chosen to measure - throughput of the various component parts and to identify possible - bottlenecks within the components. - - * the only exception is test of the logging library itself - -- test jobs are preregistered within the LB if the test includes - bookkeeping server and/or proxy by the test script program and - their id's are stored in separate file to enable re-use by other - load-generating tools (status queries, for example) - -- test results: - - some numbers must be reported by component themselves, not by - the event generator (due to the asynchronous LB nature). The - test script collects those numbers and presents them as the test - result at the end of testing. - - - after completion test scripts print the table described for the - respective tests filled in with measured values (ie. the table - is not filled in manually by human tester) - - - event throughput = 1/(time_delivered - time_arrived) - * only if next event is sent after previous was delivered - -? measure job throughput for event patterns of typical jobs or deduce -job throughput from throughput of selected types of events? - - -I) Component tests - *************** - -- tests of the isolated components on one node -- may require binaries from other components to produce/consume events - --------------------- -Logging library test --------------------- - -* component: - org.glite.lb.client - -* binaries required: - logevent_libtest - -* test shell script: - perftest_loglib - -* input required: - - events - -* test description: - - measures time required to format given events into ULM. Events - are read from file, parsed into components, timestamped and - produced. - - - events produced: - - by calling logging function edg_wll_LogEvent*() - - - events consumed: - - discarded by logging function instead of sending via - appropriate protocol (LogEventMaster) - -* results: - - job type (size) throughput (100k jobs) - ----------------------------------------- - small job - big job - small DAG - big DAG - - - ----------------- -Locallogger test ----------------- - -* component: - org.glite.lb.logger - -* binaries required: - stresslog - glite_lb_logd_perf - glite_lb_logd_perf_nofile - - does not store events in file - glite_lb_interlogd_perf_empty - - consumes immediately after reading event - -* test shell script: - perftest_logd - -* input required: - - client and host certificates - - events - -* test description: - - measures time required for event to be sent from client to - local logger and processed by locallogger. Localloger is - either instructed (by option) or instrumented to skip some - parts of event processing: - a) no parse, no file, no ipc - glite_lb_logd_perf_nofile --noParse --noIPC - b) no file, no ipc - glite_lb_logd_perf_nofile --noIPC - c) no ipc - glite_lb_logd_perf --noIPC - d) normal operation - glite_lb_logd_perf - - no parse - LL does not parse events - no file - LL does not store events into files - no ipc - LL does not send events through socket to IL - - - events produced: - - stresslog sends events to logd using client->logd - protocol (*_DoLogEvent()) - - - events consumed: - i) after storing into files - ii) by "empty" IL - -* results: - - - -i) events stored in files - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - -ii) events sent to IL - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - - - ----------------- -Interlogger test ----------------- - -* component: - org.glite.lb.logger - -* binaries required: - stresslog - glite_lb_interlogd_perf - glite_lb_interlogd_perf_noparse - - does not parse events, server address is hardcoded - glite_lb_interlogd_perf_nosync - - does not call event_store_sync() - glite_lb_interlogd_perf_norecover - - recovery thread disabled - glite_lb_interlogd_perf_nosend - - events are consumed instead of sending - glite_lb_interlogd_perf_lazy - - lazy closing connection to bkserver - glite_lb_bkserverd_perf_empty - - consumes event immediately after receiving - -* test shell script: - perftest_interlogd - -* input required: - - host certificate - - events - -* test description: - - measures time the event travels through interlogger. - Interlogger is instrumented to skip some parts of eventh - processing for particular test, specifically tests include - these variants: - a) disabled event parsing. The server address - (eg. jobid) is hardcoded. - b) disabled event synchronization from files - c) disabled recovery thread - d) lazy bkserver connection close - e) normal operation - - - events produced: - 1) stresslog sends events to interlogger using the unix - domain socket and logd->interlogger protocol, events are - stored in files (stresslog behaves like logd) - TODO: pro toto neni funkce v producerske knihovne - 2) interlogger reads events from event files created by - stresslog (by recovery thread) - 3) stresslog stores events to files and every n-th - (optional argument) is sent also through the unix socket - - - events consumed: - i) discarded instead of being sent - ii) by "empty" bkserver - -* results: - - -i) events discarded -1) events received on socket -(options 2 and 3 are not tested) - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - e) - - -ii) events sent to empty bkserver -1) events received on socket - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - e) - - -2) events recovered from files - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - d) - e) - - -3) events synced from files, every 10th event sent on socket - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - e) - - ------------- -LBProxy test ------------- - -* component: - org.glite.lb.proxy - -* binaries required: - stresslog - glite_lb_proxy_perf_noparse - - consumes events before parsing - glite_lb_proxy_perf_nostore - - consumes events before storing into database - glite_lb_proxy_perf_nostate - - consumes events before computing job status - glite_lb_proxy_perf_nosend - - consumes events before sending to interlogger - glite_lb_interlogd_perf_empty - - consumes immediately after reading event - -* test shell script: - perftest_proxy - -* input required: - - events - -* test description: - - measures time required for processing event by LB proxy. Test - is performed with (a)) and without (b)) checking for duplicit - events. - - - events produced: - - stresslog sends events using the IL protokol on local - socket (using DoLogEventProxy()) - - - events consumed: - i) before parsing - ii) before storing into database - iii) after storing into database - iv) after job status computation - v) normal operation - - - - -* results: - -a) with duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - v) - - -b) without duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - v) - - --------------- -LB server test --------------- - -* component: - org.glite.lb.server - -* binaries required: - stresslog - glite_lb_server_perf_noparse - - consumes events before parsing - glite_lb_server_perf_nostore - - consumes events before storing into database - glite_lb_server_perf_nostate - - consumes events before computing job status - -* test shell script: - perftest_server - -* input required: - - host certificates - - events - -* test description: - - measures time required for processing event by LB server. Test - is performed with (a)) and without (b)) checking for duplicit - events. - - - events produced: - - stresslog sends events using the IL protokol (using DoLogEventDirect()) - - - events consumed: - i) before parsing - ii) before storing into database - iii) after storing into database - iv) normal operation - -* results: - -a) with duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - - -b) without duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - - - ---------------------- -Job registration test ---------------------- - -* component: - org.glite.lb.server - org.glite.lb.proxy - -* binaries required: - stressreg - - generates registration events - glite_lb_bkserverd - glite_lb_proxy - glite_lb_bkserverd_perf_empty - glite_lb_proxy_perf_empty - -* test shell script: - perftest_jobreg - -* input required: - - host & user certificates - -* test description: - - measures time required to register given number of jobs (time - to process registration event). The registration event is - synchronous in principle, so it is possible to get results just - from the client (stressreg). Test variants include: - a) current implementation - b) implementation of connection pool at the client - c) parallel communication with server and proxy - - - - events produced: - - stressreg sends registration events by calling - edg_wll_RegisterJob*() - - - events consumed: - i) normally processed by server & proxy - ii) server replies immediate success - iii) proxy replies immediate success - -* results: - -a) current implementation - - throughput: one DAG DAG DAG - job (1000 nodes) (5000 nodes) (10000 nodes) - ----------------------------------------------------------------- - i) - ii) - iii) - - -b) connection pool - - throughput: one DAG DAG DAG - job (1000 nodes) (5000 nodes) (10000 nodes) - ----------------------------------------------------------------- - i) - ii) - iii) - - -c) parallel communication - - throughput: one DAG DAG DAG - job (1000 nodes) (5000 nodes) (10000 nodes) - ----------------------------------------------------------------- - i) - - - -\end{verbatim} - -\end{document} \ No newline at end of file diff --git a/org.glite.lb/doc/testplan.tex b/org.glite.lb/doc/testplan.tex deleted file mode 100644 index dd468d6..0000000 --- a/org.glite.lb/doc/testplan.tex +++ /dev/null @@ -1,300 +0,0 @@ -\documentclass{egee} -\usepackage{comment} - -\def\LB{L\&B} - -\title{\LB\ Test Plan} -\author{CESNET EGEE JRA1 team} -\DocIdentifier{EGEE-JRA1-??} -\Date{\today} -\Activity{JRA1: Middleware Engineering and Integration} -\DocStatus{DRAFT} -\Dissemination{PUBLIC} -\DocumentLink{} - -\def\req{\noindent\textbf{Prerequisities:}} -\def\how{\noindent\textbf{How to run:}} -\def\result{\noindent\textbf{Expected result:}} - -\def\path#1{{\normalfont\textsf{#1}}} -\def\code#1{\texttt{#1}} - -\def\todo#1{\textbf{TODO:} #1} - - -\specialcomment{hints}{\par\noindent\textbf{Hints: }\begingroup\slshape}{\endgroup} -%\includecomment{hints} - -\begin{document} - -\input{frontmatter} -\newpage -\tableofcontents -\newpage - -\section{Rationale} -\todo{} - -\section{Test Coverage} -\todo{} - -\section{Test Cases} - -\subsection{Event delivery} - -% locallogger -% bez dalsich demonu, registrovat job, vrati EAGAIN, objevi se fajly -\subsubsection{Standalone locallogger -- job registration} -\label{reg} -\req\ running \path{glite-lb-logd} on the test node, don't start either -\path{glite-lb-interlogd} or \path{glite-lb-bkserverd} - -\how\ call \code{edg\_wll\_RegisterJob}. Jobid's should preferably point -to a~remote \LB\ server. - -\result\ The API call returns EAGAIN, but locallogger creates an event file -in its storage. -The file should contain single line RegJob event. - -\begin{hints} -\path{glite-lb-regjob} example can be used. It generates a~unique jobid, -prints it and calls \LB\ API appropriately. -\end{hints} - -% async -- prida do fajlu, OK -% logevent -\subsubsection{Standalone locallogger -- log event} -\label{log} -\req\ running \path{glite-lb-logd} only, files generated in test~\ref{reg}. - -\how\ call \code{edg\_wll\_Log*} for various event types in a~sequence -resebmling real \LB\ usage, using the same jobid's as in test~\ref{reg} - -\result\ API calls return 0, events are added one per line to the locallogger files - -\begin{hints} -\path{glite-lb-logev} client program can be used. - -\path{glite-lb-*.sh} examples may be adapted to produce reasonable seqences -of events. -\end{hints} - -\subsubsection{Interlogger recovery} -\label{recover} -% recover interloggeru -% il & server (remote) -% spustit, protlaci soubory na server, soubory zmizi, lze se dotazat na stav -\req\ running \path{glite-lb-bkserverd} on the machine and port where -jobid's from \ref{reg} point to; files generated in~\ref{log}. - -\how\ Make a~copy of the files created in~\ref{log}, then start -\path{glite-lb-interlogd}. After approx. 10s check the jobs -with \code{edg\_wll\_JobLog} call. - -\result \code{edg\_wll\_JobLog} should return the same events that were -contained in the locallogger files. The files should be removed by -interlogger after approx. 1 min. - -\begin{hints} -\path{glite-lb-joblog} example outputs the events in (almost) the same -format as the locallogger files. -\end{hints} - -% event delivery -% poslat .sh, job log vrati to, co bylo ve fajlech -\subsubsection{Normal event delivery} -\label{normal} -\req\ all \LB\ daemons running (\path{glite-lb-logd}, \path{glite-lb-interlogd}, -\path{glite-lb-bkserverd} - -\how\ -\begin{enumerate} - -\item Register jobs with \code{edg\_wll\_RegsterJob} -\item Log reasonable sequences of events with \code{edg\_wll\_Log*}. -\item Check with \code{edg\_wll\_JobLog} -that the events got delivered afterwards (approx. 10s). -\end{enumerate} - -\result\ API calls should return 0. The same events that were logged must be returned. - -\begin{hints} -\path{glite-lb-*.sh} scripts produce reasonable seqences of events, including -the job initial registration. - -There is approx. 1min time window in which the locallogger files exist. -They can be grabbed and used for comparing the events as in~\ref{recover}. - -\end{hints} - -\subsection{Job state computation} - -% normal event delivery & job state machine -% .sh, dotaz na stav -\subsubsection{Normal job states} -\label{state} -\req\ \path{glite-lb-bkserverd} running, events from \ref{normal} logged. - -\how\ Check state of the jobs with \code{edg\_wll\_JobStatus}. - -\result\ The API call should return 0, the jobs should be in the expected -states. Thorough tests may also cross check the values supplied in the -events (e.g. destination computing element) wrt. the values reported in the job states. - -\begin{hints} -\path{glite-lb-*.sh} scripts produce sequences of events resultning -in the job state same as the `*' part of the script name. -\end{hints} - -\subsubsection{DAG job states} -\todo{} -% specialni stav DAGu, histogram potomku - -\subsection{LB proxy} -\req\ running \path{glite-lb-proxy}, \path{glite-lb-interlogd} and -\path{glite-lb-bkserverd} - -\how\ Register jobs with \code{edg\_wll\_RegisterJobProxy}, log events -using \code{edg\_wll\_LogEventProxy} and check the job states against -both lbproxy (using \code{edg\_wll\_JobStatusProxy}) and bkserver -(using \code{edg\_wll\_JobStatus}). - -\result\ A new job state should be available immediately at the -lbproxy and probably with a small delay also at the bkserver. - -\begin{hints} -There is already a script \path{test.sh} in -\path{org.glite.lb.proxy/examples} that can be used together with -above mentioned scripts \path{glite-lb-*.sh} (they are called from -\path{test.sh}) to test all this. -\end{hints} - -\subsection{WS interface} -\req\ \path{glite-lb-bkserverd} running, events from \ref{normal} logged - -\how\ retrieve both events and job states with the \LB\ WS interface -(operations \code{JobStatus}, \code{QueryEvents}). - -\result\ the returened data should match those returned by the legacy -API calls. - -\begin{hints} -Examples \path{org.glite.lb.server/examples/ws\_*.c} convert the WS -responses back to the legacy \LB\ data structures and print them in -the same form as e.g. \path{glite-lb-jobstat}. -\end{hints} - -\subsection{Notifications} - -% notifikace -% regjob, reg notifikace na vsechno, poslat udalosti, hlidat notif -\subsubsection{Single job, any state change} -\label{notif1} -\req\ All \LB\ services running - -\how -\begin{enumerate} -\item Register a job. -\item Start a~notification client (preferably on another machine), -register with \code{edg\_wll\_NotifNew} for any state changes of the job, -and repeatedly invoke \code{edg\_wll\_NotifReceive}. -\item One by one send events triggering job state change. -\end{enumerate} - -\result\ All the events should trigger notification reported by the running -notification client. - -\begin{hints} -\path{glite-lb-notify} example can be used with its \path{test} command. -\end{hints} - -\subsubsection{Additional notification criteria} -\label{notif-complex} -\req\ All \LB\ services running - -\how\ Like~\ref{notif1} but include additional criteria, -e.g. job is scheduled for a~specific destination. - -\result\ Only notifications matching the criteria should be delivered. - -% rozsireni dotazu o dalsi job -\subsubsection{Include another job} -\label{notif2} -\req\ All \LB\ services running, notification from \ref{notif1} still active - -\how\ -\begin{enumerate} -\item Register another job. -\item Augment the notification registration with the new jobid using -\code{edg\_wll\_NotifChange}. -\item Start notification client, bind to the registration with -\code{edg\_wll\_NotifBind}. -\item Send events for the new job. -\end{enumerate} - -\result\ Notifications should be received by the client. - -\begin{hints} -Commands \path{change} and \path{receive} of \path{glite-lb-notify} -can be used. -\end{hints} - -% notifikace -- zmena adresy/portu -% pak poslat udalost, musi dojit -% uz je v predchozim implicitne - -\subsubsection{Delayed delivery} -% notifikace -- zpozdene doruceni -% registrovat, odpojit, poslat udalosti, pripojit se - -\req\ All \LB\ services running - -\how\ -\begin{enumerate} -\item Register another job. -\item Register a~notification as in~\ref{notif1} but terminate the client -immediately. -\item Log events for the job. -\item Restart the client, binding to the notification and call -\code{edg\_wll\_NotifReceive} repeatedly. -\end{enumerate} - -\result\ Delayed notifications should be received by the client almost -immediately. - -\subsection{Server purge} - -\textbf{WARNING: This test is destructive, it destroys ALL data in an -existing \LB\ database.} - -The test is fairly complex but it does not make too much sense to split it -artificially. - -\req\ All \LB services running, preferably a~dedicated server for this test. - -\how -\begin{enumerate} -\item Purge all data on the server with \path{glite-lb-purge} -\item Log two sets of jobs, separated with delay of at least 60s so -that the sets can be distinguished from each other. -\item \label{purgel} -Using \code{edg\_wll\_JobLog} retrieve events of all the jobs -\item \label{purge1} -Purge the first set of jobs (by specifying appropriate timestamp), -letting the server dump the purged events. -\item \label{purge2} Purge the other set of jobs, also dumping the events. -\item \label{purge3} Run purge once more. -\end{enumerate} - -\result\ The data dumped in steps \ref{purge1}, \ref{purge2} should be the -same as retrieved in~\ref{purgel}. The final purge invocation should -do nothing (i.e. nothing was left in the database). - -% test_purge -\begin{hints} -The example \path{glite-lb-test\_purge} does exactly this sequence of steps, -including the checks. -\end{hints} - - -\end{document} diff --git a/org.glite.lb/lb4vdt/LB_install.sh b/org.glite.lb/lb4vdt/LB_install.sh deleted file mode 100755 index 93924c9..0000000 --- a/org.glite.lb/lb4vdt/LB_install.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/sh - -set -e - -#OFFLINE=true -TOPDIR=${PWD} - -export LB4VDTDIR=${TOPDIR}/org.glite.lb/lb4vdt -export STAGEDIR=${TOPDIR}/stage -mkdir -p ${STAGEDIR} - -if [ ! -f ${LB4VDTDIR}/Makefile.inc ]; then - echo "Error: There is no ${LB4VDTDIR}/Makefile.inc. Exiting." - exit 1 -fi - -if [ -z "${CVSROOT}" ]; then - export CVSROOT=:pserver:anonymous@jra1mw.cvs.cern.ch:/cvs/jra1mw -# export CVSROOT=:ext:jpospi@jra1mw.cvs.cern.ch:/cvs/jra1mw - echo "Using CVSROOT=${CVSROOT}" -fi - -dep_modules="org.glite.wms-utils.jobid -org.gridsite.core" - -modules="org.glite.security.gsoap-plugin -org.glite.lb.client-interface -org.glite.lb.common -org.glite.lb.client -org.glite.lb.logger -org.glite.lb.ws-interface -org.glite.lb.server-bones -org.glite.lb.server -org.glite.lb.proxy" -#org.glite.lb.utils - -for i in $dep_modules; -do - echo "*********************************************************" - echo "* Module $i" - echo "*********************************************************" - cd ${TOPDIR} - if [ -n "${OFFLINE}" ]; then - echo "Working offline" - else - echo "Getting sources from CVS" - cvs co -A $i; - fi - if [ -d $i -a -f ${LB4VDTDIR}/patches/$i.patch -a ! -f .$i.patched ]; then - echo "Patching $i" - patch -p0 < ${LB4VDTDIR}/patches/$i.patch - touch .$i.patched - fi - if [ -d $i ]; then - touch .$i.timestamp - if [ -f ${LB4VDTDIR}/scripts/$i.build ]; then - echo "Building" - sh -x ${LB4VDTDIR}/scripts/$i.build - fi - cd ${TOPDIR} - find ${STAGEDIR} -newer .$i.timestamp > .$i.filelist - else - echo "WARNING: directory $i not found" - fi -done - -for i in $modules; -do - echo "*********************************************************" - echo "* Module $i" - echo "*********************************************************" - cd ${TOPDIR} - if [ -n "${OFFLINE}" ]; then - echo "Working offline" - else - echo "Getting sources from CVS" - cvs co -A $i; - fi - if [ -d $i -a -f ${LB4VDTDIR}/patches/$i.patch -a ! -f .$i.patched ]; then - echo "Patching $i" - patch -p0 < ${LB4VDTDIR}/patches/$i.patch - touch .$i.patched - fi - if [ -d $i ]; then - touch .$i.timestamp - echo "Entering directory ${TOPDIR}/$i" - cd ${TOPDIR}/$i - echo "Copying supporting files" - cp -rv ${TOPDIR}/org.glite.lb/project/{at3,*.T,*.pm} ./project/ - mkdir -p build - echo "Entering directory ${TOPDIR}/$i/build" - cd build - ln -fsv ../Makefile -# ln -fsv ../../Makefile.inc Makefile.inc - ln -fsv ${LB4VDTDIR}/Makefile.inc - echo "Building" - make LB_STANDALONE=yes - make stage LB_STANDALONE=yes - cd ${TOPDIR} - find ${STAGEDIR} -newer .$i.timestamp > .$i.filelist - else - echo "WARNING: directory $i not found" - fi - echo "Done" -done - -cd ${TOPDIR} -echo "Creating filelists" -cat .org.glite.wms-utils.jobid.filelist .org.gridsite.core.filelist .org.glite.security.gsoap-plugin.filelist .org.glite.lb.common.filelist | sort | uniq > LB-common.filelist -cat .org.glite.lb.client-interface.filelist .org.glite.lb.client.filelist | sort | uniq > LB-client.filelist -cat .org.glite.lb.logger.filelist | sort | uniq > LB-logger.filelist -cat .org.glite.lb.logger.filelist .org.glite.lb.server-bones.filelist .org.glite.lb.proxy.filelist | sort | uniq > LB-proxy.filelist -cat .org.glite.lb.ws-interface.filelist .org.glite.lb.server-bones.filelist .org.glite.lb.server.filelist | sort | uniq > LB-server.filelist diff --git a/org.glite.lb/lb4vdt/Makefile.inc b/org.glite.lb/lb4vdt/Makefile.inc deleted file mode 100644 index ccf0f2b..0000000 --- a/org.glite.lb/lb4vdt/Makefile.inc +++ /dev/null @@ -1,63 +0,0 @@ -# external dependencies: - -# missing packages could be downloaded to repository from -# http://egee-jra1-integration.web.cern.ch/egee-jra1-integration/repository/ -#repository=/home/honik/egee/repository - -#vdt_location=/home/honik/egee/vdt-1.3.11 -vdt_location=${VDT_LOCATION} - - -#cares_prefix=${repository}/c-ares/1.3.0/rhel30_gcc32 -cares_prefix=/software/cares-1.3 - -#classads_prefix=${repository}/classads/0.9.6/rhel30_gcc32 -classads_prefix=${vdt_location}/classads - -# not needed (used "only" for unit tests - 'make check'): -#cppunit_prefix=${repository}/cppunit/1.10.2/rhel30_gcc32 -cppunit_prefix=/software/cppunit-1.10.2 - -#expat_prefix=/usr -expat_prefix=${vdt_location}/expat - -#globus_prefix=${repository}/globus/2.4.3-VDT-1.2.2/rhel30_gcc32 -globus_prefix=${vdt_location}/globus - -#gridsite_prefix=${stagedir} - -gsoap_default_version=2.7.6b -gsoap_versions=${gsoap_default_version} -#gsoap_name=gsoap -#gsoap_platform=rhel30_gcc32 -#gsoap_prefix=${repository}/${gsoap_name}/${gsoap_default_version}/${gsoap_platform} -gsoap_prefix=/software/gsoap-${gsoap_default_version} - -#mysql_prefix=${repository}/mysql/4.1.11/rhel30_gcc32 -mysql_prefix=${vdt_location}/mysql -mysql_version=4.1.11 - -voms_prefix=${vdt_location}/glite -#voms_prefix=/home/honik/egee/glite/stage - - -# some defaults: - -#PREFIX=${vdt_location}/glite -PREFIX=/tmp/lb4vdt -globalprefix=glite -lbprefix=lb - -builddir=build -distdir=${STAGEDIR}/../dist -stagedir=${STAGEDIR} -top_srcdir=.. - -#thrflavour=gcc64dbgpthr -#nothrflavour=gcc64dbg -thrflavour=gcc32dbgpthr -nothrflavour=gcc32dbg - -# needed by org.glite.lb.client: -glite_location=${stagedir} - diff --git a/org.glite.lb/lb4vdt/scripts/org.gridsite.core.build b/org.glite.lb/lb4vdt/scripts/org.gridsite.core.build deleted file mode 100644 index 38258c5..0000000 --- a/org.glite.lb/lb4vdt/scripts/org.gridsite.core.build +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -set -e - -TOPDIR=${PWD} -source ${LB4VDTDIR}/Makefile.inc -cd org.gridsite.core/src -make build-lib OPENSSL_FLAGS=-I${globus_prefix}/include/${nothrflavour} OPENSSL_LIBS=-L${globus_prefix}/lib FLAVOR_EXT=_${nothrflavour} -make install-lib prefix=${STAGEDIR} -cd ${TOPDIR} - diff --git a/org.glite.lb/project/MultiStruct.pm b/org.glite.lb/project/MultiStruct.pm deleted file mode 100644 index 9cd847c..0000000 --- a/org.glite.lb/project/MultiStruct.pm +++ /dev/null @@ -1,191 +0,0 @@ -package MultiStruct; - -use StructField; - -sub new { - shift; - my $self = {}; - $self->{comments} = {}; # typ->comment - $self->{fields} = {}; # typ->{ name->StructField, ... } - $self->{order} = {}; - - bless $self; -} - -sub selectType { - my $self = shift; - my $type = shift; - $self->{type} = $type; - 1; -} - -sub addType { - my $self = shift; - my $type = shift; - my $comment = shift; - $self->selectType($type); - $self->{comments}->{$type} = $comment; - $self->{fields}->{$type} = {}; - 1; -} - -sub selectField { - my $self = shift; - $self->{field} = shift; - $self->getField; -} - -sub addField { - my $self = shift; - my $field = shift; - - die "unselected type" unless $self->{type}; - $self->{fields}->{$self->{type}}->{$field->{name}} = $field; - $self->selectField($field->{name}); - 1; -} - -sub getField { - my $self = shift; - my $f = $self->{fields}->{$self->{type}}->{$self->{field}}; - return $f ? $f : $self->{fields}->{_common_}->{$self->{field}}; -} - -sub load { - my $self = shift; - my $fh = shift; - local $_; - - while ($_ = <$fh>) { - - chomp; - s/#.*$//; - next if /^\s*$/; - - if (/^\@type\s+(\S+)\s*(.*$)$/) { - $self->addType($1,$2); - $self->{order}->{$1} = $.; - next; - } - - s/^\s*//; - my ($ftype,$fname,$comment) = split /\s+/,$_,3; - if ($ftype eq '_code_') { - my $f = $self->getField(); - addCode $f $fname,$comment; - } - elsif ($ftype eq '_alias_') { - my $f = $self->getField(); - addAlias $f $fname,$comment; - } - elsif ($ftype eq '_special_') { - my $f = $self->getField(); - addSpecial $f $fname; - } - elsif ($ftype eq '_null_') { - my $f = $self->getField(); - setNull $f $fname; - } - elsif ($ftype eq '_optional_') { - my $f = $self->getField(); - $f->{optional} = 1; - } - elsif ($ftype eq '_index_') { - my $f = $self->getField(); - $f->{index} = 1; - } - else { - my $f = new StructField $fname,$ftype,$comment,$.; - $self->addField($f); - } - } -} - -sub getTypes { - my $self = shift; - my @out; - local $_; - - for (keys %{$self->{fields}}) { - push @out,$_ unless $_ eq '_common_'; - } - @out; -} - -sub getTypesOrdered { - my $self = shift; - my @names = getTypes $self; - - sort { - my $oa = $self->{order}->{$a}; - my $ob = $self->{order}->{$b}; - $oa <=> $ob; - } @names; -} - -sub getTypeComment { - my $self = shift; - my $type = shift || $self->{type}; - $self->{comments}->{$type}; -} - -sub getFieldComment { - my $self = shift; - my $fname = shift; - $self->{fields}->{$self->{type}}->{$fname}->{comment}; -} - -sub getFields { - my $self = shift; - keys %{$self->{fields}->{$self->{type}}}; -} - -sub getFieldsOrdered { - my $self = shift; - my @names = $self->getFields; - sort { - my $oa = $self->selectField($a)->{order}; - my $ob = $self->selectField($b)->{order}; - $oa <=> $ob; - } @names; -} - -sub getFieldOccurence { - my $self = shift; - my $fname = shift; - my @out; - local $_; - - for (keys %{$self->{fields}}) { - push @out,$_ if $self->{fields}->{$_}->{$fname}; - } - @out; -} - -sub getAllFields { - my $self = shift; - my %out; - local $_; - - for my $t (values %{$self->{fields}}) { - $out{$_->{name}} = 1 for (values %$t); - } - keys %out; -} - -sub getAllFieldsOrdered { - my $self = shift; - my @names = getAllFields $self; - - sort { - my @occ = $self->getFieldOccurence($a); - $self->selectType($occ[0]); - my $oa = $self->selectField($a)->{order}; - @occ = $self->getFieldOccurence($b); - $self->selectType($occ[0]); - my $ob = $self->selectField($b)->{order}; - $oa <=> $ob; - } @names; -} - -1; diff --git a/org.glite.lb/project/StructField.pm b/org.glite.lb/project/StructField.pm deleted file mode 100644 index 95d33b8..0000000 --- a/org.glite.lb/project/StructField.pm +++ /dev/null @@ -1,116 +0,0 @@ -package StructField; - -$lang = 'C'; -1; - -sub new { - shift; - my $self = {}; - $self->{name} = shift; - $self->{type} = shift; - $self->{comment} = shift; - $self->{order} = shift; - $self->{null} = $main::DefaultNullValue{$self->{type}}; - bless $self; -} - -sub addCode { - my $self = shift; - my $code = shift; - my $comment = shift; - push @{$self->{codes}},{name=>$code,comment=>$comment}; - 1; -} - -sub addSpecial { - my $self = shift; - my $special = shift; - $self->{special} = $special; - 1; -} - -sub addAlias { - my $self = shift; - my $name = shift; - my $lang = shift; - $self->{aliases}->{$lang} = $name; - 1; -} - -sub hasAlias { - my $self = shift; - my $lang = shift; - return $self->{aliases}->{$lang} ? 1 : 0; -} - -sub getName { - my $self = shift; - my $lang = shift || $lang; - $self->{aliases}->{$lang} || $self->{name}; -# return $self->{aliases}->{$lang} ? $self->{aliases}->{$lang} : $self->{name}; -} - -sub getComment { - my $self = shift; - $self->{comment}; -} - -sub getDefaultNullValue { - my $self = shift; - $self->{null}; -} - -sub toString { - my $self = shift; - my $src = shift; - my $dst = shift; - - eval $main::toString{$lang}->{$self->{type}}; -} - -sub fromString { - my $self = shift; - my $src = shift; - my $dst = shift; - - eval $main::fromString{$lang}->{$self->{type}}; -} - -sub isNULL { - my $self = shift; - my $a = shift; - my $b = $self->{null}; - - eval $main::compare{$lang}->{$self->{type}}; -} - -sub isnotNULL { - my $self = shift; - my $src = shift; - - '!('.$self->isNULL($src).')'; -} - -sub compare { - my $self = shift; - my $a = shift; - my $b = shift; - eval $main::compare{$lang}->{$self->{type}}; -} - -sub toFormatString { - my $self = shift; - - eval $main::toFormatString{$lang}->{$self->{type}}; -} - -sub setNull { - my $self = shift; - $self->{null} = shift; -} - -sub getType { - my $self = shift; - - eval $main::types{$lang}->{$self->{type}}; -} diff --git a/org.glite.lb/project/at3 b/org.glite.lb/project/at3 deleted file mode 100755 index 8ff52ec..0000000 --- a/org.glite.lb/project/at3 +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; -my $dir; -BEGIN{ - $dir = dirname $0; -} - -my $lines = $ENV{AT3_LINES}; - -use lib $dir; -use MultiStruct; -require 'types.T'; - -my $eventsn; -for (@INC) { - if (-f "$_/events.T") { - $eventsn="$_/events.T"; - last; - } -} - -my $statusn; -for (@INC) { - if (-f "$_/status.T") { - $statusn = "$_/status.T"; - last; - } -} - -my $indent = ''; - -my $event = new MultiStruct; -my $status = new MultiStruct; - -sub gen { - local $_ = shift; - - s/^\n!//; - s/\n!/\n/g; - print $_; -} - - -open EVENTS,$eventsn or die "$eventsn: $!\n"; -$event->load(\*EVENTS); -close EVENTS; - -open STATUS,$statusn or die "$statusn: $!\n"; -$status->load(\*STATUS); -close STATUS; - -my $code; -my $startcode; -while (<>) { - chomp; - if (/^\@\@\@LANG: (\S+)$/) { - $StructField::lang = $1; - next; - } - - if ($code) { - if (/^\@\@\@}$/) { - $code .= "1;\n"; - print "#line $startcode \"$ARGV\"\n/* begin */\n" if $lines; - eval $code or warn "eval: $@ at $ARGV:$.\n"; - my $nxtline = $.+1; - print "/* end */\n#line $nxtline \"$ARGV\"\n" if $lines; - undef $code; - } - else { $code .= $_."\n"; } - } - else { - if (/^\@\@\@{$/) { - $startcode = $.; - $code = "\n"; - } - elsif (/^\@\@\@AUTO$/) { - print qq{ - !! Automatically generated file - !! Do not edit, your changes will be discarded upon build - !! Change the corresponding template file $ARGV - -}; - print "#line $. \"$ARGV\"\n" if $lines; - } - else { - print "$_\n"; - } - } -} - -# print $event_common{prog}->copy('bla','hu'); diff --git a/org.glite.lb/project/build.number b/org.glite.lb/project/build.number deleted file mode 100644 index cc27364..0000000 --- a/org.glite.lb/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Aug 18 12:35:01 CEST 2006 -module.build=0242 diff --git a/org.glite.lb/project/build.properties b/org.glite.lb/project/build.properties deleted file mode 100644 index 706c9bd..0000000 --- a/org.glite.lb/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -ext.gsoap.version=2.7.0 diff --git a/org.glite.lb/project/dependencies.properties b/org.glite.lb/project/dependencies.properties deleted file mode 100644 index 710fb40..0000000 --- a/org.glite.lb/project/dependencies.properties +++ /dev/null @@ -1,20 +0,0 @@ - -################################################################### -# System dependencies -################################################################### - -org.glite.version = HEAD -org.glite.lb.version = HEAD - -# Component dependencies tag = do not remove this line = -org.glite.lb.client-interface.version = HEAD -org.glite.lb.ws-interface.version = HEAD -org.glite.lb.common.version = HEAD -org.glite.lb.client.version = HEAD -org.glite.lb.server.version = HEAD -org.glite.lb.proxy.version = HEAD -org.glite.lb.server-bones.version = HEAD -org.glite.lb.logger.version = HEAD -org.glite.lb.utils.version = HEAD - -ext.gsoap.version = 2.7.0 diff --git a/org.glite.lb/project/events.T b/org.glite.lb/project/events.T deleted file mode 100644 index 24b7626..0000000 --- a/org.glite.lb/project/events.T +++ /dev/null @@ -1,201 +0,0 @@ -@type _common_ - timeval timestamp Time the event was generated. - _alias_ date ULM - timeval arrived Time the event was stored into the bookkeeping server database. - _alias_ arr_date ULM - _optional_ - string host Hostname of the machine where the event was generated. - _alias_ host ULM - int level Logging level (in the range from DEBUG to EMERGENCY). - _alias_ lvl ULM - _code_ EMERGENCY emergency - _code_ ALERT alert - _code_ ERROR error - _code_ WARNING warning - _code_ AUTH authentication - _code_ SECURITY security - _code_ USAGE usage - _code_ SYSTEM system - _code_ IMPORTANT important - _code_ DEBUG debug - int priority Message priority (yet 0 for asynchronous and 1 for synchronous transfers). - _null_ -1 - jobid jobId Grid job id of the job the event belongs to. - string seqcode Sequence code assigned to the event. - string user Identity (certificate subject) of the event sender. - logsrc source Source (software component) which generated this event. -# string prog name of program ("EDG WMS" of name of the application). - string src_instance Instance of source component (e.g. service communication endpoint). - _optional_ - -@type Transfer Start, success, or failure of job transfer to another component. - logsrc destination Destination where the job is being transfered to. - string dest_host Hostname of server that takes over control of the job. - string dest_instance Service (instance) that takes over control of the job. - _optional_ - string job Job description in receiver's language. - int result Result code of the transfer attempt (START, OK, REFUSED or FAIL). - _code_ START The sending component has started or is about to start the transfer. - _code_ OK The job was sent successfully. - _code_ REFUSED The job was refused by the other component. - _code_ FAIL The transfer failed for other reason than explicit refusal (eg. network timeout). - string reason Detailed description of the transfer, especially reason of failure. - _optional_ - string dest_jobid Job id as assigned by the receiving software component. - _optional_ - -@type Accepted Accepting job (successful counterpart to Transfer). - logsrc from The software component the job was received from. - string from_host Hostname of the component the job was received from. - string from_instance Instance of the component the job was received from. - _optional_ - string local_jobid New job id as assigned by the receiving component. - -@type Refused Refusing job (unsuccessful counterpart to Transfer). - logsrc from The software component that tried to send the job. - string from_host Hostname of the component that tried to send the job. - string from_instance Instance of the component that tried to send the job. - _optional_ - string reason Description of the reason why the job was refused. - -@type EnQueued The job has been enqueued in an inter-component queue. - string queue Queue into which the job has been stored for retrieval by another component. - string job Job description in the receiver's language. - int result Result code of the attempt to put job into the queue (START, OK, REFUSED or FAIL). - _code_ START The sending component has started or is about to start enqueuing the job. - _code_ OK The job was enqueued successfully. - _code_ REFUSED The job was refused by the other component. - _code_ FAIL The transfer failed for other reason than explicit refusal. - string reason Detailed description of the attempt to enqueue the job, especially the reason of failure. - -@type DeQueued The job has been dequeued from an inter-component queue. - string queue Name of the queue the job was obtained from. - string local_jobid New job id as assigned by the retreiving component. - -@type HelperCall Helper component is called. - string helper_name Name of the called helper component. - string helper_params Parameters of the call to the helper component. - int src_role The role the event sender is playing in the helper call (CALLING or CALLEE). - _code_ CALLING The logging component is caller. - _code_ CALLED The logging component is callee. - -@type HelperReturn Helper component is returning the control. - string helper_name Name of the called helper component. - string retval Data returned by the call to the helper component. - int src_role The role the event sender is playing in the helper call (CALLING or CALLEE). - _code_ CALLING The logging component is caller. - _code_ CALLED The logging component is callee. - -@type Running Job wrapper started. - string node Worker node on which the job executable is being run. - -@type Resubmission Result of resubmission decision. - int result Result code of the resubmission decision (WILLRESUB or WONTRESUB or SHALLOW). - _code_ WILLRESUB The job will be resubmitted (deep resubmission). - _code_ WONTRESUB The job will not be resubmitted. - _code_ SHALLOW Shallow resubmission (user payload has not started yet) - string reason Reason why the job will or will not be resubmitted. - string tag Value of the attribute on which the decision to resubmit the job was based. - -@type Done Execution terminated (normally or abnormally). - int status_code Reason code for the termination of the job (OK, FAILED or CANCELLED). - _code_ OK The job terminated by itself. - _code_ FAILED The job disappeared from LRMS. - _code_ CANCELLED The job was cancelled by user request. - string reason Detailed description why the job was terminated. - int exit_code Exit code of the job's process. - _null_ -1 - -@type Cancel Cancel operation has been attempted on the job. - int status_code Classification of the attempt to cancel the job (REQ, REFUSE, DONE or ABORT). - _code_ REQ The request was acknowledged. - _code_ REFUSE The request was declined by this component. - _code_ DONE The request was completed by whole WMS. - _code_ ABORT The request was refused by whole WMS. - string reason Detailed description of the attempt to cancel the job, especially the reason of failure. - -@type Abort Job aborted by system. - string reason Reason why the job was aborted by the system. - -@type Clear Job cleared, output sandbox removed - int reason Description of the reason why the job was cleared and the output sandbox removed (USER, TIMEOUT or NOOUTPUT). - _code_ USER User retrieved output sandbox. - _code_ TIMEOUT Timed out, resource forced purge of the sandbox. - _code_ NOOUTPUT No output was generated. - -@type Purge Job is purged from bookkepping server. - -@type Match Matching CE found. - string dest_id Identification of the queue on the CE that the job could be send to. - -@type Pending No matching CE found yet. - string reason Description why the matching CE for the job was not found (yet). - -@type RegJob New job registration. - string jdl Job description of the job being registered. - string ns NetworkServer handling the newly registered job. - jobid parent Grid job id of the parent job registering this new one. - _optional_ - - int jobtype Type of the job being registered (SIMPLE, DAG, PARTITIONABLE or PARTITIONED). - _code_ SIMPLE The job is simple job. - _code_ DAG The job is dag (containing static set of subjobs). - _code_ PARTITIONABLE The job is partitionable (may become partitioned). - _code_ PARTITIONED The job is partitioned (dynamically created dag). - - int nsubjobs Number of subjobs this job plans to spawn. - _optional_ - string seed Seed for subjob id generation. - _optional_ - -@type Chkpt Application-specific checkpoint record. - string tag Application specific checkpoint tag. - string classad Application specific checkpoint value. - -@type Listener Listening network port for interactive control. - string svc_name Name of the port instance for interactive job control. - string svc_host Hostname of the interactive job controller. - port svc_port Port number of the interactive job controller. - -@type CurDescr Current state of job processing (optional event). - string descr Description of the current job transformation (output of the helper). - -@type UserTag User tag -- arbitrary name=value pair. - string name Arbitrary user tag name. - string value Arbitrary user tag value. - -@type ChangeACL Management of ACL stored on bookkepping server. - string user_id DN or VOMS parameter (in format VO:group). - int user_id_type Type of information given in user_id (DN or VOMS). - _null_ -1 - int permission ACL permission to change (currently only READ). - _null_ -1 - int permission_type Type of permission requested ('allow', 'deny'). - _null_ -1 - int operation Operation requested to perform with ACL (add, remove). - _null_ -1 - -@type Notification Management of notification service. - notifid notifId Notification id. - string owner Identification of the job owner (certificate subject). - string dest_host Hostname the notification is sent to. - port dest_port Port number the notification is sent to. - string jobstat Status of the job (the notification content). - - -@type ResourceUsage Resource (CPU, memory etc.) consumption. - string resource Resource's name. - int quantity Resources's quantity (how much). - string unit Units (sec, kB, etc.). - -@type ReallyRunning User payload started. - _optional_ - string wn_seq Sequence code on the worker node. - -@type Suspend Job execution (queuing) was suspended. - _optional_ - string reason Reason for the suspend. - -@type Resume Job execution (queuing) was resumed. - _optional_ - string reason Reason for the resume. diff --git a/org.glite.lb/project/glite.lb.csf.xml b/org.glite.lb/project/glite.lb.csf.xml deleted file mode 100644 index 7d77350..0000000 --- a/org.glite.lb/project/glite.lb.csf.xml +++ /dev/null @@ -1,398 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The org.glite and org.glite.lb modules have been updated, please rerun the configuration file - - - - The org.glite and org.glite.lb modules have been updated, please rerun the configuration file - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb/project/properties.xml b/org.glite.lb/project/properties.xml deleted file mode 100755 index 0d0291a..0000000 --- a/org.glite.lb/project/properties.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.glite.lb/project/run-workspace b/org.glite.lb/project/run-workspace deleted file mode 100644 index 03a3381..0000000 --- a/org.glite.lb/project/run-workspace +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -cd ../.. - -cvs co org.glite -cvs co org.glite.lb - -cd org.glite.lb/project -ant -f glite.lb.csf.xml - diff --git a/org.glite.lb/project/status.T b/org.glite.lb/project/status.T deleted file mode 100644 index b5fbeed..0000000 --- a/org.glite.lb/project/status.T +++ /dev/null @@ -1,86 +0,0 @@ -@type _common_ -jobid jobId Id of the job -string owner Job owner -_index_ - -int jobtype Type of job - _null_ -1 - _code_ SIMPLE simple job - _code_ DAG composite job -jobid parent_job parent job of subjob - -string seed string used for generation of subjob IDs -int children_num number of subjobs -strlist children list of subjob IDs - _special_ XMLstructured -intlist children_hist summary (histogram) of children job states - _special_ XMLstructured -stslist children_states full status information of the children - _special_ XMLstructured - -string condorId Id within Condor-G -string globusId Globus allocated Id -string localId Id within LRMS - -string jdl User submitted job description -string matched_jdl Full job description after matchmaking -string destination ID of CE where the job is being sent -_index_ -string condor_jdl ClassAd passed to Condor-G for last job execution -string rsl Job RSL sent to Globus - -string reason Reason of being in this status, if any - -string location Where the job is being processed -_index_ -string ce_node Worker node where the job is executed -string network_server Network server handling the job - -bool subjob_failed Subjob failed (the parent job will fail too) -int done_code Return code - _null_ -1 - _code_ OK Finished correctly - _code_ FAILED Execution failed - _code_ CANCELLED Cancelled by user -int exit_code Unix exit code -bool resubmitted The job was resubmitted - -bool cancelling Cancellation request in progress -string cancelReason Reason of cancel - -int cpuTime Consumed CPU time - _null_ -1 - -taglist user_tags List of pairs (user_tag, user_value) - _special_ XMLstructured - -timeval stateEnterTime When entered this status -timeval lastUpdateTime Last known event of the job - -intlist stateEnterTimes When all previous states were entered - _special_ XMLstructured - -bool expectUpdate Some logged information has not arrived yet -string expectFrom Sources of the missing information -string acl ACL of the job - -bool payload_running User payload started -strlist possible_destinations Possible job destinations - _special_ XMLstructured -strlist possible_ce_nodes CE nodes matching to possible_destinations - _special_ XMLstructured - -bool suspended Job is suspended -string suspend_reason Reason for the suspend - -@type Submitted Entered by the user to the User Interface or registered by Job Partitioner. -@type Waiting Accepted by WMS, waiting for resource allocation. -@type Ready Matching resources found. -@type Scheduled Accepted by LRMS queue. -@type Running Executable is running. -@type Done Execution finished, output is available. -@type Cleared Output transfered back to user and freed. -@type Aborted Aborted by system (at any stage). -@type Cancelled Cancelled by user. -@type Unknown Status cannot be determined. -@type Purged Job has been purged from bookkeeping server (for LB->RGMA interface). diff --git a/org.glite.lb/project/taskdefs.xml b/org.glite.lb/project/taskdefs.xml deleted file mode 100755 index 251f790..0000000 --- a/org.glite.lb/project/taskdefs.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/org.glite.lb/project/types.T b/org.glite.lb/project/types.T deleted file mode 100644 index 015b4e1..0000000 --- a/org.glite.lb/project/types.T +++ /dev/null @@ -1,127 +0,0 @@ -%types = ( - C=>{ - bool=>'"int"', - string=>'"char *"', - strlist=>'"char **"', - intlist=>'"int *"', - taglist=>'"edg_wll_TagValue *"', - stslist=>'"struct _edg_wll_JobStat *"', - timeval=>'"struct timeval"', - jobid=>'"edg_wlc_JobId"', - notifid=>'"edg_wll_NotifId"', - logsrc=>'"edg_wll_Source"', - port=>'"uint16_t"', -# level=>'"enum edg_wll_Level"', - int=>'"int"' - }, - 'C++'=>{ - string=>'"std::string"', - timeval=>'"struct timeval"', - jobid=>'"edg::workload::common::jobid::JobId"', - bool=>'"int"', - intlist=>'"std::vector"', - strlist=>'"std::vector"', - taglist=>'"std::vector>"', - stslist=>'"std::vector"', - logsrc=>'"int"', - port=>'"int"', - int=>'"int"' - }, - 'wsdl'=>{ - bool=>'"xsd:boolean"', - string=>'"xsd:string"', - int=>'"xsd:int"', - jobid=>'"xsd:string"', - jobstat=>'"jobStatus"', - usertag=>'"tagValue"', - timeval=>'"timeval"', - logsrc=>'"eventSource"', - notifid=>'"xsd:string"', - port=>'"xsd:int"', - } -); - -%baseTypes = ( - intlist=>'int', - strlist=>'string', - stslist=>'jobstat', - taglist=>'usertag' -); - -%toString = ( - C=>{ - int=>'qq{asprintf(&$dst,"%d",$src);}', - port=>'qq{asprintf(&$dst,"%d",(int) $src);}', - bool=>'qq{asprintf(&$dst,"%d",$src);}', - string=>'qq{$dst = $src?strdup($src):NULL;}', - timeval=>'qq{edg_wll_ULMTimevalToDate(($src).tv_sec,($src).tv_usec,$dst);}', - jobid=>'qq{$dst = edg_wlc_JobIdUnparse($src);}', - notifid=>'qq{$dst = edg_wll_NotifIdUnparse($src);}', -# level=>'qq{$dst = edg_wll_LevelToString($src);}', - logsrc=>'qq{$dst = edg_wll_SourceToString($src);}', -# strlist, intlist, stslist are used only in consumer API, they don't need toString method - } -); - -%ULMasString = ( - logsrc=>1 -); - -%fromString = ( - C=>{ - int=>'qq{$dst = atoi($src);}', - port=>'qq{$dst = (uint16_t) atoi($src);}', - bool=>'qq{$dst = atoi($src);}', - string=>'qq{$dst = strdup($src);}', - timeval=>'qq{edg_wll_ULMDateToTimeval($src,&$dst);}', - jobid=>'qq{edg_wlc_JobIdParse($src,&$dst);}', - notifid=>'qq{edg_wll_NotifIdParse($src,&$dst);}', -# level=>'qq{$dst = edg_wll_StringToLevel($src);}', - logsrc=>'qq{$dst = edg_wll_StringToSource($src);}', -# strlist, intlist, stslist are used only in consumer API, they don't need fromString method - } -); - -%DefaultNullValue = ( - int=>0, - port=>0, -# level=>'EDG_WLL_LEVEL_UNDEFINED', - bool=>0, - string=>'NULL', - jobid=>'NULL', - notifid=>'NULL', - logsrc=>'EDG_WLL_SOURCE_NONE', - timeval=>'null_timeval', - strlist=>'NULL', - intlist=>'NULL', - taglist=>'NULL', - stslist=>'NULL', -); - -%compare = ( - C=>{ - int=>'"($a == $b)"', - port=>'"($a == $b)"', -# level=>'"($a == $b)"', - bool=>'"(($a || !$b) && ($b || !$a))"', - string=>'"(($a) == NULL && ($b) == NULL) || (($a)&&($b)&& !strcmp($a,$b))"', - jobid=>'"(($a) == NULL && ($b) == NULL) || (($a)&&($b)&& !strcmp(edg_wlc_JobIdUnparse($a),edg_wlc_JobIdUnparse($b)))"', - notifid=>'"($a) == ($b)"', - logsrc=>'"($a) == ($b)"', - timeval=>'"($a).tv_sec == ($b).tv_sec && ($a).tv_usec == ($b).tv_usec"', - } -); - -%toFormatString = ( - C=>{ - int=>'"%d"', - port=>'"%d"', - bool=>'"%d"', -# level=>'"%s"', - string=>'"%|Us"', - jobid=>'"%s"', - notifid=>'"%s"', - logsrc=>'"%s"', - timeval=>'"%s"', - } -); diff --git a/org.glite.lb/project/version.properties b/org.glite.lb/project/version.properties deleted file mode 100644 index 8dac816..0000000 --- a/org.glite.lb/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Fri Sep 02 14:19:10 CEST 2005 -module.version=1.3.3 -module.age=0 diff --git a/org.glite.security.gsoap-plugin/Makefile b/org.glite.security.gsoap-plugin/Makefile index aac50aa..3b44bc4 100644 --- a/org.glite.security.gsoap-plugin/Makefile +++ b/org.glite.security.gsoap-plugin/Makefile @@ -17,7 +17,8 @@ gsoap_prefix=/opt/gsoap CC=gcc -gsoap_versions?=2.6.2 2.7.0 2.7.6b +gsoap_versions?=2.6.2 2.7.0f 2.7.6b 2.7.9b +gsoap_versions:=${shell if ! echo $gsoap_versions | grep "\<${gsoap_default_version}\>" >/dev/null; then echo "${gsoap_default_version} "; else echo ne; fi} ${gsoap_versions} -include Makefile.inc -include ../Makefile.inc @@ -32,7 +33,13 @@ version_info:=-version-info ${shell \ # version_info=-version-info `echo ${version} | cut -d. -f1,2 | tr . :` +ext_repository:=${shell if [ -d "${repository}/externals" ]; then \ + echo "${repository}/externals"; \ + else echo "${repository}"; \ + fi} + gsoap_version=${gsoap_default_version} +gsoap_prefix?=${ext_repository}/${gsoap_name}/${gsoap_version}/${gsoap_platform} VPATH=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/examples @@ -84,7 +91,7 @@ ARES_LIBS:=-L${cares_prefix}/lib -lcares EX_LIBS:= ${GLOBUS_LIBS} ${ARES_LIBS} EX_THRLIBS := ${GLOBUS_THR_LIBS} ${ARES_LIBS} -HDRS:=glite_gss.h glite_gsplugin.h +HDRS:=glite_gss.h glite_gsplugin.h glite_gscompat.h GSS_OBJS:=glite_gss.o GSS_LOBJS:=${GSS_OBJS:.o=.lo} @@ -163,7 +170,7 @@ ${THRLTLIB_S}: ${THROBJS_S} all compile: \ ${GSS_STATICLIB} ${GSS_LTLIB} ${GSS_THRSTATICLIB} ${GSS_THRLTLIB} \ ${STATICLIB} ${LTLIB} ${THRSTATICLIB} ${THRLTLIB} \ - all-libs-with-soap + all-libs-with-soap examples check: compile check.gss @@ -186,25 +193,25 @@ all-libs-with-soap: for v in ${gsoap_versions}; do \ dir=`echo $$v | tr -d .`; \ mkdir $$dir; \ - ( cd $$dir && ${MAKE} -f ../Makefile gsoap_version=$$v top_srcdir=../.. libs-with-soap examples) ; \ + ( cd $$dir && ${MAKE} -f ../Makefile gsoap_version=$$v top_srcdir=../.. libs-with-soap) ; \ done libs-with-soap: ${LTLIB_S} ${THRLTLIB_S} ${STATICLIB_S} ${THRSTATICLIB_S} +gsoap_srcname=gsoap-`echo ${gsoap_version} | cut -d. -f1,2` + link-gsoap: if [ -f ${top_srcdir}/src/stdsoap2_${gsoap_version}.c ]; then \ ln -sf ${top_srcdir}/src/stdsoap2_${gsoap_version}.c stdsoap2.c; \ ln -sf ${top_srcdir}/src/stdsoap2_${gsoap_version}.h stdsoap2.h; \ - elif [ -f ${repository}/${gsoap_name}/${gsoap_version}/src/stdsoap2.c ]; then \ - ln -sf ${repository}/${gsoap_name}/${gsoap_version}/src/stdsoap2.[ch] .; \ - elif [ -f ${repository}/${gsoap_name}/${gsoap_version}/${gsoap_platform}/stdsoap2.c ]; then \ - ln -sf ${repository}/${gsoap_name}/${gsoap_version}/${gsoap_platform}/stdsoap2.[ch] .; \ - elif [ -f ${gsoap_prefix}/stdsoap2.c ]; then \ - ln -sf ${gsoap_prefix}/stdsoap2.[ch] .; \ - elif [ -f ${gsoap_prefix}/src/stdsoap2.c ]; then \ - ln -sf ${gsoap_prefix}/src/stdsoap2.[ch] .; \ - elif [ -f ${gsoap_prefix}/devel/stdsoap2.c ]; then \ - ln -sf ${gsoap_prefix}/devel/stdsoap2.[ch] .; \ + elif [ -f ${ext_repository}/${gsoap_name}/${gsoap_version}/src/stdsoap2.c ]; then \ + ln -sf ${ext_repository}/${gsoap_name}/${gsoap_version}/src/stdsoap2.[ch] .; \ + elif [ -f ${ext_repository}/${gsoap_name}/${gsoap_version}/${gsoap_platform}/stdsoap2.c ]; then \ + ln -sf ${ext_repository}/${gsoap_name}/${gsoap_version}/${gsoap_platform}/stdsoap2.[ch] .; \ + elif [ -f ${ext_repository}/${gsoap_name}/${gsoap_version}/src/stdsoap2.c ]; then \ + ln -sf ${ext_repository}/${gsoap_name}/${gsoap_version}/src/stdsoap2.[ch] .; \ + elif [ -f ${ext_repository}/${gsoap_name}/${gsoap_version}/src/${gsoap_srcname}/soapcpp2/stdsoap2.c ]; then \ + ln -sf ${ext_repository}/${gsoap_name}/${gsoap_version}/src/${gsoap_srcname}/soapcpp2/stdsoap2.[ch] .; \ else false ; \ fi @@ -228,7 +235,6 @@ wscalc_srv_ex2: ${WSCALC_SRV2_OBJS} ${LTLIB_S} ${LINK} -o $@ ${WSCALC_SRV2_OBJS} ${LTLIB_S} -gsoap_prefix?=${repository}/${gsoap_name}/${gsoap_version}/${gsoap_platform} soapcpp:=${shell if [ -x ${gsoap_prefix}/bin/soapcpp2 ]; then \ echo ${gsoap_prefix}/bin/soapcpp2; \ else echo ${gsoap_prefix}/soapcpp2; \ @@ -266,7 +272,7 @@ install: ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} cd ${top_srcdir}/interface && ${INSTALL} -m 644 ${HDRS} ${PREFIX}/include/glite/security/ if [ x${DOSTAGE} = xyes ]; then \ - install -m 644 ${GSS_STATICLIB} ${GSS_THRSTATICLIB} ${STATICLIB} ${THRSTATICLIB} ${PREFIX}/lib; \ + install -m 644 ${GSS_STATICLIB} ${GSS_THRSTATICLIB} ${PREFIX}/lib; \ fi for v in ${gsoap_versions}; do \ (cd `echo $$v | tr -d .` && ${MAKE} -f ../Makefile install-soaplib gsoap_version=$$v PREFIX=${PREFIX} ); \ diff --git a/org.glite.security.gsoap-plugin/build.xml b/org.glite.security.gsoap-plugin/build.xml index 1bfdeed..a5ccbb2 100755 --- a/org.glite.security.gsoap-plugin/build.xml +++ b/org.glite.security.gsoap-plugin/build.xml @@ -84,20 +84,25 @@ - - + + - + + + + + + diff --git a/org.glite.security.gsoap-plugin/interface/glite_gscompat.h b/org.glite.security.gsoap-plugin/interface/glite_gscompat.h new file mode 100644 index 0000000..38b7d96 --- /dev/null +++ b/org.glite.security.gsoap-plugin/interface/glite_gscompat.h @@ -0,0 +1,78 @@ +#ifndef GLIE_SECURITY_GSCOMPAT_H +#define GLIE_SECURITY_GSCOMPAT_H + +#ident "$Header: " + +#ifndef GSOAP_VERSION + #error GSOAP_VERSION required +#endif + +#if GSOAP_VERSION >= 20709 + #define GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, ITEM, TYPENAME, TYPENO) ((CHOICE)->union_##TYPENAME.ITEM) + #define GLITE_SECURITY_GSOAP_CHOICE_SETTYPE(CHOICE, ITEM, NS, TYPENAME, TYPENO) ((CHOICE)->__union_##TYPENAME) = SOAP_UNION__##NS##__union_##TYPENAME##_##ITEM + #define GLITE_SECURITY_GSOAP_CHOICE_ISTYPE(CHOICE, ITEM, NS, TYPENAME, TYPENO) (((CHOICE)->__union_##TYPENAME) == SOAP_UNION__##NS##__union_##TYPENAME##_##ITEM) +#elif GSOAP_VERSION >= 20706 + #define GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, ITEM, TYPENAME, TYPENO) ((CHOICE)->union_##TYPENO.ITEM) + #define GLITE_SECURITY_GSOAP_CHOICE_SETTYPE(CHOICE, ITEM, NS, TYPENAME, TYPENO) ((CHOICE)->__union_##TYPENO) = SOAP_UNION_##NS##__union_##TYPENO##_##ITEM + #define GLITE_SECURITY_GSOAP_CHOICE_ISTYPE(CHOICE, ITEM, NS, TYPENAME, TYPENO) (((CHOICE)->__union_##TYPENO) == SOAP_UNION_##NS##__union_##TYPENO##_##ITEM) +#else + #define GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, ITEM, TYPENAME, TYPENO) ((CHOICE)->ITEM) + #define GLITE_SECURITY_GSOAP_CHOICE_SETTYPE(CHOICE, ITEM, NS, TYPENAME, TYPENO) + #define GLITE_SECURITY_GSOAP_CHOICE_ISTYPE(CHOICE, ITEM, NS, TYPENAME, TYPENO) (((CHOICE)->ITEM) != NULL) +#endif +#define GLITE_SECURITY_GSOAP_CHOICE_SET(CHOICE, ITEM, NS, TYPENAME, TYPENO, VALUE) do { \ + memset((CHOICE), 0, sizeof(*(CHOICE))); \ + GLITE_SECURITY_GSOAP_CHOICE_SETTYPE(CHOICE, ITEM, NS, TYPENAME, TYPENO); \ + GLITE_SECURITY_GSOAP_CHOICE_GET(CHOICE, ITEM, TYPENAME, TYPENO) = (VALUE); \ +} while(0) + +#if GSOAP_VERSION >= 20706 + #define GLITE_SECURITY_GSOAP_REASON2(SOAP) ((SOAP)->fault->SOAP_ENV__Reason ? (SOAP)->fault->SOAP_ENV__Reason->SOAP_ENV__Text : "(no reason)") + #define GLITE_SECURITY_GSOAP_TRUE xsd__boolean__true_ + #define GLITE_SECURITY_GSOAP_FALSE xsd__boolean__false_ +#else + #define GLITE_SECURITY_GSOAP_REASON2(SOAP) ((SOAP)->fault->SOAP_ENV__Reason) + #define GLITE_SECURITY_GSOAP_TRUE true_ + #define GLITE_SECURITY_GSOAP_FALSE false_ +#endif + +#define GLITE_SECURITY_GSOAP_DETAIL(SOAP) ((SOAP)->version == 2 ? (SOAP)->fault->SOAP_ENV__Detail : (SOAP)->fault->detail) +#define GLITE_SECURITY_GSOAP_REASON(SOAP) ((SOAP)->version == 2 ? GLITE_SECURITY_GSOAP_REASON2((SOAP)) : (SOAP)->fault->faultstring) + +#if GSOAP_VERSION >= 20709 + #define GLITE_SECURITY_GSOAP_LIST_CREATE0(SOAP, LIST, SIZE, TYPE, N) do { \ + if ((N) != 0) (LIST) = soap_malloc((SOAP), (N) * sizeof(TYPE)); \ + else (LIST) = NULL; \ + (SIZE) = (N); \ +} while (0) + #define GLITE_SECURITY_GSOAP_LIST_DESTROY0(SOAP, LIST, SIZE) do { \ + if ((LIST) && (SIZE) != 0) soap_dealloc((SOAP), (LIST)); \ + (LIST) = NULL; \ +} while (0) + #define GLITE_SECURITY_GSOAP_LIST_GET(LIST, INDEX) (&(LIST)[INDEX]) + #define GLITE_SECURITY_GSOAP_LIST_TYPE(NS, LIST) struct NS##__##LIST * +#else + #define GLITE_SECURITY_GSOAP_LIST_CREATE0(SOAP, LIST, SIZE, TYPE, N) do { \ + int ilist; \ + \ + if ((N) != 0) (LIST) = soap_malloc((SOAP), (N) * sizeof(void *)); \ + else (LIST) = NULL; \ + (SIZE) = (N); \ + for (ilist = 0; ilist < (N); ilist++) { \ + (LIST)[ilist] = soap_malloc((SOAP), sizeof(TYPE)); \ + } \ +} while (0) + #define GLITE_SECURITY_GSOAP_LIST_DESTROY0(SOAP, LIST, SIZE) do { \ + int ilist; \ + \ + for (ilist = 0; ilist < (SIZE); ilist++) soap_dealloc((SOAP), (LIST)[ilist]); \ + if ((LIST) && (SIZE) != 0) soap_dealloc((SOAP), (LIST)); \ + (LIST) = NULL; \ +} while (0) + #define GLITE_SECURITY_GSOAP_LIST_GET(LIST, INDEX) ((LIST)[INDEX]) + #define GLITE_SECURITY_GSOAP_LIST_TYPE(NS, LIST) struct NS##__##LIST ** +#endif +#define GLITE_SECURITY_GSOAP_LIST_CREATE(SOAP, CONTAINER, LIST, TYPE, N) GLITE_SECURITY_GSOAP_LIST_CREATE0(SOAP, (CONTAINER)->LIST, (CONTAINER)->__size##LIST, TYPE, N) +#define GLITE_SECURITY_GSOAP_LIST_DESTROY(SOAP, CONTAINER, LIST) GLITE_SECURITY_GSOAP_LIST_DESTROY0(SOAP, (CONTAINER)->LIST, (CONTAINER)->__size##LIST) + +#endif diff --git a/org.glite.security.gsoap-plugin/project/version.properties b/org.glite.security.gsoap-plugin/project/version.properties index 99dbed2..4dae1ef 100644 --- a/org.glite.security.gsoap-plugin/project/version.properties +++ b/org.glite.security.gsoap-plugin/project/version.properties @@ -1,2 +1,2 @@ -module.version=1.3.0 -module.age=0 +module.version=1.4.2 +module.age=3 diff --git a/org.glite.security.gsoap-plugin/src/glite_gsplugin.c b/org.glite.security.gsoap-plugin/src/glite_gsplugin.c index ace9384..c7cc361 100644 --- a/org.glite.security.gsoap-plugin/src/glite_gsplugin.c +++ b/org.glite.security.gsoap-plugin/src/glite_gsplugin.c @@ -168,7 +168,7 @@ glite_gsplugin(struct soap *soap, struct soap_plugin *p, void *arg) soap->fconnect = glite_gsplugin_connect; soap->fclose = glite_gsplugin_close; #if GSOAP_VERSION >= 20700 - soap->fclosesocket = glite_gsplugin_close; + soap->fclosesocket = NULL; #endif soap->faccept = glite_gsplugin_accept; soap->fsend = glite_gsplugin_send; @@ -236,6 +236,7 @@ glite_gsplugin_connect( || (GSOAP_VERSION == 20700 && (strlen(GSOAP_MIN_VERSION) < 1 || GSOAP_MIN_VERSION[1] < 'e')) ) { fprintf(stderr, "Client connect will work only with gSOAP v2.7.0e and later"); + soap->errnum = ENOSYS; return ENOSYS; } #endif @@ -265,17 +266,21 @@ glite_gsplugin_connect( goto err; } + soap->errnum = 0; return 0; err: pdprintf(("GSLITE_GSPLUGIN: glite_gsplugin_connect() error!\n")); switch ( ret ) { + case EDG_WLL_GSS_ERROR_GSS: ret = SOAP_CLI_FAULT; break; case EDG_WLL_GSS_ERROR_HERRNO: - case EDG_WLL_GSS_ERROR_ERRNO: return errno; - case EDG_WLL_GSS_ERROR_EOF: return ECONNREFUSED; - case EDG_WLL_GSS_ERROR_TIMEOUT: return ETIMEDOUT; + case EDG_WLL_GSS_ERROR_ERRNO: ret = errno; break; + case EDG_WLL_GSS_ERROR_EOF: ret = ECONNREFUSED; break; + case EDG_WLL_GSS_ERROR_TIMEOUT: ret = ETIMEDOUT; break; + default: break; } + soap->errnum = ret; return ret; } @@ -311,7 +316,7 @@ glite_gsplugin_accept(struct soap *soap, int s, struct sockaddr *a, int *n) edg_wll_GssStatus gss_code; int conn; - + soap->errnum = 0; pdprintf(("GSLITE_GSPLUGIN: glite_gsplugin_accept()\n")); ctx = ((int_plugin_data_t *)soap_lookup_plugin(soap, plugin_id))->ctx; if ( (conn = accept(s, (struct sockaddr *)&a, n)) < 0 ) return conn; @@ -320,6 +325,7 @@ glite_gsplugin_accept(struct soap *soap, int s, struct sockaddr *a, int *n) if ( edg_wll_gss_accept(ctx->cred, conn, ctx->timeout, ctx->connection, &gss_code)) { pdprintf(("GSLITE_GSPLUGIN: Client authentication failed, closing.\n")); edg_wll_gss_get_error(&gss_code, "Client authentication failed", &ctx->error_msg); + soap->errnum = SOAP_SVR_FAULT; return -1; } diff --git a/org.glite.security.gsoap-plugin/src/glite_gss.c b/org.glite.security.gsoap-plugin/src/glite_gss.c index e13a63d..1bf7fd3 100644 --- a/org.glite.security.gsoap-plugin/src/glite_gss.c +++ b/org.glite.security.gsoap-plugin/src/glite_gss.c @@ -587,6 +587,17 @@ end: return ret; } +/* XXX XXX This is black magic. "Sometimes" server refuses the client with SSL + * * alert "certificate expired" even if it is not true. In this case the server + * * slave terminates (which helps, usually), and we can reconnect transparently. + * */ + +/* This string appears in the error message in this case */ +#define _EXPIRED_ALERT_MESSAGE "function SSL3_READ_BYTES: sslv3 alert certificate expired" +#define _EXPIRED_ALERT_RETRY_COUNT 10 /* default number of slaves, hope that not all + are in the bad state */ +#define _EXPIRED_ALERT_RETRY_DELAY 10 /* ms */ + int edg_wll_gss_connect(gss_cred_id_t cred, char const *hostname, int port, struct timeval *timeout, edg_wll_GssConnection *connection, @@ -600,6 +611,7 @@ edg_wll_gss_connect(gss_cred_id_t cred, char const *hostname, int port, gss_name_t server = GSS_C_NO_NAME; gss_ctx_id_t context = GSS_C_NO_CONTEXT; char *servername = NULL; + int retry = _EXPIRED_ALERT_RETRY_COUNT; maj_stat = min_stat = min_stat2 = req_flags = 0; memset(connection, 0, sizeof(*connection)); @@ -633,6 +645,8 @@ edg_wll_gss_connect(gss_cred_id_t cred, char const *hostname, int port, /* XXX if cred == GSS_C_NO_CREDENTIAL set the ANONYMOUS flag */ + do { /* XXX: the black magic above */ + /* XXX prepsat na do {} while (maj_stat == CONT) a osetrit chyby*/ while (!context_established) { /* XXX verify ret_flags match what was requested */ @@ -674,6 +688,27 @@ edg_wll_gss_connect(gss_cred_id_t cred, char const *hostname, int port, /* XXX check ret_flags matches to what was requested */ + /* retry on false "certificate expired" */ + if (ret == EDG_WLL_GSS_ERROR_GSS) { + edg_wll_GssStatus gss_stat; + char *msg = NULL; + + gss_stat.major_status = maj_stat; + gss_stat.minor_status = min_stat; + edg_wll_gss_get_error(&gss_stat,"",&msg); + + if (strstr(msg,_EXPIRED_ALERT_MESSAGE)) { + usleep(_EXPIRED_ALERT_RETRY_DELAY); + retry--; + } + else retry = 0; + + free(msg); + } + else retry = 0; + + } while (retry); + connection->sock = sock; connection->context = context; servername = NULL; diff --git a/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.c b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.c new file mode 100644 index 0000000..b4750a4 --- /dev/null +++ b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.c @@ -0,0 +1,12026 @@ +/* + +stdsoap2.c[pp] 2.7.0f + +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. + +-------------------------------------------------------------------------------- + + This software is released under one of the following three licenses: + GPL, the gSOAP public license, or Genivia's license for commercial use. + +-------------------------------------------------------------------------------- +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 +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- + +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.0f 2005-02-28 12:00:00 GMT") +extern "C" { +#else +SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.0f 2005-02-28 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_QT (soap_wchar)(-5) /* XML character '"' */ +#define SOAP_AP (soap_wchar)(-6) /* XML character ''' */ + +#define SOAP_BOM (soap_wchar)(0xFEFF) /* UTF BOM is Unicode FEFF */ + +#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*); + +#ifndef WITH_NOIDREF +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*); +#endif + +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, soap_wchar); +static void soap_set_local_namespaces(struct soap*); +static void *fplugin(struct soap*, const char*); + +#ifndef WITH_LEAN +static const char *soap_set_validation_fault(struct soap*, const char*, const char*); +static int soap_isnumeric(struct soap*, const char*); +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 + +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +static const char *soap_decode(char*, size_t, const char*, const char*); +#endif + +#ifndef WITH_NOHTTP +static soap_wchar soap_getchunkchar(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*); +#endif + +#ifndef WITH_NOIO +static int fsend(struct soap*, const char*, size_t); +static size_t frecv(struct soap*, char*, size_t); +static int tcp_init(struct soap*); +static const char *tcp_error(struct soap*); +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 const char *soap_strerror(struct soap*); +#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_NOIO +#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 +#endif + +#ifndef WITH_NOHTTP +#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 +#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 WITH_NOIO +#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); +#ifndef WITH_LEANER + if (soap->fpreparesend) + return soap->fpreparesend(soap, s, n); +#endif + return SOAP_OK; + } +#ifndef WITH_LEANER + 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); +#endif + 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; +#ifndef WITH_LEANER + if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + return soap->fpreparesend(soap, s, n); +#endif + 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 WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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 + if (soap->recv_timeout) + { struct timeval timeout; + fd_set fd; + 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 || 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_socket_errno != SOAP_EWOULDBLOCK) + { 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); +#ifdef WITH_OPENSSL + if (soap->ssl && SSL_get_error(soap->ssl, r) == SSL_ERROR_WANT_WRITE) + r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout); + else + r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout); +#else + r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout); +#endif + 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 WITH_NOHTTP +#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 from socket %d\n", (unsigned int)soap->buflen, soap->socket)); + DBGMSG(RECV, soap->buf, soap->buflen); + if (soap->buflen) + return soap->buf[soap->bufidx++]; + return EOF; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +soap_isxdigit(int c) +{ return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); +} +#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 +#ifndef WITH_NOHTTP + 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 from socket %d\n", (unsigned int)ret, soap->socket)); + 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 +#endif + { soap->bufidx = 0; + soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket %d\n", (unsigned int)ret, soap->socket)); + DBGMSG(RECV, soap->buf, ret); + } +#ifndef WITH_LEANER + if (soap->fpreparerecv && (soap->error = soap->fpreparerecv(soap, soap->buf, ret))) + return soap->error; +#endif +#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 + +/******************************************************************************/ +#ifdef WITH_LEAN +soap_wchar +soap_get0(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx]; +} +#endif + +/******************************************************************************/ +#ifdef WITH_LEAN +soap_wchar +soap_get1(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx++]; +} +#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 WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#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); +#ifndef WITH_NOIDREF + if (flag) + soap_update_ptrs(soap, q, q + n, (long)s - (long)q); /* pointers s and q may or may not be related */ +#endif + 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 WITH_NOIO +#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 +#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; +#ifndef WITH_NOHTTP + 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; +#endif +#ifndef WITH_NOIO +#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->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; +#endif + 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 WITH_NOIO +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static const char* +http_error(struct soap *soap, int status) +{ register const char *msg = SOAP_STR_EOS; +#ifndef WITH_LEAN + msg = soap_str_code(h_http_error_codes, status); + if (!msg) + msg = SOAP_STR_EOS; +#endif + return msg; +} +#endif +#endif + +/******************************************************************************/ +/* WR[ */ +#ifndef WITH_IPV6 +/* ]WR */ +#ifndef WITH_NOIO +#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 WITH_NOIO +#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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + } + 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 &= ~SOAP_ENC; /* 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 SOAP_INVALID_SOCKET; +#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 SOAP_INVALID_SOCKET; + soap->omode = k; + k = soap->imode; + soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ + if (soap_begin_recv(soap)) + return SOAP_INVALID_SOCKET; + 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 SOAP_INVALID_SOCKET; + } + soap->ssl = SSL_new(soap->ctx); + if (!soap->ssl) + { soap->error = SOAP_SSL_ERROR; + return SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + } + } +#endif + return fd; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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 SOAP_INVALID_SOCKET; + } +/* 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } +/* 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } + } + 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 SOAP_INVALID_SOCKET; + } +/* WR[ */ +#endif /* WITH_IPV6 */ +/* ]WR */ +#ifdef WITH_OPENSSL + if (!soap->ctx && (soap->error = soap->fsslauth(soap))) + return SOAP_INVALID_SOCKET; +#endif + return soap->master; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_poll(struct soap *soap) +{ +#ifndef WITH_LEAN + struct timeval timeout; + fd_set sfd, rfd, xfd; + int r; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&rfd); + FD_ZERO(&sfd); + FD_ZERO(&xfd); + if (soap_valid_socket(soap->socket)) + { FD_SET(soap->socket, &rfd); + FD_SET(soap->socket, &sfd); + FD_SET(soap->socket, &xfd); + r = select(soap->socket + 1, &rfd, &sfd, &xfd, &timeout); + if (r > 0 && FD_ISSET(soap->socket, &xfd)) + r = -1; + } + else if (soap_valid_socket(soap->master)) + { FD_SET(soap->master, &rfd); + r = select(soap->master + 1, &rfd, &sfd, NULL, &timeout); + } + else + return SOAP_OK; + if (r > 0) + { +#ifdef WITH_OPENSSL + if (soap->ssl) + { if (soap_valid_socket(soap->socket) && FD_ISSET(soap->socket, &rfd)) + { char buf = '\0'; + if (SSL_peek(soap->ssl, &buf, 1) <= 0) + return SOAP_EOF; + } + } +#endif + if (soap_valid_socket(soap->socket) && FD_ISSET(soap->socket, &rfd)) + return SOAP_EOF; + 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 WITH_NOIO +#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 WITH_NOIO +#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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + } +#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 + soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&sockaddr, &n); + if (soap_valid_socket(soap->socket)) + { +/* 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 SOAP_INVALID_SOCKET; + } + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } +#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 SOAP_INVALID_SOCKET; + } +#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) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); + soap->errnum = soap_socket_errno; + soap_set_receiver_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } + } + else + { soap_set_receiver_error(soap, tcp_error(soap), "TCP no master socket in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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 WITH_NOIO +#ifndef PALM_1 +static int +tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) +{ return closesocket(fd); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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; + if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) + { if (soap->fclose && (soap->error = soap->fclose(soap))) + return soap->error; + soap->socket = SOAP_INVALID_SOCKET; + soap->keep_alive = 0; + } +#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 WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new1(soap_mode mode) +{ return soap_new2(mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new() +{ return soap_new2(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new2(soap_mode imode, soap_mode omode) +{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap)); + if (soap) + soap_init2(soap, imode, omode); + return soap; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#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)) +#ifndef WITH_LEANER + && !soap->fpreparesend +#endif + )) + soap->mode &= ~SOAP_IO_LENGTH; + else + soap->mode |= SOAP_IO_LENGTH; + } +#ifdef WITH_ZLIB + 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; + } + +#endif + 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; +#ifndef WITH_LEANER + soap->dime.count = 0; /* count # of attachments */ + soap->dime.size = 0; /* accumulate total size of attachments */ + if (soap->fprepareinit && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + soap->fprepareinit(soap); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); +} +#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->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); +#ifdef WITH_ZLIB + 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; + } +#endif + if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) + { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) + soap->mode |= SOAP_IO_BUFFER; + else + soap->mode |= SOAP_IO_STORE; + } + soap->mode &= ~SOAP_IO_LENGTH; + 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); +#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 +#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)); +#ifndef WITH_LEANER + if (soap->fprepareinit && (soap->mode & SOAP_IO) == SOAP_IO_STORE) + soap->fprepareinit(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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; + int i; + 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:"")); + i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); + if (!i) + { i = soap_pointer_enter(soap, p, a, n, t, &pp); + if (!i) + { soap->error = SOAP_EOM; + return -1; + } + } + if (id < 0) + id = i; + 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) + { soap->error = SOAP_EOM; + return -1; + } + content->id = aid; + content->type = atype; + content->options = aoptions; + pp->mark1 = 3; + } + } + else + pp->mark2 = 3; + return -1; +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#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 WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 (!p || !id || !*id) + return p; + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#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; + } +#ifndef WITH_NOIDREF + if (!id || !*id) +#endif + return p; +#ifndef WITH_NOIDREF + 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 +} +#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; +#ifndef WITH_NOHTTP + 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++; + } +#endif + 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); + } +#ifndef WITH_LEANER + 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) + 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; +#ifndef WITH_NOIDREF + return soap_resolve(soap); +#else + return SOAP_OK; +#endif +} +#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 +#ifndef WITH_NOIDREF + soap_free_pht(soap); + soap_free_iht(soap); +#endif + 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); +#ifndef WITH_NOIDREF + soap_init_iht(copy); + soap_init_pht(copy); +#endif + 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; +#ifndef WITH_NOHTTP + 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; +#endif + soap->fconnect = NULL; + soap->fdisconnect = NULL; +#ifndef WITH_NOIO +#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->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; +#endif + soap->fignore = NULL; + soap->fserveloop = NULL; + soap->fplugin = fplugin; +#ifndef WITH_LEANER + soap->fdimereadopen = NULL; + soap->fdimewriteopen = NULL; + soap->fdimereadclose = NULL; + soap->fdimewriteclose = NULL; + soap->fdimeread = NULL; + soap->fdimewrite = NULL; +#endif + 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; +#ifdef WITH_FAST + soap->labbuf = NULL; + soap->lablen = 0; + soap->labidx = 0; +#endif + 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; +#ifndef WITH_LEANER + 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; +#endif +#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 +#ifndef WITH_NOIDREF + soap_init_iht(soap); + soap_init_pht(soap); +#endif + 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, soap_mode mode) +{ soap_init2(soap, mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init2(struct soap *soap, soap_mode imode, soap_mode 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'; +#ifndef WITH_LEANER + soap->dime.chunksize = 0; + soap->dime.buflen = 0; +#endif + 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++; + n *= sizeof(struct Namespace); + ns2 = (struct Namespace*)SOAP_MALLOC(n); + if (ns2) + { memcpy(ns2, soap->namespaces, n); + 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 : "")) + 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_send(soap, " ") || 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_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, "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) +{ if (!p || (a && !a->__ptr)) + { soap_element_null(soap, tag, id, type); + return -1; + } +#ifndef WITH_NOIDREF + if (soap->mode & SOAP_XML_TREE) + return 0; + if (id < 0) + { struct soap_plist *pp; + 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; +#else + return 0; +#endif +} +#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_send(soap, " ") || 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, 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; + register int n = 0; + if (tag && *tag == '-') + return SOAP_OK; + soap->level--; + soap_pop_namespace(soap); + if (soap->error == SOAP_NO_TAG) + soap->error = SOAP_OK; + if (soap->peeked && *soap->tag) + n++; + soap->peeked = 0; + do + { while (((c = soap_get(soap)) != SOAP_TT)) + { if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (c == SOAP_LT) + n++; + } + } while (n--); + 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->peeked) + { if (!*soap->tag) + return soap->error = SOAP_NO_TAG; + return SOAP_OK; + } + soap->peeked = 1; + for (;;) + { c = soap_getutf8(soap); + if (c == SOAP_BOM) + c = soap_getutf8(soap); + while (soap_blank(c)) + c = soap_getutf8(soap); + if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (c != SOAP_LT) + { *soap->tag = '\0'; + soap_unget(soap, c); + return soap->error = SOAP_NO_TAG; + } + 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->error = 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 = 0xFFFFFF80UL; +#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: +#ifndef WITH_LEANER +#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 +#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 size_t m = 0; + register soap_wchar c; +#if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) + char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; +#else + char buf[8]; +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content\n")); +#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: +#ifndef WITH_LEANER +#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 +#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*)"amp;"; + m = 4; + } + 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; +#ifndef WITH_LEANER +#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 +#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; + if (soap->peeked && *soap->tag) + { soap->peeked = 0; + if (soap_element_end_in(soap, NULL)) + return NULL; + } + return t; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n")); + if (soap->peeked && *soap->tag) + { n = 1; + soap->peeked = 0; + } + 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; + } + if (soap->peeked && *soap->tag) + { soap->peeked = 0; + if (soap_element_end_in(soap, NULL)) + return NULL; + } + return (wchar_t*)soap_save_block(soap, NULL, 0); +} +#endif +#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 + { +#if defined(HAVE_STRTOF) + char *r; + *p = strtof(s, &r); + if (*r) +#elif defined(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 PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_unsignedShort2s(struct soap *soap, unsigned short n) +{ return soap_unsignedLong2s(soap, (unsigned long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +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 PALM_2 +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 PALM_2 +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)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + 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 WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + 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 +#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, "", 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)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) + return NULL; + if (soap->null) + *p = NULL; + else + *p = soap_string_in(soap, 0, -1, -1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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, "", t); + return soap_send(soap, soap->tmpbuf); + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) + return NULL; + if (soap->null) + *p = NULL; + else + *p = soap_wstring_in(soap, 0, -1, -1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif +#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 + +/******************************************************************************/ +#if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) +#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' || c == '\n') + break; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + *s++ = (char)c; + } + if (c != '\n') + c = soap_getchar(soap); /* got \r, now get \n */ + if (c == '\n') + { *s = '\0'; + if (i+1 == len) /* empty line: end of HTTP/MIME 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 +#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, *t = NULL; + 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 (;;) + { 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; + memset(t, 0, sizeof(soap->tmpbuf)); + strcpy(t, "\n--"); + strncat(t, soap->mime.boundary, sizeof(soap->tmpbuf)-4); + 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 + 1); + if (!s) + return; + } + strcpy(s, "<>"); + s += 2; + n -= 4; + while (n) + { *s++ = soap_base64o[rand()&0x3F]; + n--; + } + strcpy(s, "<>"); + } + if (!soap->mime.start) + soap->mime.start = ""; +} +#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 && !strchr("()<>@,;:\\\"/[]?={}", 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); + *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 */ +#ifndef WITH_NOIDREF + soap_free_iht(soap); +#endif + 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; +#ifndef WITH_LEANER + 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; +#endif +#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 +#ifndef WITH_LEANER + 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 +#ifndef WITH_LEANER + 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 +#endif + { while (soap_blank(c)) + c = soap_getchar(soap); + } + if ((int)c == EOF) + return soap->error = SOAP_EOF; + soap_unget(soap, c); +#ifndef WITH_NOHTTP + 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; + } +#ifndef WITH_LEANER + else if (soap->fpreparerecv && soap->buflen != soap->bufidx) + soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); +#endif +#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 + } +#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 WITH_NOHTTP +#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)) + { if (soap->error == SOAP_EOF) + { soap->error = SOAP_OK; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); + break; + } + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#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); +#ifndef WITH_LEANER + if (soap->fconnect) + { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) + return soap->error; + } + else +#endif + if (soap->fopen && *soap->host) + { soap->status = http_command; + if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) + { soap->keep_alive = 0; /* force close */ + soap_closesock(soap); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/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; + soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); + } + } + if (soap_begin_send(soap)) + return soap->error; + count = soap_count_attachments(soap); +#ifndef WITH_NOHTTP + 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; +#ifndef WITH_LEANER + if ((k & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = k; + } + if (http_command != SOAP_POST) + return soap_end_send(soap); +#endif + 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 WITH_NOHTTP +#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 && soap->http_content) + 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->status != SOAP_GET) + { register const char *t = strchr(s, ';'); + sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=\"", soap->mime.boundary); + if (t) + strncat(soap->tmpbuf, s, t - s); + else + strcat(soap->tmpbuf, s); + if (soap->mime.start) + { strcat(soap->tmpbuf, "\"; start=\""); + strcat(soap->tmpbuf, soap->mime.start); + } + strcat(soap->tmpbuf, "\""); + 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 +#ifndef WITH_LEANER + if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) + err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); + else +#endif + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_get(struct soap *soap) +{ return SOAP_GET_METHOD; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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; +#ifndef WITH_LEAN + 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; + } +#endif + } + 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 +#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; +#ifndef WITH_NOHTTP + 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; +#ifndef WITH_LEANER + if ((n & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = n; + } +#endif + 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_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; +#ifndef WITH_NOIO + case SOAP_TCP_ERROR: + *s = tcp_error(soap); + break; +#endif + 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: +#ifndef WITH_NOIO + sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap)); + *s = soap->msgbuf; + break; +#else + *s = "End of file or no input"; + break; +#endif + default: +#ifndef WITH_NOHTTP +#ifndef WITH_LEAN + if (soap->error > 200 && soap->error < 600) + { sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error)); + *s = soap->msgbuf; + } + else +#endif +#endif + { 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 WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send_empty_response(struct soap *soap) +{ soap->count = 0; + if (soap_response(soap, SOAP_OK) || soap_end_send(soap)) + return soap_closesock(soap); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv_empty_response(struct soap *soap) +{ if (soap_begin_recv(soap) || soap_end_recv(soap)) + return soap_closesock(soap); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static const char* +soap_strerror(struct soap *soap) +{ + int err = soap->errnum; + if (!err) + err = soap_errno; + if (err) + { +#ifndef WIN32 + return strerror(err); +#else + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)&soap->errorstr, sizeof(soap->errorstr), NULL); + return soap->errorstr; +#endif + } + return "Operation interrupted or timed out"; +} +#endif +#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 +#ifndef WITH_NOIO +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 +#endif + +/******************************************************************************/ +#ifndef PALM_1 +#ifndef WITH_NOIO +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 +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) +{ register struct soap_plugin *p; + register int r; + if (!(p = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin)))) + return soap->error = SOAP_EOM; + p->id = NULL; + p->data = NULL; + p->fcopy = NULL; + p->fdelete = NULL; + r = fcreate(soap, p, arg); + if (!r && p->fdelete) + { p->next = soap->plugins; + soap->plugins = p; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); + return SOAP_OK; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id?p->id:"?", r)); + SOAP_FREE(p); + return r; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static void * +fplugin(struct soap *soap, const char *id) +{ register struct soap_plugin *p; + for (p = soap->plugins; p; p = p->next) + if (p->id == id || !strcmp(p->id, id)) + return p->data; + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void * +SOAP_FMAC2 +soap_lookup_plugin(struct soap *soap, const char *id) +{ return soap->fplugin(soap, id); +} +#endif + +/******************************************************************************/ +#ifdef __cplusplus +} +#endif + diff --git a/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.h b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.h new file mode 100644 index 0000000..097b551 --- /dev/null +++ b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.0f.h @@ -0,0 +1,1885 @@ +/* + +stdsoap2.h 2.7.0f + +gSOAP runtime environment. + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. + +Contributors: + +Wind River Systems, Inc., for the following additions (marked WR[...]) : + - vxWorks compatible + - Support for IPv6. + +-------------------------------------------------------------------------------- + + This software is released under one of the following three licenses: + GPL, the gSOAP public license, or Genivia's license for commercial use. + +-------------------------------------------------------------------------------- +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-2005, 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 +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#ifdef WITH_SOAPDEFS_H +# include "soapdefs.h" /* include user-defined stuff */ +#endif + +#ifndef _THREAD_SAFE +# define _THREAD_SAFE +#endif + +#ifndef OPENSERVER +# ifndef _REENTRANT +# define _REENTRANT +# endif +#endif + +#ifndef SOAP_BEGIN_NAMESPACE +# define SOAP_BEGIN_NAMESPACE(name) +#endif + +#ifndef SOAP_END_NAMESPACE +# define SOAP_END_NAMESPACE(name) +#endif + +#ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC1 +#endif + +#ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC2 +#endif + +#ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ +# define SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC3S SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ +# define SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC4S SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ +# define SOAP_FMAC5 +#endif + +#ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ +# define SOAP_FMAC6 +#endif + +#ifndef SOAP_CMAC /* class declaration macro */ +# define SOAP_CMAC +#endif + +#ifndef SOAP_NMAC /* namespace table declaration macro */ +# define SOAP_NMAC +#endif + +#ifndef SOAP_SOURCE_STAMP +# define SOAP_SOURCE_STAMP(str) +#endif + +#ifdef WITH_LEANER +# ifndef WITH_LEAN +# define WITH_LEAN +# endif +#endif + +#ifdef WITH_LEAN +# ifdef WITH_COOKIES +# error "Cannot build WITH_LEAN code WITH_COOKIES enabled" +# endif +#endif + +#ifndef STDSOAP_H +#define STDSOAP_H + +#if defined(__vxworks) || defined(__VXWORKS__) +# define VXWORKS +#endif + +#ifdef _WIN32 +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef UNDER_CE +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef __BORLANDC__ +# ifdef __WIN32__ +# ifndef WIN32 +# define WIN32 +# endif +# endif +#endif + +#ifdef __CYGWIN__ +# ifndef CYGWIN +# define CYGWIN +# endif +#endif + +#ifdef __SYMBIAN32__ +# define SYMBIAN +# undef WIN32 +#endif + +#if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) +# ifndef PALM +# define PALM +# endif +#endif + +#if defined(__hpux) +# ifndef HP_UX +# define HP_UX +# endif +#endif + +#ifdef __alpha +# ifndef TRU64 +# define TRU64 +# endif +#endif + +#ifdef __MVS__ +# ifndef OS390 +# define OS390 +# endif +#endif + +#ifdef _AIX +# define __socklen_t_defined +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# if defined(UNDER_CE) +# define WITH_LEAN +# define HAVE_SSCANF +# elif defined(WIN32) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(CYGWIN) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__APPLE__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(_AIXVERSION_431) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(HP_UX) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(FREEBSD) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_GETTIMEOFDAY +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__VMS) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__GLIBC__) || defined(__GNU__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define HAVE_ISNAN +# elif defined(TRU64) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_GETTIMEOFDAY +# define HAVE_SYS_TIMEB_H +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define __USE_STD_IOSTREAM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(MAC_CARBON) +# define WITH_NOIO +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(PALM) +# define WITH_LEAN +# define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ +# include /* Needs to be included before unix headers */ +# include +# define IGNORE_STDIO_STUBS +# include +# define O_NONBLOCK FNONBIO +# include +# include +# include "palmFunctions.h" +# elif defined(SYMBIAN) +# define WITH_LEAN +# define WITH_NONAMESPACES +# define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ +# include +# include +# elif defined(VXWORKS) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_RAND_R +# define HAVE_PGMTIME_R +# define HAVE_PLOCALTIME_R +# define HAVE_MKTIME +# elif defined(OS390) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MB +# else +/* Default asumptions on supported functions */ +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# endif +#endif + +#if defined(TRU64) +# define SOAP_LONG_FORMAT "%ld" +# define SOAP_ULONG_FORMAT "%lu" +#elif defined(WIN32) +# define SOAP_LONG_FORMAT "%I64d" +# define SOAP_ULONG_FORMAT "%I64u" +#endif + +#ifndef SOAP_LONG_FORMAT +# define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ +#endif + +#ifndef SOAP_ULONG_FORMAT +# define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ +#endif + +#ifndef SOAP_MALLOC /* use libc malloc */ +# define SOAP_MALLOC(n) malloc(n) +#endif + +#ifndef SOAP_FREE /* use libc free */ +# define SOAP_FREE(p) free(p) +#endif + +#include + +#ifndef PALM +# include +# include +#endif + +#include +#include + +#if defined(__cplusplus) && !defined(WITH_LEAN) +# include +# include + using namespace std; +#endif + +#ifdef WITH_NOHTTP +# ifndef WITH_NOIO +# define WITH_NOIO +# undef WITH_COOKIES +# endif +#endif + +#ifndef UNDER_CE +# ifndef PALM +# ifndef WITH_NOIO +# include +# include +# endif +# ifndef WITH_LEAN +# ifdef HAVE_SYS_TIMEB_H +# include /* for ftime() */ +# endif +# include +# endif +# endif +#endif + +#ifdef OPENSERVER +# include +# include +# include + extern int h_errno; +#endif + +#ifndef WITH_NOIO +# ifndef WIN32 +# ifndef PALM +# include +# ifdef VXWORKS +# include +# endif +# ifndef VXWORKS +# ifndef SYMBIAN +# include +# endif +# endif +# ifdef SUN_OS +# include /* SUN */ +# include /* SUN < 2.8 (?) */ +# endif +# ifdef VXWORKS +# include +# else +# include +# endif +# include +# ifdef OS390 +# include +# else +# include /* TCP_NODELAY */ +# endif +# include +# endif +# endif +#endif + +#ifdef WITH_FASTCGI +# include +#endif + +#ifdef WITH_OPENSSL +# define OPENSSL_NO_KRB5 +# include +# include +# include +# ifndef ALLOW_OLD_VERSIONS +# if (OPENSSL_VERSION_NUMBER < 0x00905100L) +# error "Must use OpenSSL 0.9.6 or later" +# endif +# endif +#endif + +#ifdef WITH_GZIP +# ifndef WITH_ZLIB +# define WITH_ZLIB +# endif +#endif + +#ifdef WITH_CASEINSENSITIVETAGS +# define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ +#else +# define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ +#endif + +#ifdef WITH_ZLIB +# include +#endif + +#ifndef PALM +# include /* for isnan() */ +#endif + +/* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WIN32 +# ifndef UNDER_CE +# include +# include +# endif +# include +/* # include */ /* Alternative: use winsock2 (not available with eVC) */ +/* WR[ */ +# ifdef WITH_IPV6 +# include +# include +# endif +#else +# ifdef VXWORKS +# include +# include +# include +# endif +/* ]WR */ +# ifndef WITH_NOIO +# ifndef PALM +# include +# include +# include +# include +# endif +# endif +#endif + +#ifdef WIN32 +# define SOAP_SOCKET SOCKET +#else +# define SOAP_SOCKET int +# define closesocket(n) close(n) +#endif + +#define SOAP_INVALID_SOCKET (-1) +#define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) + +#if defined(SYMBIAN) +# define LONG64 long +# define ULONG64 unsigned LONG64 +#elif !defined(WIN32) || defined(__GLIBC__) || defined(__GNU__) +# ifndef LONG64 +# define LONG64 long long +# define ULONG64 unsigned LONG64 +# endif +#elif defined(UNDER_CE) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#elif defined(__BORLANDC__) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#endif + +#if defined(WIN32) +# define soap_int32 __int32 +#elif defined(SYMBIAN) +# define soap_int32 long +#elif defined(PALM) +# define soap_int32 Int32 +#else +# define soap_int32 int32_t +#endif + +#ifdef WIN32 +# define SOAP_EINTR WSAEINTR +# define SOAP_EAGAIN WSAEWOULDBLOCK +# define SOAP_EWOULDBLOCK WSAEWOULDBLOCK +# define SOAP_EINPROGRESS WSAEINPROGRESS +#else +# define SOAP_EINTR EINTR +# define SOAP_EAGAIN EAGAIN +# ifdef SYMBIAN +# define SOAP_EWOULDBLOCK 9898 +# define SOAP_EINPROGRESS 9899 +# else +# define SOAP_EWOULDBLOCK EWOULDBLOCK +# define SOAP_EINPROGRESS EINPROGRESS +# endif +#endif + +#ifdef WIN32 +# ifdef UNDER_CE +# define soap_errno GetLastError() +# define soap_socket_errno GetLastError() +# else +# define soap_errno GetLastError() +# define soap_socket_errno WSAGetLastError() +# endif +#else +# ifndef WITH_NOIO +# define soap_errno errno +# define soap_socket_errno errno +# else +# define soap_errno 0 +# define soap_socket_errno 0 +# endif +#endif + +#ifndef SOAP_BUFLEN +# ifndef WITH_LEAN +# define SOAP_BUFLEN (32768) /* buffer length for socket packets, also used by gethostbyname_r so don't make this too small */ +# else +# define SOAP_BUFLEN (2048) +# endif +#endif +#ifndef SOAP_LABLEN +# ifndef WITH_LEAN +# define SOAP_LABLEN (256) /* initial look-aside buffer length */ +# else +# define SOAP_LABLEN (32) +# endif +#endif +#ifndef SOAP_PTRHASH +# ifndef WITH_LEAN +# define SOAP_PTRHASH (1024) /* size of pointer analysis hash table (must be power of 2) */ +# else +# define SOAP_PTRHASH (16) +# endif +#endif +#ifndef SOAP_IDHASH +# ifndef WITH_LEAN +# define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ +# else +# define SOAP_IDHASH (19) /* 19, 199 */ +# endif +#endif +#ifndef SOAP_BLKLEN +# ifndef WITH_LEAN +# define SOAP_BLKLEN (256) /* size of blocks to collect long strings and XML attributes */ +# else +# define SOAP_BLKLEN (32) +# endif +#endif +#ifndef SOAP_TAGLEN +# ifndef WITH_LEAN +# define SOAP_TAGLEN (256) /* maximum length of XML element tag/attribute name or host/path name + 1 */ +# else +# define SOAP_TAGLEN (64) +# endif +#endif +#ifndef SOAP_HDRLEN +# ifndef WITH_LEAN +# define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ +# else +# define SOAP_HDRLEN (1024) +# endif +#endif +#ifndef SOAP_MAXDIMS +# ifndef WITH_LEAN +# define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ +# else +# define SOAP_MAXDIMS (4) +# endif +#endif + +#ifndef SOAP_MAXLOGS +# define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ +# define SOAP_INDEX_RECV (0) +# define SOAP_INDEX_SENT (1) +# define SOAP_INDEX_TEST (2) +#endif + +#ifndef SOAP_MAXKEEPALIVE +# define SOAP_MAXKEEPALIVE (100) /* max iterations to keep server connection alive */ +#endif + +#ifndef SOAP_MAXARRAYSIZE +# define SOAP_MAXARRAYSIZE (100000) /* "trusted" max size of inbound SOAP array for compound array allocation */ +#endif + +#ifdef VXWORKS +# ifdef __INCmathh +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) isNan(num) +# endif +#endif + +#ifdef WIN32 +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) _isnan(num) +#endif + +#ifdef SUN_OS +# define soap_isnan(n) isnan(n) +#endif + +#if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) +# define HAVE_ISNAN +#endif + +#ifndef soap_isnan +# ifdef HAVE_ISNAN +# define soap_isnan(n) isnan(n) +# else +# define soap_isnan(_) (0) +# endif +#endif + +extern const struct soap_double_nan { unsigned int n1, n2; } soap_double_nan; + +#ifdef VXWORKS +# ifndef FLT_MAX +# define FLT_MAX _ARCH_FLT_MAX +# endif +# ifndef DBL_MAX +# define DBL_MAX _ARCH_DBL_MAX +# endif +#endif + +#ifndef FLT_NAN +# ifdef HAVE_ISNAN +# define FLT_NAN (*(float*)&soap_double_nan) +# else +# define FLT_NAN (0.0) +# endif +#endif + +#ifndef FLT_PINFTY +# ifdef FLT_MAX +# define FLT_PINFTY FLT_MAX +# else +# ifdef HUGE_VAL +# define FLT_PINFTY (float)HUGE_VAL +# else +# ifdef FLOAT_MAX +# define FLT_PINFTY FLOAT_MAX +# else +# define FLT_PINFTY (3.40282347e+38F) +# endif +# endif +# endif +#endif + +#ifndef FLT_NINFTY +# define FLT_NINFTY (-FLT_PINFTY) +#endif + +#ifndef DBL_NAN +# ifdef HAVE_ISNAN +# define DBL_NAN (*(double*)&soap_double_nan) +# else +# define DBL_NAN (0.0) +# endif +#endif + +#ifndef DBL_PINFTY +# ifdef DBL_MAX +# define DBL_PINFTY DBL_MAX +# else +# ifdef HUGE_VAL +# define DBL_PINFTY (double)HUGE_VAL +# else +# ifdef DOUBLE_MAX +# define DBL_PINFTY DOUBLE_MAX +# else +# define DBL_PINFTY (1.7976931348623157e+308) +# endif +# endif +# endif +#endif + +#ifndef DBL_NINFTY +# define DBL_NINFTY (-DBL_PINFTY) +#endif + +#define soap_ispinfd(n) ((n) >= DBL_PINFTY) +#define soap_ispinff(n) ((n) >= FLT_PINFTY) +#define soap_isninfd(n) ((n) <= DBL_NINFTY) +#define soap_isninff(n) ((n) <= FLT_NINFTY) + +/* gSOAP error codes */ + +#define SOAP_EOF EOF +#define SOAP_ERR EOF +#define SOAP_OK 0 +#define SOAP_CLI_FAULT 1 +#define SOAP_SVR_FAULT 2 +#define SOAP_TAG_MISMATCH 3 +#define SOAP_TYPE 4 +#define SOAP_SYNTAX_ERROR 5 +#define SOAP_NO_TAG 6 +#define SOAP_IOB 7 +#define SOAP_MUSTUNDERSTAND 8 +#define SOAP_NAMESPACE 9 +/* #define SOAP_OBJ_MISMATCH 10 obsolete */ +#define SOAP_FATAL_ERROR 11 +#define SOAP_FAULT 12 +#define SOAP_NO_METHOD 13 +#define SOAP_GET_METHOD 14 +#define SOAP_EOM 15 +#define SOAP_NULL 16 +#define SOAP_MULTI_ID 17 +#define SOAP_MISSING_ID 18 +#define SOAP_HREF 19 +#define SOAP_TCP_ERROR 20 +#define SOAP_HTTP_ERROR 21 +#define SOAP_SSL_ERROR 22 +#define SOAP_ZLIB_ERROR 23 +#define SOAP_DIME_ERROR 24 +#define SOAP_DIME_HREF 25 +#define SOAP_DIME_MISMATCH 26 +#define SOAP_DIME_END 27 +#define SOAP_MIME_ERROR 28 +#define SOAP_VERSIONMISMATCH 29 +#define SOAP_PLUGIN_ERROR 30 +#define SOAP_DATAENCODINGUNKNOWN 31 +#define SOAP_REQUIRED 32 +#define SOAP_PROHIBITED 33 +#define SOAP_OCCURS 34 +#define SOAP_LENGTH 35 + +#define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_TAG_END || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_MULTI_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF) +#define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) +#define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) +#define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) +#define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) +#define soap_mime_error_check(e) ((e) == SOAP_MIME_ERROR) +#define soap_dime_error_check(e) ((e) == SOAP_DIME_ERROR || (e) == SOAP_DIME_MISMATCH) +#define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_GET_METHOD || ((e) >= 100 && (e) < 600)) + +/* gSOAP HTTP response status codes 100 to 600 are reserved */ + +/* Special gSOAP HTTP response status codes */ + +#define SOAP_STOP 1000 /* No HTTP response */ +#define SOAP_HTML 1001 /* Custom HTML response */ +#define SOAP_FILE 1002 /* Custom file-based response */ + +/* gSOAP HTTP request status codes */ + +#define SOAP_POST 1003 +#define SOAP_GET 1104 + +/* gSOAP DIME */ + +#define SOAP_DIME_CF 0x01 +#define SOAP_DIME_ME 0x02 +#define SOAP_DIME_MB 0x04 +#define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ +#define SOAP_DIME_MEDIA 0x10 +#define SOAP_DIME_ABSURI 0x20 + +/* gSOAP ZLIB */ + +#define SOAP_ZLIB_NONE 0x00 +#define SOAP_ZLIB_DEFLATE 0x01 +#define SOAP_ZLIB_INFLATE 0x02 +#define SOAP_ZLIB_GZIP 0x02 + +/* gSOAP transport, connection, and content encoding modes */ + +typedef soap_int32 soap_mode; + +#define SOAP_IO 0x00000003 /* IO mask */ +#define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ +#define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ +#define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ +#define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ + +#define SOAP_IO_LENGTH 0x00000004 +#define SOAP_IO_KEEPALIVE 0x00000008 + +#define SOAP_ENC_LATIN 0x00800010 /* iso-8859-1 encoding */ +#define SOAP_ENC_XML 0x00000020 /* plain XML encoding, no HTTP header */ +#define SOAP_ENC_DIME 0x00000040 +#define SOAP_ENC_MIME 0x00000080 +#define SOAP_ENC_ZLIB 0x00000100 +#define SOAP_ENC_SSL 0x00000200 + +#define SOAP_ENC 0x00000FFF /* IO and ENC mask */ + +#define SOAP_XML_STRICT 0x00001000 /* strict validation */ +#define SOAP_XML_CANONICAL 0x00002000 /* C14N canonical XML */ +#define SOAP_XML_TREE 0x00004000 +#define SOAP_XML_GRAPH 0x00008000 +#define SOAP_XML_NIL 0x00010000 +#define SOAP_XML_DOM 0x00020000 +#define SOAP_XML_SEC 0x00040000 /* reserved for WS security */ + +#define SOAP_C_NOIOB 0x00100000 +#define SOAP_C_UTFSTRING 0x00200000 +#define SOAP_C_MBSTRING 0x00400000 + +#define SOAP_DOM_TREE 0x01000000 +#define SOAP_DOM_NODE 0x02000000 + +#define SOAP_IO_DEFAULT SOAP_IO_FLUSH + +/* SSL client/server authentication settings */ + +#define SOAP_SSL_NO_AUTHENTICATION 0x00 /* for testing purposes */ +#define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x01 /* client requires server to authenticate */ +#define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x02 /* server requires client to authenticate */ + +#define SOAP_SSL_DEFAULT SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION + +/* */ + +#define SOAP_BEGIN 0 +#define SOAP_IN_ENVELOPE 2 +#define SOAP_IN_HEADER 3 +#define SOAP_END_HEADER 4 +#define SOAP_IN_BODY 5 +#define SOAP_END_BODY 6 +#define SOAP_END_ENVELOPE 7 +#define SOAP_END 8 + +/* DEBUG macros */ + +#ifndef WITH_LEAN +# ifdef DEBUG +# ifndef SOAP_DEBUG +# define SOAP_DEBUG +# endif +# endif +#endif + +#ifdef SOAP_DEBUG +# ifndef SOAP_MESSAGE +# define SOAP_MESSAGE fprintf +# endif +# ifndef DBGLOG +# define DBGLOG(DBGFILE, CMD) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ + CMD;\ + fflush(fdebug);\ + }\ + }\ +} +# endif +# ifndef DBGMSG +# define DBGMSG(DBGFILE, MSG, LEN) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { fwrite((MSG), 1, (LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + }\ + }\ +} +# endif +#else +# define DBGLOG(DBGFILE, CMD) +# define DBGMSG(DBGFILE, MSG, LEN) +#endif + +/* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ +typedef soap_int32 soap_wchar; + +struct Namespace +{ const char *id; + const char *ns; + const char *in; + char *out; +}; + +struct soap_nlist +{ struct soap_nlist *next; + unsigned int level; + short index; /* corresponding entry in ns mapping table */ + char *ns; /* only set when parsed ns URI is not in the ns mapping table */ + char id[1]; /* the actual string value flows into the allocated region below this struct */ +}; + +struct soap_blist +{ struct soap_blist *next; + char *ptr; + size_t size; +}; + +struct soap_array +{ void *__ptr; + int __size; +}; + +/* pointer serialization management */ +struct soap_plist +{ struct soap_plist *next; + const void *ptr; + const struct soap_array *array; + int type; + int id; + char mark1; + char mark2; +}; + +/* class allocation list */ +struct soap_clist +{ struct soap_clist *next; + void *ptr; + int type; + int size; + void (*fdelete)(struct soap_clist*); +}; + +struct soap_attribute +{ struct soap_attribute *next; + char *value; + size_t size; + char *ns; + short visible; + char name[1]; /* the actual name string flows into the allocated region below this struct */ +}; + +struct soap_cookie +{ struct soap_cookie *next; + char *name; + char *value; + char *domain; + char *path; + long expire; /* client-side: local time to expire; server-side: seconds to expire */ + unsigned int version; + short secure; + short session; /* server-side */ + short env; /* server-side: got cookie from client */ + short modified; /* server-side: client cookie was modified */ +}; + +#ifdef __cplusplus +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); + +class soap_multipart_iterator +{ public: + struct soap_multipart *content; + bool operator==(const soap_multipart_iterator& iter) const + { return content == iter.content; } + bool operator!=(const soap_multipart_iterator& iter) const + { return content != iter.content; } + struct soap_multipart &operator*() const + { return *content; } + soap_multipart_iterator &operator++() + { content = soap_next_multipart(content); return *this; } + soap_multipart_iterator() : content(NULL) + { } + soap_multipart_iterator(struct soap_multipart *p) : content(p) + { } +}; +#endif + +#ifndef WITH_LEANER +struct soap_dime +{ size_t count; + size_t size; + size_t chunksize; + size_t buflen; + char flags; + char *ptr; + const char *id; + const char *type; + const char *options; + struct soap_multipart *list; /* list of DIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +struct soap_mime +{ char *boundary; /* MIME boundary */ + const char *start; /* MIME start ID */ + struct soap_multipart *list; /* list of DIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +/* RFC2045 MIME content transfer encodings */ +enum soap_mime_encoding +{ SOAP_MIME_NONE, + SOAP_MIME_7BIT, + SOAP_MIME_8BIT, + SOAP_MIME_BINARY, + SOAP_MIME_QUOTED_PRINTABLE, + SOAP_MIME_BASE64, + SOAP_MIME_IETF_TOKEN, + SOAP_MIME_X_TOKEN +}; +#endif + +#ifndef WITH_LEANER +/* DIME/MIME multipart list */ +struct soap_multipart +{ struct soap_multipart *next; + char *ptr; /* points to raw data content */ + size_t size; /* size of data content */ + const char *id; /* DIME/MIME content ID */ + const char *type; /* DIME/MIME type (MIME type format) */ + const char *options; /* DIME options */ + enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ + const char *location; /* MIME Content-Location (optional) */ + const char *description; /* MIME Content-Description (optional) */ +#ifdef __cplusplus + typedef soap_multipart_iterator iterator; +#endif +}; +#endif + +#ifndef WITH_LEANER +struct soap_dom_attribute +{ struct soap_dom_attribute *next; + const char *nstr; + char *name; + char *data; + wchar_t *wide; + struct soap *soap; +#ifdef __cplusplus + struct soap_dom_attribute &set(const char *nstr, const char *name); /* set namespace and name */ + struct soap_dom_attribute &set(const char *data); /* set data */ + void unlink(); + soap_dom_attribute(); + soap_dom_attribute(struct soap *soap); + soap_dom_attribute(struct soap *soap, const char *nstr, const char *name, const char *data); + ~soap_dom_attribute(); +#endif +}; +#endif + +#ifndef WITH_LEANER +#ifdef __cplusplus +class soap_dom_iterator +{ public: + struct soap_dom_element *elt; + const char *nstr; + const char *name; + int type; + bool operator==(const soap_dom_iterator&) const; + bool operator!=(const soap_dom_iterator&) const; + struct soap_dom_element &operator*() const; + soap_dom_iterator &operator++(); + soap_dom_iterator(); + soap_dom_iterator(struct soap_dom_element*); + ~soap_dom_iterator(); +}; +#endif +#endif + +#ifndef WITH_LEANER +struct soap_dom_element +{ struct soap_dom_element *next; /* next sibling */ + struct soap_dom_element *prnt; /* parent */ + struct soap_dom_element *elts; /* first child element */ + struct soap_dom_attribute *atts; /* first child attribute */ + const char *nstr; /* namespace string */ + char *name; /* element tag name */ + char *data; /* element content data (with SOAP_C_UTFSTRING flag set) */ + wchar_t *wide; /* element content data */ + int type; /* optional: serialized C/C++ data type */ + void *node; /* optional: pointer to serialized C/C++ data */ + struct soap *soap; +#ifdef __cplusplus + typedef soap_dom_iterator iterator; + struct soap_dom_element &set(const char *nstr, const char *name); + struct soap_dom_element &set(const char *data); + struct soap_dom_element &set(void *node, int type); + struct soap_dom_element &add(struct soap_dom_element*); + struct soap_dom_element &add(struct soap_dom_element&); + struct soap_dom_element &add(struct soap_dom_attribute*); + struct soap_dom_element &add(struct soap_dom_attribute&); + soap_dom_iterator begin(); + soap_dom_iterator end(); + soap_dom_iterator find(const char *nstr, const char *name); + soap_dom_iterator find(int type); + void unlink(); + soap_dom_element(); + soap_dom_element(struct soap *soap); + soap_dom_element(struct soap *soap, const char *nstr, const char *name); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, const char *data); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, void *node, int type); + ~soap_dom_element(); +#endif +}; +#endif + +#if defined(__cplusplus) && !defined(WITH_LEAN) +} +extern ostream &operator<<(ostream&, const struct soap_dom_element&); +extern istream &operator>>(istream&, struct soap_dom_element&); +extern "C" { +#endif + +struct soap +{ short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */ + short copy; /* 1 = copy of another soap struct */ + soap_mode mode; + soap_mode imode; + soap_mode omode; + const char *float_format; /* points to user-definable format string for floats (<1024 chars) */ + const char *double_format; /* points to user-definable format string for doubles (<1024 chars) */ + const char *dime_id_format; /* points to user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ + int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ + int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ + int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ + int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ + int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ + int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ + int accept_flags; /* accept() SOL_SOCKET sockopt flags */ + const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ + struct Namespace *local_namespaces; /* Local namespace mapping table */ + struct soap_nlist *nlist; /* namespace stack */ + struct soap_blist *blist; /* block allocation stack */ + struct soap_clist *clist; /* class instance allocation list */ + void *alist; /* memory allocation list */ + struct soap_ilist *iht[SOAP_IDHASH]; + struct soap_plist *pht[SOAP_PTRHASH]; + struct SOAP_ENV__Header *header; + struct SOAP_ENV__Fault *fault; + void *user; /* to pass user-defined data */ + struct soap_plugin *plugins; /* linked list of plug-in data */ + char *userid; /* HTTP Basic authorization userid */ + char *passwd; /* HTTP Basic authorization passwd */ + int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); + int (*fget)(struct soap*); + int (*fposthdr)(struct soap*, const char*, const char*); + int (*fresponse)(struct soap*, int, size_t); + int (*fparse)(struct soap*); + int (*fparsehdr)(struct soap*, const char*, const char*); + int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); + int (*fconnect)(struct soap*, const char*, const char*, int); + int (*fdisconnect)(struct soap*); + int (*fclosesocket)(struct soap*, SOAP_SOCKET); + int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); + int (*fopen)(struct soap*, const char*, const char*, int); + int (*faccept)(struct soap*, int, struct sockaddr*, int *n); + int (*fclose)(struct soap*); + int (*fsend)(struct soap*, const char*, size_t); + size_t (*frecv)(struct soap*, char*, size_t); + int (*fpoll)(struct soap*); + int (*fignore)(struct soap*, const char*); + int (*fserveloop)(struct soap*); + void *(*fplugin)(struct soap*, const char*); +#ifndef WITH_LEANER + int (*fprepareinit)(struct soap*); + int (*fpreparesend)(struct soap*, const char*, size_t); + int (*fpreparerecv)(struct soap*, const char*, size_t); + void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); + void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); + void (*fdimereadclose)(struct soap*, void*); + void (*fdimewriteclose)(struct soap*, void*); + size_t (*fdimeread)(struct soap*, void*, char*, size_t); + int (*fdimewrite)(struct soap*, void*, const char*, size_t); +#endif + int master; + int socket; +#if defined(__cplusplus) && !defined(WITH_LEAN) + ostream *os; + istream *is; +#else + void *os; /* preserve alignment */ + void *is; /* preserve alignment */ +#endif +#ifndef UNDER_CE + int sendfd; + int recvfd; +#else + FILE *sendfd; + FILE *recvfd; +#endif +#ifdef WIN32 + char errorstr[256]; /* buf for FormatMessage() */ +#endif + size_t bufidx; /* index in soap.buf[] */ + size_t buflen; /* length of soap.buf[] content */ + soap_wchar ahead; /* parser lookahead */ + short cdata; /* CDATA parser state */ + short body; + unsigned int level; /* XML nesting level */ + size_t count; /* message length counter */ + size_t length; /* message length as set by HTTP header */ +#ifdef WITH_FAST + char *labbuf; /* look-aside buffer */ + size_t lablen; /* look-aside buffer allocated length */ + size_t labidx; /* look-aside buffer index to available part */ +#endif + char buf[SOAP_BUFLEN];/* send and receive buffer */ + char tmpbuf[1024]; /* in/output buffer for HTTP headers, simpleType values, attribute names, and DIME >=1024 bytes */ + char msgbuf[1024]; /* output buffer for (error) messages <=1024 bytes */ + char tag[SOAP_TAGLEN]; + char id[SOAP_TAGLEN]; + char href[SOAP_TAGLEN]; + char type[SOAP_TAGLEN]; + char arrayType[SOAP_TAGLEN]; + char arraySize[SOAP_TAGLEN]; + char arrayOffset[SOAP_TAGLEN]; + short other; + short root; + short position; + int positions[SOAP_MAXDIMS]; + struct soap_attribute *attributes; /* attribute list */ + short encoding; + short mustUnderstand; + short null; + short ns; + short part; + short alloced; + short peeked; + short keep_alive; + size_t chunksize; + size_t chunkbuflen; + char endpoint[SOAP_TAGLEN]; + char path[SOAP_TAGLEN]; + char host[SOAP_TAGLEN]; + char *action; + char *authrealm; /* HTTP authentication realm */ + char *prolog; /* XML declaration prolog */ + int port; + unsigned int max_keep_alive; + const char *proxy_host; /* Proxy Server host name */ + int proxy_port; /* Proxy Server port (default = 8080) */ + const char *proxy_userid; /* Proxy Authorization user name */ + const char *proxy_passwd; /* Proxy Authorization password */ + int status; /* -1 when request, else error code to be returned by server */ + int error; + int errmode; + int errnum; + unsigned long idnum; + unsigned long ip; +#ifndef WITH_LEANER + struct soap_dom_element *dom; + struct soap_dime dime; + struct soap_mime mime; +#endif +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) + const char *logfile[SOAP_MAXLOGS]; + FILE *fdebug[SOAP_MAXLOGS]; +#endif +#ifndef WITH_LEAN + struct soap_cookie *cookies; + const char *cookie_domain; + const char *cookie_path; + int cookie_max; +#endif +#ifdef WITH_OPENSSL + int (*fsslauth)(struct soap*); + int (*fsslverify)(int, X509_STORE_CTX*); + BIO *bio; + SSL *ssl; + SSL_CTX *ctx; + short require_server_auth; + short require_client_auth; + short rsa; /* when set, use RSA instead of DH */ + const char *keyfile; + const char *password; + const char *dhfile; + const char *cafile; + const char *capath; + const char *randfile; + SSL_SESSION *session; + char session_host[SOAP_TAGLEN]; + int session_port; +#endif +#ifdef WITH_ZLIB + short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ + short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + z_stream d_stream; /* decompression stream */ + char z_buf[SOAP_BUFLEN]; /* buffer */ + size_t z_buflen; + unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ + uLong z_crc; /* internal gzip crc */ + float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ + float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ +#endif +/* WR[ */ +#ifdef WMW_RPM_IO + void *rpmreqid; +#endif /* WMW_RPM_IO */ +/* ]WR */ +}; + +struct soap_code_map +{ long code; + const char *string; +}; + +/* forwarding list */ +struct soap_flist +{ struct soap_flist *next; + int type; + void *ptr; + unsigned int level; + void (*fcopy)(struct soap*, int, int, void*, const void*, size_t); +}; + +/* id-ref forwarding list */ +struct soap_ilist +{ struct soap_ilist *next; + int type; + size_t size; + void *link; + void *copy; + struct soap_flist *flist; + void *ptr; + unsigned int level; + char id[1]; /* the actual id string value flows into the allocated region below this struct */ +}; + +struct soap_plugin +{ struct soap_plugin *next; + const char *id; + void *data; + int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); + void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ +}; + +#ifndef WITH_NONAMESPACES +extern SOAP_NMAC struct Namespace namespaces[]; +#endif + +#ifndef WITH_LEAN +# define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) +# define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) +#else +soap_wchar soap_get0(struct soap*); +soap_wchar soap_get1(struct soap*); +#endif + +#define soap_revget1(soap) ((soap)->bufidx--) +#define soap_unget(soap, c) ((soap)->ahead = c) +#define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) +#define soap_imode(soap, n) ((soap)->mode = (soap)->imode = (n)) +#define soap_set_imode(soap, n) ((soap)->mode = (soap)->imode |= (n)) +#define soap_clr_imode(soap, n) ((soap)->mode = (soap)->imode &= ~(n)) +#define soap_omode(soap, n) ((soap)->mode = (soap)->omode = (n)) +#define soap_set_omode(soap, n) ((soap)->mode = (soap)->omode |= (n)) +#define soap_clr_omode(soap, n) ((soap)->mode = (soap)->omode &= ~(n)) +#define soap_destroy(soap) soap_delete((soap), NULL) + +#ifdef HAVE_STRRCHR +# define soap_strrchr(s, t) strrchr(s, t) +#else + SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); +#endif + +#ifdef HAVE_STRTOL +# define soap_strtol(s, t, b) strtol(s, t, b) +#else + SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b); +#endif + +#ifdef HAVE_STRTOUL +# define soap_strtoul(s, t, b) strtoul(s, t, b) +#else + SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b); +#endif + +#ifdef WITH_NOIDREF +# define soap_embedded(s, p, t) (0) +# define soap_id_lookup(s, i, p, t, n, k) (p) +# define soap_id_forward(s, h, p, st, tt, n, k, fc) (p) +# define soap_reference(s, a, t) (1) +# define soap_array_reference(s, p, a, n, t) (1) +# define soap_embed(s, p, a, n, t, pp) (0) +# define soap_embedded_id(s, i, p, t) (i) +# define soap_is_embedded(s, p) (0) +# define soap_is_single(s, p) (1) +# define soap_lookup_type(s, i) (0) +# define soap_getindependent(s) (0) +# define soap_putindependent(s) (0) +# define soap_getelement(s, n) (0) +# define soap_putelement(s, p, t, i, n) (0) +# define soap_markelement(s, p, n) (0) +#endif + +SOAP_FMAC1 void SOAP_FMAC2 soap_fault(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultcode(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultstring(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultdetail(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializefault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_accept(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); + +SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); + + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +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); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const struct soap_array *a, int n, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); +#endif + +SOAP_FMAC1 void SOAP_FMAC2 soap_begin_count(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); + +SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char *str); +SOAP_FMAC1 long SOAP_FMAC2 soap_int_code(const struct soap_code_map*, const char *str, long other); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_str_code(const struct soap_code_map*, long code); + +SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); + +SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); +SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, void (*fdelete)(struct soap_clist*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_unlink(struct soap*, const void*); +SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, int st, int tt, size_t n, unsigned int k, void(*fcopy)(struct soap*, int, int, void*, const void*, size_t)); +#endif +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct 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*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, const void *q, size_t n); + +SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *, const char *, int *); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsize(struct soap*, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizes(struct soap*, const char *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffset(struct soap*, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); + +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new(void); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new1(soap_mode); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new2(soap_mode, soap_mode); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(struct soap*); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*,struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init1(struct soap*, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_init2(struct soap*, soap_mode, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); + +#ifdef SOAP_DEBUG +SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); +#endif + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); + +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_advance(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_skip(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); +SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const struct soap_array *a, int d, const char *type, int n); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); +SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long); + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); +SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, int n1, int n2); + +SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, struct Namespace*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); + +SOAP_FMAC1 int SOAP_FMAC2 soap_new_block(struct soap*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, size_t); +SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, char*, int); +SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); +SOAP_FMAC1 int soap_envelope_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); +#endif + +SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, size_t); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, size_t*); + +#ifndef WITH_LEAN +SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); +#endif + + +SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); +SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); +SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); +SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); +SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); +SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); +SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); +SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); +SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); +SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); +SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long); +SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); + +#ifndef WITH_LEAN +SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long); +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_element_dime(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, long); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); + +#ifdef WITH_COOKIES +SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char*, char*, size_t); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern long SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); +#endif + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.c b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.c new file mode 100644 index 0000000..6b7160b --- /dev/null +++ b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.c @@ -0,0 +1,13101 @@ +/* + +stdsoap2.c[pp] 2.7.6b + +gSOAP runtime + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +Contributors: + +Wind River Systems, Inc., for the following additions: + - vxWorks compatible +-------------------------------------------------------------------------------- +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-2005, 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 +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- + +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.6b 2005-08-26 12:00:00 GMT") +extern "C" { +#else +SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.6b 2005-08-26 12:00:00 GMT") +#endif + +/* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale with multibyte support enabled) */ +#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_QT (soap_wchar)(-5) /* XML character '"' */ +#define SOAP_AP (soap_wchar)(-6) /* XML character ''' */ + +#define SOAP_BOM (soap_wchar)(0xFEFF) /* UTF BOM is Unicode FEFF */ + +#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*); + +#ifndef WITH_NOIDREF +static void soap_update_ptrs(struct soap*, char*, char*, long); +static int soap_has_copies(struct soap*, const char*, 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*); +#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*); +static void soap_free_mht(struct soap*); +static void soap_track_unlink(struct soap*, const void*); +#endif + +static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); +static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); +static int soap_getattrval(struct soap*, char*, size_t, soap_wchar); +static void *fplugin(struct soap*, const char*); + +#ifndef WITH_LEAN +static const char *soap_set_validation_fault(struct soap*, const char*, const char*); +static int soap_isnumeric(struct soap*, const char*); +static time_t soap_timegm(struct tm*); +static struct soap_nlist *soap_lookup_ns(struct soap *soap, const char *tag, size_t n); +static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); +static void soap_pop_ns(struct soap *soap); +static void soap_utilize_ns(struct soap *soap, const char *tag, size_t n); +#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*); +static int soap_match_cid(const char*, const char*); +static void soap_resolve_attachment(struct soap*, struct soap_multipart*); +#endif + +#ifdef WITH_GZIP +static int soap_getgziphdr(struct soap*); +#endif + +#ifdef WITH_OPENSSL +static void ssl_init(); +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 + +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +static const char *soap_decode(char*, size_t, const char*, const char*); +#endif + +#ifndef WITH_NOHTTP +static soap_wchar soap_getchunkchar(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*); +#endif + +#ifndef WITH_NOIO +static int fsend(struct soap*, const char*, size_t); +static size_t frecv(struct soap*, char*, size_t); +static int tcp_init(struct soap*); +static const char *tcp_error(struct soap*); +#ifndef WITH_IPV6 +static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); +#endif +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 const char *soap_strerror(struct soap*); +#endif + +#ifdef VXWORKS +static int vx_nonblocking = TRUE; /* ioctl argument */ +#endif + +#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 + +#ifndef WITH_LEAN +static const char soap_indent[11] = "\n\t\t\t\t\t\t\t\t\t"; +/* Alternative indentation form for SOAP_XML_INDENT: +static const char soap_indent[21] = "\n "; +*/ +#endif + +static const char soap_padding[3] = "\0\0"; +#define SOAP_STR_PADDING (soap_padding) +#define SOAP_STR_EOS (soap_padding) +#define SOAP_NON_NULL (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_NOIO +#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 +#endif + +#ifndef WITH_NOHTTP +#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 +#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 WITH_NOIO +#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_socket_errno != SOAP_EAGAIN) + { soap->errnum = soap_socket_errno; + return SOAP_EOF; + } + } + } +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + nwritten = SSL_write(soap->ssl, s, n); + else if (soap->bio) + nwritten = BIO_write(soap->bio, s, n); + else +#endif +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + { if (soap->peerlen) + nwritten = sendto((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags, (struct sockaddr*)&soap->peer, soap->peerlen); + else + nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags); + /* retry and back-off algorithm */ + /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ + if (nwritten < 0) + { struct timeval timeout; + fd_set fd; + int udp_repeat; + int udp_delay; + if ((soap->connect_flags & SO_BROADCAST)) + udp_repeat = 3; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ + else + udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ + udp_delay = (soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ + do + { timeout.tv_sec = 0; + timeout.tv_usec = 1000 * udp_delay; /* ms */ + FD_ZERO(&fd); + FD_SET((SOAP_SOCKET)soap->socket, &fd); + select((SOAP_SOCKET)(soap->socket + 1), NULL, NULL, &fd, &timeout); + if (soap->peerlen) + nwritten = sendto((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags, (struct sockaddr*)&soap->peer, soap->peerlen); + else + nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags); + udp_delay <<= 1; + if (udp_delay > 500) /* UDP_UPPER_DELAY */ + udp_delay = 500; + } + while (nwritten < 0 && --udp_repeat > 0); + } + } + 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 +#ifdef VXWORKS +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + nwritten = (httpBlockPut(soap->rpmreqid, s, n) == 0) ? n : -1; + 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 + nwritten = write((SOAP_SOCKET)soap->sendfd, s, n); +#endif +#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_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; +#ifndef WITH_LEANER + if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + return soap->error = soap->fpreparesend(soap, s, n); +#endif + 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_flush(struct soap *soap) +{ register int n = soap->bufidx; + if (n) + { soap->bufidx = 0; +#ifdef WITH_ZLIB + if (soap->mode & SOAP_ENC_ZLIB) + { soap->d_stream.next_in = (Byte*)soap->buf; + soap->d_stream.avail_in = (unsigned int)n; +#ifdef WITH_GZIP + soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); +#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 + return soap_flush_raw(soap, soap->buf, n); + } + return SOAP_OK; +} +#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); +#ifndef WITH_LEANER + if (soap->fpreparesend) + return soap->error = soap->fpreparesend(soap, s, n); +#endif + return SOAP_OK; + } +#ifndef WITH_LEANER + 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); +#endif + return soap->error = soap->fsend(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 WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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 + if (soap->recv_timeout) + { struct timeval timeout; + fd_set fd; + 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) + { soap->errnum = 0; + return 0; + } + if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN) + { soap->errnum = soap_socket_errno; + return 0; + } + } + } +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + { int err; + r = SSL_read(soap->ssl, s, n); + if (r > 0) + return (size_t)r; + err = SSL_get_error(soap->ssl, r); + if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) + return 0; + } + else if (soap->bio) + { r = BIO_read(soap->bio, s, n); + if (r > 0) + return (size_t)r; + return 0; + } + else +#endif + { +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + r = recvfrom((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags, (struct sockaddr*)&soap->peer, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ + soap->peerlen = (size_t)k; +#ifndef WITH_IPV6 + soap->ip = ntohl(soap->peer.sin_addr.s_addr); + soap->port = (int)ntohs(soap->peer.sin_port); +#endif + } + 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_socket_errno != SOAP_EWOULDBLOCK) + { 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); +#ifdef WITH_OPENSSL + if (soap->ssl && SSL_get_error(soap->ssl, r) == SSL_ERROR_WANT_WRITE) + r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout); + else + r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout); +#else + r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout); +#endif + 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 +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + r = httpBlockRead(soap->rpmreqid, s, n); +#endif + r = read((SOAP_SOCKET)soap->recvfd, s, n); + if (r >= 0) + return (size_t)r; + soap->errnum = soap_errno; + return 0; +#endif +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 from socket %d\n", (unsigned int)soap->buflen, soap->socket)); + DBGMSG(RECV, soap->buf, soap->buflen); + if (soap->buflen) + return soap->buf[soap->bufidx++]; + return EOF; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +soap_isxdigit(int c) +{ return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); +} +#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; + soap->error = SOAP_ZLIB_ERROR; + 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 +#ifndef WITH_NOHTTP + 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 (chunked) from socket %d\n", (unsigned int)ret, soap->socket)); + DBGMSG(RECV, soap->buf, ret); + soap->bufidx = 0; + if (!ret) + return soap->ahead = EOF; + } + else + soap->bufidx = soap->buflen; + soap->buflen = soap->chunkbuflen; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); + while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) + if ((int)c == EOF) + return soap->ahead = 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 soap->ahead = 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 soap->ahead = EOF; + } + soap->buflen = soap->bufidx + soap->chunksize; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, 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 (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); + } + else if (soap->chunkbuflen) + soap->chunksize = 0; + ret = soap->buflen - soap->bufidx; + if (!ret) + goto chunk_again; + } + } + else +#endif + { soap->bufidx = 0; + soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket %d\n", (unsigned int)ret, soap->socket)); + DBGMSG(RECV, soap->buf, ret); + } +#ifndef WITH_LEANER + if (soap->fpreparerecv && (soap->error = soap->fpreparerecv(soap, soap->buf, ret))) + return soap->error; +#endif +#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; + soap->error = SOAP_ZLIB_ERROR; + 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; + c = soap->ahead; + if (c) + { if (c != EOF) + 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) +{ if (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 + +/******************************************************************************/ +#ifdef WITH_LEAN +soap_wchar +soap_get0(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx]; +} +#endif + +/******************************************************************************/ +#ifdef WITH_LEAN +soap_wchar +soap_get1(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx++]; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +soap_wchar +SOAP_FMAC2 +soap_get(struct soap *soap) +{ register soap_wchar c; + c = soap->ahead; + if (c) + { if (c != EOF) + 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 == '%') + { register int k = 1; + 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) + { if (c == '<') + k++; + else if (c == '>') + { if (--k <= 0) + break; + } + 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 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) +{ char d[2]; + register int i; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (!(soap->dom->data = soap_s2hex(soap, s, NULL, n))) + return soap->error; + return SOAP_OK; + } +#endif + 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_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_string_in(soap, 0, -1, -1); + return (unsigned char*)soap_hex2s(soap, soap->dom->data, NULL, 0, n); + } +#endif +#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, NULL, 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_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_string_in(soap, 0, -1, -1); + return (unsigned char*)soap_base642s(soap, soap->dom->data, NULL, 0, n); + } +#endif +#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 - 1); + p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i - 1); + if (p) + memcpy(p, soap->labbuf, soap->lablen - k + i - 1); + 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 WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) +{ /* Check MTOM xop:Include element (within hex/base64Binary) */ + /* TODO: this code to be obsoleted with new import/xop.h conventions */ + int body = soap->body; /* should save type too? */ + if (!soap_peek_element(soap)) + { if (!soap_element_begin_in(soap, "xop:Include", 0) && *soap->href) + { if (soap_dime_forward(soap, ptr, size, id, type, options)) + return soap->error; + } + if (soap->body && soap_element_end_in(soap, NULL)) + return soap->error; + } + soap->body = body; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_dime_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) +{ struct soap_xlist *xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); + *ptr = NULL; + *size = 0; + *id = soap_strdup(soap, soap->href); + *type = NULL; + *options = NULL; + if (!xp) + return soap->error = SOAP_EOM; + xp->next = soap->xlist; + xp->ptr = ptr; + xp->size = size; + xp->id = *id; + xp->type = type; + xp->options = options; + soap->xlist = xp; + return SOAP_OK; +} +#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(soap, 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(soap, 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(soap, p); +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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; +#ifndef WITH_LEANER + register struct soap_xlist *xp; +#endif + 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; + } + } + } + } +#ifndef WITH_LEANER + for (xp = soap->xlist; xp; xp = xp->next) + { if (xp->ptr && (char*)xp->ptr >= start && (char*)xp->ptr < end) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", xp->id?xp->id:"", xp->ptr, (char*)xp->ptr + offset)); + xp->ptr = (unsigned char**)((char*)xp->ptr + offset); + xp->size = (int*)((char*)xp->size + offset); + xp->type = (char**)((char*)xp->type + offset); + xp->options = (char**)((char*)xp->options + offset); + } + } +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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(soap, 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 +#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(soap, 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(soap, p); + } + soap->blist = bp->next; + SOAP_FREE(soap, 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); +#ifndef WITH_NOIDREF + if (flag) + soap_update_ptrs(soap, q, q + n, (long)s - (long)q); /* pointers s and q may or may not be related */ +#endif + 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; + if (*attr1 == '[') + attr1++; + n = 1; + for (;;) + { 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; + } + if (!attr1) + break; + 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; + register short i = -1; + register size_t n, k; + n = strlen(id); + k = strlen(ns) + 1; + p = soap->local_namespaces; + if (p) + { for (i = 0; p->id; p++, i++) + { if (p->ns && !strcmp(ns, p->ns)) + { if (p->out) + { SOAP_FREE(soap, p->out); + p->out = NULL; + } + break; + } + if (p->out) + { if (!strcmp(ns, p->out)) + break; + } + else if (p->in) + { if (!soap_tag_cmp(ns, p->in)) + { if ((p->out = (char*)SOAP_MALLOC(soap, k))) + strcpy(p->out, ns); + break; + } + } + } + if (!p || !p->id) + i = -1; + } + if (i >= 0) + k = 0; + np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); + if (!np) + return soap->error = SOAP_EOM; + np->next = soap->nlist; + soap->nlist = np; + np->level = soap->level; + np->index = i; + strcpy(np->id, id); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns)); + if (i < 0) + { np->ns = np->id + n + 1; + strcpy(np->ns, ns); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); + } + else + { np->ns = NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); + } + 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)); + SOAP_FREE(soap, 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 + || (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 && !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_rand() +{ unsigned char buf[4]; + ssl_init(); + RAND_pseudo_bytes(buf, 4); + return *(int*)buf; +} +#endif + +/******************************************************************************/ +#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)) + { char buf[1024]; + RAND_seed(buf, sizeof(buf)); + while (!RAND_status()) + { int r = rand(); + 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 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); +/* See below */ + 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); + } +/* Suggested alternative approach to check cafile first before the key file: + 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 (!soap->cafile || !SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) + { 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 or key file", SOAP_SSL_ERROR); + 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 or warning 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 + /* Note: return 1 to 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) +{ BIO *bio; + 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->ctx && (soap->error = soap->fsslauth(soap))) + return SOAP_INVALID_SOCKET; + 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 + bio = BIO_new_socket((SOAP_SOCKET)soap->socket, BIO_NOCLOSE); + SSL_set_bio(soap->ssl, bio, 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 WITH_NOIO +#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 +#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, 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, soap->plugins); + soap->plugins = p; + } + soap->fplugin = fplugin; +#ifndef WITH_NOHTTP + soap->fpost = http_post; + soap->fget = http_get; + soap->fform = NULL; + soap->fposthdr = http_post_header; + soap->fresponse = http_response; + soap->fparse = http_parse; + soap->fparsehdr = http_parse_header; +#endif +#ifndef WITH_NOIO +#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->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; + soap->fpreparefinal = NULL; +#endif + soap->fseterror = 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 + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); + for (i = 0; i < SOAP_MAXLOGS; i++) + { if (soap->logfile[i]) + { SOAP_FREE(soap, (void*)soap->logfile[i]); + soap->logfile[i] = NULL; + } + soap_close_logfile(soap, i); + } + soap_free_mht(soap); +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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/UDP IP error %d", soap->errnum); + msg = soap->msgbuf; + } + } + } + return msg; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static const char* +http_error(struct soap *soap, int status) +{ register const char *msg = SOAP_STR_EOS; +#ifndef WITH_LEAN + msg = soap_str_code(h_http_error_codes, status); + if (!msg) + msg = SOAP_STR_EOS; +#endif + return msg; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_IPV6 +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) +{ soap_int32 iadd = -1; + struct hostent hostent, *host = &hostent; +#ifdef VXWORKS + int hostint; + char *addrcopy = (char*)SOAP_MALLOC(soap, 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 +#if defined(_AIXVERSION_431) || defined(TRU64) + struct hostent_data ht_data; +#endif + iadd = inet_addr(addr); +#endif + if (iadd != -1) + { memcpy(inaddr, &iadd, sizeof(iadd)); +#ifdef VXWORKS + SOAP_FREE(soap, addrcopy); +#endif + 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); +#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; + } + SOAP_FREE(soap, addrcopy); /*free() is placed after the error checking to assure that + * errno captured is that from hostGetByName() */ +#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; + } +#ifdef VXWORKS + inaddr->s_addr = hostint; +#else + memcpy(inaddr, host->h_addr, host->h_length); +#endif + return SOAP_OK; +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) +{ +#ifdef WITH_IPV6 + struct addrinfo hints, *res, *ressave; + int err; +#endif + 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->errnum = 0; + soap_set_sender_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + soap->errmode = 0; +#ifdef WITH_IPV6 + memset((void*)&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + hints.ai_socktype = SOCK_DGRAM; + else +#endif + hints.ai_socktype = SOCK_STREAM; + soap->errmode = 2; + if (soap->proxy_host) + err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); + else + err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); + if (err) + { soap_set_sender_error(soap, gai_strerror(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + ressave = res; +again: + fd = (int)socket(res->ai_family, res->ai_socktype, res->ai_protocol); + soap->errmode = 0; +#else +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + fd = (int)socket(AF_INET, SOCK_DGRAM, 0); + else +#endif + fd = (int)socket(AF_INET, SOCK_STREAM, 0); +#endif + if (fd < 0) + { soap->errnum = soap_socket_errno; + soap_set_sender_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#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), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + 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), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + 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), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + 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), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + 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), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && 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), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } +#endif +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Opening socket %d to host='%s' port=%d\n", fd, host, port)); +#ifndef WITH_IPV6 + soap->peerlen = sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->peer.sin_family = AF_INET; + soap->errmode = 2; + if (soap->proxy_host) + { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.sin_addr)) + { soap_set_sender_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + soap->peer.sin_port = htons((short)soap->proxy_port); + } + else + { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) + { soap_set_sender_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + soap->peer.sin_port = htons((short)port); + } + soap->errmode = 0; + if ((soap->omode & SOAP_IO_UDP)) + return fd; +#endif +#ifndef WITH_LEAN + if (soap->connect_timeout) +#if defined(WIN32) + { u_long nonblocking = 1; + ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking); + } +#elif defined(VXWORKS) + { vx_nonblocking = TRUE; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */ + } +#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); + } +#elif defined(VXWORKS) + { vx_nonblocking = FALSE; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */ + } +#else + fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK); +#endif +#endif + for (;;) + { +#ifdef WITH_IPV6 + if (connect((SOAP_SOCKET)fd, res->ai_addr, res->ai_addrlen)) +#else + if (connect((SOAP_SOCKET)fd, (struct sockaddr*)&soap->peer, sizeof(soap->peer))) +#endif + { +#ifndef WITH_LEAN + if (soap->connect_timeout && (soap_socket_errno == SOAP_EINPROGRESS || soap_socket_errno == SOAP_EWOULDBLOCK)) + { struct timeval timeout; + SOAP_SOCKLEN_T k; + 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", "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + 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), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); + if (!getsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ + break; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); + soap->errnum = soap_socket_errno; + soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + else +#endif +#ifdef WITH_IPV6 + if (res->ai_next) + { res = res->ai_next; + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + goto again; + } + 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), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + else + break; + } +#ifdef WITH_IPV6 + soap->peerlen = 0; /* IPv6: already connected so use send() */ + freeaddrinfo(ressave); +#endif +#ifndef WITH_LEAN + if (soap->connect_timeout) +#if defined(WIN32) + { u_long blocking = 0; + ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking); + } +#elif defined(VXWORKS) + { vx_nonblocking = FALSE; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */ + } +#else + fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK); +#endif +#endif + soap->socket = fd; + soap->imode &= ~SOAP_ENC_SSL; + soap->omode &= ~SOAP_ENC_SSL; + if (!strncmp(endpoint, "https:", 6)) + { +#ifdef WITH_OPENSSL + BIO *bio; + int r; + if (soap->proxy_host) + { short v; + unsigned int k = soap->omode; /* make sure we only parse HTTP */ + size_t n = soap->count; /* save the content length */ + soap->omode &= ~SOAP_ENC; /* 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 SOAP_INVALID_SOCKET; +#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 SOAP_INVALID_SOCKET; + soap->omode = k; + k = soap->imode; + soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ + v = soap->version; /* preserve */ + if (soap_begin_recv(soap)) + return SOAP_INVALID_SOCKET; + soap->version = v; /* restore */ + soap->imode = k; /* restore */ + soap->count = n; /* restore */ + 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 SOAP_INVALID_SOCKET; + } + soap->ssl = SSL_new(soap->ctx); + if (!soap->ssl) + { soap->error = SOAP_SSL_ERROR; + return SOAP_INVALID_SOCKET; + } + 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; + bio = BIO_new_socket((SOAP_SOCKET)fd, BIO_NOCLOSE); + SSL_set_bio(soap->ssl, bio, 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 SOAP_INVALID_SOCKET; + } + 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", "connect failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + 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 SOAP_INVALID_SOCKET; + } + } +#else + soap->error = SOAP_SSL_ERROR; + return SOAP_INVALID_SOCKET; +#endif + } + return fd; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_bind(struct soap *soap, const char *host, int port, int backlog) +{ +#ifdef WITH_IPV6 + struct addrinfo *addrinfo; + struct addrinfo hints; + struct addrinfo res; + int err; +#endif +#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 SOAP_INVALID_SOCKET; + } +#ifdef WITH_IPV6 + memset((void*)&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + hints.ai_socktype = SOCK_DGRAM; + else +#endif + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + soap->errmode = 2; + err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); + if (addrinfo) + { res = *addrinfo; + soap->peer = *((struct sockaddr_storage*)addrinfo->ai_addr); + soap->peerlen = addrinfo->ai_addrlen; + res.ai_addr = (struct sockaddr*)&soap->peer; + res.ai_addrlen = soap->peerlen; + freeaddrinfo(addrinfo); + } + if (err) + { soap_set_receiver_error(soap, gai_strerror(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + soap->master = socket(res.ai_family, res.ai_socktype, res.ai_protocol); +#else +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); + else +#endif + soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); +#endif + soap->errmode = 0; + if (!soap_valid_socket(soap->master)) + { soap->errnum = soap_socket_errno; + soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + soap->socket = soap->master; +#endif +#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), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && 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), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + 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), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + 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), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && 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), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#endif +#endif +#ifdef WITH_IPV6 + soap->errmode = 0; + if (bind((SOAP_SOCKET)soap->master, res.ai_addr, res.ai_addrlen)) + { 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), "bind failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#else + soap->peerlen = sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->peer.sin_family = AF_INET; + soap->errmode = 2; + if (host) + { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) + { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } + else + soap->peer.sin_addr.s_addr = htonl(INADDR_ANY); + soap->peer.sin_port = htons((short)port); + soap->errmode = 0; + if (bind((SOAP_SOCKET)soap->master, (struct sockaddr*)&soap->peer, soap->peerlen)) + { 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), "bind failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#endif + if (!(soap->omode & SOAP_IO_UDP) && 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), "listen failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + return soap->master; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_poll(struct soap *soap) +{ +#ifndef WITH_LEAN + struct timeval timeout; + fd_set rfd, sfd, xfd; + int r; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&rfd); + FD_ZERO(&sfd); + FD_ZERO(&xfd); + if (soap_valid_socket(soap->socket)) + { FD_SET((SOAP_SOCKET)soap->socket, &rfd); + FD_SET((SOAP_SOCKET)soap->socket, &sfd); + FD_SET((SOAP_SOCKET)soap->socket, &xfd); + r = select((SOAP_SOCKET)(soap->socket + 1), &rfd, &sfd, &xfd, &timeout); + if (r > 0 && FD_ISSET((SOAP_SOCKET)soap->socket, &xfd)) + r = -1; + } + else if (soap_valid_socket(soap->master)) + { FD_SET((SOAP_SOCKET)soap->master, &sfd); + r = select((SOAP_SOCKET)(soap->master + 1), NULL, &sfd, NULL, &timeout); + } + else + return SOAP_OK; + if (r > 0) + { if (soap_valid_socket(soap->socket) + && FD_ISSET((SOAP_SOCKET)soap->socket, &sfd) + && (!FD_ISSET((SOAP_SOCKET)soap->socket, &rfd) + || recv((SOAP_SOCKET)soap->socket, soap->tmpbuf, 1, MSG_PEEK) > 0)) + return SOAP_OK; + } + else if (r < 0) + { soap->errnum = soap_socket_errno; + if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno != SOAP_EINTR) + { 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 = 0; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); + return SOAP_EOF; +#else + return SOAP_OK; +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_accept(struct soap *soap, int s, struct sockaddr *a, int *n) +{ int fd; + fd = (int)accept((SOAP_SOCKET)s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ +#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 WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_accept(struct soap *soap) +{ int n = (int)sizeof(soap->peer); +#ifndef WITH_LEAN + int len = SOAP_BUFLEN; + int set = 1; +#endif + soap->error = SOAP_OK; +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + return soap->socket = soap->master; +#endif + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->socket = SOAP_INVALID_SOCKET; + soap->errmode = 0; + soap->keep_alive = 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", "accept failed in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (soap_socket_errno != SOAP_EINTR) + { soap->errnum = soap_socket_errno; + soap_closesock(soap); + soap_set_sender_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } +#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); + } +#elif defined(VXWORKS) + { vx_nonblocking = FALSE; + 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 +#endif + soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&soap->peer, &n); + soap->peerlen = (size_t)n; + if (soap_valid_socket(soap->socket)) + { +#ifdef WITH_IPV6 +/* Use soap->host to store the numeric form of the remote host */ + getnameinfo((struct sockaddr*)&soap->peer, 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->peer and soap->host */ + soap->port = 0; /* info stored in soap->peer and soap->host */ +#else + soap->ip = ntohl(soap->peer.sin_addr.s_addr); + soap->port = (int)ntohs(soap->peer.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)); +#endif +#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), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + } + 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), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && 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), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + 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), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + 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), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && 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), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } +#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); +#elif defined(VXWORKS) + vx_nonblocking = FALSE; + ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking)); + ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)(&vx_nonblocking)); +#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 + } + soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); + return soap->socket; + } + if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); + soap->errnum = soap_socket_errno; + soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + } + } + else + { soap->errnum = 0; + soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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) && !(soap->omode & SOAP_IO_UDP)) + { 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 WITH_NOIO +#ifndef PALM_1 +static int +tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket %d\n", (int)fd)); + return closesocket(fd); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket %d how=%d\n", (int)fd, 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; + if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) + { if (soap->fclose && (soap->error = soap->fclose(soap))) + return soap->error; + soap->keep_alive = 0; + } +#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 WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_init_pht(struct soap *soap) +{ register int i; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n")); + soap->pblk = NULL; + soap->pidx = 0; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->pht[i] = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new1(soap_mode mode) +{ return soap_new2(mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new() +{ return soap_new2(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new2(soap_mode imode, soap_mode omode) +{ struct soap *soap = (struct soap*)malloc(sizeof(struct soap)); + if (soap) + soap_init2(soap, imode, omode); + return soap; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_free_pht(struct soap *soap) +{ register struct soap_pblk *pb, *next; + register int i; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); + for (pb = soap->pblk; pb; pb = next) + { next = pb->next; + SOAP_FREE(soap, pb); + } + soap->pblk = NULL; + soap->pidx = 0; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->pht[i] = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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; + if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) + { register struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); + if (!pb) + { soap->error = SOAP_EOM; + return 0; + } + pb->next = soap->pblk; + soap->pblk = pb; + soap->pidx = 0; + } + *ppp = pp = &soap->pblk->plist[soap->pidx++]; + 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=%d\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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +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)) +#ifndef WITH_LEANER + && !soap->fpreparesend +#endif + )) + soap->mode &= ~SOAP_IO_LENGTH; + else + soap->mode |= SOAP_IO_LENGTH; + } +#ifdef WITH_ZLIB + 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; + } +#endif + if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) + soap->mode |= SOAP_XML_TREE; +#ifndef WITH_LEANER + if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) + soap->mode |= SOAP_ENC_MIME; + else + soap->mode &= ~SOAP_ENC_MTOM; + 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; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); +#ifndef WITH_LEANER + soap->dime.count = 0; /* count # of attachments */ + soap->dime.size = 0; /* accumulate total size of attachments */ + if (soap->fprepareinit && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + return soap->error = soap->fprepareinit(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_end_count(struct soap *soap) +{ +#ifndef WITH_LEANER + if (soap->fpreparefinal) + return soap->error = soap->fpreparefinal(soap); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); + return SOAP_OK; +} +#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->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); +#ifdef WITH_ZLIB + 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; + } +#endif +#ifdef WITH_UDP + if ((soap->mode & SOAP_IO_UDP)) + { soap->mode |= SOAP_ENC_XML; + if (soap->count > SOAP_BUFLEN) + return soap->error = SOAP_UDP_ERROR; + } +#endif + if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) + { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) + soap->mode |= SOAP_IO_BUFFER; + else + soap->mode |= SOAP_IO_STORE; + } + soap->mode &= ~SOAP_IO_LENGTH; + 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_MTOM) && (soap->mode & SOAP_ENC_DIME)) + { soap->mode |= SOAP_ENC_MIME; + soap->mode &= ~SOAP_ENC_DIME; + } + else + soap->mode &= ~SOAP_ENC_MTOM; + if (soap->mode & SOAP_ENC_MIME) + soap_select_mime_boundary(soap); +#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 +#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->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=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); + soap->part = SOAP_BEGIN; +#ifndef WITH_LEANER + if (soap->fprepareinit && (soap->mode & SOAP_IO) == SOAP_IO_STORE) + soap->fprepareinit(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 || !a->__ptr) + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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; + if (soap->mode & SOAP_XML_TREE) + return id; + 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_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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_attachment(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; + int i; + 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:"")); + i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); + if (!i) + { i = soap_pointer_enter(soap, p, a, n, t, &pp); + if (!i) + { soap->error = SOAP_EOM; + return -1; + } + } + if (id < 0) + id = i; + if (!aid) + { sprintf(soap->tmpbuf, soap->dime_id_format, id); + aid = soap_strdup(soap, soap->tmpbuf); + } + /* Add MTOM xop:Include element when necessary */ + /* TODO: this code to be obsoleted with new import/xop.h conventions */ + if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) + { if (soap_element_begin_out(soap, tag, 0, type) + || soap_element_href(soap, "xop:Include", 0, "href", aid) + || soap_element_end_out(soap, tag)) + return soap->error; + } + else 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; + if (soap->mode & SOAP_ENC_MTOM) + content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a->__ptr, a->__size); + else + content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size); + if (!content) + { soap->error = SOAP_EOM; + return -1; + } + if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ + { if (soap->mode & SOAP_ENC_MTOM) + { char *s = (char*)soap_malloc(soap, strlen(aid) - 1); + if (s) + { *s = '<'; + strcpy(s + 1, aid + 4); + strcat(s, ">"); + content->id = s; + } + } + else + content->id = aid + 4; + } + else + content->id = aid; + content->type = atype; + content->options = aoptions; + content->encoding = SOAP_MIME_BINARY; + pp->mark1 = 3; + } + } + else + pp->mark2 = 3; + return -1; +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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(soap, fp); + } + p = ip->next; + SOAP_FREE(soap, ip); + } + soap->iht[i] = NULL; + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +struct soap_ilist * +SOAP_FMAC2 +soap_lookup(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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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(soap, 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 +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_malloc(struct soap *soap, size_t n) +{ register char *p; + if (!n) + return (void*)SOAP_NON_NULL; + if (!soap) + return SOAP_MALLOC(soap, n); + n += (-(long)n) & 7; + if (!(p = (char*)SOAP_MALLOC(soap, 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; + return p; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +static void +soap_init_mht(struct soap *soap) +{ register int i; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->mht[i] = NULL; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +static void +soap_free_mht(struct soap *soap) +{ register int i; + register struct soap_mlist *mp, *mq; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + { for (mp = soap->mht[i]; mp; mp = mq) + { mq = mp->next; + if (mp->live) + fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); + free(mp); + } + soap->mht[i] = NULL; + } +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) +{ register void *p = malloc(size); + if (soap) + { register int h = soap_hash_ptr(p); + register struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); + if (soap->fdebug[SOAP_INDEX_TEST]) + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); + mp->next = soap->mht[h]; + mp->ptr = p; + mp->file = file; + mp->line = line; + mp->live = 1; + soap->mht[h] = mp; + } + return p; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_track_free(struct soap *soap, const char *file, int line, void *p) +{ register int h = soap_hash_ptr(p); + register struct soap_mlist *mp; + for (mp = soap->mht[h]; mp; mp = mp->next) + if (mp->ptr == p) + break; + if (mp) + { if (mp->live) + { free(p); + if (soap->fdebug[SOAP_INDEX_TEST]) + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); + mp->live = 0; + } + else + fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); + } + else + fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +static void +soap_track_unlink(struct soap *soap, const void *p) +{ register int h = soap_hash_ptr(p); + register struct soap_mlist *mp; + for (mp = soap->mht[h]; mp; mp = mp->next) + if (mp->ptr == p) + break; + if (mp) + mp->live = 0; +} +#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(soap, p); + return; + } + } + soap_delete(soap, p); + } + else + { register char *q; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); + while (soap->alist) + { q = (char*)soap->alist; + soap->alist = *(void**)q; + q -= *(size_t*)(q + sizeof(void*)); + SOAP_FREE(soap, q); + } + } + /* we must assume these were deallocated: */ + soap->action = NULL; + soap->fault = NULL; + soap->header = NULL; + soap->userid = NULL; + soap->passwd = 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(soap, 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(soap, 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(soap, 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)); +#ifdef SOAP_DEBUG + soap_track_unlink(soap, p); +#endif + 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(soap, q); + return; + } + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 (!p || !id || !*id) + return p; + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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(soap, 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 +#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*)) +{ +#ifndef WITH_NOIDREF + struct soap_ilist *ip; +#endif + 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; + } +#ifndef WITH_NOIDREF + if (!id || !*id) +#endif + return p; +#ifndef WITH_NOIDREF + 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_DUPLICATE_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 +} +#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; +#ifndef WITH_NOHTTP + 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++; + } +#endif + 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); + } +#ifndef WITH_LEANER + 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 && !(soap->omode & SOAP_IO_UDP)) + soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */ +#else + if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) + soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */ +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); + soap->omode &= ~SOAP_XML_SEC; + soap->count = 0; + soap->part = SOAP_END; + 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_DIME) && soap_getdime(soap)) + return soap->error; + soap->dime.list = soap->dime.first; + soap->dime.first = NULL; + soap->dime.last = NULL; + 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->mime.boundary = 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; +#ifndef WITH_NOIDREF + return soap_resolve(soap); +#else +#ifndef WITH_LEANER + if (soap->xlist) + { if (soap->mode & SOAP_ENC_MTOM) + return soap->error = SOAP_MIME_HREF; + return soap->error = SOAP_DIME_HREF; + } +#endif + return SOAP_OK; +#endif +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_free(struct soap *soap) +{ register struct Namespace *ns; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); + while (soap->nlist) + { register struct soap_nlist *np = soap->nlist->next; + SOAP_FREE(soap, 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 attribute storage\n")); + while (soap->attributes) + { register struct soap_attribute *tp = soap->attributes->next; + if (soap->attributes->value) + SOAP_FREE(soap, soap->attributes->value); + SOAP_FREE(soap, soap->attributes); + soap->attributes = tp; + } +#ifdef WITH_FAST + if (soap->labbuf) + SOAP_FREE(soap, soap->labbuf); + soap->labbuf = NULL; + soap->lablen = 0; + soap->labidx = 0; +#endif + ns = soap->local_namespaces; + if (ns) + { for (; ns->id; ns++) + { if (ns->out) + { if (soap->encodingStyle == ns->out) + soap->encodingStyle = SOAP_STR_EOS; + SOAP_FREE(soap, ns->out); + ns->out = NULL; + } + if (soap->encodingStyle == ns->ns) + soap->encodingStyle = SOAP_STR_EOS; + } + SOAP_FREE(soap, soap->local_namespaces); + soap->local_namespaces = NULL; + } +#ifndef WITH_LEANER + while (soap->xlist) + { struct soap_xlist *xp = soap->xlist->next; + SOAP_FREE(soap, soap->xlist); + soap->xlist = xp; + } +#endif +#ifndef WITH_NOIDREF + soap_free_pht(soap); + soap_free_iht(soap); +#endif +} +#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(soap, (void*)soap->logfile[i]); + if (logfile) + if ((s = (char*)SOAP_MALLOC(soap, 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*)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->error = SOAP_OK; + copy->userid = NULL; + copy->passwd = NULL; + copy->nlist = NULL; + copy->blist = NULL; + copy->clist = NULL; + copy->alist = NULL; + copy->attributes = NULL; +#ifdef WITH_FAST + copy->labbuf = NULL; + copy->lablen = 0; + copy->labidx = 0; +#endif +#ifdef SOAP_DEBUG + soap_init_mht(copy); +#endif + copy->local_namespaces = NULL; +#ifndef WITH_NOIDREF + soap_init_iht(copy); + soap_init_pht(copy); +#endif + copy->header = NULL; + copy->fault = NULL; + copy->action = NULL; + *copy->host = '\0'; +#ifndef WITH_LEAN +#ifdef WITH_COOKIES + copy->cookies = soap_copy_cookies(copy); +#else + copy->cookies = NULL; +#endif +#endif +#ifdef SOAP_DEBUG + soap_init_logs(copy); + soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); + soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); + soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); +#endif + copy->plugins = NULL; + for (p = soap->plugins; p; p = p->next) + { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, 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(copy, q, p))) + { SOAP_FREE(copy, 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; +#ifndef WITH_NOHTTP + soap->fpost = http_post; + soap->fget = http_get; + soap->fform = NULL; + soap->fposthdr = http_post_header; + soap->fresponse = http_response; + soap->fparse = http_parse; + soap->fparsehdr = http_parse_header; +#endif + soap->fconnect = NULL; + soap->fdisconnect = NULL; +#ifndef WITH_NOIO +#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->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; + soap->fpreparefinal = NULL; +#endif + soap->fseterror = NULL; + soap->fignore = NULL; + soap->fserveloop = NULL; + soap->fplugin = fplugin; +#ifndef WITH_LEANER + soap->fdimereadopen = NULL; + soap->fdimewriteopen = NULL; + soap->fdimereadclose = NULL; + soap->fdimewriteclose = NULL; + soap->fdimeread = NULL; + soap->fdimewrite = NULL; +#endif + 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; +#ifdef WITH_FAST + soap->labbuf = NULL; + soap->lablen = 0; + soap->labidx = 0; +#endif + 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; +#ifndef WITH_LEANER + 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; + soap->xlist = NULL; +#endif +#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->crlfile = 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->c14ninclude = NULL; + soap->c14nexclude = NULL; + soap->cookies = NULL; + soap->cookie_domain = NULL; + soap->cookie_path = NULL; + soap->cookie_max = 32; +#endif +#ifdef SOAP_DEBUG + soap_init_mht(soap); + 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 +#ifdef WMW_RPM_IO + soap->rpmreqid = NULL; +#endif /* WMW_RPM_IO */ +#ifdef PALM + palmNetLibOpen(); +#endif +#ifndef WITH_NOIDREF + soap_init_iht(soap); + soap_init_pht(soap); +#endif + 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, soap_mode mode) +{ soap_init2(soap, mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init2(struct soap *soap, soap_mode imode, soap_mode 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_END; + 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'; +#ifndef WITH_LEANER + soap->dime.chunksize = 0; + soap->dime.buflen = 0; +#endif + 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, 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) +{ register struct Namespace *ns = soap->local_namespaces; + register struct soap_nlist *np, *nq, *nr; + register unsigned int level = soap->level; + soap->namespaces = p; + soap->local_namespaces = NULL; + soap_set_local_namespaces(soap); + /* reverse the namespace 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; + } + } + /* then push on new stack */ + while (np) + { register const char *s; + soap->level = np->level; /* preserve element nesting level */ + s = np->ns; + if (!s && np->index >= 0 && ns) + { s = ns[np->index].out; + if (!s) + s = ns[np->index].ns; + } + if (s && soap_push_namespace(soap, np->id, s)) + return soap->error; + nq = np; + np = np->next; + SOAP_FREE(soap, nq); + } + if (ns) + { register int i; + for (i = 0; ns[i].id; i++) + { if (ns[i].out) + { SOAP_FREE(soap, ns[i].out); + ns[i].out = NULL; + } + } + SOAP_FREE(soap, ns); + } + soap->level = level; /* restore level */ + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +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++; + n *= sizeof(struct Namespace); + ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); + if (ns2) + { memcpy(ns2, soap->namespaces, n); + if (ns2[0].ns) + { if (!strcmp(ns2[0].ns, soap_env1)) + soap->version = 1; + else + soap->version = 2; + } + soap->local_namespaces = ns2; + } + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +#ifndef PALM_1 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_strsearch(const char *big, const char *little) +{ size_t n = strlen(little); + const char *s = big; + while (s) + { if (!strncmp(s, little, n) && (s[n] == '\0' || s[n] == ' ')) + return s; + s = strchr(s, ' '); + if (s) + s++; + } + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static struct soap_nlist * +soap_lookup_ns(struct soap *soap, const char *tag, size_t n) +{ register struct soap_nlist *np; + for (np = soap->nlist; np; np = np->next) + { if (!strncmp(np->id, tag, n) && !np->id[n]) + return np; + } + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static struct soap_nlist * +soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) +{ register struct soap_nlist *np; + size_t n, k; + if (soap_strsearch(soap->c14nexclude, id)) + return NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns?ns:"")); + if (!utilized) + { for (np = soap->nlist; np; np = np->next) + { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) + break; + } + if (np) + { if (np->index == 1) + utilized = np->index; + else + return NULL; + } + } + n = strlen(id); + if (ns) + k = strlen(ns); + else + k = 0; + np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); + if (!np) + { soap->error = SOAP_EOM; + return NULL; + } + np->next = soap->nlist; + soap->nlist = np; + strcpy(np->id, id); + if (ns) + { np->ns = np->id + n + 1; + strcpy(np->ns, ns); + } + else + np->ns = NULL; + np->level = soap->level; + np->index = utilized; + return np; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static void +soap_utilize_ns(struct soap *soap, const char *tag, size_t n) +{ register struct soap_nlist *np = soap_lookup_ns(soap, tag, n); + if (np) + { if (np->index == 0) + soap_push_ns(soap, np->id, np->ns, 1); + } + else + { strncpy(soap->tmpbuf, tag, n); + soap->tmpbuf[n] = '\0'; + soap_push_ns(soap, soap->tmpbuf, NULL, 1); + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static void +soap_pop_ns(struct soap *soap) +{ soap_pop_namespace(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element(struct soap *soap, const char *tag, int id, const char *type) +{ 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 *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); + if (!elt) + return soap->error = SOAP_EOM; + elt->soap = soap; + elt->next = NULL; + elt->prnt = soap->dom; + elt->name = soap_strdup(soap, tag); + elt->elts = NULL; + elt->atts = NULL; + elt->nstr = NULL; + elt->data = NULL; + elt->wide = NULL; + elt->node = NULL; + elt->type = 0; + elt->head = NULL; + elt->tail = NULL; + if (soap->dom) + { struct soap_dom_element *p = soap->dom->elts; + if (p) + { while (p->next) + p = p->next; + p->next = elt; + } + else + soap->dom->elts = elt; + } + soap->dom = elt; + } + else + { +#endif + soap->level++; +#ifndef WITH_LEAN + if (!soap->ns) + { if (!(soap->mode & SOAP_XML_CANONICAL) + && soap_send(soap, soap->prolog ? soap->prolog : "\n")) + return soap->error; + } + else if (soap->mode & SOAP_XML_INDENT) + { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) + return soap->error; + soap->body = 1; + } +#endif + if (soap_send_raw(soap, "<", 1) + || soap_send(soap, tag)) + return soap->error; +#ifdef WITH_DOM + } +#endif + if (!soap->ns) + { struct Namespace *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; /* start with 0 or 2, but should be one to continue */ +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { const char *s = strchr(tag, ':'); + if (s) + soap_utilize_ns(soap, tag, s - tag); + } +#endif + 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; +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { const char *s = strchr(type, ':'); + if (s) + soap_utilize_ns(soap, type, s - type); + } +#endif + } + 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 && (n > 214748364 || c >= '8')) + 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 && (n > 429496729 || c >= '6')) + 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; + } +#ifndef WITH_LEAN + if (type && *type && (soap->mode & SOAP_XML_CANONICAL)) + { const char *s = strchr(type, ':'); + if (s) + soap_utilize_ns(soap, type, s - type); + } +#endif + 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 + register struct soap_dom_attribute **att; + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { att = &soap->dom->atts; + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); + if (!*att) + return soap->error = SOAP_EOM; + (*att)->next = NULL; + (*att)->nstr = NULL; + (*att)->name = soap_strdup(soap, tp->name); + (*att)->data = soap_strdup(soap, tp->value); + (*att)->wide = NULL; + (*att)->soap = soap; + tp->visible = 0; + } + } + return SOAP_OK; + } +#endif +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { struct soap_nlist *np; + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible && tp->name) + { const char *s = strchr(tp->name, ':'); + if (s) + soap_utilize_ns(soap, tp->name, s - tp->name); + } + } + for (np = soap->nlist; np; np = np->next) + { if (np->index == 1 && np->ns) + { sprintf(soap->tmpbuf, "xmlns:%s", np->id); + soap_set_attr(soap, soap->tmpbuf, np->ns); + np->index = 2; + } + } + } +#endif + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { if (soap_send(soap, " ") || 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) + { +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { if (soap_send_raw(soap, ">", 1) + || soap_element_end_out(soap, tag)) + return soap->error; + } + else +#endif + soap->level--; /* decrement level just before /> */ + if (soap_send_raw(soap, "/>", 2)) + return soap->error; + return SOAP_OK; + } + 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 +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + soap_pop_ns(soap); + if (soap->mode & SOAP_XML_INDENT) + { if (!soap->body) + { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) + return soap->error; + } + soap->body = 0; + } +#endif + if (soap_send_raw(soap, "error; + soap->level--; /* decrement level just before > */ + 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) +{ if (!p || (a && !a->__ptr)) + { soap_element_null(soap, tag, id, type); + return -1; + } +#ifndef WITH_NOIDREF + if (soap->mode & SOAP_XML_TREE) + return 0; + if (id < 0) + { struct soap_plist *pp; + 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; +#else + return 0; +#endif +} +#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); + a->data = soap_strdup(soap, value); + a->wide = NULL; + a->soap = soap; + soap->dom->atts = a; + return SOAP_OK; + } +#endif +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { /* TODO: consider using this code to handle default namespace + if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) + { if (name[5] == ':') + soap_push_ns(soap, name + 6, value, 0); + else + soap_push_ns(soap, "", value, 0); + } + */ + if (!strncmp(name, "xmlns:", 6)) + soap_push_ns(soap, name + 6, value, 0); + else if (soap_set_attr(soap, name, value)) + return soap->error; + } + else +#endif + { if (soap_send(soap, " ") || 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, 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; + } + } + else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') + soap->error = SOAP_OK; + 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; + register int n = 0; + if (tag && *tag == '-') + return SOAP_OK; + soap->level--; + soap_pop_namespace(soap); +#ifdef WITH_DOM + /* this whitespace or mixed content is not insignificant for DOM */ + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (!soap->peeked && !soap_string_in(soap, 3, -1, -1)) + return soap->error; + if (soap->dom->prnt) + soap->dom = soap->dom->prnt; + } +#endif + if (soap->peeked) + { if (soap->error == SOAP_NO_TAG) + soap->error = SOAP_OK; + if (*soap->tag) + n++; + soap->peeked = 0; + } + do + { while (((c = soap_get(soap)) != SOAP_TT)) + { if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (c == SOAP_LT) + n++; + else if (c == '/') + { c = soap_get(soap); + if (c == SOAP_GT) + n--; + else + soap_unget(soap, c); + } + } + } while (n--); + s = soap->tag; + while (soap_notblank(c = soap_getutf8(soap))) + *s++ = (char)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 || !*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(soap, 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(soap, tp->value); + tp->value = NULL; + tp->ns = NULL; + } + if (value) + { if (!tp->value) + { tp->size = strlen(value) + 1; + if (!(tp->value = (char*)SOAP_MALLOC(soap, 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; +#ifndef WITH_LEAN + if (!strcmp(name, "wsu:Id")) + { soap->part = SOAP_BEGIN_SECURITY; + strncpy(soap->id, value, sizeof(soap->id)); + soap->id[sizeof(soap->id)-1] = '\0'; + } +#endif + } + 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, soap->attributes->value); + SOAP_FREE(soap, 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 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_store_lab(struct soap *soap, const char *s, size_t n) +{ soap->labidx = 0; + return soap_append_lab(soap, s, n); +} +#endif +#endif + +/******************************************************************************/ +#ifdef WITH_FAST +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +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, soap->lablen); + if (!soap->labbuf) + { if (t) + SOAP_FREE(soap, t); + return soap->error = SOAP_EOM; + } + if (t) + { memcpy(soap->labbuf, t, soap->labidx); + SOAP_FREE(soap, 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) +{ +#ifdef WITH_DOM + register struct soap_dom_attribute **att = NULL; + register char *lead = NULL; +#endif + register struct soap_attribute *tp; + const char *t; + register char *s; + register soap_wchar c; + register int i; + if (soap->peeked) + { if (!*soap->tag) + return soap->error = SOAP_NO_TAG; + return SOAP_OK; + } + soap->peeked = 1; + for (;;) + { c = soap_getutf8(soap); + if (c == SOAP_BOM) + c = soap_get(soap); +#ifdef WITH_DOM + /* whitespace leading to start tag is not insignificant for DOM */ + if (soap_blank(c)) + { soap->labidx = 0; + do + { if (soap_append_lab(soap, NULL, 0)) + return SOAP_EOM; + s = soap->labbuf + soap->labidx; + i = soap->lablen - soap->labidx; + soap->labidx = soap->lablen; + while (soap_blank(c) && i--) + { *s++ = c; + c = soap_get(soap); + } + } + while (soap_blank(c)); + *s = '\0'; + lead = soap_strdup(soap, soap->labbuf); + } +#else + while (soap_blank(c)) + c = soap_get(soap); +#endif + if (c != SOAP_LT) + { *soap->tag = '\0'; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + soap_unget(soap, c); +#ifdef WITH_DOM + /* whitespace leading to end tag is not insignificant for DOM */ + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->tail = soap_strdup(soap, lead); +#endif + return soap->error = SOAP_NO_TAG; + } + s = soap->tag; + do c = soap_getutf8(soap); + while (soap_blank(c)); + i = sizeof(soap->tag); + while (c != '/' && soap_notblank(c)) + { if (--i > 0) + *s++ = (char)c; + c = soap_getutf8(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; +#ifdef WITH_DOM + if (soap->mode & SOAP_XML_DOM) + { register struct soap_dom_element *elt; + elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); + if (!elt) + return soap->error = SOAP_EOM; + elt->next = NULL; + elt->nstr = NULL; + elt->name = soap_strdup(soap, soap->tag); + elt->prnt = soap->dom; + elt->elts = NULL; + elt->atts = NULL; + elt->data = NULL; + elt->wide = NULL; + elt->type = 0; + elt->node = NULL; + elt->head = lead; + elt->tail = NULL; + elt->soap = soap; + if (soap->dom) + { struct soap_dom_element *p = soap->dom->elts; + if (p) + { while (p->next) + p = p->next; + p->next = elt; + } + else + soap->dom->elts = elt; + } + soap->dom = elt; + att = &elt->atts; + } +#endif + for (tp = soap->attributes; tp; tp = tp->next) + tp->visible = 0; + 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; +#ifdef WITH_DOM + /* add attribute name to dom */ + if (att) + { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); + if (!*att) + return soap->error = SOAP_EOM; + (*att)->next = NULL; + (*att)->nstr = NULL; + (*att)->name = soap_strdup(soap, soap->tmpbuf); + (*att)->data = NULL; + (*att)->wide = NULL; + (*att)->soap = soap; + } +#endif + if (!strncmp(soap->tmpbuf, "xmlns", 5)) + { if (soap->tmpbuf[5] == ':') + { soap->tmpbuf[5] = '\0'; + t = soap->tmpbuf + 6; + } + else if (soap->tmpbuf[5]) + t = NULL; + else + 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(soap, 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; + if (soap_store_lab(soap, tp->value, tp->size)) + return soap->error; + if (tp->value) + SOAP_FREE(soap, 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; + } + if (soap->labidx) + tp->size = soap->lablen; + else + { tp->size = strlen(soap->labbuf) + 1; + if (tp->size < SOAP_LABLEN) + tp->size = SOAP_LABLEN; + } + if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) + return soap->error = SOAP_EOM; + strcpy(tp->value, soap->labbuf); +#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(soap, n))) + return soap->error = SOAP_EOM; + if (tp->value) + { memcpy(s, tp->value, tp->size); + SOAP_FREE(soap, 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 */ +#ifdef WITH_DOM + if (att) + (*att)->data = soap_strdup(soap, tp->value); +#endif + } + else + tp->visible = 1; /* seen this attribute w/o value */ +#ifdef WITH_DOM + if (att) + att = &(*att)->next; +#endif + if (t && tp->value) + { if (soap_push_namespace(soap, t, tp->value)) + return soap->error; + tp->visible = 0; + } + } +#ifdef WITH_DOM + if (att) + { soap->dom->nstr = soap_dom_current_nstr(soap, soap->tag); + for (att = &soap->dom->atts; *att; att = &(*att)->next) + (*att)->nstr = soap_dom_current_nstr(soap, (*att)->name); + } +#endif + if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (!(soap->body = (c != '/'))) + do c = soap_get(soap); + while (soap_blank(c)); +#ifdef WITH_DOM + if (soap->mode & SOAP_XML_DOM) + { if (!soap->body && soap->dom->prnt) + soap->dom = soap->dom->prnt; + } +#endif + 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->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) + || (soap->version == 2 && !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; + } + } + return soap->error = SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_retry(struct soap *soap) +{ soap->error = SOAP_OK; + soap_revert(soap); +} +#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 = 0xFFFFFF80UL; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_strdup(soap, s); + 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: +#ifndef WITH_LEANER +#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 +#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; +#if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) + char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; +#else + char buf[8]; +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content\n")); + if (soap->peeked) + { if (!soap->body) + return NULL; + if (*soap->tag) + { n = 1; + soap->peeked = 0; +#ifndef WITH_LEAN + t = soap->tmpbuf; + t[0] = '<'; + strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 1); + strncat(t, ">", sizeof(soap->tmpbuf)); + m = strlen(soap->tag) + 2; +#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: +#ifndef WITH_LEANER +#ifdef HAVE_WCTOMB + if (soap->mode & SOAP_C_MBSTRING) + { m = wctomb(buf, c & 0x7FFFFFFF); + if (m >= 1 && m <= (int)MB_CUR_MAX) + { t = buf; + *s++ = *t++; + m--; + } + else + { *s++ = SOAP_UNKNOWN_CHAR; + m = 0; + } + } + else +#endif +#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*)"amp;"; + m = 4; + } + 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; +#ifndef WITH_LEANER +#ifdef HAVE_WCTOMB + if (soap->mode & SOAP_C_MBSTRING) + { m = wctomb(buf, c & 0x7FFFFFFF); + if (m >= 1 && m <= (int)MB_CUR_MAX) + { t = buf; + *s++ = *t++; + m--; + } + else + { *s++ = SOAP_UNKNOWN_CHAR; + m = 0; + } + } + else +#endif +#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; + } +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (flag == 3) + soap->dom->tail = t; + else + soap->dom->data = t; + } +#endif + if (flag == 2) + if (soap_s2QName(soap, t, &t)) + return NULL; + return t; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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) + { wchar_t *r = (wchar_t*)s; + int n = 1; + while (*r++) + n++; + soap->dom->wide = r = (wchar_t*)soap_malloc(soap, n * sizeof(wchar_t)); + while (n--) + *r++ = *s++; + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n")); + if (soap->peeked) + { if (!soap->body) + return NULL; + if (*soap->tag) + { n = 1; + soap->peeked = 0; + } + } + 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; + } + s = (wchar_t*)soap_save_block(soap, NULL, 0); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->wide = s; +#endif + return s; +} +#endif +#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 ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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 (*soap->href) + p = (int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(int), 0, NULL); + else if (p) + { if (soap_s2int(soap, soap_value(soap), p)) + return 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 ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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 (*soap->href) + p = (long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(long), 0, NULL); + else if (p) + { if (soap_s2long(soap, soap_value(soap), p)) + return 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) + { +#ifdef HAVE_STRTOLL + char *r; + *p = strtoll(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) +#else +# ifdef HAVE_SSCANF + if (sscanf(s, SOAP_LONG_FORMAT, p) != 1) +# endif +#endif + 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 (*soap->href) + p = (LONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(LONG64), 0, NULL); + else if (p) + { if (soap_s2LONG64(soap, soap_value(soap), p)) + return 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 (s == r || *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 (*soap->href) + p = (char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(char), 0, NULL); + else if (p) + { if (soap_s2byte(soap, soap_value(soap), p)) + return 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 (s == r || *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 (*soap->href) + p = (short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(short), 0, NULL); + else if (p) + { if (soap_s2short(soap, soap_value(soap), p)) + return 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 (!*s) + return soap->error = SOAP_TYPE; + 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 + { +/* On some systems, strtof appears to be broken or doesn't link: use with caution */ +#if defined(HAVE_STRTOF) + char *r; + *p = strtof((char*)s, &r); + if (*r) +#elif defined(HAVE_STRTOD) + char *r; + *p = (float)strtod(s, &r); + if (*r) +#endif +#ifdef HAVE_SSCANF + if (sscanf(s, "%g", 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 (*soap->href) + p = (float*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(float), 0, NULL); + else if (p) + { if (soap_s2float(soap, soap_value(soap), p)) + return 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 (!*s) + return soap->error = SOAP_TYPE; + 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, "%lg", 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 (*soap->href) + p = (double*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(double), 0, NULL); + else if (p) + { if (soap_s2double(soap, soap_value(soap), p)) + return 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 (s == r || *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 (*soap->href) + p = (unsigned char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned char), 0, NULL); + else if (p) + { if (soap_s2unsignedByte(soap, soap_value(soap), p)) + return 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_unsignedShort2s(struct soap *soap, unsigned short n) +{ return soap_unsignedLong2s(soap, (unsigned long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +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 PALM_2 +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 (s == r || *r || n > 65535) + soap->error = SOAP_TYPE; + *p = (unsigned short)n; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +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 (*soap->href) + p = (unsigned short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned short), 0, NULL); + else if (p) + { if (soap_s2unsignedShort(soap, soap_value(soap), p)) + return 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 ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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 (*soap->href) + p = (unsigned int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned int), 0, NULL); + else if (p) + { if (soap_s2unsignedInt(soap, soap_value(soap), p)) + return 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 ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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 (*soap->href) + p = (unsigned long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned long), 0, NULL); + else if (p) + { if (soap_s2unsignedLong(soap, soap_value(soap), p)) + return 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) + { +#ifdef HAVE_STRTOULL + char *r; + *p = strtoull(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) +#else +# ifdef HAVE_SSCANF + if (sscanf(s, SOAP_ULONG_FORMAT, p) != 1) +# endif +#endif + 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 (*soap->href) + p = (ULONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(ULONG64), 0, NULL); + else if (p) + { if (soap_s2ULONG64(soap, soap_value(soap), p)) + return 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 != '"') + { +#ifndef WITH_LEAN + if (s && (soap->mode & SOAP_XML_CANONICAL)) + { t = strchr(s, ':'); + if (t) + soap_utilize_ns(soap, s, t - s); + } +#endif + 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:_%d", 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)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + 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; + if (*soap->href) + 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 WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + 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; + if (*soap->href) + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static time_t +soap_timegm(struct tm *T) +{ +#if defined(HAVE_TIMEGM) + return timegm(T); +#else + time_t t, g, z; +#ifdef HAVE_GMTIME_R + struct tm tm, *tmp = &tm; +#else + struct tm *tmp; +#endif + t = mktime(T); + if (t == -1) + return -1; +#ifdef HAVE_GMTIME_R + gmtime_r(&t, tmp); +#else + tmp = gmtime(&t); +#endif + tmp->tm_isdst = 0; + g = mktime(tmp); + if (g == -1) + return -1; + z = g - t; + return t - z; +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_dateTime2s(struct soap *soap, time_t n) +{ struct tm T, *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); + /* 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); +#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+(pT->tm_isdst!=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+(pT->tm_isdst!=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+(pT->tm_isdst!=0), abs(t.timezone)%60); + } + /* 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); + } +# 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+(pT->tm_isdst!=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); + /* 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); +#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]; + const char *t; + memset((void*)&T, 0, sizeof(T)); + zone[sizeof(zone)-1] = '\0'; + if (strchr(s, '-')) + t = "%d-%d-%dT%d:%d:%d%15s"; + else if (strchr(s, ':')) + t = "%4d%2d%2dT%d:%d:%d%15s"; + else /* parse non-XSD-standard alternative ISO 8601 format */ + t = "%4d%2d%2dT%2d%2d%2d%15s"; + sscanf(s, t, &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 == '+' || *s == '-') + { int h = 0, m = 0; + if (s[3] == ':') + { sscanf(s, "%d:%d", &h, &m); + if (h < 0) + m = -m; + } + else + { m = (int)atol(s); + h = m / 100; + m = m % 100; + } + T.tm_hour -= h; + 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 (*soap->href) + p = (time_t*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(time_t), 0, NULL); + else if (p) + { if (soap_s2dateTime(soap, soap_value(soap), p)) + return 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 (soap->local_namespaces && (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, "", 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)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) + return NULL; + if (soap->null) + *p = NULL; + else + *p = soap_string_in(soap, 0, -1, -1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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 (soap->local_namespaces && (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, "", t); + return soap_send(soap, soap->tmpbuf); + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) + return NULL; + if (soap->null) + *p = NULL; + else + *p = soap_wstring_in(soap, 0, -1, -1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_token(struct soap *soap) +{ register size_t i; + register soap_wchar c = 0; + register char *s = soap->tmpbuf; + if (!soap->body) + return SOAP_STR_EOS; + do c = soap_get(soap); + while (soap_blank(c)); + for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) + { if (c == SOAP_TT || (int)c == EOF || soap_blank(c)) + break; + *s++ = (char)c; + c = soap_get(soap); + } + if ((int)c == EOF || c == SOAP_TT) + soap_unget(soap, c); + *s = '\0'; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); + return soap->tmpbuf; /* return non-null pointer */ +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_value(struct soap *soap) +{ register size_t i; + register soap_wchar c = 0; + register char *s = soap->tmpbuf; + if (!soap->body) + return SOAP_STR_EOS; + do c = soap_get(soap); + while (soap_blank(c)); + for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) + { if (c == SOAP_TT || (int)c == EOF) + break; + *s++ = (char)c; + c = soap_get(soap); + } + for (s--; i > 0; i--, s--) + if (!soap_blank(*s)) + break; + s[1] = '\0'; + if ((int)c == EOF || c == SOAP_TT) + soap_unget(soap, c); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->data = soap_strdup(soap, soap->tmpbuf); +#endif + return soap->tmpbuf; /* return non-null pointer */ +} +#endif + +/******************************************************************************/ +#if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) +#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' || c == '\n') + break; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + *s++ = (char)c; + } + if (c != '\n') + c = soap_getchar(soap); /* got \r, now get \n */ + if (c == '\n') + { *s = '\0'; + if (i+1 == len) /* empty line: end of HTTP/MIME 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 +#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; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); + if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + { 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 content is %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); + /* count Content-Transfer-Encoding: ...\r\n */ + s = soap_str_code(mime_codes, content->encoding); + 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 content is %lu bytes\n", (unsigned long)content->size)); + } + /* count \r\n--boundary-- */ + count += 6 + n; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count is %lu bytes\n", (unsigned long)count)); + 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) +{ while (soap->dime.flags & SOAP_DIME_CF) + { if (soap_getdimehdr(soap)) + return soap->error; + if (soap_move(soap, soap->dime.size)) + return soap->error = SOAP_EOF; + } + if (soap_move(soap, ((soap->dime.size+3)&(~3))-soap_tell(soap))) + return soap->error = SOAP_EOF; + for (;;) + { register struct soap_multipart *content; + if (soap_getdimehdr(soap)) + break; + 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; + soap_resolve_attachment(soap, content); + if (soap->error) + return soap->error; + } + if (soap->error != SOAP_DIME_END) + return soap->error; + return soap->error = SOAP_OK; +} +#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-Disposition")) + content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); + 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 = 0; + if (!soap->mime.last) + return SOAP_OK; + for (;;) + { register size_t i, m = 0; + register char *s, *t = NULL; + 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 short flag = 0; + if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN))) + return soap->error = SOAP_EOM; + for (i = 0; i < SOAP_BLKLEN; i++) + { if (m > 0) + { flag = (*t == '\r'); + *s++ = *t++; + m--; + } + else + { if (!flag) + { c = soap_get1(soap); + if ((int)c == EOF) + return soap->error = SOAP_EOF; + } + if (flag || c == '\r') + { t = soap->tmpbuf; + memset(t, 0, sizeof(soap->tmpbuf)); + strcpy(t, "\n--"); + if (soap->mime.boundary) + strncat(t, soap->mime.boundary, sizeof(soap->tmpbuf)-4); + 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); + soap_resolve_attachment(soap, content); + 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' && c != '\n'); + if ((int)c != '\r' || soap_getchar(soap) != '\n') + return soap->error = SOAP_MIME_ERROR; + */ + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static int +soap_match_cid(const char *s, const char *t) +{ register size_t n; + if (!s) + return 1; + if (!strcmp(s, t)) + return 0; + if (!strncmp(s, "cid:", 4)) + s += 4; + n = strlen(t); + if (*t == '<') + { t++; + n -= 2; + } + if (!strncmp(s, t, n) && !s[n]) + return 0; + return 1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static void +soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) +{ if (content->id) + { register struct soap_xlist **xp = &soap->xlist; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id=%s\n", content->id)); + while (*xp) + { register struct soap_xlist *xq = *xp; + if (!soap_match_cid(xq->id, content->id)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment %s for content id=%s\n", xq->id, content->id)); + *xp = xq->next; + *xq->ptr = (unsigned char*)content->ptr; + *xq->size = (int)content->size; + *xq->type = (char*)content->type; + if (content->options) + *xq->options = (char*)content->options; + else + *xq->options = (char*)content->description; + SOAP_FREE(soap, xq); + } + else + xp = &(*xp)->next; + } + } +} +#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, "--"); +} +#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 + 1); + if (!s) + return; + } + strcpy(s, "<>"); + s += 2; + n -= 4; + while (n) + { *s++ = soap_base64o[soap_random & 0x3F]; + n--; + } + strcpy(s, "<>"); + } + if (!soap->mime.start) + soap->mime.start = ""; +} +#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 && !strchr("()<>@,;:\\\"/[]?={}", 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(soap, sizeof(struct soap_cookie)))) + { if ((q->name = (char*)SOAP_MALLOC(soap, 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->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(soap, q->name); + SOAP_FREE(soap, q); + q = NULL; + } + } + } + else + q->modified = 1; + if (q) + { if (q->value) + { SOAP_FREE(soap, q->value); + q->value = NULL; + } + if (q->domain) + { SOAP_FREE(soap, q->domain); + q->domain = NULL; + } + if (q->path) + { SOAP_FREE(soap, q->path); + q->path = NULL; + } + if (value && *value && (q->value = (char*)SOAP_MALLOC(soap, strlen(value)+1))) + strcpy(q->value, value); + if (domain && *domain && (q->domain = (char*)SOAP_MALLOC(soap, strlen(domain)+1))) + strcpy(q->domain, domain); + if (path && *path && (q->path = (char*)SOAP_MALLOC(soap, strlen(path)+1))) + strcpy(q->path, path); + q->session = 1; + q->env = 0; + } + 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", NULL, SOAP_HTTP_ERROR); + return; + } + if (!path) + path = soap->cookie_path; + if (!path) + { soap_set_receiver_error(soap, "Cookie path not set", NULL, 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(soap, q->value); + if (q->domain) + SOAP_FREE(soap, q->domain); + if (q->path) + SOAP_FREE(soap, q->path); + *p = q->next; + SOAP_FREE(soap, 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 +char * +SOAP_FMAC2 +soap_env_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)) && p->env) + 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); + *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->error = 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; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain=%s path=%s\n", domain, path)); + if (*path == '/') + path++; + while ((q = *p)) + { if (q->expire && now > q->expire) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); + SOAP_FREE(soap, q->name); + if (q->value) + SOAP_FREE(soap, q->value); + if (q->domain) + SOAP_FREE(soap, q->domain); + if (q->path) + SOAP_FREE(soap, q->path); + *p = q->next; + SOAP_FREE(soap, q); + } + else + { size_t domlen = 0; + if (q->domain) + { const char *s = strchr(q->domain, ':'); + if (s) + domlen = s - q->domain; + else + domlen = strlen(q->domain); + } + if ((!q->domain || !strncmp(q->domain, domain, domlen)) + && (!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 == '/' ? q->path + 1 : 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->error = soap->fposthdr(soap, "Cookie", tmp))) + return soap->error; + } + 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(soap, strlen(tmp)+1))) + strcpy(t, tmp); + } + else + t = NULL; + if (p) + { if (p->path) + SOAP_FREE(soap, p->path); + p->path = t; + } + else + { if (path) + SOAP_FREE(soap, 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(soap, strlen(tmp)+1))) + strcpy(t, tmp); + } + else + t = NULL; + if (p) + { if (p->domain) + SOAP_FREE(soap, p->domain); + p->domain = t; + } + else + { if (domain) + SOAP_FREE(soap, domain); + domain = t; + } + } + else if (p && !soap_tag_cmp(tmp, "Path")) + { if (p->path) + SOAP_FREE(soap, p->path); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((p->path = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) + strcpy(p->path, tmp); + } + else + p->path = NULL; + } + else if (p && !soap_tag_cmp(tmp, "Domain")) + { if (p->domain) + SOAP_FREE(soap, p->domain); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((p->domain = (char*)SOAP_MALLOC(soap, 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(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, p); + } + if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) + { p->name = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); + strcpy(p->name, tmp); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { p->value = (char*)SOAP_MALLOC(soap, 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 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(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, p); + } + if (domain) + SOAP_FREE(soap, domain); + if (path) + SOAP_FREE(soap, 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(soap, sizeof(struct soap_cookie)))) + return r; + **q = *p; + if (p->name) + { if (((*q)->name = (char*)SOAP_MALLOC(soap, strlen(p->name)+1))) + strcpy((*q)->name, p->name); + } + if (p->value) + { if (((*q)->value = (char*)SOAP_MALLOC(soap, strlen(p->value)+1))) + strcpy((*q)->value, p->value); + } + if (p->domain) + { if (((*q)->domain = (char*)SOAP_MALLOC(soap, strlen(p->domain)+1))) + strcpy((*q)->domain, p->domain); + } + if (p->path) + { if (((*q)->path = (char*)SOAP_MALLOC(soap, 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(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, 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 */ +#ifndef WITH_NOIDREF + soap_free_iht(soap); +#endif + 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->action = NULL; +#ifndef WITH_LEANER + soap->dom = 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; + soap->xlist = NULL; +#endif +#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 +#ifndef WITH_LEANER + 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 +#ifndef WITH_LEANER + 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 +#endif + { while (soap_blank(c)) + c = soap_getchar(soap); + } + if ((int)c == EOF) + return soap->error = SOAP_EOF; + soap_unget(soap, c); +#ifndef WITH_NOHTTP + /* if not XML or (start of)BOM or MIME/DIME/ZLIB, assume HTTP header */ + if (c != '<' && c != 0xEF && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB))) + { soap->mode &= ~SOAP_IO; + soap->error = soap->fparse(soap); + if (soap->error && soap->error < SOAP_STOP) + { 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; + } +#ifndef WITH_LEANER + else if (soap->fpreparerecv && soap->buflen != soap->bufidx) + soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); +#endif +#ifdef WITH_ZLIB + if (soap->zlib_in != SOAP_ZLIB_NONE) + { /* 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 + if (soap->error) + { if (soap->error == SOAP_FORM && soap->fform) + { soap->error = soap->fform(soap); + if (soap->error == SOAP_OK) + soap->error = SOAP_STOP; /* prevents further processing */ + } + return soap->error; + } + } +#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 WITH_NOHTTP +#ifndef PALM_1 +static int +http_parse(struct soap *soap) +{ char header[SOAP_HDRLEN], *s; + unsigned short get = 0, status = 0, k = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); + *soap->endpoint = '\0'; + soap->length = 0; + soap->userid = NULL; + soap->passwd = NULL; + soap->action = NULL; + soap->authrealm = NULL; + 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)) + { if (soap->error == SOAP_EOF) + { soap->error = SOAP_OK; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); + break; + } + 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))) + { if (soap->error < SOAP_STOP) + return soap->error; + status = soap->error; + soap->error = SOAP_OK; + } + } + } + if ((s = strchr(soap->msgbuf, ' '))) + { k = (unsigned short)soap_strtoul(s, &s, 10); + if (!soap_blank(*s)) + k = 0; + } + 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 && (((get = !strncmp(soap->msgbuf, "GET ", 4))) || !strncmp(soap->msgbuf, "POST ", 5))) + { size_t m = strlen(soap->endpoint); + size_t n = m + (s - soap->msgbuf) - 5 - (!get); + if (n >= sizeof(soap->endpoint)) + n = sizeof(soap->endpoint) - 1; + strncpy(soap->path, soap->msgbuf + 4 + (!get), n - m); + soap->path[n - m] = '\0'; + strcat(soap->endpoint, soap->path); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint)); + if (get) + { soap->error = soap->fget(soap); + if (soap->error == SOAP_OK) + soap->error = SOAP_STOP; /* prevents further processing */ + return soap->error; + } + if (status) + return soap->error = status; + return SOAP_OK; + } + if (k == 0 || (k >= 200 && k <= 299) || k == 400 || k == 500) + return SOAP_OK; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP error %d\n", k)); + return soap_set_receiver_error(soap, "HTTP error", soap->msgbuf, k); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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_get_header_attribute(soap, val, "multipart/form-data")) + { 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 *")) + { int 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 == '"') + { 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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#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) && !(soap->mode & SOAP_ENC_MTOM)) + 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->mode & SOAP_ENC_MTOM)) + { 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) && !(soap->mode & SOAP_ENC_MTOM)) + 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(soap, p[1].out); + if ((p[1].out = (char*)SOAP_MALLOC(soap, 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(soap, p[1].out); + if ((p[1].out = (char*)SOAP_MALLOC(soap, 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) +{ soap->part = SOAP_END_ENVELOPE; + return soap_element_end_in(soap, "SOAP-ENV:Envelope"); +} +#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; +#ifndef WITH_LEAN + if ((soap->mode & SOAP_XML_SEC) && soap_set_attr(soap, "wsu:Id", "Body")) + return soap->error; +#endif + if (soap_element(soap, "SOAP-ENV:Body", 0, NULL)) + 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_END_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; + if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0)) + return soap->error; + if (!soap->body) + soap->part = SOAP_NO_BODY; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_body_end_in(struct soap *soap) +{ if (soap->part == SOAP_NO_BODY) + return SOAP_OK; + soap->part = SOAP_END_BODY; + return soap_element_end_in(soap, "SOAP-ENV:Body"); +} +#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] = '\0'; + soap->host[0] = '\0'; + soap->path[0] = '/'; + soap->path[1] = '\0'; + soap->port = 80; + if (!endpoint || !*endpoint) + return; + if (!strncmp(endpoint, "https:", 6)) + soap->port = 443; + 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; +#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 + for (i = 0; i < n; i++) + { soap->host[i] = s[i]; + if (s[i] == '/' || s[i] == ':') + break; + } +#endif + 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, 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); +#ifndef WITH_LEANER + if (soap->fconnect) + { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) + return soap->error; + } + else +#endif + if (soap->fopen && *soap->host) + { soap->status = http_command; + if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) + { soap->keep_alive = 0; /* to force close */ + soap->omode &= ~SOAP_IO_UDP; /* to force close */ + soap_closesock(soap); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port)); +#ifdef WITH_UDP + if (!strncmp(endpoint, "soap.udp:", 9)) + soap->omode |= SOAP_IO_UDP; +#endif + 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); + } + } + count = soap_count_attachments(soap); + if (soap_begin_send(soap)) + return soap->error; +#ifndef WITH_NOHTTP + 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; +#ifndef WITH_LEANER + if ((k & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = k; + } + else if (action) + soap->action = soap_strdup(soap, action); + if (http_command != SOAP_POST) + return soap_end_send(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) +{ register int 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, int *n) +{ register int i, j, c; + register unsigned long m; + register const char *p; + if (!s || !*s) + { if (n) + *n = 0; + if (soap->error) + return NULL; + return SOAP_NON_NULL; + } + if (!t) + { l = (strlen(s) + 3) / 4 * 3; + t = (char*)soap_malloc(soap, l); + } + if (!t) + { soap->error = SOAP_EOM; + return NULL; + } + 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 WITH_LEAN +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) +{ register char *p; + if (!t) + t = (char*)soap_malloc(soap, 2 * n + 1); + if (!t) + { soap->error = SOAP_EOM; + return NULL; + } + p = t; + t[0] = '\0'; + if (s) + { for (; n > 0; n--) + { register int m = *s++; + *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); + m &= 0x0F; + *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); + } + } + *t++ = '\0'; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) +{ register const char *p; + if (!s || !*s) + { if (n) + *n = 0; + if (soap->error) + return NULL; + return SOAP_NON_NULL; + } + if (!t) + { l = strlen(s) / 2; + t = (char*)soap_malloc(soap, l); + } + if (!t) + { soap->error = SOAP_EOM; + return NULL; + } + p = t; + while (l) + { register int d1, d2; + d1 = *s++; + if (!d1) + break; + d2 = *s++; + if (!d2) + break; + *t++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); + l--; + } + if (n) + *n = t - p; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_puthttphdr(struct soap *soap, int status, size_t count) +{ register const char *s; +#ifndef WITH_LEANER + register const char *r = NULL; +#endif + register int err; + if (status == SOAP_FILE && soap->http_content) + s = soap->http_content; + else if (status == SOAP_HTML) + s = "text/html; charset=utf-8"; + 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_DIME | SOAP_ENC_MTOM)) + { if (soap->mode & SOAP_ENC_MTOM) + { r = s; + s = "application/xop+xml; charset=utf-8"; + } + else + s = "application/dime"; + } + if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->status != SOAP_GET) + { register const char *t = strchr(s, ';'); + sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=\"", soap->mime.boundary); + if (t) + strncat(soap->tmpbuf, s, t - s); + else + strcat(soap->tmpbuf, s); + if (soap->mime.start) + { strcat(soap->tmpbuf, "\"; start=\""); + strcat(soap->tmpbuf, soap->mime.start); + } + strcat(soap->tmpbuf, "\""); + if (r) + { strcat(soap->tmpbuf, "; start-info=\""); + strcat(soap->tmpbuf, r); + strcat(soap->tmpbuf, "\""); + } + 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 +#ifndef WITH_LEANER + if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) + err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); + else +#endif + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_get(struct soap *soap) +{ return SOAP_GET_METHOD; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 == '/' ? path + 1 : 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_response(struct soap *soap, int status, size_t count) +{ register int err; +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + httpOutputEnable(soap->rpmreqid); +#endif /* WMW_RPM_IO */ + if (!status || status == SOAP_HTML || status == SOAP_FILE) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "OK 200\n")); +#ifdef WMW_RPM_IO + if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ +#else + if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ +#endif /* WMW_RPM_IO */ + { 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; +#ifndef WITH_LEAN + 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; + } +#endif + } + 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)); +#ifdef WMW_RPM_IO + if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ +#else + if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ +#endif /* WMW_RPM_IO */ + { 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 +#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; +#ifndef WITH_NOHTTP + 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; +#ifndef WITH_LEANER + if ((n & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = n; + } +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static const char* +soap_set_validation_fault(struct soap *soap, const char *s, const char *t) +{ if (*soap->tag) + sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element <%s>", s, t?t:SOAP_STR_EOS, soap->tag); + else + sprintf(soap->msgbuf, "Validation constraint violation: %s%s", s, t?t:SOAP_STR_EOS); + 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 && !*s && soap->fseterror) + soap->fseterror(soap, c, s); + 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_TYPE: + *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type); + break; + case SOAP_SYNTAX_ERROR: + *s = "Well-formedness violation"; + break; + case SOAP_NO_TAG: + *s = "No XML element tag"; + 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_USER_ERROR: + *s = "User error"; + 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_DUPLICATE_ID: + *s = soap_set_validation_fault(soap, "multiple definitions of id ", soap->id); + if (soap->version == 2) + *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; + break; + case SOAP_MISSING_ID: + *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); + if (soap->version == 2) + *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; + break; + case SOAP_HREF: + *s = soap_set_validation_fault(soap, "incompatible object ref ", soap->id); + break; + case SOAP_FAULT: + break; +#ifndef WITH_NOIO + case SOAP_UDP_ERROR: + *s = "Message too large for UDP packet"; + break; + case SOAP_TCP_ERROR: + *s = tcp_error(soap); + break; +#endif + case SOAP_HTTP_ERROR: + *s = "HTTP error"; + break; + case SOAP_SSL_ERROR: +#ifdef WITH_OPENSSL + *s = "SSL error"; +#else + *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; +#endif + break; + case SOAP_PLUGIN_ERROR: + *s = "Plugin registry error"; + break; + case SOAP_DIME_ERROR: + *s = "DIME format error"; + break; + case SOAP_DIME_HREF: + *s = "DIME href to missing attachment"; + break; + case SOAP_DIME_MISMATCH: + *s = "DIME version/transmission error"; + break; + case SOAP_DIME_END: + *s = "End of DIME error"; + break; + case SOAP_MIME_ERROR: + *s = "MIME format error"; + break; + case SOAP_MIME_HREF: + *s = "MIME href to missing attachment"; + break; + case SOAP_MIME_END: + *s = "End of MIME 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/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; +#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, "min/maxOccurs violation", NULL); + break; + case SOAP_LENGTH: + *s = soap_set_validation_fault(soap, "content length violation", NULL); + break; + case SOAP_STOP: + *s = "Stopped: no response sent"; + break; +#endif + case SOAP_EOF: +#ifndef WITH_NOIO + sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap)); + *s = soap->msgbuf; + break; +#else + *s = "End of file or no input"; + break; +#endif + default: +#ifndef WITH_NOHTTP +#ifndef WITH_LEAN + if (soap->error > 200 && soap->error < 600) + { sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error)); + *s = soap->msgbuf; + } + else +#endif +#endif + { sprintf(soap->msgbuf, "Error %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; + int r = 1; + 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); +#ifndef WITH_NOIO +#ifndef WITH_LEAN + if (soap_valid_socket(soap->socket)) + { struct timeval timeout; + fd_set rfd, sfd; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&rfd); + FD_ZERO(&sfd); + FD_SET((SOAP_SOCKET)soap->socket, &rfd); + FD_SET((SOAP_SOCKET)soap->socket, &sfd); + r = select((SOAP_SOCKET)(soap->socket + 1), &rfd, &sfd, NULL, &timeout); + if (r > 0) + { if (!FD_ISSET((SOAP_SOCKET)soap->socket, &sfd) + || (FD_ISSET((SOAP_SOCKET)soap->socket, &rfd) + && recv((SOAP_SOCKET)soap->socket, soap->tmpbuf, 1, MSG_PEEK) < 0)) + r = 0; + } + } +#endif +#endif + if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && r > 0) + { 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); + } + soap_end_count(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 WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send_empty_response(struct soap *soap) +{ soap->count = 0; + if (soap_response(soap, SOAP_OK) || soap_end_send(soap)) + return soap_closesock(soap); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv_empty_response(struct soap *soap) +{ if (soap_begin_recv(soap) || soap_end_recv(soap)) + return soap_closesock(soap); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static const char* +soap_strerror(struct soap *soap) +{ register int err = soap->errnum; + if (err) + { +#ifndef WIN32 + return strerror(err); +#else + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)&soap->errorstr, sizeof(soap->errorstr), NULL); + return soap->errorstr; +#endif + } + return "Operation interrupted or timed out"; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +static int +soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcode, const char *faultstring, const char *faultdetail, int soaperror) +{ *soap_faultcode(soap) = faultcode; + if (faultsubcode) + *soap_faultsubcode(soap) = faultsubcode; + *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", NULL, 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", NULL, faultstring, faultdetail, soaperror); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +static int +soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcode, const char *faultstring, const char *faultdetail) +{ char *r = NULL, *s = NULL, *t = NULL; + if (faultsubcode) + r = soap_strdup(soap, faultsubcode); + if (faultstring) + s = soap_strdup(soap, faultstring); + if (faultdetail) + t = soap_strdup(soap, faultdetail); + return soap_set_error(soap, faultcode, r, 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_sender_fault_subcode(soap, NULL, faultstring, faultdetail); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) +{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultsubcode, 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_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) +{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultsubcode, faultstring, faultdetail); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_print_fault(struct soap *soap, FILE *fd) +{ if (soap->error) + { const char *c, *v = NULL, *s, **d; + d = soap_faultcode(soap); + if (!*d) + soap_set_fault(soap); + c = *d; + if (soap->version == 2) + v = *soap_faultsubcode(soap); + s = *soap_faultstring(soap); + d = soap_faultdetail(soap); + fprintf(fd, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, c, v ? v : "no subcode", s ? s : "[no reason]", d && *d ? *d : "[no detail]"); + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_print_fault_location(struct soap *soap, FILE *fd) +{ +#ifndef WITH_LEAN + int i, j, c1, c2; + if (soap->error && soap->buflen > 0) + { i = (int)soap->bufidx - 1; + if (i <= 0) + i = 0; + c1 = soap->buf[i]; + soap->buf[i] = '\0'; + if ((int)soap->buflen >= i + 1024) + j = i + 1023; + else + j = (int)soap->buflen - 1; + c2 = soap->buf[j]; + soap->buf[j] = '\0'; + fprintf(fd, "%s%c\n** HERE **\n", soap->buf, c1); + if (soap->bufidx < soap->buflen) + fprintf(fd, "%s\n", soap->buf + soap->bufidx); + soap->buf[i] = c1; + soap->buf[j] = c2; + } +#endif +} +#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(soap, 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(soap, p); + return r; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static void * +fplugin(struct soap *soap, const char *id) +{ register struct soap_plugin *p; + for (p = soap->plugins; p; p = p->next) + if (p->id == id || !strcmp(p->id, id)) + return p->data; + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void * +SOAP_FMAC2 +soap_lookup_plugin(struct soap *soap, const char *id) +{ return soap->fplugin(soap, id); +} +#endif + +/******************************************************************************/ +#ifdef __cplusplus +} +#endif + diff --git a/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.h b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.h new file mode 100644 index 0000000..17ef597 --- /dev/null +++ b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.6b.h @@ -0,0 +1,2053 @@ +/* + +stdsoap2.h 2.7.6b + +gSOAP runtime + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +Contributors: + +Wind River Systems, Inc., for the following additions (marked WR[...]): + - vxWorks compatible +-------------------------------------------------------------------------------- +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-2005, 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 +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#ifdef WITH_SOAPDEFS_H +# include "soapdefs.h" /* include user-defined stuff */ +#endif + +#ifndef _THREAD_SAFE +# define _THREAD_SAFE +#endif + +#ifndef OPENSERVER +# ifndef _REENTRANT +# define _REENTRANT +# endif +#endif + +#ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC1 +#endif + +#ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC2 +#endif + +#ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ +# define SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC3S SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ +# define SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC4S SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ +# define SOAP_FMAC5 +#endif + +#ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ +# define SOAP_FMAC6 +#endif + +#ifndef SOAP_CMAC /* class declaration macro */ +# define SOAP_CMAC +#endif + +#ifndef SOAP_NMAC /* namespace table declaration macro */ +# define SOAP_NMAC +#endif + +#ifndef SOAP_SOURCE_STAMP +# define SOAP_SOURCE_STAMP(str) +#endif + +/* gSOAP 2.7.4 and higher: fast look-aside buffering is stable */ +#ifndef WITH_FAST +# define WITH_FAST +#endif + +#ifdef WITH_LEANER +# ifndef WITH_LEAN +# define WITH_LEAN +# endif +#endif + +#ifdef WITH_LEAN +# ifdef WITH_COOKIES +# error "Cannot build WITH_LEAN code WITH_COOKIES enabled" +# endif +#endif + +#ifndef STDSOAP_H +#define STDSOAP_H + +#if defined(__vxworks) || defined(__VXWORKS__) +# define VXWORKS +#endif + +#ifdef _WIN32 +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef UNDER_CE +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef __BORLANDC__ +# ifdef __WIN32__ +# ifndef WIN32 +# define WIN32 +# endif +# endif +#endif + +#ifdef __CYGWIN__ +# ifndef CYGWIN +# define CYGWIN +# endif +#endif + +#ifdef __SYMBIAN32__ +# define SYMBIAN +# undef WIN32 +#endif + +#if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) +# ifndef PALM +# define PALM +# endif +#endif + +#if defined(__hpux) +# ifndef HP_UX +# define HP_UX +# endif +#endif + +#if defined(__alpha) && !defined(__VMS) +# ifndef TRU64 +# define TRU64 +# endif +#endif + +#ifdef __MVS__ +# ifndef OS390 +# define OS390 +# endif +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +# ifdef WITH_OPENSSL +# ifndef HAVE_OPENSSL_SSL_H +# undef WITH_OPENSSL +# endif +# endif +#else +# if defined(UNDER_CE) +# define WITH_LEAN +# define HAVE_SSCANF +# elif defined(WIN32) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%I64d" +# define SOAP_ULONG_FORMAT "%I64u" +# elif defined(CYGWIN) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__APPLE__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(_AIXVERSION_431) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(HP_UX) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(FREEBSD) || defined(__FreeBSD__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_STRTOLL +# define HAVE_STRTOULL +# define HAVE_GETTIMEOFDAY +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%qd" +# define SOAP_ULONG_FORMAT "%qu" +# elif defined(__VMS) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__GLIBC__) || defined(__GNU__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_STRTOLL +# define HAVE_STRTOULL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define HAVE_ISNAN +# elif defined(TRU64) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_STRTOLL +# define HAVE_STRTOULL +# define HAVE_GETTIMEOFDAY +# define HAVE_SYS_TIMEB_H +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define __USE_STD_IOSTREAM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%ld" +# define SOAP_ULONG_FORMAT "%lu" +# elif defined(MAC_CARBON) +# define WITH_NOIO +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(PALM) +# define WITH_LEAN +# define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ +# include /* Needs to be included before unix headers */ +# include +# define IGNORE_STDIO_STUBS +# include +# define O_NONBLOCK FNONBIO +# include +# include "palmFunctions.h" +# elif defined(SYMBIAN) +# define WITH_LEAN +# define WITH_NONAMESPACES +# define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ +# include +# include +# elif defined(VXWORKS) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_PGMTIME_R +# define HAVE_PLOCALTIME_R +# define HAVE_MKTIME +# elif defined(OS390) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MB +# else +/* Default asumptions on supported functions */ +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# endif +#endif + +/* QNX does not have a working version of strtof */ +#if defined(__QNX__) || defined(QNX) +# undef HAVE_STRTOF +#endif + +#ifndef SOAP_LONG_FORMAT +# define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ +#endif + +#ifndef SOAP_ULONG_FORMAT +# define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ +#endif + +#ifndef WITH_NOSTDLIB +# include +# ifndef PALM +# include +# include +# endif +# include +# include +#endif + +#if defined(__cplusplus) && !defined(WITH_LEAN) +# include +# include +#endif + +#ifdef WITH_NOHTTP +# ifndef WITH_NOIO +# define WITH_NOIO +# undef WITH_COOKIES +# endif +#endif + +#ifndef UNDER_CE +# ifndef PALM +# ifndef WITH_NOIO +# include +# include +# endif +# ifndef WITH_LEAN +# ifdef HAVE_SYS_TIMEB_H +# include /* for ftime() */ +# endif +# include +# endif +# endif +#endif + +#ifdef OPENSERVER +# include +# include +# include + extern int h_errno; +#endif + +#ifndef WITH_NOIO +# ifndef WIN32 +# ifndef PALM +# include +# ifdef VXWORKS +# include +# include +# endif +# ifndef VXWORKS +# ifndef SYMBIAN +# include +# endif +# endif +# ifdef SUN_OS +# include /* SUN */ +# include /* SUN < 2.8 (?) */ +# endif +# ifdef VXWORKS +# ifdef _WRS_KERNEL +# include +# endif +# else +# include +# endif +# include +# ifdef OS390 +# include +# else +# include /* TCP_NODELAY */ +# endif +# include +# endif +# endif +#endif + +#ifdef WITH_FASTCGI +# include +#endif + +#ifdef WITH_OPENSSL +# define OPENSSL_NO_KRB5 +# include +# include +# include +# ifndef ALLOW_OLD_VERSIONS +# if (OPENSSL_VERSION_NUMBER < 0x00905100L) +# error "Must use OpenSSL 0.9.6 or later" +# endif +# endif +#endif + +#ifdef WITH_GZIP +# ifndef WITH_ZLIB +# define WITH_ZLIB +# endif +#endif + +#ifdef WITH_CASEINSENSITIVETAGS +# define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ +#else +# define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ +#endif + +#ifdef WITH_ZLIB +# include +#endif + +#ifndef WITH_NOSTDLIB +# ifndef PALM +# include /* for isnan() */ +# endif +#endif + +/* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WIN32 +# ifndef UNDER_CE +# include +# include +# endif +# include +/* # include */ /* Alternative: use winsock2 (not available with eVC) */ +# ifdef WITH_IPV6 +# include +# include +# endif +#else +# ifdef VXWORKS +# include +# include +# include +# endif +# ifndef WITH_NOIO +# ifndef PALM +# include +# include +# include +# include +# endif +# endif +#endif + +/* Portability: define SOAP_SOCKLEN_T */ +#if defined(SOCKLEN_T) +# define SOAP_SOCKLEN_T SOCKLEN_T +#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX) || defined(_AIX) +# define SOAP_SOCKLEN_T socklen_t +#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) +# define SOAP_SOCKLEN_T int +#else +# define SOAP_SOCKLEN_T size_t +#endif + +#ifdef WIN32 +# define SOAP_SOCKET SOCKET +#else +# define SOAP_SOCKET int +# define closesocket(n) close(n) +#endif + +#define SOAP_INVALID_SOCKET (-1) +#define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) + +#if defined(SYMBIAN) +# define LONG64 long +# define ULONG64 unsigned LONG64 +#elif !defined(WIN32) || defined(__GLIBC__) || defined(__GNU__) +# ifndef LONG64 +# define LONG64 long long +# define ULONG64 unsigned LONG64 +# endif +#elif defined(UNDER_CE) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#elif defined(__BORLANDC__) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#endif + +#if defined(WIN32) +# define soap_int32 __int32 +#elif defined(SYMBIAN) +# define soap_int32 long +#elif defined(PALM) +# define soap_int32 Int32 +#else +# define soap_int32 int32_t +#endif + +#ifdef WIN32 +# define SOAP_ERANGE ERANGE +# define SOAP_EINTR WSAEINTR +# define SOAP_EAGAIN WSAEWOULDBLOCK +# define SOAP_EWOULDBLOCK WSAEWOULDBLOCK +# define SOAP_EINPROGRESS WSAEINPROGRESS +#else +# define SOAP_ERANGE ERANGE +# define SOAP_EINTR EINTR +# define SOAP_EAGAIN EAGAIN +# ifdef SYMBIAN +# define SOAP_EWOULDBLOCK 9898 +# define SOAP_EINPROGRESS 9899 +# else +# define SOAP_EWOULDBLOCK EWOULDBLOCK +# define SOAP_EINPROGRESS EINPROGRESS +# endif +#endif + +#ifdef WIN32 +# ifdef UNDER_CE +# define soap_errno GetLastError() +# define soap_socket_errno GetLastError() +# else +# define soap_errno GetLastError() +# define soap_socket_errno WSAGetLastError() +# endif +#else +# ifndef WITH_NOIO +# define soap_errno errno +# define soap_socket_errno errno +# else +# define soap_errno 0 +# define soap_socket_errno 0 +# endif +#endif + +#ifndef SOAP_BUFLEN +# ifdef WITH_UDP +# define SOAP_BUFLEN (65536) /* max UDP packet size */ +# else +# ifndef WITH_LEAN +# define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r so don't make this too small */ +# else +# define SOAP_BUFLEN (2048) +# endif +# endif +#endif +#ifndef SOAP_LABLEN +# define SOAP_LABLEN (64) /* initial look-aside buffer length */ +#endif +#ifndef SOAP_PTRBLK +# define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ +#endif +#ifndef SOAP_PTRHASH +# ifndef WITH_LEAN +# define SOAP_PTRHASH (1024) /* size of pointer analysis hash table (must be power of 2) */ +# else +# define SOAP_PTRHASH (32) +# endif +#endif +#ifndef SOAP_IDHASH +# ifndef WITH_LEAN +# define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ +# else +# define SOAP_IDHASH (19) /* 19, 199 */ +# endif +#endif +#ifndef SOAP_BLKLEN +# ifndef WITH_LEAN +# define SOAP_BLKLEN (256) /* size of blocks to collect long strings and XML attributes */ +# else +# define SOAP_BLKLEN (32) +# endif +#endif +#ifndef SOAP_TAGLEN +# ifndef WITH_LEAN +# define SOAP_TAGLEN (256) /* maximum length of XML element tag/attribute name or host/path name + 1 */ +# else +# define SOAP_TAGLEN (64) +# endif +#endif +#ifndef SOAP_HDRLEN +# ifndef WITH_LEAN +# define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ +# else +# define SOAP_HDRLEN (1024) +# endif +#endif +#ifndef SOAP_MAXDIMS +# ifndef WITH_LEAN +# define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ +# else +# define SOAP_MAXDIMS (4) +# endif +#endif + +#ifndef SOAP_MAXLOGS +# define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ +# define SOAP_INDEX_RECV (0) +# define SOAP_INDEX_SENT (1) +# define SOAP_INDEX_TEST (2) +#endif + +#ifndef SOAP_MAXKEEPALIVE +# define SOAP_MAXKEEPALIVE (100) /* max iterations to keep server connection alive */ +#endif + +#ifndef SOAP_MAXARRAYSIZE +# define SOAP_MAXARRAYSIZE (100000) /* "trusted" max size of inbound SOAP array for compound array allocation */ +#endif + +#ifdef VXWORKS +# ifdef __INCmathh +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) isNan(num) +# endif +#endif + +#ifdef WIN32 +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) _isnan(num) +#endif + +#ifdef SUN_OS +# define soap_isnan(n) isnan(n) +#endif + +#if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) +# define HAVE_ISNAN +#endif + +#ifndef soap_isnan +# ifdef HAVE_ISNAN +# define soap_isnan(n) isnan(n) +# else +# define soap_isnan(_) (0) +# endif +#endif + +extern const struct soap_double_nan { unsigned int n1, n2; } soap_double_nan; + +#ifdef VXWORKS +# ifndef FLT_MAX +# define FLT_MAX _ARCH_FLT_MAX +# endif +# ifndef DBL_MAX +# define DBL_MAX _ARCH_DBL_MAX +# endif +#endif + +#ifndef FLT_NAN +# ifdef HAVE_ISNAN +# define FLT_NAN (*(float*)(void*)&soap_double_nan) +# else +# define FLT_NAN (0.0) +# endif +#endif + +#ifndef FLT_PINFTY +# if defined(FLT_MAX) +# define FLT_PINFTY FLT_MAX +# elif defined(HUGE_VALF) +# define FLT_PINFTY (float)HUGE_VALF +# elif defined(HUGE_VAL) +# define FLT_PINFTY (float)HUGE_VAL +# elif defined(FLOAT_MAX) +# define FLT_PINFTY FLOAT_MAX +# else +# define FLT_PINFTY (3.40282347e+38F) +# endif +#endif + +#ifndef FLT_NINFTY +# define FLT_NINFTY (-FLT_PINFTY) +#endif + +#ifndef DBL_NAN +# ifdef HAVE_ISNAN +# define DBL_NAN (*(double*)(void*)&soap_double_nan) +# else +# define DBL_NAN (0.0) +# endif +#endif + +#ifndef DBL_PINFTY +# if defined(DBL_MAX) +# define DBL_PINFTY DBL_MAX +# elif defined(HUGE_VALF) +# define DBL_PINFTY (double)HUGE_VALF +# elif defined(HUGE_VAL) +# define DBL_PINFTY (double)HUGE_VAL +# elif defined(DOUBLE_MAX) +# define DBL_PINFTY DOUBLE_MAX +# else +# define DBL_PINFTY (1.7976931348623157e+308) +# endif +#endif + +#ifndef DBL_NINFTY +# define DBL_NINFTY (-DBL_PINFTY) +#endif + +#define soap_ispinfd(n) ((n) >= DBL_PINFTY) +#define soap_ispinff(n) ((n) >= FLT_PINFTY) +#define soap_isninfd(n) ((n) <= DBL_NINFTY) +#define soap_isninff(n) ((n) <= FLT_NINFTY) + +/* gSOAP error codes */ + +#define SOAP_EOF EOF +#define SOAP_ERR EOF +#define SOAP_OK 0 +#define SOAP_CLI_FAULT 1 +#define SOAP_SVR_FAULT 2 +#define SOAP_TAG_MISMATCH 3 +#define SOAP_TYPE 4 +#define SOAP_SYNTAX_ERROR 5 +#define SOAP_NO_TAG 6 +#define SOAP_IOB 7 +#define SOAP_MUSTUNDERSTAND 8 +#define SOAP_NAMESPACE 9 +#define SOAP_USER_ERROR 10 +#define SOAP_FATAL_ERROR 11 +#define SOAP_FAULT 12 +#define SOAP_NO_METHOD 13 +#define SOAP_GET_METHOD 14 +#define SOAP_EOM 15 +#define SOAP_NULL 16 +#define SOAP_DUPLICATE_ID 17 +#define SOAP_MISSING_ID 18 +#define SOAP_HREF 19 +#define SOAP_UDP_ERROR 20 +#define SOAP_TCP_ERROR 21 +#define SOAP_HTTP_ERROR 22 +#define SOAP_SSL_ERROR 23 +#define SOAP_ZLIB_ERROR 24 +#define SOAP_DIME_ERROR 25 +#define SOAP_DIME_HREF 26 +#define SOAP_DIME_MISMATCH 27 +#define SOAP_DIME_END 28 +#define SOAP_MIME_ERROR 29 +#define SOAP_MIME_HREF 30 +#define SOAP_MIME_END 31 +#define SOAP_VERSIONMISMATCH 32 +#define SOAP_PLUGIN_ERROR 33 +#define SOAP_DATAENCODINGUNKNOWN 34 +#define SOAP_REQUIRED 35 +#define SOAP_PROHIBITED 36 +#define SOAP_OCCURS 37 +#define SOAP_LENGTH 38 + +#define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_TAG_END || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF) +#define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) +#define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) +#define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) +#define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) +#define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_GET_METHOD || ((e) >= 100 && (e) < 600)) + +/* gSOAP HTTP response status codes 100 to 599 are reserved */ + +/* Codes 600 to 999 are user definable */ + +/* Exceptional gSOAP HTTP response status codes >= 1000 */ + +#define SOAP_STOP 1000 /* No HTTP response */ +#define SOAP_FORM 1001 /* Form request/response */ +#define SOAP_HTML 1002 /* Custom HTML response */ +#define SOAP_FILE 1003 /* Custom file-based response */ + +/* gSOAP HTTP method codes */ + +#define SOAP_POST 2000 +#define SOAP_GET 2001 + +/* gSOAP DIME */ + +#define SOAP_DIME_CF 0x01 +#define SOAP_DIME_ME 0x02 +#define SOAP_DIME_MB 0x04 +#define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ +#define SOAP_DIME_MEDIA 0x10 +#define SOAP_DIME_ABSURI 0x20 + +/* gSOAP ZLIB */ + +#define SOAP_ZLIB_NONE 0x00 +#define SOAP_ZLIB_DEFLATE 0x01 +#define SOAP_ZLIB_INFLATE 0x02 +#define SOAP_ZLIB_GZIP 0x02 + +/* gSOAP transport, connection, and content encoding modes */ + +typedef soap_int32 soap_mode; + +#define SOAP_IO 0x00000003 /* IO mask */ +#define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ +#define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ +#define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ +#define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ + +#define SOAP_IO_UDP 0x00000004 +#define SOAP_IO_LENGTH 0x00000008 +#define SOAP_IO_KEEPALIVE 0x00000010 + +#define SOAP_ENC_LATIN 0x00800020 /* iso-8859-1 encoding */ +#define SOAP_ENC_XML 0x00000040 /* plain XML encoding, no HTTP header */ +#define SOAP_ENC_DIME 0x00000080 +#define SOAP_ENC_MIME 0x00000100 +#define SOAP_ENC_MTOM 0x00000200 +#define SOAP_ENC_ZLIB 0x00000400 +#define SOAP_ENC_SSL 0x00000800 + +#define SOAP_ENC 0x00000FFF /* IO and ENC mask */ + +#define SOAP_XML_STRICT 0x00001000 /* strict validation */ +#define SOAP_XML_INDENT 0x00002000 +#define SOAP_XML_CANONICAL 0x00004000 /* EXC C14N canonical XML */ +#define SOAP_XML_TREE 0x00008000 +#define SOAP_XML_GRAPH 0x00010000 +#define SOAP_XML_NIL 0x00020000 +#define SOAP_XML_DOM 0x00040000 +#define SOAP_XML_SEC 0x00080000 /* reserved for WS security */ + +#define SOAP_C_NOIOB 0x00100000 +#define SOAP_C_UTFSTRING 0x00200000 +#define SOAP_C_MBSTRING 0x00400000 + +#define SOAP_DOM_TREE 0x01000000 +#define SOAP_DOM_NODE 0x02000000 +#define SOAP_DOM_ASIS 0x04000000 + +#define SOAP_IO_DEFAULT SOAP_IO_FLUSH + +/* SSL client/server authentication settings */ + +#define SOAP_SSL_NO_AUTHENTICATION 0x00 /* for testing purposes */ +#define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x01 /* client requires server to authenticate */ +#define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x02 /* server requires client to authenticate */ + +#define SOAP_SSL_DEFAULT SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION + +/* */ + +#define SOAP_BEGIN 0 +#define SOAP_IN_ENVELOPE 2 +#define SOAP_IN_HEADER 3 +#define SOAP_END_HEADER 4 +#define SOAP_NO_BODY 5 +#define SOAP_IN_BODY 6 +#define SOAP_END_BODY 7 +#define SOAP_END_ENVELOPE 8 +#define SOAP_END 9 +#define SOAP_BEGIN_SECURITY 10 +#define SOAP_IN_SECURITY 11 +#define SOAP_END_SECURITY 12 + +/* DEBUG macros */ + +#ifndef WITH_LEAN +# ifdef DEBUG +# ifndef SOAP_DEBUG +# define SOAP_DEBUG +# endif +# endif +#endif + +#ifdef SOAP_DEBUG +# define SOAP_MALLOC(soap, size) soap_track_malloc(soap, __FILE__, __LINE__, size) +# define SOAP_FREE(soap, ptr) soap_track_free(soap, __FILE__, __LINE__, ptr) +#endif + +#ifndef SOAP_MALLOC /* use libc malloc */ +# define SOAP_MALLOC(soap, size) malloc(size) +#endif + +#ifndef SOAP_FREE /* use libc free */ +# define SOAP_FREE(soap, ptr) free(ptr) +#endif + +#ifdef SOAP_DEBUG +# ifndef SOAP_MESSAGE +# define SOAP_MESSAGE fprintf +# endif +# ifndef DBGLOG +# define DBGLOG(DBGFILE, CMD) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ + CMD;\ + fflush(fdebug);\ + }\ + }\ +} +# endif +# ifndef DBGMSG +# define DBGMSG(DBGFILE, MSG, LEN) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { fwrite((MSG), 1, (LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + }\ + }\ +} +# endif +# ifndef DGBFUN +# define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) +# define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT")\n", __FILE__, __LINE__, FNAME, (ARG))) +# define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) +# define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2", "FMT3")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) +# endif +# ifndef DBGHEX +# define DBGHEX(DBGFILE, MSG, LEN) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { int i; char *s;\ + for (s = (char*)(MSG), i = (LEN); i; i--)\ + fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2hhX ", *s++);\ + fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + }\ + }\ +} +# endif +#else +# define DBGLOG(DBGFILE, CMD) +# define DBGMSG(DBGFILE, MSG, LEN) +# define DBGFUN(FNAME) +# define DBGFUN1(FNAME, FMT, ARG) +# define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) +# define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) +# define DBGHEX(DBGFILE, MSG, LEN) +#endif + +/* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ +typedef soap_int32 soap_wchar; + +/* namespace table row */ +struct Namespace +{ const char *id; + const char *ns; + const char *in; + char *out; +}; + +/* namespace stack */ +struct soap_nlist +{ struct soap_nlist *next; + unsigned int level; /* nesting depth level */ + short index; /* corresponding entry in ns mapping table */ + char *ns; /* only set when parsed ns URI is not in the ns mapping table */ + char id[1]; /* the actual string value flows into the allocated region below this struct */ +}; + +/* block stack for nested block allocations */ +struct soap_blist +{ struct soap_blist *next; + char *ptr; + size_t size; +}; + +/* array layout */ +struct soap_array +{ void *__ptr; + int __size; +}; + +/* pointer serialization management */ +struct soap_plist +{ struct soap_plist *next; + const void *ptr; + const struct soap_array *array; + int type; + int id; + char mark1; + char mark2; +}; + +/* block allocation for pointer serialization management */ +struct soap_pblk +{ struct soap_pblk *next; + struct soap_plist plist[SOAP_PTRBLK]; +}; + +#ifdef SOAP_DEBUG +/* malloc/free tracking for debugging */ +struct soap_mlist +{ struct soap_mlist *next; + const void *ptr; + const char *file; + int line; + short live; +}; +#endif + +/* class allocation list */ +struct soap_clist +{ struct soap_clist *next; + void *ptr; + int type; + int size; + void (*fdelete)(struct soap_clist*); +}; + +/* attributes */ +struct soap_attribute +{ struct soap_attribute *next; + char *value; + size_t size; + char *ns; + short visible; + char name[1]; /* the actual name string flows into the allocated region below this struct */ +}; + +struct soap_cookie +{ struct soap_cookie *next; + char *name; + char *value; + char *domain; + char *path; + long expire; /* client-side: local time to expire; server-side: seconds to expire */ + unsigned int version; + short secure; + short session; /* server-side */ + short env; /* server-side: got cookie from client and should not be (re)send */ + short modified; /* server-side: client cookie was modified and should be send */ +}; + +#ifdef __cplusplus +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); + +class soap_multipart_iterator +{ public: + struct soap_multipart *content; + bool operator==(const soap_multipart_iterator& iter) const + { return content == iter.content; } + bool operator!=(const soap_multipart_iterator& iter) const + { return content != iter.content; } + struct soap_multipart &operator*() const + { return *content; } + soap_multipart_iterator &operator++() + { content = soap_next_multipart(content); return *this; } + soap_multipart_iterator() : content(NULL) + { } + soap_multipart_iterator(struct soap_multipart *p) : content(p) + { } +}; +#endif + +#ifndef WITH_LEANER +struct soap_dime +{ size_t count; + size_t size; + size_t chunksize; + size_t buflen; + char flags; + char *ptr; + const char *id; + const char *type; + const char *options; + struct soap_multipart *list; /* list of DIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +struct soap_mime +{ char *boundary; /* MIME boundary */ + const char *start; /* MIME start ID */ + struct soap_multipart *list; /* list of MIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +/* RFC2045 MIME content transfer encodings */ +enum soap_mime_encoding +{ SOAP_MIME_NONE, + SOAP_MIME_7BIT, + SOAP_MIME_8BIT, + SOAP_MIME_BINARY, + SOAP_MIME_QUOTED_PRINTABLE, + SOAP_MIME_BASE64, + SOAP_MIME_IETF_TOKEN, + SOAP_MIME_X_TOKEN +}; +#endif + +#ifndef WITH_LEANER +/* DIME/MIME multipart list */ +struct soap_multipart +{ struct soap_multipart *next; + char *ptr; /* points to raw data content */ + size_t size; /* size of data content */ + const char *id; /* DIME/MIME content ID or form data name */ + const char *type; /* DIME/MIME type (MIME type format) */ + const char *options; /* DIME options */ + enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ + const char *location; /* MIME Content-Location (optional) */ + const char *description; /* MIME Content-Description (optional) */ +#ifdef __cplusplus + typedef soap_multipart_iterator iterator; +#endif +}; +#endif + +#ifndef WITH_LEANER +/* attachment DIME and MTOM XOP forwarding */ +struct soap_xlist +{ struct soap_xlist *next; + unsigned char **ptr; + int *size; + char *id; + char **type; + char **options; +}; +#endif + +/******************************************************************************/ + +#ifndef WITH_LEANER +#ifdef __cplusplus +class soap_dom_attribute_iterator +{ public: + struct soap_dom_attribute *att; + const char *nstr; + const char *name; + bool operator==(const soap_dom_attribute_iterator&) const; + bool operator!=(const soap_dom_attribute_iterator&) const; + struct soap_dom_attribute &operator*() const; + soap_dom_attribute_iterator &operator++(); + soap_dom_attribute_iterator(); + soap_dom_attribute_iterator(struct soap_dom_attribute*); + ~soap_dom_attribute_iterator(); +}; +#endif +#endif + +#ifndef WITH_LEANER +struct soap_dom_attribute +{ struct soap_dom_attribute *next; + const char *nstr; + char *name; + char *data; + wchar_t *wide; + struct soap *soap; +#ifdef __cplusplus + typedef soap_dom_attribute_iterator iterator; + struct soap_dom_attribute &set(const char *nstr, const char *name); /* set namespace and name */ + struct soap_dom_attribute &set(const char *data); /* set data */ + soap_dom_attribute_iterator begin(); + soap_dom_attribute_iterator end(); + soap_dom_attribute_iterator find(const char *nstr, const char *name); + void unlink(); + soap_dom_attribute(); + soap_dom_attribute(struct soap *soap); + soap_dom_attribute(struct soap *soap, const char *nstr, const char *name, const char *data); + ~soap_dom_attribute(); +#endif +}; +#endif + +#ifndef WITH_LEANER +#ifdef __cplusplus +class soap_dom_element_iterator +{ public: + struct soap_dom_element *elt; + const char *nstr; + const char *name; + int type; + bool operator==(const soap_dom_element_iterator&) const; + bool operator!=(const soap_dom_element_iterator&) const; + struct soap_dom_element &operator*() const; + soap_dom_element_iterator &operator++(); + soap_dom_element_iterator(); + soap_dom_element_iterator(struct soap_dom_element*); + ~soap_dom_element_iterator(); +}; +#endif +#endif + +#ifndef WITH_LEANER +struct soap_dom_element +{ struct soap_dom_element *next; /* next sibling */ + struct soap_dom_element *prnt; /* parent */ + struct soap_dom_element *elts; /* list of child elements */ + struct soap_dom_attribute *atts; /* list of attributes */ + const char *nstr; /* namespace string */ + char *name; /* element tag name */ + char *data; /* element content data (with SOAP_C_UTFSTRING flag set) */ + wchar_t *wide; /* element content data */ + int type; /* optional: serialized C/C++ data type */ + void *node; /* optional: pointer to serialized C/C++ data */ + char *head; /* leading whitespace to start tag */ + char *tail; /* leading whitespace to end tag */ + struct soap *soap; /* soap context that manages this node */ +#ifdef __cplusplus + typedef soap_dom_element_iterator iterator; + struct soap_dom_element &set(const char *nstr, const char *name); + struct soap_dom_element &set(const char *data); + struct soap_dom_element &set(void *node, int type); + struct soap_dom_element &add(struct soap_dom_element*); + struct soap_dom_element &add(struct soap_dom_element&); + struct soap_dom_element &add(struct soap_dom_attribute*); + struct soap_dom_element &add(struct soap_dom_attribute&); + soap_dom_element_iterator begin(); + soap_dom_element_iterator end(); + soap_dom_element_iterator find(const char *nstr, const char *name); + soap_dom_element_iterator find(int type); + void unlink(); + soap_dom_element(); + soap_dom_element(struct soap *soap); + soap_dom_element(struct soap *soap, const char *nstr, const char *name); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, const char *data); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, void *node, int type); + ~soap_dom_element(); +#endif +}; +SOAP_FMAC1 const char* SOAP_FMAC2 soap_dom_current_nstr(struct soap *soap, const char *tag); +SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(struct soap_dom_element *elt); +SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(struct soap_dom_attribute *att); +#endif + +#if defined(__cplusplus) && !defined(WITH_LEAN) +} +extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); +extern std::istream &operator>>(std::istream&, struct soap_dom_element&); +extern "C" { +#endif + +/******************************************************************************/ + +struct soap +{ short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */ + short copy; /* 1 = copy of another soap struct */ + soap_mode mode; + soap_mode imode; + soap_mode omode; + const char *float_format; /* user-definable format string for floats (<1024 chars) */ + const char *double_format; /* user-definable format string for doubles (<1024 chars) */ + const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ + int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ + int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ + int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ + int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ + int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ + int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ + int accept_flags; /* accept() SOL_SOCKET sockopt flags */ + const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ + struct Namespace *local_namespaces; /* Local namespace mapping table */ + struct soap_nlist *nlist; /* namespace stack */ + struct soap_blist *blist; /* block allocation stack */ + struct soap_clist *clist; /* class instance allocation list */ + void *alist; /* memory allocation (malloc) list */ + struct soap_ilist *iht[SOAP_IDHASH]; + struct soap_plist *pht[SOAP_PTRHASH]; + struct soap_pblk *pblk; /* plist block allocation */ + short pidx; /* plist block allocation */ + struct SOAP_ENV__Header *header; + struct SOAP_ENV__Fault *fault; + int idnum; + void *user; /* to pass user-defined data */ + struct soap_plugin *plugins; /* linked list of plug-in data */ + char *userid; /* HTTP Basic authorization userid */ + char *passwd; /* HTTP Basic authorization passwd */ + int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); + int (*fget)(struct soap*); + int (*fform)(struct soap*); + int (*fposthdr)(struct soap*, const char*, const char*); + int (*fresponse)(struct soap*, int, size_t); + int (*fparse)(struct soap*); + int (*fparsehdr)(struct soap*, const char*, const char*); + int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); + int (*fconnect)(struct soap*, const char*, const char*, int); + int (*fdisconnect)(struct soap*); + int (*fclosesocket)(struct soap*, SOAP_SOCKET); + int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); + int (*fopen)(struct soap*, const char*, const char*, int); + int (*faccept)(struct soap*, int, struct sockaddr*, int *n); + int (*fclose)(struct soap*); + int (*fsend)(struct soap*, const char*, size_t); + size_t (*frecv)(struct soap*, char*, size_t); + int (*fpoll)(struct soap*); + void (*fseterror)(struct soap*, const char **c, const char **s); + int (*fignore)(struct soap*, const char*); + int (*fserveloop)(struct soap*); + void *(*fplugin)(struct soap*, const char*); +#ifndef WITH_LEANER + int (*fprepareinit)(struct soap*); + int (*fpreparesend)(struct soap*, const char*, size_t); + int (*fpreparerecv)(struct soap*, const char*, size_t); + int (*fpreparefinal)(struct soap*); + void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); + void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); + void (*fdimereadclose)(struct soap*, void*); + void (*fdimewriteclose)(struct soap*, void*); + size_t (*fdimeread)(struct soap*, void*, char*, size_t); + int (*fdimewrite)(struct soap*, void*, const char*, size_t); +#endif + int master; + int socket; +#if defined(__cplusplus) && !defined(WITH_LEAN) + std::ostream *os; + std::istream *is; +#else + void *os; /* preserve alignment */ + void *is; /* preserve alignment */ +#endif +#ifndef UNDER_CE + int sendfd; + int recvfd; +#else + FILE *sendfd; + FILE *recvfd; +#endif +#ifdef WIN32 + char errorstr[256]; /* buf for FormatMessage() */ +#endif + size_t bufidx; /* index in soap.buf[] */ + size_t buflen; /* length of soap.buf[] content */ + soap_wchar ahead; /* parser lookahead */ + short cdata; /* CDATA parser state */ + short body; /* parsed XML element has a body or not */ + unsigned int level; /* XML nesting level */ + size_t count; /* message length counter */ + size_t length; /* message length as set by HTTP header */ +#ifdef WITH_FAST + char *labbuf; /* look-aside buffer */ + size_t lablen; /* look-aside buffer allocated length */ + size_t labidx; /* look-aside buffer index to available part */ +#endif + char buf[SOAP_BUFLEN];/* send and receive buffer */ + char tmpbuf[1024]; /* in/output buffer for HTTP headers, simpleType values, attribute names, and DIME >=1024 bytes */ + char msgbuf[1024]; /* output buffer for (error) messages <=1024 bytes */ + char tag[SOAP_TAGLEN]; + char id[SOAP_TAGLEN]; + char href[SOAP_TAGLEN]; + char type[SOAP_TAGLEN]; + char arrayType[SOAP_TAGLEN]; + char arraySize[SOAP_TAGLEN]; + char arrayOffset[SOAP_TAGLEN]; + short other; + short position; + int positions[SOAP_MAXDIMS]; + short root; + struct soap_attribute *attributes; /* attribute list */ + short encoding; /* when set, output encodingStyle */ + short mustUnderstand; /* a mustUnderstand element was parsed or is output */ + short keep_alive; /* connection should be kept open */ + short null; /* parsed XML is xsi:nil */ + short ns; /* when not set, output full xmlns bindings */ + short part; /* parsing state */ + short alloced; + short peeked; + size_t chunksize; + size_t chunkbuflen; + char endpoint[SOAP_TAGLEN]; + char path[SOAP_TAGLEN]; + char host[SOAP_TAGLEN]; + char *action; + char *authrealm; /* HTTP authentication realm */ + char *prolog; /* XML declaration prolog */ + unsigned long ip; /* IP number */ + int port; /* port number */ + unsigned int max_keep_alive; + const char *proxy_host; /* Proxy Server host name */ + int proxy_port; /* Proxy Server port (default = 8080) */ + const char *proxy_userid; /* Proxy Authorization user name */ + const char *proxy_passwd; /* Proxy Authorization password */ + int status; /* -1 when request, else error code to be returned by server */ + int error; + int errmode; + int errnum; +#ifndef WITH_LEANER + struct soap_dom_element *dom; + struct soap_dime dime; + struct soap_mime mime; + struct soap_xlist *xlist; +#endif +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) + const char *logfile[SOAP_MAXLOGS]; + FILE *fdebug[SOAP_MAXLOGS]; + struct soap_mlist *mht[SOAP_PTRHASH]; +#endif +#ifndef WITH_LEAN + const char *c14ninclude; + const char *c14nexclude; + struct soap_cookie *cookies; + const char *cookie_domain; + const char *cookie_path; + int cookie_max; +#endif +#ifndef WITH_NOIO +#ifdef WITH_IPV6 + struct sockaddr_storage peer; /* IPv6: set by soap_accept and by UDP recv */ +#else + struct sockaddr_in peer; /* IPv4: set by soap_connect/soap_accept and by UDP recv */ +#endif + size_t peerlen; +#endif +#ifdef WITH_OPENSSL + int (*fsslauth)(struct soap*); + int (*fsslverify)(int, X509_STORE_CTX*); + BIO *bio; + SSL *ssl; + SSL_CTX *ctx; + short require_server_auth; + short require_client_auth; + short rsa; /* when set, use RSA instead of DH */ + const char *keyfile; + const char *password; + const char *dhfile; + const char *cafile; + const char *capath; + const char *crlfile; + const char *randfile; + SSL_SESSION *session; + char session_host[SOAP_TAGLEN]; + int session_port; +#endif +#ifdef WITH_ZLIB + short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ + short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + z_stream d_stream; /* decompression stream */ + char z_buf[SOAP_BUFLEN]; /* buffer */ + size_t z_buflen; + unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ + uLong z_crc; /* internal gzip crc */ + float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ + float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ +#endif +/* WR[ */ +#ifdef WMW_RPM_IO + void *rpmreqid; +#endif /* WMW_RPM_IO */ +/* ]WR */ +}; + +struct soap_code_map +{ long code; + const char *string; +}; + +/* forwarding list */ +struct soap_flist +{ struct soap_flist *next; + int type; + void *ptr; + unsigned int level; + void (*fcopy)(struct soap*, int, int, void*, const void*, size_t); +}; + +/* id-ref forwarding list */ +struct soap_ilist +{ struct soap_ilist *next; + int type; + size_t size; + void *link; + void *copy; + struct soap_flist *flist; + void *ptr; + unsigned int level; + char id[1]; /* the actual id string value flows into the allocated region below this struct */ +}; + +struct soap_plugin +{ struct soap_plugin *next; + const char *id; + void *data; + int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); + void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ +}; + +#ifndef WITH_NONAMESPACES +extern SOAP_NMAC struct Namespace namespaces[]; +#endif + +#ifndef WITH_LEAN +# define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) +# define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) +#else +soap_wchar soap_get0(struct soap*); +soap_wchar soap_get1(struct soap*); +#endif + +#define soap_revget1(soap) ((soap)->bufidx--) +#define soap_unget(soap, c) ((soap)->ahead = c) +#define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) +#define soap_imode(soap, n) ((soap)->mode = (soap)->imode = (n)) +#define soap_set_imode(soap, n) ((soap)->imode |= (n)) +#define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) +#define soap_omode(soap, n) ((soap)->mode = (soap)->omode = (n)) +#define soap_set_omode(soap, n) ((soap)->omode |= (n)) +#define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) +#define soap_set_mode(soap, n) ((soap)->imode |= (n), (soap)->omode |= (n)) +#define soap_clr_mode(soap, n) ((soap)->imode &= ~(n), (soap)->omode &= ~(n)) +#define soap_destroy(soap) soap_delete((soap), NULL) + +#ifdef HAVE_STRRCHR +# define soap_strrchr(s, t) strrchr(s, t) +#else + SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); +#endif + +#ifdef HAVE_STRTOL +# define soap_strtol(s, t, b) strtol(s, t, b) +#else + SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b); +#endif + +#ifdef HAVE_STRTOUL +# define soap_strtoul(s, t, b) strtoul(s, t, b) +#else + SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b); +#endif + +#if defined(WITH_OPENSSL) +# define soap_random soap_rand() +SOAP_FMAC1 int SOAP_FMAC2 soap_rand(); +#elif defined(HAVE_RANDOM) +# define soap_random (int)random() +#else +# define soap_random rand() +#endif + +#ifdef WITH_NOIDREF +# define soap_embedded(s, p, t) (0) +# define soap_id_lookup(s, i, p, t, n, k) (p) +# define soap_id_forward(s, h, p, st, tt, n, k, fc) (p) +# define soap_reference(s, a, t) (1) +# define soap_array_reference(s, p, a, n, t) (1) +# define soap_embed(s, p, a, n, t, pp) (0) +# define soap_embedded_id(s, i, p, t) (i) +# define soap_is_embedded(s, p) (0) +# define soap_is_single(s, p) (1) +# define soap_lookup_type(s, i) (0) +# define soap_getindependent(s) (0) +# define soap_putindependent(s) (0) +# define soap_getelement(s, n) (n) +# define soap_putelement(s, p, t, i, n) (0) +# define soap_markelement(s, p, n) (0) +#endif + +SOAP_FMAC1 void SOAP_FMAC2 soap_fault(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultcode(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultsubcode(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultstring(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultdetail(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializefault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_accept(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); + +SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); +SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap*, unsigned char**, int*, char**, char**, char**); +#endif + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +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); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const struct soap_array *a, int n, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); + +SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char *str); +SOAP_FMAC1 long SOAP_FMAC2 soap_int_code(const struct soap_code_map*, const char *str, long other); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_str_code(const struct soap_code_map*, long code); + +SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); + +SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); +SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, void (*fdelete)(struct soap_clist*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_unlink(struct soap*, const void*); +SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); + +SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, int st, int tt, size_t n, unsigned int k, void(*fcopy)(struct soap*, int, int, void*, const void*, size_t)); +#endif +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct 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*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, const void *q, size_t n); + +SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *, const char *, int *); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsize(struct soap*, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizes(struct soap*, const char *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffset(struct soap*, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); + +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new(void); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new1(soap_mode); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new2(soap_mode, soap_mode); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(struct soap*); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*,struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init1(struct soap*, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_init2(struct soap*, soap_mode, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); + +#ifdef SOAP_DEBUG +SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); +#endif + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_token(struct soap*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); +SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const struct soap_array *a, int d, const char *type, int n); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); +SOAP_FMAC1 const char * SOAP_FMAC2 soap_strsearch(const char *big, const char *little); + +SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); +SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long); + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); +SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, int n1, int n2); + +SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, struct Namespace*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); + +SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); + +SOAP_FMAC1 int SOAP_FMAC2 soap_new_block(struct soap*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, size_t); +SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, char*, int); +SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); +SOAP_FMAC1 int soap_envelope_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*); + +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); +#endif + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); + +#ifndef WITH_LEAN +SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); +#endif + + +SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); +SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); +SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); +SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); +SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); +SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); +SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); +SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); +SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); +SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); +SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long); +SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); + +#ifndef WITH_LEAN +SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long); +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, long); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); + +#ifdef WITH_COOKIES +SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char*, char*, size_t); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern long SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.c b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.c new file mode 100644 index 0000000..959147e --- /dev/null +++ b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.c @@ -0,0 +1,14172 @@ +/* + +stdsoap2.c[pp] 2.7.9b + +gSOAP runtime + +gSOAP XML Web services tools +Copyright (C) 2000-2007, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +Contributors: + +Wind River Systems Inc., for the following additions under gSOAP public license: + - vxWorks compatible (#define VXWORKS) +-------------------------------------------------------------------------------- +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-2007, 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 +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- + +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. + +*/ + +#ifdef AS400 +# pragma convert(819) /* EBCDIC to ASCII */ +#endif + +#include "stdsoap2.h" + +#ifdef WIN32 +# pragma comment(lib, "wsock32.lib") +#endif + +#ifdef __cplusplus +SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.7.9b 2007-01-01 12:00:00 GMT") +extern "C" { +#else +SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.9 2007-01-01 12:00:00 GMT") +#endif + +/* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale with multibyte support enabled) */ +#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_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) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) + +#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 SOAP_MEM_DEBUG +static void soap_init_mht(struct soap*); +static void soap_free_mht(struct soap*); +static void soap_track_unlink(struct soap*, const void*); +#endif + +#ifndef PALM_2 +static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); +static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); +static int soap_getattrval(struct soap*, char*, size_t, soap_wchar); +#endif + +#ifndef PALM_1 +static soap_wchar soap_char(struct soap*); +static soap_wchar soap_get_pi(struct soap*); +static int soap_isxdigit(int); +static void *fplugin(struct soap*, const char*); +#ifndef WITH_NOIDREF +static void soap_update_ptrs(struct soap*, char*, char*, char*, char*); +static int soap_has_copies(struct soap*, const char*, 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*); +#endif +#endif + +#ifndef WITH_LEAN +static const char *soap_set_validation_fault(struct soap*, const char*, const char*); +static int soap_isnumeric(struct soap*, const char*); +static time_t soap_timegm(struct tm*); +static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); +static void soap_pop_ns(struct soap *soap); +static void soap_utilize_ns(struct soap *soap, const char *tag, size_t n); +#endif + +#ifndef WITH_LEANER +#ifndef PALM_1 +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*); +static void soap_resolve_attachment(struct soap*, struct soap_multipart*); +#endif +#endif + +#ifdef WITH_GZIP +static int soap_getgziphdr(struct soap*); +#endif + +#ifdef WITH_OPENSSL +static int ssl_init_done = 0; +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 + +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#ifndef PALM_1 +static const char *soap_decode(char*, size_t, const char*, const char*); +#endif +#endif + +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static soap_wchar soap_getchunkchar(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*); +#endif +#endif + +#ifndef WITH_NOIO +#ifndef PALM_1 +static int fsend(struct soap*, const char*, size_t); +static size_t frecv(struct soap*, char*, size_t); +static int tcp_init(struct soap*); +static const char *tcp_error(struct soap*); +#ifndef WITH_LEAN +static size_t frecv_stop(struct soap*, char*, size_t); +#endif +#ifndef WITH_IPV6 +static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); +#endif +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 const char *soap_strerror(struct soap*); +#endif +#endif + +#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 + +#ifndef WITH_LEAN +static const char soap_indent[11] = "\n\t\t\t\t\t\t\t\t\t"; +/* Alternative indentation form for SOAP_XML_INDENT: +static const char soap_indent[21] = "\n "; +*/ +#endif + +#ifndef SOAP_CANARY +# define SOAP_CANARY (0xC0DE) +#endif + +static const char soap_padding[4] = "\0\0\0"; +#define SOAP_STR_PADDING (soap_padding) +#define SOAP_STR_EOS (soap_padding) +#define SOAP_NON_NULL (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_NOIO +#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 +#endif + +#ifndef WITH_NOHTTP +#ifndef WITH_LEAN +static const struct soap_code_map h_http_error_codes[] = +{ { 200, "OK" }, + { 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 +#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 WITH_NOIO +#ifndef PALM_1 +static int +fsend(struct soap *soap, const char *s, size_t n) +{ register int nwritten, err; +#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; + } +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + 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; + } + err = soap_socket_errno(soap->socket); + if (err != SOAP_EINTR && err != SOAP_EAGAIN) + { soap->errnum = err; + return SOAP_EOF; + } + } + } +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + nwritten = SSL_write(soap->ssl, s, n); + else if (soap->bio) + nwritten = BIO_write(soap->bio, s, n); + else +#endif +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + { if (soap->peerlen) + nwritten = sendto((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags, (struct sockaddr*)&soap->peer, soap->peerlen); + else + nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags); + /* retry and back-off algorithm */ + /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ + if (nwritten < 0) + { struct timeval timeout; + fd_set fd; + int udp_repeat; + int udp_delay; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + if ((soap->connect_flags & SO_BROADCAST)) + udp_repeat = 3; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ + else + udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ + udp_delay = (soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ + do + { timeout.tv_sec = 0; + timeout.tv_usec = 1000 * udp_delay; /* ms */ + FD_ZERO(&fd); + FD_SET((SOAP_SOCKET)soap->socket, &fd); + select((SOAP_SOCKET)(soap->socket + 1), NULL, NULL, &fd, &timeout); + if (soap->peerlen) + nwritten = sendto((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags, (struct sockaddr*)&soap->peer, soap->peerlen); + else + nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags); + udp_delay <<= 1; + if (udp_delay > 500) /* UDP_UPPER_DELAY */ + udp_delay = 500; + } + while (nwritten < 0 && --udp_repeat > 0); + } + } + else +#endif +#if !defined(PALM) && !defined(AS400) + 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 + err = soap_socket_errno(soap->socket); + if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) + { soap->errnum = err; + 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 +#ifdef VXWORKS +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + nwritten = (httpBlockPut(soap->rpmreqid, s, n) == 0) ? n : -1; + else +#endif + nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); +#else + nwritten = write((SOAP_SOCKET)soap->sendfd, s, n); +#endif +#endif +#endif + if (nwritten <= 0) + { err = soap_errno; + if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) + { soap->errnum = err; + 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_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; +#ifndef WITH_LEANER + if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + return soap->error = soap->fpreparesend(soap, s, n); +#endif + 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_flush(struct soap *soap) +{ register int n = soap->bufidx; + if (n) + { soap->bufidx = 0; +#ifdef WITH_ZLIB + if (soap->mode & SOAP_ENC_ZLIB) + { soap->d_stream.next_in = (Byte*)soap->buf; + soap->d_stream.avail_in = (unsigned int)n; +#ifdef WITH_GZIP + soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); +#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 + return soap_flush_raw(soap, soap->buf, n); + } + return SOAP_OK; +} +#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); +#ifndef WITH_LEANER + if (soap->fpreparesend) + return soap->error = soap->fpreparesend(soap, s, n); +#endif + return SOAP_OK; + } +#ifndef WITH_LEANER + 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); +#endif + return soap->error = soap->fsend(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 WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static size_t +frecv(struct soap *soap, char *s, size_t n) +{ register int r; +#ifdef PALM + register int timeouts = 0; +#endif + 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 + if (soap->recv_timeout) + { struct timeval timeout; + fd_set fd; + 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; + } +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return 0; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + 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) + { soap->errnum = 0; + return 0; + } + r = soap_socket_errno(soap->socket); + if (r != SOAP_EINTR && r != SOAP_EAGAIN) + { soap->errnum = r; + return 0; + } + } + } +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + { int err; + r = SSL_read(soap->ssl, s, n); + if (r > 0) + return (size_t)r; + err = SSL_get_error(soap->ssl, r); + if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) + return 0; + } + else if (soap->bio) + { r = BIO_read(soap->bio, s, n); + if (r > 0) + return (size_t)r; + return 0; + } + else +#endif + { +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + r = recvfrom((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags, (struct sockaddr*)&soap->peer, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ + soap->peerlen = (size_t)k; +#ifndef WITH_IPV6 + soap->ip = ntohl(soap->peer.sin_addr.s_addr); +#endif + } + else +#endif + r = recv((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags); +#ifdef PALM + /* CycleSyncDisplay(curStatusMsg); */ +#endif + if (r >= 0) + return (size_t)r; + r = soap_socket_errno(soap->socket); + if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) + { soap->errnum = r; + return 0; + } + } +#ifndef WITH_LEAN + { struct timeval timeout; + fd_set fd; + timeout.tv_sec = 0; + timeout.tv_usec = 10000; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return 0; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + FD_ZERO(&fd); + FD_SET((SOAP_SOCKET)soap->socket, &fd); +#ifdef WITH_OPENSSL + if (soap->ssl && SSL_get_error(soap->ssl, r) == SSL_ERROR_WANT_WRITE) + r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout); + else + r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout); +#else + r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout); +#endif + if (r < 0 && (r = soap_socket_errno(soap->socket)) != SOAP_EINTR) + { soap->errnum = r; + return 0; + } + } +#endif +#ifdef PALM + if (r < 0 && (r = soap_socket_errno(soap->socket)) == SOAP_EINTR) + { timeouts++; + if (timeouts > 10) + { soap->errnum = r; + return 0; + } + } +#endif + } + } +#ifdef WITH_FASTCGI + return fread(s, 1, n, stdin); +#else +#ifdef UNDER_CE + return fread(s, 1, n, soap->recvfd); +#else +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + r = httpBlockRead(soap->rpmreqid, s, n); + else +#endif + r = read((SOAP_SOCKET)soap->recvfd, s, n); + if (r >= 0) + return (size_t)r; + soap->errnum = soap_errno; + return 0; +#endif +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +#ifndef WITH_NOIO +#ifndef PALM_1 +static size_t +frecv_stop(struct soap *soap, char *s, size_t n) +{ return 0; +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 from socket %d\n", (unsigned int)soap->buflen, soap->socket)); + DBGMSG(RECV, soap->buf, soap->buflen); + if (soap->buflen) + return soap->buf[soap->bufidx++]; + return EOF; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +soap_isxdigit(int c) +{ return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); +} +#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; + ret = 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)ret); + 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 (ret) + { soap->count += ret; + DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); + DBGMSG(RECV, soap->buf, ret); + 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; + soap->error = SOAP_ZLIB_ERROR; + 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; + } + DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); + } +#endif +#ifndef WITH_NOHTTP + 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 (chunked) from socket %d\n", (unsigned int)ret, soap->socket)); + DBGMSG(RECV, soap->buf, ret); + soap->bufidx = 0; + if (!ret) + return soap->ahead = EOF; + } + else + soap->bufidx = soap->buflen; + soap->buflen = soap->chunkbuflen; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); + while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) + { if ((int)c == EOF) + return soap->ahead = 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 soap->ahead = 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 soap->ahead = EOF; + } + soap->buflen = soap->bufidx + soap->chunksize; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, 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 (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); + } + else if (soap->chunkbuflen) + soap->chunksize = 0; + ret = soap->buflen - soap->bufidx; + if (!ret) + goto chunk_again; + } + } + else +#endif + { soap->bufidx = 0; + soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket %d\n", (unsigned int)ret, soap->socket)); + DBGMSG(RECV, soap->buf, ret); + } +#ifndef WITH_LEANER + if (soap->fpreparerecv && (soap->error = soap->fpreparerecv(soap, soap->buf, ret))) + return soap->error; +#endif +#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; + } + DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); + DBGMSG(RECV, soap->buf, ret); + } + 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; + soap->error = SOAP_ZLIB_ERROR; + 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; + c = soap->ahead; + if (c) + { if (c != EOF) + 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 *code_map, const char *str) +{ if (code_map && str) + { while (code_map->string) + { if (!strcmp(str, code_map->string)) /* case sensitive */ + return code_map; + code_map++; + } + } + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +long +SOAP_FMAC2 +soap_code_int(const struct soap_code_map *code_map, const char *str, long other) +{ if (code_map) + { while (code_map->string) + { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ + return code_map->code; + code_map++; + } + } + return other; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_code_str(const struct soap_code_map *code_map, long code) +{ if (!code_map) + return NULL; + while (code_map->code != code && code_map->string) + code_map++; + return code_map->string; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +long +SOAP_FMAC2 +soap_code_bits(const struct soap_code_map *code_map, const char *str) +{ register long bits = 0; + if (code_map) + { while (str && *str) + { const struct soap_code_map *p; + for (p = code_map; p->string; p++) + { register size_t n = strlen(p->string); + if (!strncmp(p->string, str, n) && soap_blank(str[n])) + { bits |= p->code; + str += n; + while (*str > 0 && *str <= 32) + str++; + break; + } + } + if (!p->string) + return 0; + } + } + return bits; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) +{ register char *t = soap->tmpbuf; + if (code_map) + { while (code_map->string) + { if (code_map->code & code) + { register const char *s = code_map->string; + if (t != soap->tmpbuf) + *t++ = ' '; + while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) + *t++ = *s++; + if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) + break; + } + code_map++; + } + } + *t = '\0'; + return soap->tmpbuf; +} +#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_code_int(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR); +#else + return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ +#endif +} +#endif + +/******************************************************************************/ +#ifdef WITH_LEAN +#ifndef PALM_1 +soap_wchar +soap_get0(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx]; +} +#endif +#endif + +/******************************************************************************/ +#ifdef WITH_LEAN +#ifndef PALM_1 +soap_wchar +soap_get1(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx++]; +} +#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) + { if ((int)c != EOF) + soap->ahead = 0; + } + else + c = soap_get1(soap); + while ((int)c != EOF) + { if (soap->cdata) + { if (c == ']') + { c = soap_get1(soap); + if (c == ']') + { c = soap_get0(soap); + if (c == '>') + { soap->cdata = 0; + soap_get1(soap); + c = soap_get1(soap); + } + else + { soap_unget(soap, ']'); + return ']'; + } + } + else + { soap_revget1(soap); + return ']'; + } + } + else + return c; + } + switch (c) + { case '<': + do c = soap_get1(soap); + while (soap_blank(c)); + if (c == '!' || c == '?' || c == '%') + { register int k = 1; + 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); + } + } + else if (c == '?') + c = soap_get_pi(soap); + while ((int)c != EOF) + { if (c == '<') + k++; + else if (c == '>') + { if (--k <= 0) + break; + } + 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 +static soap_wchar +soap_get_pi(struct soap *soap) +{ char buf[64]; + register char *s = buf; + register int i = sizeof(buf); + register soap_wchar c = soap_getchar(soap); + /* This is a quick way to parse XML PI and we could use a callback instead to + * enable applications to intercept processing instructions */ + while ((int)c != EOF && c != '?') + { if (--i > 0) + { if (soap_blank(c)) + c = ' '; + *s++ = (char)c; + } + c = soap_getchar(soap); + } + *s = '\0'; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); + if (!strncmp(buf, "xml ", 4)) + { s = strstr(buf, " encoding="); + if (s && s[10]) + { if (!soap_tag_cmp(s + 11, "iso-8859-1*") + || !soap_tag_cmp(s + 11, "latin1*")) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); + soap->mode |= SOAP_ENC_LATIN; + } + else if (!soap_tag_cmp(s + 11, "utf-8*")) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); + soap->mode &= ~SOAP_ENC_LATIN; + } + } + } + if ((int)c != EOF) + c = soap_getchar(soap); + 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 < 0x80 && c >= 0x20) + { *tmp = (char)c; + return soap_send_raw(soap, tmp, 1); + } +#ifndef WITH_LEAN + if (c >= 0x80 && (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->ahead; + if (c > 0xFF) + { soap->ahead = 0; + return c; + } +again: + c = soap_get(soap); + if (c < 0x80 || (soap->mode & SOAP_ENC_LATIN)) + return c; + c1 = soap_get1(soap); + if (c1 < 0x80) + { soap_revget1(soap); /* doesn't look like this is UTF8 */ + return c; + } + c1 &= 0x3F; + if (c < 0xE0) + return ((soap_wchar)(c & 0x1F) << 6) | c1; + c2 = (soap_wchar)soap_get1(soap) & 0x3F; + if (c == 0xEF && c1 == 0x3B && c2 == 0x3F) /* ignore UTF-8 BOM */ + goto again; + 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) +{ char d[2]; + register int i; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (!(soap->dom->data = soap_s2hex(soap, s, NULL, n))) + return soap->error; + return SOAP_OK; + } +#endif + 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_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_string_in(soap, 0, -1, -1); + return (unsigned char*)soap_hex2s(soap, soap->dom->data, NULL, 0, n); + } +#endif +#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, NULL, 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_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_string_in(soap, 0, -1, -1); + return (unsigned char*)soap_base642s(soap, soap->dom->data, NULL, 0, n); + } +#endif +#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 = soap->lablen - soap->labidx; + soap->labidx = 3 * (soap->lablen / 3); + if (!s) + return NULL; + for (i = 0; i < k - 2; 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) + { int b = soap_base64i[c]; + if (b >= 64) + { soap->error = SOAP_TYPE; + return NULL; + } + m = (m << 6) + b; + j++; + } + else if (!soap_blank(c)) + { soap->error = SOAP_TYPE; + return NULL; + } + } 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) + { int b = soap_base64i[c]; + if (b >= 64) + { soap->error = SOAP_TYPE; + return NULL; + } + m = (m << 6) + b; + j++; + } + else if (!soap_blank(c)) + { soap->error = SOAP_TYPE; + return NULL; + } + } while (j < 4); + *s++ = (char)((m >> 16) & 0xFF); + *s++ = (char)((m >> 8) & 0xFF); + *s++ = (char)(m & 0xFF); + } + } +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) +{ /* Check MTOM xop:Include element (within hex/base64Binary) */ + /* TODO: this code to be obsoleted with new import/xop.h conventions */ + int body = soap->body; /* should save type too? */ + if (!soap_peek_element(soap)) + { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL) && *soap->href) + { if (soap_dime_forward(soap, ptr, size, id, type, options)) + return soap->error; + } + if (soap->body && soap_element_end_in(soap, NULL)) + return soap->error; + } + soap->body = body; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_dime_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) +{ struct soap_xlist *xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); + *ptr = NULL; + *size = 0; + *id = soap_strdup(soap, soap->href); + *type = NULL; + *options = NULL; + if (!xp) + return soap->error = SOAP_EOM; + xp->next = soap->xlist; + xp->ptr = ptr; + xp->size = size; + xp->id = *id; + xp->type = type; + xp->options = options; + soap->xlist = xp; + return SOAP_OK; +} +#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(soap, 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(soap, 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(soap, p); +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_update_ptrs(struct soap *soap, char *start, char *end, char *p1, char *p2) +{ int i; + register struct soap_ilist *ip; + register struct soap_flist *fp; +#ifndef WITH_LEANER + register struct soap_xlist *xp; +#endif + 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 + (p1-p2))); + ip->ptr = (char*)ip->ptr + (p1-p2); + } + 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 + (p1-p2); + } + } + 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 + (p1-p2); + } + } + 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 + (p1-p2); + } + } + } + } +#ifndef WITH_LEANER + for (xp = soap->xlist; xp; xp = xp->next) + { if (xp->ptr && (char*)xp->ptr >= start && (char*)xp->ptr < end) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", xp->id?xp->id:"", xp->ptr, (char*)xp->ptr + (p1-p2))); + xp->ptr = (unsigned char**)((char*)xp->ptr + (p1-p2)); + xp->size = (int*)((char*)xp->size + (p1-p2)); + xp->type = (char**)((char*)xp->type + (p1-p2)); + xp->options = (char**)((char*)xp->options + (p1-p2)); + } + } +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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, fp->len, p, ip->size); + else + soap_fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size); + ip->flist = fp->next; + SOAP_FREE(soap, 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 +#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(soap, 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(soap, p); + } + soap->blist = bp->next; + SOAP_FREE(soap, 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); +#ifndef WITH_NOIDREF + if (flag) + soap_update_ptrs(soap, q, q + n, s, q); +#endif + 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; + if (*attr1 == '[') + attr1++; + n = 1; + for (;;) + { 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; + } + if (!attr1) + break; + 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; + register short i = -1; + register size_t n, k; + n = strlen(id); + k = strlen(ns) + 1; + p = soap->local_namespaces; + if (p) + { for (i = 0; p->id; p++, i++) + { if (p->ns && !strcmp(ns, p->ns)) + { if (p->out) + { SOAP_FREE(soap, p->out); + p->out = NULL; + } + break; + } + if (p->out) + { if (!strcmp(ns, p->out)) + break; + } + else if (p->in) + { if (!soap_tag_cmp(ns, p->in)) + { if ((p->out = (char*)SOAP_MALLOC(soap, k))) + strcpy(p->out, ns); + break; + } + } + } + if (!p || !p->id) + i = -1; + } + if (i >= 0) + k = 0; + np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); + if (!np) + return soap->error = SOAP_EOM; + np->next = soap->nlist; + soap->nlist = np; + np->level = soap->level; + np->index = i; + strcpy(np->id, id); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns)); + if (i < 0) + { np->ns = np->id + n + 1; + strcpy(np->ns, ns); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); + } + else + { np->ns = NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); + } + 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)); + SOAP_FREE(soap, 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 + || (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_current_namespace(struct soap *soap, const char *tag) +{ register struct soap_nlist *np; + register const char *s; + np = soap->nlist; + if (!(s = strchr(tag, ':'))) + { while (np && *np->id) /* find default namespace, if present */ + np = np->next; + } + else + { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) + np = np->next; + if (!np) + soap->error = SOAP_NAMESPACE; + } + if (np) + { if (np->index >= 0) + return soap->namespaces[np->index].ns; + if (np->ns) + return soap_strdup(soap, np->ns); + } + return NULL; +} +#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 && !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 + +/******************************************************************************\ + * + * SSL + * +\******************************************************************************/ + +#ifdef WITH_OPENSSL +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_rand() +{ unsigned char buf[4]; + if (!ssl_init_done) + soap_ssl_init(); + RAND_pseudo_bytes(buf, 4); + return *(int*)buf; +} +#endif + +/******************************************************************************/ +#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; + soap->dhfile = dhfile; + soap->randfile = randfile; + soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); + 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->ssl_flags = flags; + soap->randfile = randfile; + return soap->fsslauth(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_ssl_init() +{ /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ + if (!ssl_init_done) + { ssl_init_done = 1; + SSL_library_init(); +#ifndef WITH_LEAN + SSL_load_error_strings(); +#endif + if (!RAND_load_file("/dev/urandom", 1024)) + { char buf[1024]; + RAND_seed(buf, sizeof(buf)); + while (!RAND_status()) + { int r = rand(); + RAND_seed(&r, sizeof(int)); + } + } + } +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_ssl_error(struct soap *soap, int ret) +{ int err = SSL_get_error(soap->ssl, ret); + const char *msg = soap_code_str(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) +{ long flags; + int mode; + if (!ssl_init_done) + 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 directory", SOAP_SSL_ERROR); + if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) + SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); + } + 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); +/* This code assumes a typical scenario, see alternative code below */ + 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); + } +/* Suggested alternative approach to check cafile first before the key file: + 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 (!soap->cafile || !SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) + { 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 or key file", SOAP_SSL_ERROR); + 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->ssl_flags & SOAP_SSL_RSA)) + { RSA *rsa = RSA_generate_key(1024, 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); + } + flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); + if ((soap->ssl_flags & SOAP_SSLv3)) + flags |= SSL_OP_NO_TLSv1; + if ((soap->ssl_flags & SOAP_TLSv1)) + flags |= SSL_OP_NO_SSLv3; + SSL_CTX_set_options(soap->ctx, flags); + if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) + mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); + else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) + mode = SSL_VERIFY_PEER; + else + mode = SSL_VERIFY_NONE; + SSL_CTX_set_verify(soap->ctx, mode, 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 or warning 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 + /* Note: return 1 to 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) +{ BIO *bio; + 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->ctx && (soap->error = soap->fsslauth(soap))) + return SOAP_INVALID_SOCKET; + 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; +#if defined(WIN32) + { u_long nonblocking = 1; + ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &nonblocking); + } +#elif defined(VXWORKS) + { u_long nonblocking = 1; + ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)&nonblocking); + } +#else + fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)|O_NONBLOCK); +#endif + bio = BIO_new_socket((SOAP_SOCKET)soap->socket, BIO_NOCLOSE); + SSL_set_bio(soap->ssl, bio, 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; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + FD_ZERO(&fd); + FD_SET((SOAP_SOCKET)soap->socket, &fd); + r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout); + if (r < 0 && (r = soap_socket_errno(soap->socket)) != SOAP_EINTR) + { soap->errnum = r; + return SOAP_EOF; + } + } + else + { soap->errnum = err; + break; + } + } +#if defined(WIN32) + { u_long blocking = 0; + ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking); + } +#elif defined(VXWORKS) + { u_long blocking = 0; + ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)&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, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); + soap_closesock(soap); + return SOAP_SSL_ERROR; + } + if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) + { 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 WITH_NOIO +#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 +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_done(struct soap *soap) +{ +#ifdef SOAP_DEBUG + int i; +#endif + if (soap_check_state(soap)) + return; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context\n")); + soap_free_temp(soap); + while (soap->clist) + { struct soap_clist *p = soap->clist->next; + SOAP_FREE(soap, 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->state == SOAP_INIT) + soap->plugins->fdelete(soap, soap->plugins); + SOAP_FREE(soap, soap->plugins); + soap->plugins = p; + } + soap->fplugin = fplugin; + soap->fmalloc = NULL; +#ifndef WITH_NOHTTP + soap->fpost = http_post; + soap->fget = http_get; + soap->fform = NULL; + soap->fposthdr = http_post_header; + soap->fresponse = http_response; + soap->fparse = http_parse; + soap->fparsehdr = http_parse_header; +#endif + soap->fheader = NULL; +#ifndef WITH_NOIO +#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->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; + soap->fpreparefinal = NULL; +#endif + soap->fseterror = NULL; + soap->fignore = NULL; + soap->fserveloop = NULL; +#ifdef WITH_OPENSSL + if (soap->session) + { SSL_SESSION_free(soap->session); + soap->session = NULL; + } +#endif + if (soap->state == SOAP_INIT) + { 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 + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); + for (i = 0; i < SOAP_MAXLOGS; i++) + { if (soap->logfile[i]) + { SOAP_FREE(soap, (void*)soap->logfile[i]); + soap->logfile[i] = NULL; + } + soap_close_logfile(soap, i); + } + soap_free_mht(soap); + soap->state = 0; +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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_code_str(h_error_codes, soap->errnum); + if (!msg) +#endif + { sprintf(soap->msgbuf, "TCP/UDP IP error %d", soap->errnum); + msg = soap->msgbuf; + } + } + } + return msg; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static const char* +http_error(struct soap *soap, int status) +{ register const char *msg = SOAP_STR_EOS; +#ifndef WITH_LEAN + msg = soap_code_str(h_http_error_codes, status); + if (!msg) + msg = SOAP_STR_EOS; +#endif + return msg; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_IPV6 +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) +{ soap_int32 iadd = -1; + struct hostent hostent, *host = &hostent; +#ifdef VXWORKS + int hostint; + /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ + iadd = inet_addr((char*)addr); +#else +#if defined(_AIXVERSION_431) || defined(TRU64) + struct hostent_data ht_data; +#endif +#ifdef AS400 + iadd = inet_addr((void*)addr); +#else + iadd = inet_addr(addr); +#endif +#endif + if (iadd != -1) + { memcpy(inaddr, &iadd, sizeof(iadd)); + 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); +#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((char*)addr); + if (hostint == ERROR) + { host = NULL; + soap->errnum = soap_errno; + } +#else +#ifdef AS400 + if (!(host = gethostbyname((void*)addr))) + soap->errnum = h_errno; +#else + if (!(host = gethostbyname(addr))) + soap->errnum = h_errno; +#endif +#endif + if (!host) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); + return SOAP_ERR; + } +#ifdef VXWORKS + inaddr->s_addr = hostint; +#else + memcpy(inaddr, host->h_addr, host->h_length); +#endif + return SOAP_OK; +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) +{ +#ifdef WITH_IPV6 + struct addrinfo hints, *res, *ressave; +#endif + register int err, 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->errnum = 0; + soap_set_sender_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + soap->errmode = 0; +#ifdef WITH_IPV6 + memset((void*)&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + hints.ai_socktype = SOCK_DGRAM; + else +#endif + hints.ai_socktype = SOCK_STREAM; + soap->errmode = 2; + if (soap->proxy_host) + err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); + else + err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); + if (err) + { soap_set_sender_error(soap, gai_strerror(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + ressave = res; +again: + fd = (int)socket(res->ai_family, res->ai_socktype, res->ai_protocol); + soap->errmode = 0; +#else +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + fd = (int)socket(AF_INET, SOCK_DGRAM, 0); + else +#endif + fd = (int)socket(AF_INET, SOCK_STREAM, 0); +#endif + if (fd < 0) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#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(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + else if (soap->connect_flags && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, soap->connect_flags, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + if (soap->keep_alive && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } +#endif +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Opening socket %d to host='%s' port=%d\n", fd, host, port)); +#ifndef WITH_IPV6 + soap->peerlen = sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->peer.sin_family = AF_INET; + soap->errmode = 2; + if (soap->proxy_host) + { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.sin_addr)) + { soap_set_sender_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + soap->peer.sin_port = htons((short)soap->proxy_port); + } + else + { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) + { soap_set_sender_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + soap->peer.sin_port = htons((short)port); + } + soap->errmode = 0; + if ((soap->omode & SOAP_IO_UDP)) + return fd; +#endif +#ifndef WITH_LEAN + if (soap->connect_timeout) +#if defined(WIN32) + { u_long nonblocking = 1; + ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking); + } +#elif defined(VXWORKS) + { u_long nonblocking = 1; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&nonblocking)); /* modified to use fd */ + } +#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); + } +#elif defined(VXWORKS) + { u_long blocking = 0; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&blocking)); + } +#else + fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK); +#endif +#endif + for (;;) + { +#ifdef WITH_IPV6 + if (connect((SOAP_SOCKET)fd, res->ai_addr, res->ai_addrlen)) +#else + if (connect((SOAP_SOCKET)fd, (struct sockaddr*)&soap->peer, sizeof(soap->peer))) +#endif + { +#ifndef WITH_LEAN + if (soap->connect_timeout && (soap_socket_errno(fd) == SOAP_EINPROGRESS || soap_socket_errno(fd) == SOAP_EWOULDBLOCK)) + { struct timeval timeout; + SOAP_SOCKLEN_T k; + 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; + } +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return SOAP_INVALID_SOCKET; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + FD_ZERO(&fds); + FD_SET((SOAP_SOCKET)fd, &fds); + for (;;) + { register 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", "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + r = soap_socket_errno(fd); + if (r != SOAP_EINTR) + { soap->errnum = r; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); + soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); + if (!getsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ + break; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); + if (!soap->errnum) + soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + else +#endif +#ifdef WITH_IPV6 + if (res->ai_next) + { res = res->ai_next; + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + goto again; + } + else +#endif + err = soap_socket_errno(fd); + if (err && err != SOAP_EINTR) + { soap->errnum = err; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); + soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + else + break; + } +#ifdef WITH_IPV6 + soap->peerlen = 0; /* IPv6: already connected so use send() */ + freeaddrinfo(ressave); +#endif +#ifndef WITH_LEAN + if (soap->connect_timeout) +#if defined(WIN32) + { u_long blocking = 0; + ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking); + } +#elif defined(VXWORKS) + { u_long blocking = 0; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&blocking)); + } +#else + fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK); +#endif +#endif + soap->socket = fd; + soap->imode &= ~SOAP_ENC_SSL; + soap->omode &= ~SOAP_ENC_SSL; + if (!soap_tag_cmp(endpoint, "https:*")) + { +#ifdef WITH_OPENSSL + BIO *bio; + 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 */ + char *userid, *passwd; + char endp[sizeof(soap->endpoint)]; + soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ + soap->omode |= SOAP_IO_BUFFER; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server\n", soap->proxy_http_version)); + sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->proxy_http_version); + if (soap_begin_send(soap) + || (soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL))) + { soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } +#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))) + { soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return soap->error; + } + } +#endif + if ((soap->error = soap->fposthdr(soap, NULL, NULL)) + || soap_flush(soap)) + { soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + soap->omode = k; + k = soap->imode; + soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ + strcpy(endp, soap->endpoint); + userid = soap->userid; /* preserve */ + passwd = soap->passwd; /* preserve */ + if ((soap->error = soap->fparse(soap))) + { soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + strcpy(soap->endpoint, endp); /* restore */ + soap->userid = userid; /* restore */ + soap->passwd = passwd; /* restore */ + soap->imode = k; /* restore */ + soap->count = n; /* restore */ + if (soap_begin_send(soap)) + { soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + 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); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + soap->ssl = SSL_new(soap->ctx); + if (!soap->ssl) + { soap->fclosesocket(soap, (SOAP_SOCKET)fd); + soap->error = SOAP_SSL_ERROR; + return SOAP_INVALID_SOCKET; + } + 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; + bio = BIO_new_socket((SOAP_SOCKET)fd, BIO_NOCLOSE); + SSL_set_bio(soap->ssl, bio, bio); +#ifndef WITH_LEAN + if (soap->connect_timeout) +#if defined(WIN32) + { u_long nonblocking = 1; + ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking); + } +#elif defined(VXWORKS) + { u_long nonblocking = 1; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&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, soap_ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + 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; + } +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return SOAP_INVALID_SOCKET; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + FD_ZERO(&fds); + FD_SET((SOAP_SOCKET)fd, &fds); + for (;;) + { int r = select((SOAP_SOCKET)(fd + 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", "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + continue; + } + } + break; + } +#ifndef WITH_LEAN + if (soap->connect_timeout) +#ifdef WIN32 + { u_long blocking = 0; + ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking); + } +#elif defined(VXWORKS) + { u_long blocking = 0; + ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&blocking)); + } +#else + fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK); +#endif +#endif + if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) + { int err; + // TODO: add callback to verify server + 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); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) + { X509_NAME *subj; + int ext_count; + int ok = 0; + X509 *peer; + 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); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + ext_count = X509_get_ext_count(peer); + if (ext_count > 0) + { int i; + for (i = 0; i < ext_count; i++) + { X509_EXTENSION *ext = X509_get_ext(peer, i); + const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); + if (ext_str && !strcmp(ext_str, "subjectAltName")) + { X509V3_EXT_METHOD *meth = X509V3_EXT_get(ext); + void *ext_data; + unsigned char *data; + STACK_OF(CONF_VALUE) *val; + int j; + if (!meth) + break; + data = ext->value->data; +#if (OPENSSL_VERSION_NUMBER > 0x00907000L) + if (meth->it) + ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); + else + { /* OpenSSL not perfectly portable at this point (?): + Some compilers appear to prefer + meth->d2i(NULL, (const unsigned char**)&data, ... + */ + ext_data = meth->d2i(NULL, &data, ext->value->length); + } +#else + ext_data = meth->d2i(NULL, &data, ext->value->length); +#endif + val = meth->i2v(meth, ext_data, NULL); + for (j = 0; j < sk_CONF_VALUE_num(val); j++) + { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); + if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) + { ok = 1; + break; + } + } + } + if (ok) + break; + } + } + if (!ok && (subj = X509_get_subject_name(peer))) + { int i = -1; + do + { ASN1_STRING *name; + i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); + if (i == -1) + break; + name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); + if (name && !soap_tag_cmp((const char*)name, host)) + ok = 1; + else + { unsigned char *tmp = NULL; + ASN1_STRING_to_UTF8(&tmp, name); + if (tmp) + { if (!soap_tag_cmp((const char*)tmp, host)) + ok = 1; + OPENSSL_free(tmp); + } + } + } while (!ok); + } + X509_free(peer); + if (!ok) + { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + return SOAP_INVALID_SOCKET; + } + } + } +#else + soap->fclosesocket(soap, (SOAP_SOCKET)fd); + soap->error = SOAP_SSL_ERROR; + return SOAP_INVALID_SOCKET; +#endif + } + return fd; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_bind(struct soap *soap, const char *host, int port, int backlog) +{ +#ifdef WITH_IPV6 + struct addrinfo *addrinfo = NULL; + struct addrinfo hints; + struct addrinfo res; + int err; +#endif +#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 SOAP_INVALID_SOCKET; + } +#ifdef WITH_IPV6 + memset((void*)&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + hints.ai_socktype = SOCK_DGRAM; + else +#endif + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + soap->errmode = 2; + err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); + if (addrinfo) + { res = *addrinfo; + soap->peer = *((struct sockaddr_storage*)addrinfo->ai_addr); + soap->peerlen = addrinfo->ai_addrlen; + res.ai_addr = (struct sockaddr*)&soap->peer; + res.ai_addrlen = soap->peerlen; + freeaddrinfo(addrinfo); + } + if (err) + { soap_set_receiver_error(soap, gai_strerror(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + soap->master = socket(res.ai_family, res.ai_socktype, res.ai_protocol); +#else +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); + else +#endif + soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); +#endif + soap->errmode = 0; + if (!soap_valid_socket(soap->master)) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + soap->socket = soap->master; +#endif +#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->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && setsockopt((SOAP_SOCKET)soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#endif +#endif +#ifdef WITH_IPV6 + soap->errmode = 0; + if (bind((SOAP_SOCKET)soap->master, res.ai_addr, res.ai_addrlen)) + { soap->errnum = soap_socket_errno(soap->master); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); + soap_closesock(soap); + soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#else + soap->peerlen = sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->peer.sin_family = AF_INET; + soap->errmode = 2; + if (host) + { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) + { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } + else + soap->peer.sin_addr.s_addr = htonl(INADDR_ANY); + soap->peer.sin_port = htons((short)port); + soap->errmode = 0; + if (bind((SOAP_SOCKET)soap->master, (struct sockaddr*)&soap->peer, soap->peerlen)) + { soap->errnum = soap_socket_errno(soap->master); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); + soap_closesock(soap); + soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#endif + if (!(soap->omode & SOAP_IO_UDP) && listen((SOAP_SOCKET)soap->master, backlog)) + { soap->errnum = soap_socket_errno(soap->master); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); + soap_closesock(soap); + soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + return soap->master; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_poll(struct soap *soap) +{ +#ifndef WITH_LEAN + struct timeval timeout; + fd_set rfd, sfd, xfd; + int r; + timeout.tv_sec = 0; + timeout.tv_usec = 0; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + FD_ZERO(&rfd); + FD_ZERO(&sfd); + FD_ZERO(&xfd); + if (soap_valid_socket(soap->socket)) + { FD_SET((SOAP_SOCKET)soap->socket, &rfd); + FD_SET((SOAP_SOCKET)soap->socket, &sfd); + FD_SET((SOAP_SOCKET)soap->socket, &xfd); + r = select((SOAP_SOCKET)(soap->socket + 1), &rfd, &sfd, &xfd, &timeout); + if (r > 0 && FD_ISSET((SOAP_SOCKET)soap->socket, &xfd)) + r = -1; + } + else if (soap_valid_socket(soap->master)) + { FD_SET((SOAP_SOCKET)soap->master, &sfd); + r = select((SOAP_SOCKET)(soap->master + 1), NULL, &sfd, NULL, &timeout); + } + else + return SOAP_OK; + if (r > 0) + { +#ifdef WITH_OPENSSL + if (soap->imode & SOAP_ENC_SSL) + { + if (soap_valid_socket(soap->socket) + && FD_ISSET((SOAP_SOCKET)soap->socket, &sfd) + && (!FD_ISSET((SOAP_SOCKET)soap->socket, &rfd) + || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) + return SOAP_OK; + } + else +#endif + if (soap_valid_socket(soap->socket) + && FD_ISSET((SOAP_SOCKET)soap->socket, &sfd) + && (!FD_ISSET((SOAP_SOCKET)soap->socket, &rfd) + || recv((SOAP_SOCKET)soap->socket, soap->tmpbuf, 1, MSG_PEEK) > 0)) + return SOAP_OK; + } + else if (r < 0) + { soap->errnum = soap_socket_errno(soap->master); + if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) + { 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 = 0; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); + return SOAP_EOF; +#else + return SOAP_OK; +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_accept(struct soap *soap, int s, struct sockaddr *a, int *n) +{ int fd; + fd = (int)accept((SOAP_SOCKET)s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ +#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 WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_accept(struct soap *soap) +{ int n = (int)sizeof(soap->peer); +#ifndef WITH_LEAN + int len = SOAP_BUFLEN; + int set = 1; +#endif + soap->error = SOAP_OK; +#ifdef WITH_UDP + if ((soap->omode & SOAP_IO_UDP)) + return soap->socket = soap->master; +#endif + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->socket = SOAP_INVALID_SOCKET; + soap->errmode = 0; + soap->keep_alive = 0; + if (soap_valid_socket(soap->master)) + { register int err; + 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; + } +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return SOAP_INVALID_SOCKET; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + FD_ZERO(&fd); + FD_SET((SOAP_SOCKET)soap->master, &fd); + for (;;) + { register 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", "accept failed in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + r = soap_socket_errno(soap->master); + if (r != SOAP_EINTR) + { soap->errnum = r; + soap_closesock(soap); + soap_set_sender_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } +#if defined(WIN32) + { u_long nonblocking = 1; + ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &nonblocking); + } +#elif defined(VXWORKS) + { u_long nonblocking = 1; + ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&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); + } +#elif defined(VXWORKS) + { u_long blocking = 0; + ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&blocking)); + } +#else + fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK); +#endif +#endif + soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&soap->peer, &n); + soap->peerlen = (size_t)n; + if (soap_valid_socket(soap->socket)) + { +#ifdef WITH_IPV6 +/* Use soap->host to store the numeric form of the remote host */ + getnameinfo((struct sockaddr*)&soap->peer, 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->peer and soap->host */ + soap->port = 0; /* info stored in soap->peer and soap->host */ +#else + soap->ip = ntohl(soap->peer.sin_addr.s_addr); + soap->port = (int)ntohs(soap->peer.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)); +#endif +#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->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + } + else if (soap->accept_flags && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, soap->accept_flags, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && setsockopt((SOAP_SOCKET)soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } +#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); +#elif defined(VXWORKS) + u_long blocking = 0; + ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&blocking)); + ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)(&blocking)); +#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 + } + soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); + return soap->socket; + } + err = soap_socket_errno(soap->socket); + if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); + soap->errnum = err; + soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + } + } + else + { soap->errnum = 0; + soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#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) && !(soap->omode & SOAP_IO_UDP)) + { 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 WITH_NOIO +#ifndef PALM_1 +static int +tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket %d\n", (int)fd)); + return soap_closesocket(fd); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket %d how=%d\n", (int)fd, 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; + if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) + { if (soap->fclose && (soap->error = soap->fclose(soap))) + return soap->error; + soap->keep_alive = 0; + } +#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 WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_init_pht(struct soap *soap) +{ register int i; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n")); + soap->pblk = NULL; + soap->pidx = 0; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->pht[i] = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new1(soap_mode mode) +{ return soap_new2(mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new() +{ return soap_new2(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new2(soap_mode imode, soap_mode omode) +{ struct soap *soap = (struct soap*)malloc(sizeof(struct soap)); + if (soap) + soap_init2(soap, imode, omode); + return soap; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_free(struct soap *soap) +{ soap_done(soap); + free(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_del(struct soap *soap) +{ free(soap); +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_free_pht(struct soap *soap) +{ register struct soap_pblk *pb, *next; + register int i; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); + for (pb = soap->pblk; pb; pb = next) + { next = pb->next; + SOAP_FREE(soap, pb); + } + soap->pblk = NULL; + soap->pidx = 0; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->pht[i] = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 size_t h; + register struct soap_plist *pp; + if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) + { register struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); + if (!pb) + { soap->error = SOAP_EOM; + return 0; + } + pb->next = soap->pblk; + soap->pblk = pb; + soap->pidx = 0; + } + *ppp = pp = &soap->pblk->plist[soap->pidx++]; + 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=%d\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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_begin_count(struct soap *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)) +#ifndef WITH_LEANER + && !soap->fpreparesend +#endif + )) + soap->mode &= ~SOAP_IO_LENGTH; + else + soap->mode |= SOAP_IO_LENGTH; + } +#ifdef WITH_ZLIB + 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; + } +#endif + if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) + soap->mode |= SOAP_XML_TREE; +#ifndef WITH_LEANER + if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) + soap->mode |= SOAP_ENC_MIME; + else + soap->mode &= ~SOAP_ENC_MTOM; + 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_clr_attr(soap); + soap_set_local_namespaces(soap); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); +#ifndef WITH_LEANER + soap->dime.count = 0; /* count # of attachments */ + soap->dime.size = 0; /* accumulate total size of attachments */ + if (soap->fprepareinit && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + return soap->error = soap->fprepareinit(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_end_count(struct soap *soap) +{ +#ifndef WITH_LEANER + if (soap->fpreparefinal) + return soap->error = soap->fpreparefinal(soap); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_begin_send(struct soap *soap) +{ soap->error = SOAP_OK; + soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); +#ifdef WITH_ZLIB + 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; + } +#endif +#ifdef WITH_UDP + if ((soap->mode & SOAP_IO_UDP)) + { soap->mode |= SOAP_ENC_XML; + if (soap->count > SOAP_BUFLEN) + return soap->error = SOAP_UDP_ERROR; + } +#endif + if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) + { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) + soap->mode |= SOAP_IO_BUFFER; + else + soap->mode |= SOAP_IO_STORE; + } + soap->mode &= ~SOAP_IO_LENGTH; + 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_MTOM) && (soap->mode & SOAP_ENC_DIME)) + { soap->mode |= SOAP_ENC_MIME; + soap->mode &= ~SOAP_ENC_DIME; + } + else + soap->mode &= ~SOAP_ENC_MTOM; + if (soap->mode & SOAP_ENC_MIME) + soap_select_mime_boundary(soap); +#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 +#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->idnum = 0; + soap->level = 0; + soap_clr_attr(soap); + soap_set_local_namespaces(soap); +#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=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); + soap->part = SOAP_BEGIN; +#ifndef WITH_LEANER + if (soap->fprepareinit && (soap->mode & SOAP_IO) == SOAP_IO_STORE) + soap->fprepareinit(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 || !a->__ptr) + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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; + if (soap->mode & SOAP_XML_TREE) + return id; + 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_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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_attachment(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; + int i; + 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:"")); + i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); + if (!i) + { i = soap_pointer_enter(soap, p, a, n, t, &pp); + if (!i) + { soap->error = SOAP_EOM; + return -1; + } + } + if (id <= 0) + id = i; + if (!aid) + { sprintf(soap->tmpbuf, soap->dime_id_format, id); + aid = soap_strdup(soap, soap->tmpbuf); + } + /* Add MTOM xop:Include element when necessary */ + /* TODO: this code to be obsoleted with new import/xop.h conventions */ + if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) + { if (soap_element_begin_out(soap, tag, 0, type) + || soap_element_href(soap, "xop:Include", 0, "href", aid) + || soap_element_end_out(soap, tag)) + return soap->error; + } + else 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; + if (soap->mode & SOAP_ENC_MTOM) + content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a->__ptr, a->__size); + else + content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size); + if (!content) + { soap->error = SOAP_EOM; + return -1; + } + if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ + { if (soap->mode & SOAP_ENC_MTOM) + { char *s = (char*)soap_malloc(soap, strlen(aid) - 1); + if (s) + { *s = '<'; + strcpy(s + 1, aid + 4); + strcat(s, ">"); + content->id = s; + } + } + else + content->id = aid + 4; + } + else + content->id = aid; + content->type = atype; + content->options = aoptions; + content->encoding = SOAP_MIME_BINARY; + pp->mark1 = 3; + } + } + else + pp->mark2 = 3; + return -1; +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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(soap, fp); + } + p = ip->next; + SOAP_FREE(soap, ip); + } + soap->iht[i] = NULL; + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +struct soap_ilist * +SOAP_FMAC2 +soap_lookup(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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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(soap, 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 +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_malloc(struct soap *soap, size_t n) +{ register char *p; + if (!n) + return (void*)SOAP_NON_NULL; + if (!soap) + return SOAP_MALLOC(soap, n); + if (soap->fmalloc) + p = (char*)soap->fmalloc(soap, n); + else + { n += sizeof(short); + n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ + if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)))) + { soap->error = SOAP_EOM; + return NULL; + } + /* set the canary to detect corruption */ + *(short*)(p + n - sizeof(short)) = (short)SOAP_CANARY; + /* keep chain of alloced cells for destruction */ + *(void**)(p + n) = soap->alist; + *(size_t*)(p + n + sizeof(void*)) = n; + soap->alist = p + n; + } + soap->alloced = 1; + return p; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +static void +soap_init_mht(struct soap *soap) +{ register int i; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->mht[i] = NULL; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +static void +soap_free_mht(struct soap *soap) +{ register int i; + register struct soap_mlist *mp, *mq; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + { for (mp = soap->mht[i]; mp; mp = mq) + { mq = mp->next; + if (mp->live) + fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); + free(mp); + } + soap->mht[i] = NULL; + } +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) +{ register void *p = malloc(size); + if (soap) + { register size_t h = soap_hash_ptr(p); + register struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); + if (soap->fdebug[SOAP_INDEX_TEST]) + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); + mp->next = soap->mht[h]; + mp->ptr = p; + mp->file = file; + mp->line = line; + mp->live = 1; + soap->mht[h] = mp; + } + return p; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_track_free(struct soap *soap, const char *file, int line, void *p) +{ register size_t h = soap_hash_ptr(p); + register struct soap_mlist *mp; + for (mp = soap->mht[h]; mp; mp = mp->next) + if (mp->ptr == p) + break; + if (mp) + { if (mp->live) + { free(p); + if (soap->fdebug[SOAP_INDEX_TEST]) + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); + mp->live = 0; + } + else + fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); + } + else + fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +static void +soap_track_unlink(struct soap *soap, const void *p) +{ register size_t h = soap_hash_ptr(p); + register struct soap_mlist *mp; + for (mp = soap->mht[h]; mp; mp = mp->next) + if (mp->ptr == p) + break; + if (mp) + mp->live = 0; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_dealloc(struct soap *soap, void *p) +{ if (soap_check_state(soap)) + return; + if (p) + { register char **q; + for (q = (char**)&soap->alist; *q; q = *(char***)q) + { + if (*(short*)(char*)(*q - sizeof(short)) != (short)SOAP_CANARY) + { fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); + DBGHEX(TEST, *q - 200, 200); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); + soap->error = SOAP_MOE; + return; + } + 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(soap, p); + return; + } + } + soap_delete(soap, p); + } + else + { register char *q; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); + while (soap->alist) + { q = (char*)soap->alist; + if (*(short*)(char*)(q - sizeof(short)) != (short)SOAP_CANARY) + { fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); + DBGHEX(TEST, q - 200, 200); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); + soap->error = SOAP_MOE; + return; + } + soap->alist = *(void**)q; + q -= *(size_t*)(q + sizeof(void*)); + SOAP_FREE(soap, q); + } + } + /* we must assume these were deallocated: */ + soap->action = NULL; + soap->fault = NULL; + soap->header = NULL; + soap->userid = NULL; + soap->passwd = 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; + if (soap_check_state(soap)) + return; + 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(soap, 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; + q->fdelete(q); + SOAP_FREE(soap, 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(soap, 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)); +#ifdef SOAP_DEBUG + soap_track_unlink(soap, p); +#endif + 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(soap, q); + return; + } + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#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 (!p || !id || !*id) + return p; + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, size_t, 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(soap, 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; + fp->len = len; + 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 len=%lu href='%s'\n", st, tt, (unsigned long)n, p, k, (unsigned long)len, 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 +#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*)) +{ +#ifndef WITH_NOIDREF + struct soap_ilist *ip; +#endif + 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; + } +#ifndef WITH_NOIDREF + if (!id || !*id) +#endif + return p; +#ifndef WITH_NOIDREF + 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_DUPLICATE_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 +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t len, 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; +#ifndef WITH_NOHTTP + 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++; + } +#endif + 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); + } +#ifndef WITH_LEANER + 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_TCPFIN +#ifdef WITH_OPENSSL + if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) + soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */ +#else + if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) + soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */ +#endif +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); + soap->omode &= ~SOAP_XML_SEC; + soap->count = 0; + soap->part = SOAP_END; + 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_DIME) && soap_getdime(soap)) + return soap->error; + soap->dime.list = soap->dime.first; + soap->dime.first = NULL; + soap->dime.last = NULL; + /* Check if MIME attachments and mime-post-check flag is set, if set call soap_resolve() and return */ + if (soap->mode & SOAP_ENC_MIME) + { if (soap->mode & SOAP_MIME_POSTCHECK) + { soap_resolve(soap); + return SOAP_OK; + } + if (soap_getmime(soap)) + return soap->error; + } + soap->mime.list = soap->mime.first; + soap->mime.first = NULL; + soap->mime.last = NULL; + soap->mime.boundary = NULL; + if (soap->xlist) + { struct soap_multipart *content; + for (content = soap->mime.list; content; content = content->next) + soap_resolve_attachment(soap, content); + } +#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; +#ifndef WITH_NOIDREF + if (soap_resolve(soap)) + return soap->error; +#endif +#ifndef WITH_LEANER + if (soap->xlist) + { if (soap->mode & SOAP_ENC_MTOM) + return soap->error = SOAP_MIME_HREF; + return soap->error = SOAP_DIME_HREF; + } +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_free_temp(struct soap *soap) +{ register struct Namespace *ns; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); + while (soap->nlist) + { register struct soap_nlist *np = soap->nlist->next; + SOAP_FREE(soap, 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 attribute storage\n")); + while (soap->attributes) + { register struct soap_attribute *tp = soap->attributes->next; + if (soap->attributes->value) + SOAP_FREE(soap, soap->attributes->value); + SOAP_FREE(soap, soap->attributes); + soap->attributes = tp; + } +#ifdef WITH_FAST + if (soap->labbuf) + SOAP_FREE(soap, soap->labbuf); + soap->labbuf = NULL; + soap->lablen = 0; + soap->labidx = 0; +#endif + ns = soap->local_namespaces; + if (ns) + { for (; ns->id; ns++) + { if (ns->out) + { if (soap->encodingStyle == ns->out) + soap->encodingStyle = SOAP_STR_EOS; + SOAP_FREE(soap, ns->out); + ns->out = NULL; + } + if (soap->encodingStyle == ns->ns) + soap->encodingStyle = SOAP_STR_EOS; + } + SOAP_FREE(soap, soap->local_namespaces); + soap->local_namespaces = NULL; + } +#ifndef WITH_LEANER + while (soap->xlist) + { struct soap_xlist *xp = soap->xlist->next; + SOAP_FREE(soap, soap->xlist); + soap->xlist = xp; + } +#endif +#ifndef WITH_NOIDREF + soap_free_pht(soap); + soap_free_iht(soap); +#endif +} +#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(soap, (void*)soap->logfile[i]); + if (logfile) + if ((s = (char*)SOAP_MALLOC(soap, 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*)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 (soap_check_state(soap)) + return NULL; + if (copy) + { register struct soap_plugin *p; + memcpy(copy, soap, sizeof(struct soap)); + copy->state = SOAP_COPY; + copy->error = SOAP_OK; + copy->userid = NULL; + copy->passwd = NULL; + copy->nlist = NULL; + copy->blist = NULL; + copy->clist = NULL; + copy->alist = NULL; + copy->attributes = NULL; + copy->labbuf = NULL; + copy->lablen = 0; + copy->labidx = 0; +#ifdef SOAP_DEBUG + soap_init_mht(copy); +#endif + copy->local_namespaces = NULL; +#ifndef WITH_NOIDREF + soap_init_iht(copy); + soap_init_pht(copy); +#endif + copy->header = NULL; + copy->fault = NULL; + copy->action = NULL; +#ifndef WITH_LEAN +#ifdef WITH_COOKIES + copy->cookies = soap_copy_cookies(copy, soap); +#else + copy->cookies = NULL; +#endif +#endif +#ifdef SOAP_DEBUG + soap_init_logs(copy); + soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); + soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); + soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); +#endif + copy->plugins = NULL; + for (p = soap->plugins; p; p = p->next) + { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, 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(copy, q, p))) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s'\n", p->id)); + SOAP_FREE(copy, 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_copy_stream(struct soap *copy, struct soap *soap) +{ copy->mode = soap->mode; + copy->imode = soap->imode; + copy->omode = soap->omode; + copy->socket = soap->socket; + copy->recv_timeout = soap->recv_timeout; + copy->send_timeout = soap->send_timeout; +#if defined(__cplusplus) && !defined(WITH_LEAN) + copy->os = soap->os; + copy->is = soap->is; +#endif + copy->sendfd = soap->sendfd; + copy->recvfd = soap->recvfd; + copy->bufidx = soap->bufidx; + copy->buflen = soap->buflen; + copy->ahead = soap->ahead; + copy->cdata = soap->cdata; + copy->chunksize = soap->chunksize; + copy->chunkbuflen = soap->chunkbuflen; + copy->keep_alive = soap->keep_alive; + copy->max_keep_alive = soap->max_keep_alive; +#ifndef WITH_NOIO + copy->peer = soap->peer; + copy->peerlen = soap->peerlen; +#endif +#ifdef WITH_OPENSSL + copy->bio = soap->bio; + copy->ssl = soap->ssl; + copy->ctx = soap->ctx; +#endif +#ifdef WITH_ZLIB + copy->zlib_state = soap->zlib_state; + copy->zlib_in = soap->zlib_in; + copy->zlib_out = soap->zlib_out; + copy->d_stream = soap->d_stream; + copy->z_buflen = soap->z_buflen; + copy->z_level = soap->z_level; + copy->z_crc = soap->z_crc; + copy->z_ratio_in = soap->z_ratio_in; + copy->z_ratio_out = soap->z_ratio_out; + memcpy(copy->z_buf, soap->z_buf, sizeof(soap->z_buf)); +#endif + memcpy(copy->buf, soap->buf, sizeof(soap->buf)); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init(struct soap *soap) +{ soap->state = SOAP_INIT; + soap->version = 0; + soap_imode(soap, SOAP_IO_DEFAULT); + soap_omode(soap, SOAP_IO_DEFAULT); + soap->plugins = NULL; + soap->user = NULL; + soap->userid = NULL; + soap->passwd = NULL; +#ifndef WITH_NOHTTP + soap->fpost = http_post; + soap->fget = http_get; + soap->fform = NULL; + soap->fposthdr = http_post_header; + soap->fresponse = http_response; + soap->fparse = http_parse; + soap->fparsehdr = http_parse_header; +#endif + soap->fheader = NULL; + soap->fconnect = NULL; + soap->fdisconnect = NULL; +#ifndef WITH_NOIO +#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->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif + soap->fseterror = NULL; + soap->fignore = NULL; + soap->fserveloop = NULL; + soap->fplugin = fplugin; + soap->fmalloc = NULL; +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; + soap->fpreparefinal = NULL; + soap->fdimereadopen = NULL; + soap->fdimewriteopen = NULL; + soap->fdimereadclose = NULL; + soap->fdimewriteclose = NULL; + soap->fdimeread = NULL; + soap->fdimewrite = NULL; + soap->fmimereadopen = NULL; + soap->fmimewriteopen = NULL; + soap->fmimereadclose = NULL; + soap->fmimewriteclose = NULL; + soap->fmimeread = NULL; + soap->fmimewrite = NULL; +#endif + soap->float_format = "%G"; + soap->double_format = "%lG"; + soap->dime_id_format = "cid:id%d"; /* default DIME id format */ + soap->http_version = "1.1"; + soap->proxy_http_version = "1.0"; + soap->http_content = NULL; + 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; +#ifndef WITH_LEANER + 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; + soap->xlist = NULL; +#endif +#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 + if (!ssl_init_done) + soap_ssl_init(); + soap->fsslauth = ssl_auth_init; + soap->fsslverify = ssl_verify_callback; + soap->bio = NULL; + soap->ssl = NULL; + soap->ctx = NULL; + soap->ssl_flags = SOAP_SSL_DEFAULT; + soap->keyfile = NULL; + soap->password = NULL; + soap->dhfile = NULL; + soap->cafile = NULL; + soap->capath = NULL; + soap->crlfile = 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->c14ninclude = NULL; + soap->c14nexclude = NULL; + soap->cookies = NULL; + soap->cookie_domain = NULL; + soap->cookie_path = NULL; + soap->cookie_max = 32; +#endif +#ifdef SOAP_DEBUG + soap_init_mht(soap); + soap_init_logs(soap); +#endif +#ifdef WMW_RPM_IO + soap->rpmreqid = NULL; +#endif +#ifdef PALM + palmNetLibOpen(); +#endif +#ifndef WITH_NOIDREF + soap_init_iht(soap); + soap_init_pht(soap); +#endif +#ifdef SOAP_DEBUG + soap_set_recv_logfile(soap, "RECV.log"); + soap_set_sent_logfile(soap, "SENT.log"); + soap_set_test_logfile(soap, "TEST.log"); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing context\n")); +#endif + soap_begin(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init1(struct soap *soap, soap_mode mode) +{ soap_init2(soap, mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init2(struct soap *soap, soap_mode imode, soap_mode 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, "Reinitializing context\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_END; + 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'; +#ifndef WITH_LEANER + soap->dime.chunksize = 0; + soap->dime.buflen = 0; +#endif + soap_free_temp(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_end(struct soap *soap) +{ register struct soap_clist *cp; + if (soap_check_state(soap)) + return; + soap_free_temp(soap); + soap_dealloc(soap, NULL); + while (soap->clist) + { cp = soap->clist->next; + SOAP_FREE(soap, 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, const struct Namespace *p) +{ register struct Namespace *ns = soap->local_namespaces; + register struct soap_nlist *np, *nq, *nr; + register unsigned int level = soap->level; + soap->namespaces = p; + soap->local_namespaces = NULL; + soap_set_local_namespaces(soap); + /* reverse the namespace 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; + } + } + /* then push on new stack */ + while (np) + { register const char *s; + soap->level = np->level; /* preserve element nesting level */ + s = np->ns; + if (!s && np->index >= 0 && ns) + { s = ns[np->index].out; + if (!s) + s = ns[np->index].ns; + } + if (s && soap_push_namespace(soap, np->id, s)) + return soap->error; + nq = np; + np = np->next; + SOAP_FREE(soap, nq); + } + if (ns) + { register int i; + for (i = 0; ns[i].id; i++) + { if (ns[i].out) + { SOAP_FREE(soap, ns[i].out); + ns[i].out = NULL; + } + } + SOAP_FREE(soap, ns); + } + soap->level = level; /* restore level */ + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +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++; + n *= sizeof(struct Namespace); + ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); + if (ns2) + { memcpy(ns2, soap->namespaces, n); + if (ns2[0].ns) + { if (!strcmp(ns2[0].ns, soap_env1)) + soap->version = 1; + else + soap->version = 2; + } + soap->local_namespaces = ns2; + } + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +#ifndef PALM_1 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_strsearch(const char *big, const char *little) +{ size_t n = strlen(little); + const char *s = big; + while (s) + { if (!strncmp(s, little, n) && (s[n] == '\0' || s[n] == ' ')) + return s; + s = strchr(s, ' '); + if (s) + s++; + } + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +#ifndef PALM_1 +SOAP_FMAC1 +struct soap_nlist * +SOAP_FMAC2 +soap_lookup_ns(struct soap *soap, const char *tag, size_t n) +{ register struct soap_nlist *np; + for (np = soap->nlist; np; np = np->next) + { if (!strncmp(np->id, tag, n) && !np->id[n]) + return np; + } + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static struct soap_nlist * +soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) +{ register struct soap_nlist *np; + size_t n, k; + if (soap_strsearch(soap->c14nexclude, id)) + return NULL; + if (!utilized) + { for (np = soap->nlist; np; np = np->next) + { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) + break; + } + if (np) + { if ((np->level < soap->level || !np->ns) && np->index == 1) + utilized = 1; + else + return NULL; + } + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns?ns:"(null)", utilized)); + n = strlen(id); + if (ns) + k = strlen(ns); + else + k = 0; + np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); + if (!np) + { soap->error = SOAP_EOM; + return NULL; + } + np->next = soap->nlist; + soap->nlist = np; + strcpy(np->id, id); + if (ns) + { np->ns = np->id + n + 1; + strcpy(np->ns, ns); + } + else + np->ns = NULL; + np->level = soap->level; + np->index = utilized; + return np; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static void +soap_utilize_ns(struct soap *soap, const char *tag, size_t n) +{ register struct soap_nlist *np = soap_lookup_ns(soap, tag, n); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); + if (np) + { if (np->index == 0) + soap_push_ns(soap, np->id, np->ns, 1); + } + else if (strncmp(tag, "xml", 3)) + { strncpy(soap->tmpbuf, tag, n); + soap->tmpbuf[n] = '\0'; + soap_push_ns(soap, soap->tmpbuf, NULL, 1); + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static void +soap_pop_ns(struct soap *soap) +{ soap_pop_namespace(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element(struct soap *soap, const char *tag, int id, const char *type) +{ +#ifdef WITH_XMLNS + register const char *s; +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:"")); +#ifdef WITH_DOM + if (soap->part == SOAP_BEGIN_SECURITY && (soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) + { register struct soap_nlist *np; + /* wsu:Id found: clear xmlns renderings, so re-emit them for exc-c14n */ + for (np = soap->nlist; np; np = np->next) + { if (np->index == 2) + np->index = 0; + } + } + if (soap->mode & SOAP_XML_DOM) + { register struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); + if (!elt) + return soap->error = SOAP_EOM; + elt->soap = soap; + elt->next = NULL; + elt->prnt = soap->dom; + elt->name = soap_strdup(soap, tag); + elt->elts = NULL; + elt->atts = NULL; + elt->nstr = NULL; + elt->data = NULL; + elt->wide = NULL; + elt->node = NULL; + elt->type = 0; + elt->head = NULL; + elt->tail = NULL; + if (soap->dom) + { struct soap_dom_element *p = soap->dom->elts; + if (p) + { while (p->next) + p = p->next; + p->next = elt; + } + else + soap->dom->elts = elt; + } + soap->dom = elt; + } + else + { +#endif + soap->level++; +#ifndef WITH_LEAN + if (!soap->ns) + { if (!(soap->mode & SOAP_XML_CANONICAL) + && soap_send(soap, soap->prolog ? soap->prolog : "\n")) + return soap->error; + } + else if (soap->mode & SOAP_XML_INDENT) + { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) + return soap->error; + soap->body = 1; + } +#endif +#ifdef WITH_XMLNS + s = strchr(tag, ':'); + if (s && strncmp(tag, "SOAP-ENV", s - tag)) + { struct Namespace *ns = soap->local_namespaces; + size_t n = s - tag; + if (soap_send_raw(soap, "<", 1) + || soap_send(soap, s + 1)) + return soap->error; + if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) + ns = NULL; + for (; ns && ns->id; ns++) + { if (*ns->id && (ns->out || ns->ns) && !strncmp(ns->id, tag, n) && !ns->id[n]) + { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); + if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) + return soap->error; + break; + } + } + } + else +#endif + if (soap_send_raw(soap, "<", 1) + || soap_send(soap, tag)) + return soap->error; +#ifdef WITH_DOM + } +#endif + if (!soap->ns) + { struct Namespace *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; /* start with 0 or 2, but should be one to continue */ +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { const char *t = strchr(tag, ':'); + if (t) + soap_utilize_ns(soap, tag, t - tag); + } +#endif + if (id > 0) + { sprintf(soap->tmpbuf, "_%d", id); + if (soap_attribute(soap, "id", soap->tmpbuf)) + return soap->error; + } + if (type && *type && (!(soap->mode & SOAP_XML_SEC) || soap->part == SOAP_IN_BODY)) + { if (soap_attribute(soap, "xsi:type", type)) + return soap->error; +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { const char *t = strchr(type, ':'); + if (t) + soap_utilize_ns(soap, type, t - type); + } +#endif + } + if (soap->null && soap->position > 0) + { register 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; + if (soap->part == SOAP_BEGIN_SECURITY && (soap->mode & SOAP_XML_CANONICAL)) + soap->part = SOAP_IN_SECURITY; + 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 && (n > 214748364 || c >= '8')) + 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 && (n > 429496729 || c >= '6')) + 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; + } +#ifndef WITH_LEAN + if (type && *type && (soap->mode & SOAP_XML_CANONICAL)) + { const char *s = strchr(type, ':'); + if (s) + soap_utilize_ns(soap, type, s - type); + } +#endif + 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; +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { struct soap_nlist *np; + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible && tp->name) + { const char *s = strchr(tp->name, ':'); + if (s) + soap_utilize_ns(soap, tp->name, s - tp->name); + } + } + for (np = soap->nlist; np; np = np->next) + { if (np->index == 1 && np->ns) + { sprintf(soap->tmpbuf, "xmlns:%s", np->id); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s'\n", np->level, soap->tmpbuf, np->ns)); + soap_set_attr(soap, soap->tmpbuf, np->ns); + np->index = 2; + } + } + } +#endif +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { register struct soap_dom_attribute **att; + att = &soap->dom->atts; + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); + if (!*att) + return soap->error = SOAP_EOM; + (*att)->next = NULL; + (*att)->nstr = NULL; + (*att)->name = soap_strdup(soap, tp->name); + (*att)->data = soap_strdup(soap, tp->value); + (*att)->wide = NULL; + (*att)->soap = soap; + att = &(*att)->next; + tp->visible = 0; + } + } + return SOAP_OK; + } +#endif + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { +#ifdef WITH_XMLNS + const char *s = strchr(tp->name, ':'); + if (s) + { size_t n = s - tp->name; + if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) + s++; + else + s = tp->name; + if (soap_send(soap, " ") || soap_send(soap, s)) + return soap->error; + } + else +#endif + if (soap_send(soap, " ") || 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) + { +#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 + soap->level--; /* decrement level just before /> */ + if (soap_send_raw(soap, "/>", 2)) + return soap->error; + return SOAP_OK; + } + 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 +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + soap_pop_ns(soap); + if (soap->mode & SOAP_XML_INDENT) + { if (!soap->body) + { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) + return soap->error; + } + soap->body = 0; + } +#endif +#ifdef WITH_XMLNS + { const char *s = strchr(tag, ':'); + if (s && strncmp(tag, "SOAP-ENV", s - tag)) + { soap_pop_ns(soap); + tag = s + 1; + } + } +#endif + if (soap_send_raw(soap, "error; + soap->level--; /* decrement level just before > */ + 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; + const char *s = "href"; + if (soap->version == 2) + { s = "SOAP-ENC:ref"; + n = 1; + } + sprintf(soap->href, "#_%d", href); + return soap_element_href(soap, tag, id, s, 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) +{ if (!p || (a && !a->__ptr)) + { soap_element_null(soap, tag, id, type); + return -1; + } +#ifndef WITH_NOIDREF + if (soap->mode & SOAP_XML_TREE) + return 0; + if (id < 0) + { struct soap_plist *pp; + 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; +#else + return 0; +#endif +} +#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_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_check_result(struct soap *soap, const char *tag) +{ if (soap->version == 2 && soap->encodingStyle) + { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1); + /* should compare tag to element's QName value? */ + } +} +#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->mode & SOAP_XML_CANONICAL) && 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); + a->data = soap_strdup(soap, value); + a->wide = NULL; + a->soap = soap; + soap->dom->atts = a; + return SOAP_OK; + } +#endif +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { /* TODO: consider using this code to handle default namespace bindings + if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) + { if (name[5] == ':') + soap_push_ns(soap, name + 6, value, 0); + else + soap_push_ns(soap, "", value, 0); + } + */ + if (!strncmp(name, "xmlns:", 6)) + soap_push_ns(soap, name + 6, value, 0); + else if (soap_set_attr(soap, name, value)) + return soap->error; + } + else +#endif + { if (soap_send(soap, " ") || 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, int nillable, const char *type) +{ 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; + if (type && *soap->type && soap_match_tag(soap, soap->type, type)) + return soap->error = SOAP_TYPE; + } + } + else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') + soap->error = SOAP_OK; + 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; + register int n = 0; + if (tag && *tag == '-') + return SOAP_OK; + soap->level--; + soap_pop_namespace(soap); +#ifdef WITH_DOM + /* this whitespace or mixed content is not insignificant for DOM */ + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (!soap->peeked && !soap_string_in(soap, 3, -1, -1)) + return soap->error; + if (soap->dom->prnt) + soap->dom = soap->dom->prnt; + } +#endif + if (soap->peeked) + { if (soap->error == SOAP_NO_TAG) + soap->error = SOAP_OK; + if (*soap->tag) + n++; + soap->peeked = 0; + } + do + { while (((c = soap_get(soap)) != SOAP_TT)) + { if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (c == SOAP_LT) + n++; + else if (c == '/') + { c = soap_get(soap); + if (c == SOAP_GT) + n--; + else + soap_unget(soap, c); + } + } + } while (n--); + s = soap->tag; + n = sizeof(soap->tag); + while (soap_notblank(c = soap_get(soap))) + { if (--n > 0) + *s++ = (char)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 || !*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 (tp->visible && !soap_match_tag(soap, tp->name, name)) + break; + } + if (tp) + { 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(soap, 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, ':'); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", 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 (tp->visible) + { return SOAP_OK; + } + 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(soap, tp->value); + tp->value = NULL; + tp->ns = NULL; + } + if (value) + { if (!tp->value) + { tp->size = strlen(value) + 1; + if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) + return soap->error = SOAP_EOM; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); + } + strcpy(tp->value, value); + if (!strncmp(tp->name, "xmlns:", 6)) + tp->ns = tp->value; + tp->visible = 2; +#ifndef WITH_LEAN + if (!strcmp(name, "wsu:Id")) + { soap->part = SOAP_BEGIN_SECURITY; + strncpy(soap->id, value, sizeof(soap->id)); + soap->id[sizeof(soap->id)-1] = '\0'; + } +#endif + } + 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; + if (soap->attributes->value) + SOAP_FREE(soap, soap->attributes->value); + SOAP_FREE(soap, 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) +{ register size_t i; + for (i = 0; i < n; i++) + { register soap_wchar c = soap_get(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 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_store_lab(struct soap *soap, const char *s, size_t n) +{ soap->labidx = 0; + return soap_append_lab(soap, s, n); +} +#endif +#endif + +/******************************************************************************/ +#ifdef WITH_FAST +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +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, soap->lablen); + if (!soap->labbuf) + { if (t) + SOAP_FREE(soap, t); + return soap->error = SOAP_EOM; + } + if (t) + { memcpy(soap->labbuf, t, soap->labidx); + SOAP_FREE(soap, 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) +{ +#ifdef WITH_DOM + register struct soap_dom_attribute **att = NULL; + register char *lead = NULL; +#endif + register struct soap_attribute *tp; + const char *t; + register char *s; + register soap_wchar c; + register int i; + if (soap->peeked) + { if (!*soap->tag) + return soap->error = SOAP_NO_TAG; + return SOAP_OK; + } + soap->peeked = 1; + c = soap_getutf8(soap); +#ifdef WITH_DOM + /* whitespace leading to start tag is not insignificant for DOM */ + if (soap_blank(c)) + { soap->labidx = 0; + do + { if (soap_append_lab(soap, NULL, 0)) + return SOAP_EOM; + s = soap->labbuf + soap->labidx; + i = soap->lablen - soap->labidx; + soap->labidx = soap->lablen; + while (soap_blank(c) && i--) + { *s++ = c; + c = soap_getutf8(soap); + } + } + while (soap_blank(c)); + *s = '\0'; + lead = soap_strdup(soap, soap->labbuf); + } +#else + while (soap_blank(c)) + c = soap_getutf8(soap); +#endif + if (c != SOAP_LT) + { *soap->tag = '\0'; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + soap_unget(soap, c); +#ifdef WITH_DOM + /* whitespace leading to end tag is not insignificant for DOM */ + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->tail = soap_strdup(soap, lead); +#endif + return soap->error = SOAP_NO_TAG; + } + s = soap->tag; + do c = soap_get1(soap); + while (soap_blank(c)); + i = sizeof(soap->tag); + while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) + { if (--i > 0) + *s++ = (char)c; + c = soap_get1(soap); + } + while (soap_blank(c)) + c = soap_get1(soap); + *s = '\0'; + 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; +#ifdef WITH_DOM + if (soap->mode & SOAP_XML_DOM) + { register struct soap_dom_element *elt; + elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); + if (!elt) + return soap->error = SOAP_EOM; + elt->next = NULL; + elt->nstr = NULL; + elt->name = soap_strdup(soap, soap->tag); + elt->prnt = soap->dom; + elt->elts = NULL; + elt->atts = NULL; + elt->data = NULL; + elt->wide = NULL; + elt->type = 0; + elt->node = NULL; + elt->head = lead; + elt->tail = NULL; + elt->soap = soap; + if (soap->dom) + { struct soap_dom_element *p = soap->dom->elts; + if (p) + { while (p->next) + p = p->next; + p->next = elt; + } + else + soap->dom->elts = elt; + } + soap->dom = elt; + att = &elt->atts; + } +#endif + for (tp = soap->attributes; tp; tp = tp->next) + tp->visible = 0; + while ((int)c != EOF && c != '>' && c != '/') + { s = soap->tmpbuf; + i = sizeof(soap->tmpbuf); + while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) + { if (--i > 0) + *s++ = (char)c; + c = soap_get1(soap); + } + *s = '\0'; + if (i == sizeof(soap->tmpbuf)) + return soap->error = SOAP_SYNTAX_ERROR; +#ifdef WITH_DOM + /* add attribute name to dom */ + if (att) + { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); + if (!*att) + return soap->error = SOAP_EOM; + (*att)->next = NULL; + (*att)->nstr = NULL; + (*att)->name = soap_strdup(soap, soap->tmpbuf); + (*att)->data = NULL; + (*att)->wide = NULL; + (*att)->soap = soap; + } +#endif + if (!strncmp(soap->tmpbuf, "xmlns", 5)) + { if (soap->tmpbuf[5] == ':') + { soap->tmpbuf[5] = '\0'; + t = soap->tmpbuf + 6; + } + else if (soap->tmpbuf[5]) + t = NULL; + else + 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(soap, 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_get1(soap); + if (c == '=') + { do c = soap_getutf8(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; + if (soap_store_lab(soap, tp->value, tp->size)) + return soap->error; + if (tp->value) + SOAP_FREE(soap, 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; + } + if (soap->labidx) + tp->size = soap->lablen; + else + { tp->size = strlen(soap->labbuf) + 1; + if (tp->size < SOAP_LABLEN) + tp->size = SOAP_LABLEN; + } + if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) + return soap->error = SOAP_EOM; + strcpy(tp->value, soap->labbuf); +#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(soap, n))) + return soap->error = SOAP_EOM; + if (tp->value) + { memcpy(s, tp->value, tp->size); + SOAP_FREE(soap, tp->value); + } + soap_save_block(soap, s + tp->size, 0); + tp->value = s; + tp->size = n; +#endif + } + do c = soap_get1(soap); + while (soap_blank(c)); + tp->visible = 2; /* seen this attribute w/ value */ +#ifdef WITH_DOM + if (att) + (*att)->data = soap_strdup(soap, tp->value); +#endif + } + else + tp->visible = 1; /* seen this attribute w/o value */ +#ifdef WITH_DOM + if (att) + att = &(*att)->next; +#endif + if (t && tp->value) + { if (soap_push_namespace(soap, t, tp->value)) + return soap->error; + tp->visible = 0; + } + } +#ifdef WITH_DOM + if (att) + { soap->dom->nstr = soap_current_namespace(soap, soap->tag); + for (att = &soap->dom->atts; *att; att = &(*att)->next) + (*att)->nstr = soap_current_namespace(soap, (*att)->name); + } +#endif + if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (!(soap->body = (c != '/'))) + do c = soap_get1(soap); + while (soap_blank(c)); +#ifdef WITH_DOM + if (soap->mode & SOAP_XML_DOM) + { if (!soap->body && soap->dom->prnt) + soap->dom = soap->dom->prnt; + } +#endif + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible && tp->value) + { if (!strcmp(tp->name, "id")) + { if (soap->version > 0 + || (soap->mode & SOAP_XML_GRAPH)) + { *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")) + { if (soap->version == 1 + || (soap->mode & SOAP_XML_GRAPH) + || (soap->mode & SOAP_ENC_MTOM)) + { strncpy(soap->href, tp->value, sizeof(soap->href) - 1); + 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_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; + } + else if (soap->version == 1) + { if (!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_match_tag(soap, tp->name, "SOAP-ENC:offset")) + strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset)); + else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) + soap->position = soap_getposition(tp->value, soap->positions); + else if (!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:mustUnderstand") + && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) + soap->mustUnderstand = 1; + else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) + { if ((!soap->actor || strcmp(soap->actor, tp->value)) + && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) + soap->other = 1; + } + } + else if (soap->version == 2) + { if (!strcmp(tp->name, "ref") + || !soap_match_tag(soap, tp->name, "SOAP-ENC: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, "SOAP-ENC:itemType")) + strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1); + else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) + strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 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, "SOAP-ENV:role")) + { if ((!soap->actor || strcmp(soap->actor, tp->value)) + && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) + soap->other = 1; + } + } + } + } + return soap->error = SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_retry(struct soap *soap) +{ soap->error = SOAP_OK; + soap_revert(soap); +} +#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 = 0xFFFFFF80UL; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_strdup(soap, s); + return SOAP_OK; + } +#endif + if (soap->mode & SOAP_C_UTFSTRING) + mask = 0; + t = s; + while ((c = *t++)) + { switch (c) + { + case 0x09: + if (flag) + { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) + return soap->error; + s = t; + } + break; + case 0x0A: + 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 0x0D: + 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: +#ifndef WITH_LEANER +#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 +#endif + if ((c & mask) || !(c & 0xFFFFFFE0UL)) + { 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; +#if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) + char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; +#else + char buf[8]; +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content\n")); + if (soap->peeked) + { if (!soap->body) + return NULL; + if (*soap->tag) + { n = 1; + soap->peeked = 0; +#ifndef WITH_LEAN + t = soap->tmpbuf; + t[0] = '<'; + strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 1); + strncat(t, ">", sizeof(soap->tmpbuf)); + m = strlen(soap->tag) + 2; +#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: +#ifndef WITH_LEANER +#ifdef HAVE_WCTOMB + if (soap->mode & SOAP_C_MBSTRING) + { m = wctomb(buf, c & 0x7FFFFFFF); + if (m >= 1 && m <= (int)MB_CUR_MAX) + { t = buf; + *s++ = *t++; + m--; + } + else + { *s++ = SOAP_UNKNOWN_CHAR; + m = 0; + } + } + else +#endif +#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*)"amp;"; + m = 4; + } + 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; +#ifndef WITH_LEANER +#ifdef HAVE_WCTOMB + if (soap->mode & SOAP_C_MBSTRING) + { m = wctomb(buf, c & 0x7FFFFFFF); + if (m >= 1 && m <= (int)MB_CUR_MAX) + { t = buf; + *s++ = *t++; + m--; + } + else + { *s++ = SOAP_UNKNOWN_CHAR; + m = 0; + } + } + else +#endif +#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; + } +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (flag == 3) + soap->dom->tail = t; + else + soap->dom->data = t; + } +#endif + if (flag == 2) + if (soap_s2QName(soap, t, &t)) + return NULL; + return t; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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) + { wchar_t *r = (wchar_t*)s; + int n = 1; + while (*r++) + n++; + soap->dom->wide = r = (wchar_t*)soap_malloc(soap, n * sizeof(wchar_t)); + while (n--) + *r++ = *s++; + return SOAP_OK; + } +#endif + while ((c = *s++)) + { switch (c) + { + case 0x09: + if (flag) + t = " "; + else + t = "\t"; + break; + case 0x0A: + if (flag || !(soap->mode & SOAP_XML_CANONICAL)) + t = " "; + else + t = "\n"; + break; + case 0x0D: + 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 >= 0x20 && 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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n")); + if (soap->peeked) + { if (!soap->body) + return NULL; + if (*soap->tag) + { n = 1; + soap->peeked = 0; + } + } + 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; + } + s = (wchar_t*)soap_save_block(soap, NULL, 0); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->wide = s; +#endif + return s; +} +#endif +#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; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = (int)soap_strtol(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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, NULL)) + 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 (*soap->href) + p = (int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(int), 0, NULL); + else if (p) + { if (soap_s2int(soap, soap_value(soap), p)) + return 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; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = soap_strtol(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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, NULL)) + 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 (*soap->href) + p = (long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long), 0, NULL); + else if (p) + { if (soap_s2long(soap, soap_value(soap), p)) + return 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) + { +#ifdef HAVE_STRTOLL + char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = strtoll(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) +#else +# ifdef HAVE_SSCANF + if (sscanf(s, SOAP_LONG_FORMAT, p) != 1) +# endif +#endif + 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, NULL)) + 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 (*soap->href) + p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(LONG64), 0, NULL); + else if (p) + { if (soap_s2LONG64(soap, soap_value(soap), p)) + return 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 (s == r || *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, NULL)) + 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 (*soap->href) + p = (char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(char), 0, NULL); + else if (p) + { if (soap_s2byte(soap, soap_value(soap), p)) + return 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 (s == r || *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, NULL)) + 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 (*soap->href) + p = (short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(short), 0, NULL); + else if (p) + { if (soap_s2short(soap, soap_value(soap), p)) + return 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) +{ char *s; + if (soap_isnan((double)n)) + s = "NaN"; + else if (soap_ispinff(n)) + s = "INF"; + else if (soap_isninff(n)) + s = "-INF"; + else + { char *t; + s = soap->tmpbuf; + sprintf(soap->tmpbuf, soap->float_format, n); + t = strchr(s, ','); /* convert decimal comma to DP */ + if (t) + *t = '.'; + } + 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 (!*s) + return soap->error = SOAP_TYPE; + 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 + { +/* On some systems, strtof appears to be broken or doesn't link: use with caution */ +#if defined(HAVE_STRTOF) + char *r; + *p = strtof((char*)s, &r); + if (*r) +#elif defined(HAVE_STRTOD) + char *r; + *p = (float)strtod(s, &r); + if (*r) +#endif +#ifdef HAVE_SSCANF + if (sscanf(s, "%g", 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, NULL)) + 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 (*soap->href) + p = (float*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(float), 0, NULL); + else if (p) + { if (soap_s2float(soap, soap_value(soap), p)) + return 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) +{ char *s; + if (soap_isnan(n)) + s = "NaN"; + else if (soap_ispinfd(n)) + s = "INF"; + else if (soap_isninfd(n)) + s = "-INF"; + else + { char *t; + s = soap->tmpbuf; + sprintf(soap->tmpbuf, soap->double_format, n); + t = strchr(s, ','); /* convert decimal comma to DP */ + if (t) + *t = '.'; + } + 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 (!*s) + return soap->error = SOAP_TYPE; + 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, "%lg", 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, NULL)) + 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 (*soap->href) + p = (double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(double), 0, NULL); + else if (p) + { if (soap_s2double(soap, soap_value(soap), p)) + return 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 (s == r || *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, NULL)) + 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 (*soap->href) + p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned char), 0, NULL); + else if (p) + { if (soap_s2unsignedByte(soap, soap_value(soap), p)) + return 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_unsignedShort2s(struct soap *soap, unsigned short n) +{ return soap_unsignedLong2s(soap, (unsigned long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +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 PALM_2 +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 (s == r || *r || n > 65535) + soap->error = SOAP_TYPE; + *p = (unsigned short)n; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +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, NULL)) + 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 (*soap->href) + p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned short), 0, NULL); + else if (p) + { if (soap_s2unsignedShort(soap, soap_value(soap), p)) + return 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; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = (unsigned int)soap_strtoul(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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, NULL)) + 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 (*soap->href) + p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned int), 0, NULL); + else if (p) + { if (soap_s2unsignedInt(soap, soap_value(soap), p)) + return 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; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = soap_strtoul(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + 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, NULL)) + 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 (*soap->href) + p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned long), 0, NULL); + else if (p) + { if (soap_s2unsignedLong(soap, soap_value(soap), p)) + return 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) + { +#ifdef HAVE_STRTOULL + char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = strtoull(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) +#else +# ifdef HAVE_SSCANF + if (sscanf(s, SOAP_ULONG_FORMAT, p) != 1) +# endif +#endif + 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, NULL)) + 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 (*soap->href) + p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(ULONG64), 0, NULL); + else if (p) + { if (soap_s2ULONG64(soap, soap_value(soap), p)) + return 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) + { if (!(*t = soap_strdup(soap, s))) + return soap->error = SOAP_EOM; + if (!(soap->mode & (SOAP_ENC_LATIN | SOAP_C_UTFSTRING))) + { /* TODO: consider truncating UTF8 to ASCII for regular XML attribute strings? */ + } + } + 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 = soap->nlist; + const char *p; + /* if there is no namespace stack, or prefix is "xml" then pass string */ + if (!np || !strncmp(s, "xml:", 4)) + { *t = soap_strdup(soap, s); + return SOAP_OK; + } + /* else we normalize the QName by replacing its prefix */ + 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); + } + else + *t = NULL; + 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 != '"') + { +#ifndef WITH_LEAN + if (s && (soap->mode & SOAP_XML_CANONICAL)) + { t = (char*)strchr(s, ':'); + if (t) + soap_utilize_ns(soap, s, t - s); + } +#endif + 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:_%d", 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 WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2wchar(struct soap *soap, const char *s, wchar_t **t) +{ wchar_t *r; + if (!s) + *t = NULL; + else + { *t = r = (wchar_t*)soap_malloc(soap, sizeof(wchar_t) * (strlen(s) + 1)); + if (!r) + return soap->error; + if (soap->mode & SOAP_ENC_LATIN) + { while (*s) + *r++ = (wchar_t)*s++; + } + else + { /* Convert UTF8 to wchar */ + while (*s) + { register soap_wchar c, c1, c2, c3, c4; + c = *s++; + if (c < 0x80) + *r++ = (wchar_t)c; + else + { c1 = (soap_wchar)*s++ & 0x3F; + if (c < 0xE0) + *r++ = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); + else + { c2 = (soap_wchar)*s++ & 0x3F; + if (c < 0xF0) + *r++ = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); + else + { c3 = (soap_wchar)*s++ & 0x3F; + if (c < 0xF8) + *r++ = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); + else + { c4 = (soap_wchar)*s++ & 0x3F; + if (c < 0xFC) + *r++ = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); + else + *r++ = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); + } + } + } + } + } + } + *r = L'\0'; + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_wchar2s(struct soap *soap, const wchar_t *s) +{ register soap_wchar c; + register char *r, *t; + const wchar_t *q = s; + size_t n = 0; + while ((c = *q++)) + { if (c > 0 && c < 0x80) + n++; + else + n += 6; + } + r = t = (char*)soap_malloc(soap, n + 1); + if (r) + { /* Convert wchar to UTF8 */ + while ((c = *s++)) + { if (c > 0 && c < 0x80) + *t++ = (char)c; + else + { 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'; + } + return r; +} +#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) + return soap->error; + if (!**p && (soap->mode & SOAP_C_NILSTRING)) + return soap_element_null(soap, tag, id, type); + if (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, NULL)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + 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 if (soap->null) + *p = NULL; + else + *p = (char*)SOAP_STR_EOS; + if (*soap->href) + 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 WITH_LEANER +#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) + return soap->error; + if (!**p && (soap->mode & SOAP_C_NILSTRING)) + return soap_element_null(soap, tag, id, type); + if (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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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, NULL)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + 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 if (soap->null) + *p = NULL; + else + *p = (wchar_t*)SOAP_STR_EOS; + if (*soap->href) + 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 +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static time_t +soap_timegm(struct tm *T) +{ +#if defined(HAVE_TIMEGM) + return timegm(T); +#else + time_t t, g, z; +#ifdef HAVE_GMTIME_R + struct tm tm, *tmp = &tm; +#else + struct tm *tmp; +#endif + t = mktime(T); + if (t == -1) + return -1; +#ifdef HAVE_GMTIME_R + gmtime_r(&t, tmp); +#else + tmp = gmtime(&t); +#endif + tmp->tm_isdst = 0; + g = mktime(tmp); + if (g == -1) + return -1; + z = g - t; + return t - z; +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_dateTime2s(struct soap *soap, time_t n) +{ struct tm T, *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); + /* 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); +#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+(pT->tm_isdst!=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+(pT->tm_isdst!=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)) + { +#ifdef __BORLANDC__ + ::ftime(&t); +#else + ftime(&t); +#endif + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); + } + /* 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); + } +# else + if ((pT = localtime(&n))) + { +#ifdef __BORLANDC__ + ::ftime(&t); +#else + ftime(&t); +#endif + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=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); + /* 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); +#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[32]; + const char *t; + memset((void*)&T, 0, sizeof(T)); + zone[sizeof(zone)-1] = '\0'; + if (strchr(s, '-')) + t = "%d-%d-%dT%d:%d:%d%31s"; + else if (strchr(s, ':')) + t = "%4d%2d%2dT%d:%d:%d%31s"; + else /* parse non-XSD-standard alternative ISO 8601 format */ + t = "%4d%2d%2dT%2d%2d%2d%31s"; + sscanf(s, t, &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 == '+' || *s == '-') + { int h = 0, m = 0; + if (s[3] == ':') + { sscanf(s, "%d:%d", &h, &m); + if (h < 0) + m = -m; + } + else + { m = (int)atol(s); + h = m / 100; + m = m % 100; + } + T.tm_hour -= h; + T.tm_min -= m; + } + T.tm_isdst = 0; + *p = soap_timegm(&T); + } + else + { T.tm_isdst = -1; + *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, NULL)) + 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 (*soap->href) + p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(time_t), 0, NULL); + else if (p) + { if (soap_s2dateTime(soap, soap_value(soap), p)) + return 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, const char *type) +{ int i; + const char *t = NULL; + if (tag && *tag != '-') + { if (soap->local_namespaces && (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++; + if (soap_element(soap, t, 0, type) + || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) + || soap_element_start_end_out(soap, NULL)) + return soap->error; + } + else + { t = tag; + if (soap_element_begin_out(soap, t, 0, type)) + return soap->error; + } + } + if (p && *p) + { if (soap_send(soap, *p)) + return soap->error; + } + if (t) + return soap_element_end_out(soap, t); + 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, NULL)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) + return NULL; + if (soap->body) + *p = soap_string_in(soap, 0, -1, -1); + else if (soap->null) + *p = NULL; + else + *p = (char*)SOAP_STR_EOS; + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) +{ int i; + const char *t = NULL; + if (tag && *tag != '-') + { if (soap->local_namespaces && (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++; + if (soap_element(soap, t, 0, type) + || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) + || soap_element_start_end_out(soap, NULL)) + return soap->error; + } + else + { t = tag; + if (soap_element_begin_out(soap, t, 0, type)) + return soap->error; + } + if (soap_send(soap, soap->tmpbuf)) + return soap->error; + } + if (p) + { wchar_t c; + const wchar_t *s = *p; + while ((c = *s++)) + { if (soap_pututf8(soap, (unsigned long)c)) + return soap->error; + } + } + if (t) + return soap_element_end_out(soap, t); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#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, NULL)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) + return NULL; + if (soap->body) + *p = soap_wstring_in(soap, 0, -1, -1); + else if (soap->null) + *p = NULL; + else + *p = (wchar_t*)SOAP_STR_EOS; + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_value(struct soap *soap) +{ register size_t i; + register soap_wchar c = 0; + register char *s = soap->tmpbuf; + if (!soap->body) + return SOAP_STR_EOS; + do c = soap_get(soap); + while (soap_blank(c)); + for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) + { if (c == SOAP_TT || (int)c == EOF) + break; + *s++ = (char)c; + c = soap_get(soap); + } + for (s--; i > 0; i--, s--) + { if (!soap_blank(*s)) + break; + } + s[1] = '\0'; + if ((int)c == EOF || c == SOAP_TT) + soap_unget(soap, c); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->data = soap_strdup(soap, soap->tmpbuf); +#endif + return soap->tmpbuf; /* return non-null pointer */ +} +#endif + +/******************************************************************************/ +#if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) +#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' || c == '\n') + break; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + *s++ = (char)c; + } + if (c != '\n') + c = soap_getchar(soap); /* got \r, now get \n */ + if (c == '\n') + { *s = '\0'; + if (i+1 == len) /* empty line: end of HTTP/MIME 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 +#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; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); + if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + { 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 content is %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); + /* count Content-Transfer-Encoding: ...\r\n */ + s = soap_code_str(mime_codes, content->encoding); + 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->description); + /* count \r\n...content */ + count += 2 + content->size; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); + } + /* count \r\n--boundary-- */ + count += 6 + n; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count is %lu bytes\n", (unsigned long)count)); + 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 (!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)content->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) +{ while (soap->dime.flags & SOAP_DIME_CF) + { if (soap_getdimehdr(soap)) + return soap->error; + if (soap_move(soap, soap->dime.size)) + return soap->error = SOAP_EOF; + } + if (soap_move(soap, ((soap->dime.size+3)&(~3))-soap_tell(soap))) + return soap->error = SOAP_EOF; + for (;;) + { register struct soap_multipart *content; + if (soap_getdimehdr(soap)) + break; + 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; + if (soap->error) + return soap->error; + soap_resolve_attachment(soap, content); + } + if (soap->error != SOAP_DIME_END) + return soap->error; + return soap->error = SOAP_OK; +} +#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-Disposition")) + content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); + 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_code_int(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) +{ while (soap_get_mime_attachment(soap, NULL)) + ; + return soap->error; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_post_check_mime_attachments(struct soap *soap) +{ soap->imode |= SOAP_MIME_POSTCHECK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_check_mime_attachments(struct soap *soap) +{ if (soap->mode & SOAP_MIME_POSTCHECK) + return soap_get_mime_attachment(soap, NULL) != NULL; + return 0; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +struct soap_multipart * +SOAP_FMAC2 +soap_get_mime_attachment(struct soap *soap, void *handle) +{ register soap_wchar c = 0; + register size_t i, m = 0; + register char *s, *t = NULL; + register struct soap_multipart *content; + register short flag = 0; + if (!(soap->mode & SOAP_ENC_MIME)) + return NULL; + content = soap->mime.last; + if (!content) + { if (soap_getmimehdr(soap)) + return NULL; + content = soap->mime.last; + } + else if (content != soap->mime.first) + { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) + { if (!content->ptr) + return NULL; + } + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id=%s type=%s\n", content->id?content->id:"", content->type?content->type:"")); + if (!content->ptr && soap_new_block(soap)) + { soap->error = SOAP_EOM; + return NULL; + } + for (;;) + { if (content->ptr) + s = soap->tmpbuf; + else if (!(s = (char*)soap_push_block(soap, sizeof(soap->tmpbuf)))) + { soap->error = SOAP_EOM; + return NULL; + } + for (i = 0; i < sizeof(soap->tmpbuf); i++) + { if (m > 0) + { *s++ = *t++; + m--; + } + else + { if (!flag) + { c = soap_get1(soap); + if ((int)c == EOF) + { soap->error = SOAP_EOF; + return NULL; + } + } + if (flag || c == '\r') + { t = soap->msgbuf; + memset(t, 0, sizeof(soap->msgbuf)); + strcpy(t, "\n--"); + if (soap->mime.boundary) + strncat(t, soap->mime.boundary, sizeof(soap->msgbuf)-4); + do c = soap_getchar(soap); + while (c == *t++); + if ((int)c == EOF) + { soap->error = SOAP_EOF; + return NULL; + } + if (!*--t) + goto end; + *t = (char)c; + flag = (c == '\r'); + m = t - soap->msgbuf + 1 - flag; + t = soap->msgbuf; + c = '\r'; + } + *s++ = (char)c; + } + } + if (content->ptr && soap->fmimewrite) + { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) + break; + } + } +end: + *s = '\0'; /* force 0-terminated */ + if (content->ptr) + { if (!soap->error && soap->fmimewrite) + soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); + if (soap->fmimewriteclose) + soap->fmimewriteclose(soap, (void*)content->ptr); + if (soap->error) + return NULL; + } + else + { content->size = soap_size_block(soap, i+1)-1; + content->ptr = soap_save_block(soap, NULL, 0); + } + soap_resolve_attachment(soap, content); + if (c == '-' && soap_getchar(soap) == '-') + { soap->mode &= ~SOAP_ENC_MIME; + if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) + return NULL; + } + else + { while (c != '\r' && (int)c != EOF && soap_blank(c)) + c = soap_getchar(soap); + if (c != '\r' || soap_getchar(soap) != '\n') + { soap->error = SOAP_MIME_ERROR; + return NULL; + } + if (soap_getmimehdr(soap)) + return NULL; + } + return content; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_match_cid(struct soap *soap, const char *s, const char *t) +{ register size_t n; + if (!s) + return 1; + if (!strcmp(s, t)) + return 0; + if (!strncmp(s, "cid:", 4)) + s += 4; + n = strlen(t); + if (*t == '<') + { t++; + n -= 2; + } + if (!strncmp(s, t, n) && !s[n]) + return 0; + soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); + if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) + return 0; + return 1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static void +soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) +{ if (content->id) + { register struct soap_xlist **xp = &soap->xlist; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id=%s\n", content->id)); + while (*xp) + { register struct soap_xlist *xq = *xp; + if (!soap_match_cid(soap, xq->id, content->id)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment %s for content id=%s\n", xq->id, content->id)); + *xp = xq->next; + *xq->ptr = (unsigned char*)content->ptr; + *xq->size = (int)content->size; + *xq->type = (char*)content->type; + if (content->options) + *xq->options = (char*)content->options; + else + *xq->options = (char*)content->description; + SOAP_FREE(soap, xq); + } + else + xp = &(*xp)->next; + } + } +} +#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_code_str(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) + { void *handle; + if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) + { size_t size = content->size; + if (!handle) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); + return soap->error; + } + if (soap_putmimehdr(soap, content)) + return soap->error; + if (!size) + { if ((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 MIME\n")); + do + { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); + if (soap_send_raw(soap, soap->tmpbuf, size)) + break; + } while (size); + } + else + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); + } + } + else + { do + { size_t bufsize; + if (size < sizeof(soap->tmpbuf)) + bufsize = size; + else + bufsize = sizeof(soap->tmpbuf); + if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); + soap->error = SOAP_EOF; + break; + } + if (soap_send_raw(soap, soap->tmpbuf, bufsize)) + break; + size -= bufsize; + } while (size); + } + if (soap->fmimereadclose) + soap->fmimereadclose(soap, handle); + } + else + { 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, "--"); +} +#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 = 64; + s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); + if (!s) + return; + } + strcpy(s, "=="); + s += 2; + n -= 4; + while (n) + { *s++ = soap_base64o[soap_random & 0x3F]; + n--; + } + strcpy(s, "=="); + } + if (!soap->mime.start) + soap->mime.start = ""; +} +#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; + if (soap->fmimeread) + return SOAP_OK; + 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 + +/******************************************************************************\ + * + * HTTP cookie handling + * +\******************************************************************************/ + +#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 && !strchr("()<>@,;:\\\"/[]?={}", 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 = SOAP_STR_EOS; + else if (*path == '/') + path++; + n = strlen(path); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie %s domain=%s path=%s\n", name, domain?domain:"(null)", path?path:"(null)")); + for (p = soap->cookies; p; p = p->next) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s=%s domain=%s path=%s env=%hd\n", p->name, p->value?p->value:"(null)", p->domain?p->domain:"(null)", p->path?p->path:"(null)", p->env)); + if (!strcmp(p->name, name) + && p->domain + && p->path + && !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:"(null)", domain?domain:"(null)", path?path:"(null)")); + if (!domain) + domain = soap->cookie_domain; + if (!path) + path = soap->cookie_path; + if (!path) + path = SOAP_STR_EOS; + else if (*path == '/') + path++; + q = soap_cookie(soap, name, domain, path); + if (!q) + { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) + { if ((q->name = (char*)SOAP_MALLOC(soap, strlen(name)+1))) + strcpy(q->name, name); + q->value = NULL; + q->domain = NULL; + q->path = NULL; + q->expire = -1; + q->maxage = -1; + q->version = 1; + q->secure = 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 && path && strcmp((*p)->path, path) < 0) + break; + if (n) + { q->next = *p; + *p = q; + } + else + { SOAP_FREE(soap, q->name); + SOAP_FREE(soap, q); + q = NULL; + } + } + } + else + q->modified = 1; + if (q) + { if (q->value) + { SOAP_FREE(soap, q->value); + q->value = NULL; + } + if (q->domain) + { SOAP_FREE(soap, q->domain); + q->domain = NULL; + } + if (q->path) + { SOAP_FREE(soap, q->path); + q->path = NULL; + } + if (value && *value && (q->value = (char*)SOAP_MALLOC(soap, strlen(value)+1))) + strcpy(q->value, value); + if (domain && (q->domain = (char*)SOAP_MALLOC(soap, strlen(domain)+1))) + strcpy(q->domain, domain); + if (path && (q->path = (char*)SOAP_MALLOC(soap, strlen(path)+1))) + strcpy(q->path, path); + q->session = 1; + q->env = 0; + } + 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) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie domain not set\n", name?name:"(null)")); + return; + } + if (!path) + path = soap->cookie_path; + if (!path) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie path not set\n", name?name:"(null)")); + 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(soap, q->value); + if (q->domain) + SOAP_FREE(soap, q->domain); + if (q->path) + SOAP_FREE(soap, q->path); + *p = q->next; + SOAP_FREE(soap, 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 +char * +SOAP_FMAC2 +soap_env_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)) && p->env) + return p->value; + return NULL; +} + +/******************************************************************************/ +SOAP_FMAC1 +time_t +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; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age %ld: %s domain=%s path=%s\n", expire, name, domain?domain:"(null)", path?path:"(null)")); + if ((p = soap_cookie(soap, name, domain, path))) + { p->maxage = 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 && s-tmp < 4060) + { sprintf(s, ";Version=%u", p->version); + s += strlen(s); + } + if (p->maxage >= 0 && s-tmp < 4060) + { sprintf(s, ";Max-Age=%ld", p->maxage); + s += strlen(s); + } + if (p->secure && s-tmp < 4073) + strcpy(s, ";Secure"); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); + if ((soap->error = 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; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain=%s path=%s\n", domain, path)); + if (*path == '/') + path++; + while ((q = *p)) + { if (q->expire && now > q->expire) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); + SOAP_FREE(soap, q->name); + if (q->value) + SOAP_FREE(soap, q->value); + if (q->domain) + SOAP_FREE(soap, q->domain); + if (q->path) + SOAP_FREE(soap, q->path); + *p = q->next; + SOAP_FREE(soap, q); + } + else + { size_t domlen = 0; + if (q->domain) + { const char *s = strchr(q->domain, ':'); + if (s) + domlen = s - q->domain; + else + domlen = strlen(q->domain); + } + if ((!q->domain || !strncmp(q->domain, domain, domlen)) + && (!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 && *q->path && (int)strlen(q->path) < tmp-s+4080) + { sprintf(s, ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : 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->error = soap->fposthdr(soap, "Cookie", tmp))) + return soap->error; + } + 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(soap, strlen(tmp)+1))) + strcpy(t, tmp); + } + else + t = NULL; + if (p) + { if (p->path) + SOAP_FREE(soap, p->path); + p->path = t; + } + else + { if (path) + SOAP_FREE(soap, 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(soap, strlen(tmp)+1))) + strcpy(t, tmp); + } + else + t = NULL; + if (p) + { if (p->domain) + SOAP_FREE(soap, p->domain); + p->domain = t; + } + else + { if (domain) + SOAP_FREE(soap, domain); + domain = t; + } + } + else if (p && !soap_tag_cmp(tmp, "Path")) + { if (p->path) + SOAP_FREE(soap, p->path); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((p->path = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) + strcpy(p->path, tmp); + } + else + p->path = NULL; + } + else if (p && !soap_tag_cmp(tmp, "Domain")) + { if (p->domain) + SOAP_FREE(soap, p->domain); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((p->domain = (char*)SOAP_MALLOC(soap, 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:"(null)", p->domain?p->domain:"(null)", p->path?p->path:"(null)", 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(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, p); + } + if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) + { p->name = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); + strcpy(p->name, tmp); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { p->value = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); + strcpy(p->value, tmp); + } + else + p->value = NULL; + if (domain) + p->domain = domain; + else + { p->domain = (char*)SOAP_MALLOC(soap, strlen(soap->host)+1); + strcpy(p->domain, soap->host); + } + if (path) + p->path = path; + else + { p->path = (char*)SOAP_MALLOC(soap, strlen(soap->path)+1); + strcpy(p->path, soap->path); + } + p->expire = 0; + p->secure = 0; + p->version = version; + } + } + } + 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:"(null)", p->domain?p->domain:"(null)", p->path?p->path:"(null)", 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(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, p); + } + if (domain) + SOAP_FREE(soap, domain); + if (path) + SOAP_FREE(soap, 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 *copy, 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(copy, sizeof(struct soap_cookie)))) + return r; + **q = *p; + if (p->name) + { if (((*q)->name = (char*)SOAP_MALLOC(copy, strlen(p->name)+1))) + strcpy((*q)->name, p->name); + } + if (p->value) + { if (((*q)->value = (char*)SOAP_MALLOC(copy, strlen(p->value)+1))) + strcpy((*q)->value, p->value); + } + if (p->domain) + { if (((*q)->domain = (char*)SOAP_MALLOC(copy, strlen(p->domain)+1))) + strcpy((*q)->domain, p->domain); + } + if (p->path) + { if (((*q)->path = (char*)SOAP_MALLOC(copy, 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(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, 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)c != 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_temp(soap); + soap_set_local_namespaces(soap); + soap->version = 0; /* don't assume we're parsing SOAP content by default */ +#ifndef WITH_NOIDREF + soap_free_iht(soap); +#endif + 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->action = NULL; + soap->status = 0; +#ifndef WITH_LEANER + soap->dom = 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; + soap->xlist = NULL; +#endif +#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 +#ifndef WITH_LEANER + 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 +#ifndef WITH_LEANER + 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 +#endif + { while (soap_blank(c)) + c = soap_getchar(soap); + } + if ((int)c == EOF) + return soap->error = SOAP_EOF; + soap_unget(soap, c); +#ifndef WITH_NOHTTP + /* if not XML or (start of)BOM or MIME/DIME/ZLIB, assume HTTP header */ + if (c != '<' && c != 0xEF && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB))) + { soap->mode &= ~SOAP_IO; + soap->error = soap->fparse(soap); + if (soap->error && soap->error < SOAP_STOP) + { 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; + } +#ifndef WITH_LEANER + else if (soap->fpreparerecv && soap->buflen != soap->bufidx) + soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); +#endif + /* Note: fparse should not use soap_unget to push back last char */ + if (soap_get0(soap) == (int)EOF) + { if (soap->status == 200) + return soap->error = SOAP_NO_DATA; + return soap->error = soap->status; + } +#ifdef WITH_ZLIB + if (soap->zlib_in != SOAP_ZLIB_NONE) +#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 + if (soap->error) + { if (soap->error == SOAP_FORM && soap->fform) + { soap->error = soap->fform(soap); + if (soap->error == SOAP_OK) + soap->error = SOAP_STOP; /* prevents further processing */ + } + return soap->error; + } + } +#endif +#ifndef WITH_LEANER + if (soap->mode & SOAP_ENC_MIME) + { if (soap_getmimehdr(soap)) + return soap->error; + if (soap->mime.start) + { do + { if (!soap->mime.last->id) + break; + if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) + break; + } while (soap_get_mime_attachment(soap, NULL)); + } + 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 WITH_NOHTTP +#ifndef PALM_1 +static int +http_parse(struct soap *soap) +{ char header[SOAP_HDRLEN], *s; + unsigned short get = 0, status = 0, k = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); + *soap->endpoint = '\0'; + soap->length = 0; + soap->userid = NULL; + soap->passwd = NULL; + soap->action = NULL; + soap->authrealm = NULL; + 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)) + { if (soap->error == SOAP_EOF) + { soap->error = SOAP_OK; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); + break; + } + 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))) + { if (soap->error < SOAP_STOP) + return soap->error; + status = soap->error; + soap->error = SOAP_OK; + } + } + } + if ((s = strchr(soap->msgbuf, ' '))) + { k = (unsigned short)soap_strtoul(s, &s, 10); + if (!soap_blank(*s)) + k = 0; + } + else + k = 0; + } while (k == 100); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", k)); + 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 && (((get = !strncmp(soap->msgbuf, "GET ", 4))) || !strncmp(soap->msgbuf, "POST ", 5))) + { size_t m = strlen(soap->endpoint); + size_t n = m + (s - soap->msgbuf) - 5 - (!get); + if (n >= sizeof(soap->endpoint)) + n = sizeof(soap->endpoint) - 1; + strncpy(soap->path, soap->msgbuf + 4 + (!get), n - m); + soap->path[n - m] = '\0'; + strcat(soap->endpoint, soap->path); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint)); + if (get) + { soap->error = soap->fget(soap); + if (soap->error == SOAP_OK) + soap->error = SOAP_STOP; /* prevents further processing */ + return soap->error; + } + if (status) + return soap->error = status; + } + soap->status = k; + if (k == 0 || k == 200 || (((k > 200 && k <= 299) || k == 400 || k == 500) && ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || soap->length > 0))) + return SOAP_OK; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP error %d\n", k)); + return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, k); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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")) + { soap->http_content = soap_strdup(soap, val); + 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_get_header_attribute(soap, val, "multipart/form-data")) + { 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 *")) + { int 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 == '"') + { 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, "Cookie2") + || !soap_tag_cmp(key, "Set-Cookie") + || !soap_tag_cmp(key, "Set-Cookie2")) + soap_getcookies(soap, val); +#endif + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#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 +#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 && strlen(soap->mime.boundary) + strlen(soap->mime.start) < sizeof(soap->tmpbuf) - 80 ) + { const char *s; + if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + s = "application/dime"; + else if (soap->version == 2) + { if (soap->mode & SOAP_ENC_MTOM) + s = "application/xop+xml; charset=utf-8; type=application/soap+xml"; + else + 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->mode & SOAP_ENC_MTOM)) + { 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)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); + } + if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + 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, NULL)) + { +#ifndef WITH_LEAN + if (!soap_element_begin_in(soap, "html", 0, NULL)) + { /* get HTML from buffer, stop receiving to avoid HTML parsing issues */ + char *s; +#ifndef WITH_NOIO + size_t (*f)(struct soap*, char*, size_t) = soap->frecv; + soap->frecv = frecv_stop; +#endif + soap_revert(soap); + s = soap_string_in(soap, 1, -1, -1); +#ifndef WITH_NOIO + soap->frecv = f; +#endif + return soap_set_receiver_error(soap, "HTTP Error", s, SOAP_HTTP_ERROR); + } +#endif + 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(soap, p[1].out); + if ((p[1].out = (char*)SOAP_MALLOC(soap, 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(soap, p[1].out); + if ((p[1].out = (char*)SOAP_MALLOC(soap, 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) +{ soap->part = SOAP_END_ENVELOPE; + return soap_element_end_in(soap, "SOAP-ENV:Envelope"); +} +#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; +#ifndef WITH_LEAN + if ((soap->mode & SOAP_XML_SEC) && soap_set_attr(soap, "wsu:Id", "Body")) + return soap->error; +#endif + if (soap_element(soap, "SOAP-ENV:Body", 0, NULL)) + 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_END_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; + if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) + return soap->error; + if (!soap->body) + soap->part = SOAP_NO_BODY; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_body_end_in(struct soap *soap) +{ if (soap->part == SOAP_NO_BODY) + return SOAP_OK; + soap->part = SOAP_END_BODY; + return soap_element_end_in(soap, "SOAP-ENV:Body"); +} +#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; + else if (soap->error == SOAP_OK && soap->fheader) + soap->error = soap->fheader(soap); + 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] = '\0'; + soap->host[0] = '\0'; + soap->path[0] = '/'; + soap->path[1] = '\0'; + soap->port = 80; + if (!endpoint || !*endpoint) + return; +#ifdef WITH_OPENSSL + if (!soap_tag_cmp(endpoint, "https:*")) + soap->port = 443; +#endif + strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1); + soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; + 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; +#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 + for (i = 0; i < n; i++) + { soap->host[i] = s[i]; + if (s[i] == '/' || s[i] == ':') + break; + } +#endif + 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, 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); +#ifndef WITH_LEANER + if (soap->fconnect) + { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) + return soap->error; + } + else +#endif + if (soap->fopen && *soap->host) + { soap->status = http_command; + if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) + { soap->keep_alive = 0; /* to force close */ + soap->omode &= ~SOAP_IO_UDP; /* to force close */ + soap_closesock(soap); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port)); +#ifdef WITH_UDP + if (!strncmp(endpoint, "soap.udp:", 9)) + soap->omode |= SOAP_IO_UDP; +#endif + 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); + } + } + count = soap_count_attachments(soap); + if (soap_begin_send(soap)) + return soap->error; +#ifndef WITH_NOHTTP + soap->action = soap_strdup(soap, action); + 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; +#ifndef WITH_LEANER + if ((k & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = k; + } + if (http_command != SOAP_POST) + return soap_end_send(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) +{ register int 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, int *n) +{ register int i, j, c; + register unsigned long m; + register const char *p; + if (!s || !*s) + { if (n) + *n = 0; + if (soap->error) + return NULL; + return SOAP_NON_NULL; + } + if (!t) + { l = (strlen(s) + 3) / 4 * 3; + t = (char*)soap_malloc(soap, l); + } + if (!t) + { soap->error = SOAP_EOM; + return NULL; + } + 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) + { int b = soap_base64i[c]; + if (b >= 64) + { soap->error = SOAP_TYPE; + return NULL; + } + m = (m << 6) + b; + j++; + } + else if (!soap_blank(c)) + { soap->error = SOAP_TYPE; + return NULL; + } + } + *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 WITH_LEAN +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) +{ register char *p; + if (!t) + t = (char*)soap_malloc(soap, 2 * n + 1); + if (!t) + { soap->error = SOAP_EOM; + return NULL; + } + p = t; + t[0] = '\0'; + if (s) + { for (; n > 0; n--) + { register int m = *s++; + *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); + m &= 0x0F; + *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); + } + } + *t++ = '\0'; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) +{ register const char *p; + if (!s || !*s) + { if (n) + *n = 0; + if (soap->error) + return NULL; + return SOAP_NON_NULL; + } + if (!t) + { l = strlen(s) / 2; + t = (char*)soap_malloc(soap, l); + } + if (!t) + { soap->error = SOAP_EOM; + return NULL; + } + p = t; + while (l) + { register int d1, d2; + d1 = *s++; + if (!d1) + break; + d2 = *s++; + if (!d2) + break; + *t++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); + l--; + } + if (n) + *n = t - p; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_puthttphdr(struct soap *soap, int status, size_t count) +{ register const char *s = "text/xml; charset=utf-8"; + register int err = SOAP_OK; +#ifndef WITH_LEANER + register const char *r = NULL; +#endif + if (status == SOAP_FILE && soap->http_content) + s = soap->http_content; + else if (status == SOAP_HTML) + s = "text/html; charset=utf-8"; + else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) + { if (soap->version == 2) + s = "application/soap+xml; charset=utf-8"; + } +#ifndef WITH_LEANER + if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) + { if (soap->mode & SOAP_ENC_MTOM) + { r = s; + s = "application/xop+xml; charset=utf-8"; + } + else + s = "application/dime"; + } + if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->status != SOAP_GET && strlen(soap->mime.boundary) + strlen(soap->mime.start ? soap->mime.start : SOAP_STR_EOS) < sizeof(soap->tmpbuf) - 80) + { register const char *t = strchr(s, ';'); + sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=\"", soap->mime.boundary); + if (t) + strncat(soap->tmpbuf, s, t - s); + else + strcat(soap->tmpbuf, s); + if (soap->mime.start) + { strcat(soap->tmpbuf, "\"; start=\""); + strcat(soap->tmpbuf, soap->mime.start); + } + strcat(soap->tmpbuf, "\""); + if (r) + { strcat(soap->tmpbuf, "; start-info=\""); + strcat(soap->tmpbuf, r); + strcat(soap->tmpbuf, "\""); + } + s = soap->tmpbuf; + } +#endif + if (s && (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 +#ifndef WITH_LEANER + if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) + err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); + else +#endif + if (s && soap->status != SOAP_GET) + { 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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_get(struct soap *soap) +{ return SOAP_GET_METHOD; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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"; + else + s = "POST"; +#ifdef PALM + if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8)) +#else + if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6))) +#endif + return SOAP_OK; + if (strlen(endpoint) + strlen(soap->http_version) > sizeof(soap->tmpbuf) - 80) + return soap->error = SOAP_EOM; + if (soap->proxy_host && soap_tag_cmp(endpoint, "https:*")) + sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version); + else + sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : 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 (soap->version == 1 || (action && *action && strlen(action) < sizeof(soap->tmpbuf) - 2)) + { sprintf(soap->tmpbuf, "\"%s\"", action?action:""); + if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) + return err; + } + return soap->fposthdr(soap, NULL, NULL); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#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 +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_response(struct soap *soap, int status, size_t count) +{ register int err; +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + httpOutputEnable(soap->rpmreqid); +#endif + if (strlen(soap->http_version) > 4) + return soap->error = SOAP_EOM; + if (!status || status == SOAP_HTML || status == SOAP_FILE) + { const char *s; + if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) + s = "200 OK"; + else + s = "202 ACCEPTED"; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Status = %s\n", s)); +#ifdef WMW_RPM_IO + if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ +#else + if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ +#endif + { 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; + } + 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; +#ifndef WITH_LEAN + if (status == 401) + { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", strlen(soap->authrealm) < sizeof(soap->tmpbuf) - 14 ? 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; + } +#endif + } + 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)); +#ifdef WMW_RPM_IO + if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ +#else + if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ +#endif + { 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))) /* CGI */ + 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 +#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; +#ifndef WITH_NOHTTP + 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; +#ifndef WITH_LEANER + if ((n & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = n; + } +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static const char* +soap_set_validation_fault(struct soap *soap, const char *s, const char *t) +{ if (*soap->tag) + sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element <%s>", s, t?t:SOAP_STR_EOS, soap->tag); + else + sprintf(soap->msgbuf, "Validation constraint violation: %s%s", s, t?t:SOAP_STR_EOS); + 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 (soap->fseterror) + soap->fseterror(soap, c, s); + 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_TYPE: + *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type); + break; + case SOAP_SYNTAX_ERROR: + *s = "Well-formedness violation"; + break; + case SOAP_NO_TAG: + *s = "No XML element tag"; + 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_USER_ERROR: + *s = "User error"; + 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_NO_DATA: + *s = "Data required for operation"; + break; + case SOAP_GET_METHOD: + *s = "HTTP GET method not implemented"; + break; + case SOAP_EOM: + *s = "Out of memory"; + break; + case SOAP_MOE: + *s = "Memory overflow or corruption error"; + 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_DUPLICATE_ID: + *s = soap_set_validation_fault(soap, "multiple definitions of id ", soap->id); + if (soap->version == 2) + *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; + break; + case SOAP_MISSING_ID: + *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); + if (soap->version == 2) + *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; + break; + case SOAP_HREF: + *s = soap_set_validation_fault(soap, "incompatible object ref ", soap->id); + break; + case SOAP_FAULT: + break; +#ifndef WITH_NOIO + case SOAP_UDP_ERROR: + *s = "Message too large for UDP packet"; + break; + case SOAP_TCP_ERROR: + *s = tcp_error(soap); + break; +#endif + case SOAP_HTTP_ERROR: + *s = "An HTTP processing error occurred"; + break; + case SOAP_SSL_ERROR: +#ifdef WITH_OPENSSL + *s = "SSL error"; +#else + *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; +#endif + break; + case SOAP_PLUGIN_ERROR: + *s = "Plugin registry error"; + break; + case SOAP_DIME_ERROR: + *s = "DIME format error"; + break; + case SOAP_DIME_HREF: + *s = "DIME href to missing attachment"; + break; + case SOAP_DIME_MISMATCH: + *s = "DIME version/transmission error"; + break; + case SOAP_DIME_END: + *s = "End of DIME error"; + break; + case SOAP_MIME_ERROR: + *s = "MIME format error"; + break; + case SOAP_MIME_HREF: + *s = "MIME href to missing attachment"; + break; + case SOAP_MIME_END: + *s = "End of MIME 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/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; +#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, "min/maxOccurs violation", NULL); + break; + case SOAP_LENGTH: + *s = soap_set_validation_fault(soap, "content length violation", NULL); + break; + case SOAP_FD_EXCEEDED: + *s = "Maximum number of open connections was reached"; + break; + case SOAP_STOP: + *s = "Stopped: no response sent"; + break; +#endif + case SOAP_EOF: +#ifndef WITH_NOIO + sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap)); + *s = soap->msgbuf; + break; +#else + *s = "End of file or no input"; + break; +#endif + default: +#ifndef WITH_NOHTTP +#ifndef WITH_LEAN + if (soap->error > 200 && soap->error < 600) + { sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error)); + *s = soap->msgbuf; + } + else +#endif +#endif + { sprintf(soap->msgbuf, "Error %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; + int r = 1; + 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); +#ifndef WITH_NOIO +#ifndef WITH_LEAN + if (soap_valid_socket(soap->socket)) + { struct timeval timeout; + fd_set rfd, sfd; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&rfd); + FD_ZERO(&sfd); + FD_SET((SOAP_SOCKET)soap->socket, &rfd); + FD_SET((SOAP_SOCKET)soap->socket, &sfd); + r = select((SOAP_SOCKET)(soap->socket + 1), &rfd, &sfd, NULL, &timeout); + if (r > 0) + { if (!FD_ISSET((SOAP_SOCKET)soap->socket, &sfd) + || (FD_ISSET((SOAP_SOCKET)soap->socket, &rfd) + && recv((SOAP_SOCKET)soap->socket, soap->tmpbuf, 1, MSG_PEEK) < 0)) + r = 0; + } + } +#endif +#endif + if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && r > 0) + { 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); + } + soap_end_count(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 WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send_empty_response(struct soap *soap, int status) +{ register soap_mode m = soap->omode; + soap->count = 0; + if ((m & SOAP_IO) == SOAP_IO_CHUNK) + { soap->omode &= ~SOAP_IO_CHUNK; + soap->omode |= SOAP_IO_BUFFER; + } + if (soap_response(soap, status) || soap_end_send(soap)) + { soap->omode = m; + return soap_closesock(soap); + } + soap->omode = m; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv_empty_response(struct soap *soap) +{ if (soap_begin_recv(soap) || soap_end_recv(soap)) + { if (soap->error != 202) + return soap_closesock(soap); + soap->error = SOAP_OK; + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static const char* +soap_strerror(struct soap *soap) +{ register int err = soap->errnum; + if (err) + { +#ifndef WIN32 + return strerror(err); +#else +#ifndef UNDER_CE + DWORD len; + *soap->msgbuf = '\0'; + len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL); +#else + DWORD i, len; + *soap->msgbuf = '\0'; + len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); + for (i = 0; i <= len; i++) + { if (((TCHAR*)soap->msgbuf)[i] < 0x80) + soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; + else + soap->msgbuf[i] = '?'; + } +#endif + return soap->msgbuf; +#endif + } + return "Operation interrupted or timed out"; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +static int +soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcode, const char *faultstring, const char *faultdetail, int soaperror) +{ *soap_faultcode(soap) = faultcode; + if (faultsubcode) + *soap_faultsubcode(soap) = faultsubcode; + *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", NULL, 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", NULL, faultstring, faultdetail, soaperror); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +static int +soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcode, const char *faultstring, const char *faultdetail) +{ char *r = NULL, *s = NULL, *t = NULL; + if (faultsubcode) + r = soap_strdup(soap, faultsubcode); + if (faultstring) + s = soap_strdup(soap, faultstring); + if (faultdetail) + t = soap_strdup(soap, faultdetail); + return soap_set_error(soap, faultcode, r, 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_sender_fault_subcode(soap, NULL, faultstring, faultdetail); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) +{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultsubcode, 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_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) +{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultsubcode, faultstring, faultdetail); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_print_fault(struct soap *soap, FILE *fd) +{ if (soap_check_state(soap)) + fprintf(fd, "Error: soap struct not initialized\n"); + else if (soap->error) + { const char *c, *v = NULL, *s, **d; + d = soap_faultcode(soap); + if (!*d) + soap_set_fault(soap); + c = *d; + if (soap->version == 2) + v = *soap_faultsubcode(soap); + s = *soap_faultstring(soap); + d = soap_faultdetail(soap); + fprintf(fd, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, c, v ? v : "no subcode", s ? s : "[no reason]", d && *d ? *d : "[no detail]"); + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_print_fault_location(struct soap *soap, FILE *fd) +{ +#ifndef WITH_LEAN + int i, j, c1, c2; + if (soap->error && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= SOAP_BUFLEN) + { i = (int)soap->bufidx - 1; + if (i <= 0) + i = 0; + c1 = soap->buf[i]; + soap->buf[i] = '\0'; + if ((int)soap->buflen >= i + 1024) + j = i + 1023; + else + j = (int)soap->buflen - 1; + c2 = soap->buf[j]; + soap->buf[j] = '\0'; + fprintf(fd, "%s%c\n\n", soap->buf, c1); + if (soap->bufidx < soap->buflen) + fprintf(fd, "%s\n", soap->buf + soap->bufidx); + soap->buf[i] = c1; + soap->buf[j] = c2; + } +#endif +} +#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(soap, 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(soap, 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 + +/******************************************************************************\ + * + * C++ soap struct methods + * +\******************************************************************************/ + +#ifdef __cplusplus +#ifndef WITH_LEAN +soap::soap() +{ soap_init(this); +} +#endif +#endif + +/******************************************************************************/ +#ifdef __cplusplus +#ifndef WITH_LEAN +soap::soap(soap_mode m) +{ soap_init1(this, m); +} +#endif +#endif + +/******************************************************************************/ +#ifdef __cplusplus +#ifndef WITH_LEAN +soap::soap(soap_mode im, soap_mode om) +{ soap_init2(this, im, om); +} +#endif +#endif + +/******************************************************************************/ +#ifdef __cplusplus +#ifndef WITH_LEAN +soap::soap(struct soap& soap) +{ soap_copy_context(this, &soap); +} +#endif +#endif + +/******************************************************************************/ +#ifdef __cplusplus +#ifndef WITH_LEAN +soap::~soap() +{ soap_destroy(this); + soap_end(this); + soap_done(this); +} +#endif +#endif + +/******************************************************************************/ diff --git a/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.h b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.h new file mode 100644 index 0000000..2a8928b --- /dev/null +++ b/org.glite.security.gsoap-plugin/src/stdsoap2_2.7.9b.h @@ -0,0 +1,2166 @@ +/* + +stdsoap2.h 2.7.9b + +gSOAP runtime + +gSOAP XML Web services tools +Copyright (C) 2000-2007, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +Contributors: + +Wind River Systems, Inc., for the following additions (marked WR[...]): + - vxWorks compatible +-------------------------------------------------------------------------------- +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-2007, 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 +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#ifdef WITH_SOAPDEFS_H +# include "soapdefs.h" /* include user-defined stuff */ +#endif + +#ifndef _THREAD_SAFE +# define _THREAD_SAFE +#endif + +#ifndef OPENSERVER +# ifndef _REENTRANT +# define _REENTRANT +# endif +#endif + +#ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC1 +#endif + +#ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC2 +#endif + +#ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ +# define SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC3S SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ +# define SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC4S SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ +# define SOAP_FMAC5 +#endif + +#ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ +# define SOAP_FMAC6 +#endif + +#ifndef SOAP_CMAC /* class declaration macro */ +# define SOAP_CMAC +#endif + +#ifndef SOAP_NMAC /* namespace table declaration macro */ +# define SOAP_NMAC +#endif + +#ifndef SOAP_SOURCE_STAMP +# define SOAP_SOURCE_STAMP(str) +#endif + +/* gSOAP 2.7.4 and higher: fast look-aside buffering is stable */ +#ifndef WITH_FAST +# define WITH_FAST +#endif + +#ifdef WITH_LEANER +# ifndef WITH_LEAN +# define WITH_LEAN +# endif +#endif + +#ifdef WITH_LEAN +# ifdef WITH_COOKIES +# error "Cannot build WITH_LEAN code WITH_COOKIES enabled" +# endif +#endif + +#ifndef STDSOAP_H +#define STDSOAP_H + +#if defined(__vxworks) || defined(__VXWORKS__) +# define VXWORKS +#endif + +#ifdef _WIN32 +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef _WIN32_WCE +# ifndef UNDER_CE +# define UNDER_CE _WIN32_WCE +# endif +#endif + +#ifdef UNDER_CE +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef __BORLANDC__ +# ifdef __WIN32__ +# ifndef WIN32 +# define WIN32 +# endif +# endif +#endif + +#ifdef __CYGWIN__ +# ifndef CYGWIN +# define CYGWIN +# endif +#endif + +#ifdef __SYMBIAN32__ +# define SYMBIAN +# undef WIN32 +#endif + +#if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) +# ifndef PALM +# define PALM +# endif +#endif + +#if defined(__hpux) +# ifndef HP_UX +# define HP_UX +# endif +#endif + +#if defined(__alpha) && !defined(__VMS) +# ifndef TRU64 +# define TRU64 +# endif +#endif + +#ifdef __MVS__ +# ifndef OS390 +# define OS390 +# endif +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +# ifdef WITH_OPENSSL +# ifndef HAVE_OPENSSL_SSL_H +# undef WITH_OPENSSL +# endif +# endif +#else +# if defined(UNDER_CE) +# define WITH_LEAN +# define HAVE_SSCANF +# elif defined(WIN32) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%I64d" +# define SOAP_ULONG_FORMAT "%I64u" +# elif defined(CYGWIN) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__APPLE__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(_AIXVERSION_431) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(HP_UX) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(FREEBSD) || defined(__FreeBSD__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_STRTOLL +# define HAVE_STRTOULL +# define HAVE_GETTIMEOFDAY +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%qd" +# define SOAP_ULONG_FORMAT "%qu" +# elif defined(__VMS) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__GLIBC__) || defined(__GNU__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_STRTOLL +# define HAVE_STRTOULL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define HAVE_ISNAN +# elif defined(TRU64) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_GETTIMEOFDAY +# define HAVE_SYS_TIMEB_H +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define __USE_STD_IOSTREAM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%ld" +# define SOAP_ULONG_FORMAT "%lu" +# elif defined(MAC_CARBON) +# define WITH_NOIO +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(PALM) +# define WITH_LEAN +# define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ +# include /* Needs to be included before unix headers */ +# include +# define IGNORE_STDIO_STUBS +# include +# define O_NONBLOCK FNONBIO +# include +# include "palmFunctions.h" +# elif defined(SYMBIAN) +# define WITH_LEAN +# define WITH_NONAMESPACES +# define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ +# include +# include +# elif defined(VXWORKS) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_PGMTIME_R +# define HAVE_PLOCALTIME_R +# define HAVE_MKTIME +# elif defined(OS390) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(AS400) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__QNX__) || defined(QNX) +/* QNX does not have a working version of strtof */ +# undef HAVE_STRTOF +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define LONG64 long +# define ULONG64 unsigned LONG64 +# define SOAP_LONG_FORMAT "%ld" +# define SOAP_ULONG_FORMAT "%lu" +# else +/* Default asumptions on supported functions */ +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# endif +#endif + +#ifndef SOAP_LONG_FORMAT +# define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ +#endif + +#ifndef SOAP_ULONG_FORMAT +# define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ +#endif + +#ifndef WITH_NOSTDLIB +# include +# ifndef PALM +# include +# include +# endif +# include +# include +#endif + +#if defined(__cplusplus) && !defined(WITH_LEAN) +# include +# include +#endif + +#ifdef WITH_NOHTTP +# ifndef WITH_NOIO +# define WITH_NOIO +# undef WITH_COOKIES +# endif +#endif + +#ifndef UNDER_CE +# ifndef PALM +# ifndef WITH_NOIO +# include +# include +# endif +# ifndef WITH_LEAN +# ifdef HAVE_SYS_TIMEB_H +# include /* for ftime() */ +# endif +# include +# endif +# endif +#endif + +#ifdef OPENSERVER +# include +# include +# include + extern int h_errno; +#endif + +#ifndef WITH_NOIO +# ifndef WIN32 +# ifndef PALM +# include +# ifdef VXWORKS +# include +# include +# endif +# ifndef VXWORKS +# ifndef SYMBIAN +# include +# endif +# endif +# ifdef SUN_OS +# include /* SUN */ +# include /* SUN < 2.8 (?) */ +# endif +# ifdef VXWORKS +# ifdef _WRS_KERNEL +# include +# endif +# else +# include +# endif +# include +# ifdef OS390 +# include +# else +# include /* TCP_NODELAY */ +# endif +# include +# endif +# endif +#endif + +#ifdef WITH_FASTCGI +# include +#endif + +#ifdef WITH_OPENSSL +# define OPENSSL_NO_KRB5 +# include +# include +# include +# include +# include +# ifndef ALLOW_OLD_VERSIONS +# if (OPENSSL_VERSION_NUMBER < 0x00905100L) +# error "Must use OpenSSL 0.9.6 or later" +# endif +# endif +#endif + +#ifdef WITH_GZIP +# ifndef WITH_ZLIB +# define WITH_ZLIB +# endif +#endif + +#ifdef WITH_CASEINSENSITIVETAGS +# define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ +#else +# define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ +#endif + +#ifdef WITH_ZLIB +# include +#endif + +#ifndef WITH_NOSTDLIB +# ifndef PALM +# include /* for isnan() */ +# endif +#endif + +/* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WIN32 +# ifndef UNDER_CE +# include +# include +# endif +# include +/* # include */ /* Alternative: use winsock2 (not available with eVC) */ +# ifdef WITH_IPV6 +# include +# include +# endif +#else +# ifdef VXWORKS +# include +# include +# include +# endif +# ifndef WITH_NOIO +# ifndef PALM +# include +# include +# include +# include +# endif +# endif +#endif + +/* Portability: define SOAP_SOCKLEN_T */ +#if defined(_AIX) +# define SOAP_SOCKLEN_T socklen_t +#elif defined(SOCKLEN_T) +# define SOAP_SOCKLEN_T SOCKLEN_T +#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX) +# define SOAP_SOCKLEN_T socklen_t +#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) +# define SOAP_SOCKLEN_T int +#else +# define SOAP_SOCKLEN_T size_t +#endif + +#ifndef SOAP_SOCKET +# ifdef WIN32 +# define SOAP_SOCKET SOCKET +# define soap_closesocket(n) closesocket(n) +# else +# define SOAP_SOCKET int +# define soap_closesocket(n) close(n) +# endif +#endif + +#define SOAP_INVALID_SOCKET (-1) +#define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) + +#ifndef FD_SETSIZE +# define FD_SETSIZE (1024) +#endif + +#if defined(SYMBIAN) +# define LONG64 long +# define ULONG64 unsigned LONG64 +#elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) +# ifndef LONG64 +# define LONG64 long long +# define ULONG64 unsigned LONG64 +# endif +#elif defined(UNDER_CE) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#elif defined(__BORLANDC__) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#endif + +#if defined(WIN32) && !defined(CYGWIN) +# define soap_int32 __int32 +#elif defined(SYMBIAN) +# define soap_int32 long +#elif defined(PALM) +# define soap_int32 Int32 +#else +# define soap_int32 int32_t +#endif + +#ifdef WIN32 +# define SOAP_ERANGE ERANGE +# define SOAP_EINTR WSAEINTR +# define SOAP_EAGAIN WSAEWOULDBLOCK +# define SOAP_EWOULDBLOCK WSAEWOULDBLOCK +# define SOAP_EINPROGRESS WSAEINPROGRESS +#else +# define SOAP_ERANGE ERANGE +# define SOAP_EINTR EINTR +# define SOAP_EAGAIN EAGAIN +# ifdef SYMBIAN +# define SOAP_EWOULDBLOCK 9898 +# define SOAP_EINPROGRESS 9899 +# else +# define SOAP_EWOULDBLOCK EWOULDBLOCK +# define SOAP_EINPROGRESS EINPROGRESS +# endif +#endif + +#ifdef WIN32 +# ifdef UNDER_CE +# define soap_errno GetLastError() +# define soap_socket_errno(s) GetLastError() +# define soap_reset_errno SetLastError(0) +# else +# define soap_errno GetLastError() +# define soap_socket_errno(s) WSAGetLastError() +# define soap_reset_errno SetLastError(0) +# endif +#else +# ifndef WITH_NOIO +# define soap_errno errno +# define soap_socket_errno(s) errno +# define soap_reset_errno (errno = 0) +# else +# define soap_errno 0 +# define soap_socket_errno(s) 0 +# define soap_reset_errno +# endif +#endif + +#ifndef SOAP_BUFLEN +# ifdef WITH_UDP +# define SOAP_BUFLEN (65536) /* max UDP packet size */ +# else +# ifndef WITH_LEAN +# define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r so don't make this too small */ +# else +# define SOAP_BUFLEN (2048) +# endif +# endif +#endif +#ifndef SOAP_LABLEN +# define SOAP_LABLEN (256) /* initial look-aside buffer length */ +#endif +#ifndef SOAP_PTRBLK +# define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ +#endif +#ifndef SOAP_PTRHASH +# ifndef WITH_LEAN +# define SOAP_PTRHASH (1024) /* size of pointer analysis hash table (must be power of 2) */ +# else +# define SOAP_PTRHASH (32) +# endif +#endif +#ifndef SOAP_IDHASH +# ifndef WITH_LEAN +# define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ +# else +# define SOAP_IDHASH (19) /* 19, 199 */ +# endif +#endif +#ifndef SOAP_BLKLEN +# ifndef WITH_LEAN +# define SOAP_BLKLEN (256) /* size of blocks to collect long strings and XML attributes */ +# else +# define SOAP_BLKLEN (32) +# endif +#endif +#ifndef SOAP_TAGLEN +# ifndef WITH_LEAN +# define SOAP_TAGLEN (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */ +# else +# define SOAP_TAGLEN (64) +# endif +#endif +#ifndef SOAP_HDRLEN +# ifndef WITH_LEAN +# define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ +# else +# define SOAP_HDRLEN (1024) +# endif +#endif +#ifndef SOAP_MAXDIMS +# ifndef WITH_LEAN +# define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ +# else +# define SOAP_MAXDIMS (4) +# endif +#endif + +#ifndef SOAP_MAXLOGS +# define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ +# define SOAP_INDEX_RECV (0) +# define SOAP_INDEX_SENT (1) +# define SOAP_INDEX_TEST (2) +#endif + +#ifndef SOAP_MAXKEEPALIVE +# define SOAP_MAXKEEPALIVE (100) /* max iterations to keep server connection alive */ +#endif + +#ifndef SOAP_MAXARRAYSIZE +# define SOAP_MAXARRAYSIZE (100000) /* "trusted" max size of inbound SOAP array for compound array allocation */ +#endif + +#ifdef VXWORKS +# ifdef __INCmathh +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) isNan(num) +# endif +#endif + +#ifdef WIN32 +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) _isnan(num) +#endif + +#ifdef SUN_OS +# define HAVE_ISNAN +#endif + +#ifdef __APPLE__ +# ifdef __cplusplus +# ifndef isnan +extern "C" int isnan(double); +# endif +# endif +# define HAVE_ISNAN +#endif + +#if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) +# define HAVE_ISNAN +#endif + +extern const struct soap_double_nan { unsigned int n1, n2; } soap_double_nan; + +#ifdef VXWORKS +# ifndef FLT_MAX +# define FLT_MAX _ARCH_FLT_MAX +# endif +# ifndef DBL_MAX +# define DBL_MAX _ARCH_DBL_MAX +# endif +#endif + +#ifndef FLT_NAN +# define FLT_NAN (*(float*)(void*)&soap_double_nan) +#endif + +#ifndef FLT_PINFTY +# if defined(FLT_MAX) +# define FLT_PINFTY FLT_MAX +# elif defined(HUGE_VALF) +# define FLT_PINFTY (float)HUGE_VALF +# elif defined(HUGE_VAL) +# define FLT_PINFTY (float)HUGE_VAL +# elif defined(FLOAT_MAX) +# define FLT_PINFTY FLOAT_MAX +# else +# define FLT_PINFTY (3.40282347e+38F) +# endif +#endif + +#ifndef FLT_NINFTY +# define FLT_NINFTY (-FLT_PINFTY) +#endif + +#ifndef DBL_NAN +# define DBL_NAN (*(double*)(void*)&soap_double_nan) +#endif + +#ifndef DBL_PINFTY +# if defined(DBL_MAX) +# define DBL_PINFTY DBL_MAX +# elif defined(HUGE_VALF) +# define DBL_PINFTY (double)HUGE_VALF +# elif defined(HUGE_VAL) +# define DBL_PINFTY (double)HUGE_VAL +# elif defined(DOUBLE_MAX) +# define DBL_PINFTY DOUBLE_MAX +# else +# define DBL_PINFTY (1.7976931348623157e+308) +# endif +#endif + +#ifndef DBL_NINFTY +# define DBL_NINFTY (-DBL_PINFTY) +#endif + +#ifndef soap_isnan +# ifdef HAVE_ISNAN +# define soap_isnan(n) isnan(n) +# else +# define soap_isnan(n) (0) +# endif +#endif + +#define soap_ispinfd(n) ((n) >= DBL_PINFTY) +#define soap_ispinff(n) ((n) >= FLT_PINFTY) +#define soap_isninfd(n) ((n) <= DBL_NINFTY) +#define soap_isninff(n) ((n) <= FLT_NINFTY) + +/* gSOAP error codes */ + +#define SOAP_EOF EOF +#define SOAP_ERR EOF +#define SOAP_OK 0 +#define SOAP_CLI_FAULT 1 +#define SOAP_SVR_FAULT 2 +#define SOAP_TAG_MISMATCH 3 +#define SOAP_TYPE 4 +#define SOAP_SYNTAX_ERROR 5 +#define SOAP_NO_TAG 6 +#define SOAP_IOB 7 +#define SOAP_MUSTUNDERSTAND 8 +#define SOAP_NAMESPACE 9 +#define SOAP_USER_ERROR 10 +#define SOAP_FATAL_ERROR 11 +#define SOAP_FAULT 12 +#define SOAP_NO_METHOD 13 +#define SOAP_NO_DATA 14 +#define SOAP_GET_METHOD 15 +#define SOAP_EOM 16 +#define SOAP_MOE 17 +#define SOAP_NULL 18 +#define SOAP_DUPLICATE_ID 19 +#define SOAP_MISSING_ID 20 +#define SOAP_HREF 21 +#define SOAP_UDP_ERROR 22 +#define SOAP_TCP_ERROR 23 +#define SOAP_HTTP_ERROR 24 +#define SOAP_SSL_ERROR 25 +#define SOAP_ZLIB_ERROR 26 +#define SOAP_DIME_ERROR 27 +#define SOAP_DIME_HREF 28 +#define SOAP_DIME_MISMATCH 29 +#define SOAP_DIME_END 30 +#define SOAP_MIME_ERROR 31 +#define SOAP_MIME_HREF 32 +#define SOAP_MIME_END 33 +#define SOAP_VERSIONMISMATCH 34 +#define SOAP_PLUGIN_ERROR 35 +#define SOAP_DATAENCODINGUNKNOWN 36 +#define SOAP_REQUIRED 37 +#define SOAP_PROHIBITED 38 +#define SOAP_OCCURS 39 +#define SOAP_LENGTH 40 +#define SOAP_FD_EXCEEDED 41 + +#define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_TAG_END || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF) +#define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) +#define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) +#define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) +#define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) +#define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || (e) == SOAP_GET_METHOD || (e) == SOAP_NO_DATA || ((e) >= 100 && (e) < 600)) + +/* gSOAP HTTP response status codes 100 to 599 are reserved */ + +/* Codes 600 to 999 are user definable */ + +/* Exceptional gSOAP HTTP response status codes >= 1000 */ + +#define SOAP_STOP 1000 /* No HTTP response */ +#define SOAP_FORM 1001 /* Form request/response */ +#define SOAP_HTML 1002 /* Custom HTML response */ +#define SOAP_FILE 1003 /* Custom file-based response */ + +/* gSOAP HTTP method codes */ + +#define SOAP_POST 2000 +#define SOAP_GET 2001 + +/* gSOAP DIME */ + +#define SOAP_DIME_CF 0x01 +#define SOAP_DIME_ME 0x02 +#define SOAP_DIME_MB 0x04 +#define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ +#define SOAP_DIME_MEDIA 0x10 +#define SOAP_DIME_ABSURI 0x20 + +/* gSOAP ZLIB */ + +#define SOAP_ZLIB_NONE 0x00 +#define SOAP_ZLIB_DEFLATE 0x01 +#define SOAP_ZLIB_INFLATE 0x02 +#define SOAP_ZLIB_GZIP 0x02 + +/* gSOAP transport, connection, and content encoding modes */ + +typedef soap_int32 soap_mode; + +#define SOAP_IO 0x00000003 /* IO mask */ +#define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ +#define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ +#define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ +#define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ + +#define SOAP_IO_UDP 0x00000004 /* TCP or UDP */ + +#define SOAP_IO_LENGTH 0x00000008 /* calc message length (internal) */ +#define SOAP_IO_KEEPALIVE 0x00000010 /* keep connection alive */ + +#define SOAP_ENC_LATIN 0x00000020 /* accept iso-8859-1 encoding */ +#define SOAP_ENC_XML 0x00000040 /* plain XML encoding, no HTTP header */ +#define SOAP_ENC_DIME 0x00000080 +#define SOAP_ENC_MIME 0x00000100 +#define SOAP_ENC_MTOM 0x00000200 +#define SOAP_ENC_ZLIB 0x00000400 +#define SOAP_ENC_SSL 0x00000800 + +#define SOAP_ENC 0x00000FFF /* IO and ENC mask */ + +#define SOAP_XML_STRICT 0x00001000 /* apply strict validation */ +#define SOAP_XML_INDENT 0x00002000 /* emit indented XML */ +#define SOAP_XML_CANONICAL 0x00004000 /* EXC C14N canonical XML */ +#define SOAP_XML_TREE 0x00008000 /* emit XML tree (no id/ref) */ +#define SOAP_XML_GRAPH 0x00010000 +#define SOAP_XML_NIL 0x00020000 +#define SOAP_XML_DOM 0x00040000 +#define SOAP_XML_SEC 0x00080000 /* reserved for WS security */ + +#define SOAP_C_NOIOB 0x00100000 /* don't fault on array index out of bounds (just ignore) */ +#define SOAP_C_UTFSTRING 0x00200000 /* (de)serialize strings with UTF8 content */ +#define SOAP_C_MBSTRING 0x00400000 /* (de)serialize strings with multi-byte content */ +#define SOAP_C_NILSTRING 0x00800000 /* serialize empty strings as nil (omitted) */ + +#define SOAP_DOM_TREE 0x01000000 +#define SOAP_DOM_NODE 0x02000000 +#define SOAP_DOM_ASIS 0x04000000 + +#define SOAP_MIME_POSTCHECK 0x10000000 /* MIME flag (internal) */ + +#define SOAP_IO_DEFAULT SOAP_IO_FLUSH + +/* SSL client/server authentication settings */ + +#define SOAP_SSL_NO_AUTHENTICATION 0x00 /* for testing purposes */ +#define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x01 /* client requires server to authenticate */ +#define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x02 /* server requires client to authenticate */ +#define SOAP_SSL_SKIP_HOST_CHECK 0x04 /* client does not check the common name of the host in certificate */ +#define SOAP_SSL_RSA 0x06 /* use RSA */ +#define SOAP_SSLv3_TLSv1 0x00 /* SSL v3 and TLS v1 support by default */ +#define SOAP_SSLv3 0x10 /* SSL v3 only */ +#define SOAP_TLSv1 0x20 /* TLS v1 only */ + +#define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_SSLv3_TLSv1) + +/* state */ + +#define SOAP_INIT 1 +#define SOAP_COPY 2 + +#define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY)) + +/* part */ + +#define SOAP_BEGIN 0 +#define SOAP_IN_ENVELOPE 2 +#define SOAP_IN_HEADER 3 +#define SOAP_END_HEADER 4 +#define SOAP_NO_BODY 5 +#define SOAP_IN_BODY 6 +#define SOAP_END_BODY 7 +#define SOAP_END_ENVELOPE 8 +#define SOAP_END 9 +#define SOAP_BEGIN_SECURITY 10 +#define SOAP_IN_SECURITY 11 +#define SOAP_END_SECURITY 12 + +/* DEBUG macros */ + +#ifndef WITH_LEAN +# ifdef DEBUG +# ifndef SOAP_DEBUG +# define SOAP_DEBUG +# endif +# ifndef SOAP_MEM_DEBUG +# define SOAP_MEM_DEBUG +# endif +# endif +#endif + +#ifdef SOAP_MEM_DEBUG +# ifndef SOAP_MALLOC +# define SOAP_MALLOC(soap, size) soap_track_malloc(soap, __FILE__, __LINE__, size) +# endif +# ifndef SOAP_FREE +# define SOAP_FREE(soap, ptr) soap_track_free(soap, __FILE__, __LINE__, ptr) +# endif +#endif + +#ifndef SOAP_MALLOC /* use libc malloc */ +# define SOAP_MALLOC(soap, size) malloc(size) +#endif + +#ifndef SOAP_FREE /* use libc free */ +# define SOAP_FREE(soap, ptr) free(ptr) +#endif + +#ifdef SOAP_DEBUG +# ifndef SOAP_MESSAGE +# define SOAP_MESSAGE fprintf +# endif +# ifndef DBGLOG +# define DBGLOG(DBGFILE, CMD) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ + CMD;\ + fflush(fdebug);\ + }\ + }\ +} +# endif +# ifndef DBGMSG +# define DBGMSG(DBGFILE, MSG, LEN) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { fwrite((MSG), 1, (LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + }\ + }\ +} +# endif +# ifndef DGBFUN +# define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) +# define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT")\n", __FILE__, __LINE__, FNAME, (ARG))) +# define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) +# define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2", "FMT3")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) +# endif +# ifndef DBGHEX +# define DBGHEX(DBGFILE, MSG, LEN) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { int i; char *s;\ + for (s = (char*)(MSG), i = (LEN); i; i--)\ + fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X ", (int)*s++&0xFF);\ + fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + }\ + }\ +} +# endif +#else +# define DBGLOG(DBGFILE, CMD) +# define DBGMSG(DBGFILE, MSG, LEN) +# define DBGFUN(FNAME) +# define DBGFUN1(FNAME, FMT, ARG) +# define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) +# define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) +# define DBGHEX(DBGFILE, MSG, LEN) +#endif + +/* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ +typedef soap_int32 soap_wchar; + +/* namespace table row */ +struct Namespace +{ const char *id; + const char *ns; + const char *in; + char *out; +}; + +/* namespace stack */ +struct soap_nlist +{ struct soap_nlist *next; + unsigned int level; /* nesting depth level */ + short index; /* corresponding entry in ns mapping table */ + char *ns; /* only set when parsed ns URI is not in the ns mapping table */ + char id[1]; /* the actual string value flows into the allocated region below this struct */ +}; + +/* block stack for nested block allocations */ +struct soap_blist +{ struct soap_blist *next; + char *ptr; + size_t size; +}; + +/* array layout */ +struct soap_array +{ void *__ptr; + int __size; +}; + +/* pointer serialization management */ +struct soap_plist +{ struct soap_plist *next; + const void *ptr; + const struct soap_array *array; + int type; + int id; + char mark1; + char mark2; +}; + +/* block allocation for pointer serialization management */ +struct soap_pblk +{ struct soap_pblk *next; + struct soap_plist plist[SOAP_PTRBLK]; +}; + +#ifdef SOAP_MEM_DEBUG +/* malloc/free tracking for debugging */ +struct soap_mlist +{ struct soap_mlist *next; + const void *ptr; + const char *file; + int line; + short live; +}; +#endif + +/* class allocation list */ +struct soap_clist +{ struct soap_clist *next; + void *ptr; + int type; + int size; + void (*fdelete)(struct soap_clist*); +}; + +/* attributes */ +struct soap_attribute +{ struct soap_attribute *next; + char *value; + size_t size; + char *ns; + short visible; + char name[1]; /* the actual name string flows into the allocated region below this struct */ +}; + +#ifndef WITH_LEAN +struct soap_cookie +{ struct soap_cookie *next; + char *name; + char *value; + char *domain; + char *path; + time_t expire; /* client-side: local time to expire */ + long maxage; /* server-side: seconds to expire */ + unsigned int version; + short secure; + short session; /* server-side */ + short env; /* server-side: got cookie from client and should not be (re)send */ + short modified; /* server-side: client cookie was modified and should be send */ +}; +#endif + +#ifdef __cplusplus +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); + +class soap_multipart_iterator +{ public: + struct soap_multipart *content; + bool operator==(const soap_multipart_iterator& iter) const + { return content == iter.content; } + bool operator!=(const soap_multipart_iterator& iter) const + { return content != iter.content; } + struct soap_multipart &operator*() const + { return *content; } + soap_multipart_iterator &operator++() + { content = soap_next_multipart(content); return *this; } + soap_multipart_iterator() : content(NULL) + { } + soap_multipart_iterator(struct soap_multipart *p) : content(p) + { } +}; +#endif + +#ifndef WITH_LEANER +struct soap_dime +{ size_t count; + size_t size; + size_t chunksize; + size_t buflen; + char flags; + char *ptr; + const char *id; + const char *type; + const char *options; + struct soap_multipart *list; /* list of DIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +struct soap_mime +{ char *boundary; /* MIME boundary */ + const char *start; /* MIME start ID */ + struct soap_multipart *list; /* list of MIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +/* RFC2045 MIME content transfer encodings */ +enum soap_mime_encoding +{ SOAP_MIME_NONE, + SOAP_MIME_7BIT, + SOAP_MIME_8BIT, + SOAP_MIME_BINARY, + SOAP_MIME_QUOTED_PRINTABLE, + SOAP_MIME_BASE64, + SOAP_MIME_IETF_TOKEN, + SOAP_MIME_X_TOKEN +}; +#endif + +#ifndef WITH_LEANER +/* DIME/MIME multipart list */ +struct soap_multipart +{ struct soap_multipart *next; + char *ptr; /* points to raw data content */ + size_t size; /* size of data content */ + const char *id; /* DIME/MIME content ID or form data name */ + const char *type; /* DIME/MIME type (MIME type format) */ + const char *options; /* DIME options */ + enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ + const char *location; /* MIME Content-Location (optional) */ + const char *description; /* MIME Content-Description (optional) */ +#ifdef __cplusplus + typedef soap_multipart_iterator iterator; +#endif +}; +#endif + +#ifndef WITH_LEANER +/* attachment DIME and MTOM XOP forwarding */ +struct soap_xlist +{ struct soap_xlist *next; + unsigned char **ptr; + int *size; + char *id; + char **type; + char **options; +}; +#endif + +/******************************************************************************/ + +#ifndef WITH_LEANER +#ifdef __cplusplus +class soap_dom_attribute_iterator +{ public: + struct soap_dom_attribute *att; + const char *nstr; + const char *name; + bool operator==(const soap_dom_attribute_iterator&) const; + bool operator!=(const soap_dom_attribute_iterator&) const; + struct soap_dom_attribute &operator*() const; + soap_dom_attribute_iterator &operator++(); + soap_dom_attribute_iterator(); + soap_dom_attribute_iterator(struct soap_dom_attribute*); + ~soap_dom_attribute_iterator(); +}; +#endif +#endif + +#ifndef WITH_LEANER +struct soap_dom_attribute +{ struct soap_dom_attribute *next; + const char *nstr; + char *name; + char *data; + wchar_t *wide; + struct soap *soap; +#ifdef __cplusplus + typedef soap_dom_attribute_iterator iterator; + struct soap_dom_attribute &set(const char *nstr, const char *name); /* set namespace and name */ + struct soap_dom_attribute &set(const char *data); /* set data */ + soap_dom_attribute_iterator begin(); + soap_dom_attribute_iterator end(); + soap_dom_attribute_iterator find(const char *nstr, const char *name); + void unlink(); + soap_dom_attribute(); + soap_dom_attribute(struct soap *soap); + soap_dom_attribute(struct soap *soap, const char *nstr, const char *name, const char *data); + ~soap_dom_attribute(); +#endif +}; +#endif + +#ifndef WITH_LEANER +#ifdef __cplusplus +class soap_dom_element_iterator +{ public: + struct soap_dom_element *elt; + const char *nstr; + const char *name; + int type; + bool operator==(const soap_dom_element_iterator&) const; + bool operator!=(const soap_dom_element_iterator&) const; + struct soap_dom_element &operator*() const; + soap_dom_element_iterator &operator++(); + soap_dom_element_iterator(); + soap_dom_element_iterator(struct soap_dom_element*); + ~soap_dom_element_iterator(); +}; +#endif +#endif + +#ifndef WITH_LEANER +struct soap_dom_element +{ struct soap_dom_element *next; /* next sibling */ + struct soap_dom_element *prnt; /* parent */ + struct soap_dom_element *elts; /* list of child elements */ + struct soap_dom_attribute *atts; /* list of attributes */ + const char *nstr; /* namespace string */ + char *name; /* element tag name */ + char *data; /* element content data (with SOAP_C_UTFSTRING flag set) */ + wchar_t *wide; /* element content data */ + int type; /* optional: serialized C/C++ data type */ + void *node; /* optional: pointer to serialized C/C++ data */ + char *head; /* leading whitespace to start tag */ + char *tail; /* leading whitespace to end tag */ + struct soap *soap; /* soap context that manages this node */ +#ifdef __cplusplus + typedef soap_dom_element_iterator iterator; + struct soap_dom_element &set(const char *nstr, const char *name); + struct soap_dom_element &set(const char *data); + struct soap_dom_element &set(void *node, int type); + struct soap_dom_element &add(struct soap_dom_element*); + struct soap_dom_element &add(struct soap_dom_element&); + struct soap_dom_element &add(struct soap_dom_attribute*); + struct soap_dom_element &add(struct soap_dom_attribute&); + soap_dom_element_iterator begin(); + soap_dom_element_iterator end(); + soap_dom_element_iterator find(const char *nstr, const char *name); + soap_dom_element_iterator find(int type); + void unlink(); + soap_dom_element(); + soap_dom_element(struct soap *soap); + soap_dom_element(struct soap *soap, const char *nstr, const char *name); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, const char *data); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, void *node, int type); + ~soap_dom_element(); +#endif +}; +SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(struct soap_dom_element *elt); +SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(struct soap_dom_attribute *att); +#endif + +#if defined(__cplusplus) && !defined(WITH_LEAN) +} +extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); +extern std::istream &operator>>(std::istream&, struct soap_dom_element&); +extern "C" { +#endif + +/******************************************************************************/ + +#ifdef WIN32 +# ifdef SOAP_STD_EXPORTS +# define SOAP_STD_API __declspec(dllexport) +# else +# define SOAP_STD_API +# endif +#else +# define SOAP_STD_API +#endif + +struct SOAP_STD_API soap +{ short state; /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */ + short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */ + soap_mode mode; + soap_mode imode; + soap_mode omode; + const char *float_format; /* user-definable format string for floats (<1024 chars) */ + const char *double_format; /* user-definable format string for doubles (<1024 chars) */ + const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ + int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ + int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ + int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ + int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ + int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ + int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ + int accept_flags; /* accept() SOL_SOCKET sockopt flags */ + const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ + struct Namespace *local_namespaces; /* Local namespace mapping table */ + struct soap_nlist *nlist; /* namespace stack */ + struct soap_blist *blist; /* block allocation stack */ + struct soap_clist *clist; /* class instance allocation list */ + void *alist; /* memory allocation (malloc) list */ + struct soap_ilist *iht[SOAP_IDHASH]; + struct soap_plist *pht[SOAP_PTRHASH]; + struct soap_pblk *pblk; /* plist block allocation */ + short pidx; /* plist block allocation */ + struct SOAP_ENV__Header *header; + struct SOAP_ENV__Fault *fault; + int idnum; + void *user; /* to pass user-defined data */ + struct soap_plugin *plugins; /* linked list of plug-in data */ + char *userid; /* HTTP Basic authorization userid */ + char *passwd; /* HTTP Basic authorization passwd */ + int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); + int (*fget)(struct soap*); + int (*fform)(struct soap*); + int (*fposthdr)(struct soap*, const char*, const char*); + int (*fresponse)(struct soap*, int, size_t); + int (*fparse)(struct soap*); + int (*fparsehdr)(struct soap*, const char*, const char*); + int (*fheader)(struct soap*); + int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); + int (*fconnect)(struct soap*, const char*, const char*, int); + int (*fdisconnect)(struct soap*); + int (*fclosesocket)(struct soap*, SOAP_SOCKET); + int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); + int (*fopen)(struct soap*, const char*, const char*, int); + int (*faccept)(struct soap*, int, struct sockaddr*, int *n); + int (*fclose)(struct soap*); + int (*fsend)(struct soap*, const char*, size_t); + size_t (*frecv)(struct soap*, char*, size_t); + int (*fpoll)(struct soap*); + void (*fseterror)(struct soap*, const char **c, const char **s); + int (*fignore)(struct soap*, const char*); + int (*fserveloop)(struct soap*); + void *(*fplugin)(struct soap*, const char*); + void *(*fmalloc)(struct soap*, size_t); +#ifndef WITH_LEANER + int (*fprepareinit)(struct soap*); + int (*fpreparesend)(struct soap*, const char*, size_t); + int (*fpreparerecv)(struct soap*, const char*, size_t); + int (*fpreparefinal)(struct soap*); + void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); + void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); + void (*fdimereadclose)(struct soap*, void*); + void (*fdimewriteclose)(struct soap*, void*); + size_t (*fdimeread)(struct soap*, void*, char*, size_t); + int (*fdimewrite)(struct soap*, void*, const char*, size_t); + void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*); + void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding); + void (*fmimereadclose)(struct soap*, void*); + void (*fmimewriteclose)(struct soap*, void*); + size_t (*fmimeread)(struct soap*, void*, char*, size_t); + int (*fmimewrite)(struct soap*, void*, const char*, size_t); +#endif + int master; + int socket; +#if defined(__cplusplus) && !defined(WITH_LEAN) + std::ostream *os; + std::istream *is; +#else + void *os; /* preserve alignment */ + void *is; /* preserve alignment */ +#endif +#ifndef UNDER_CE + int sendfd; + int recvfd; +#else + FILE *sendfd; + FILE *recvfd; +#endif + size_t bufidx; /* index in soap.buf[] */ + size_t buflen; /* length of soap.buf[] content */ + soap_wchar ahead; /* parser lookahead */ + short cdata; /* CDATA parser state */ + short body; /* parsed XML element has a body or not */ + unsigned int level; /* XML nesting level */ + size_t count; /* message length counter */ + size_t length; /* message length as set by HTTP header */ + char *labbuf; /* look-aside buffer */ + size_t lablen; /* look-aside buffer allocated length */ + size_t labidx; /* look-aside buffer index to available part */ + char buf[SOAP_BUFLEN];/* send and receive buffer */ + char tmpbuf[1024]; /* in/output buffer for HTTP/MIME headers, simpleType values, attribute names, and DIME must be >=1024 bytes */ + char msgbuf[1024]; /* in/output buffer for messages >=1024 bytes */ + char tag[SOAP_TAGLEN]; + char id[SOAP_TAGLEN]; + char href[SOAP_TAGLEN]; + char type[SOAP_TAGLEN]; + char arrayType[SOAP_TAGLEN]; + char arraySize[SOAP_TAGLEN]; + char arrayOffset[SOAP_TAGLEN]; + short other; + short position; + int positions[SOAP_MAXDIMS]; + short root; + struct soap_attribute *attributes; /* attribute list */ + short encoding; /* when set, output encodingStyle */ + short mustUnderstand; /* a mustUnderstand element was parsed or is output */ + short keep_alive; /* connection should be kept open */ + short null; /* parsed XML is xsi:nil */ + short ns; /* when not set, output full xmlns bindings */ + short part; /* parsing state */ + short alloced; + short peeked; + size_t chunksize; + size_t chunkbuflen; + char endpoint[SOAP_TAGLEN]; + char path[SOAP_TAGLEN]; + char host[SOAP_TAGLEN]; + char *action; + char *authrealm; /* HTTP authentication realm */ + char *prolog; /* XML declaration prolog */ + unsigned long ip; /* IP number */ + int port; /* port number */ + unsigned int max_keep_alive; + const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */ + const char *proxy_host; /* Proxy Server host name */ + int proxy_port; /* Proxy Server port (default = 8080) */ + const char *proxy_userid; /* Proxy Authorization user name */ + const char *proxy_passwd; /* Proxy Authorization password */ + int status; /* -1 when request, else error code to be returned by server */ + int error; + int errmode; + int errnum; +#ifndef WITH_LEANER + struct soap_dom_element *dom; + struct soap_dime dime; + struct soap_mime mime; + struct soap_xlist *xlist; +#endif +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) + const char *logfile[SOAP_MAXLOGS]; + FILE *fdebug[SOAP_MAXLOGS]; + struct soap_mlist *mht[SOAP_PTRHASH]; +#endif +#ifndef WITH_LEAN + const char *c14ninclude; + const char *c14nexclude; + struct soap_cookie *cookies; + const char *cookie_domain; + const char *cookie_path; + int cookie_max; +#endif +#ifndef WITH_NOIO +#ifdef WITH_IPV6 + struct sockaddr_storage peer; /* IPv6: set by soap_accept and by UDP recv */ +#else + struct sockaddr_in peer; /* IPv4: set by soap_connect/soap_accept and by UDP recv */ +#endif +#endif + size_t peerlen; +#ifdef WITH_OPENSSL + int (*fsslauth)(struct soap*); + int (*fsslverify)(int, X509_STORE_CTX*); + BIO *bio; + SSL *ssl; + SSL_CTX *ctx; + unsigned short ssl_flags; + const char *keyfile; + const char *password; + const char *dhfile; + const char *cafile; + const char *capath; + const char *crlfile; + const char *randfile; + SSL_SESSION *session; + char session_host[SOAP_TAGLEN]; + int session_port; +#endif +#ifdef WITH_ZLIB + short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ + short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + z_stream d_stream; /* decompression stream */ + char z_buf[SOAP_BUFLEN]; /* buffer */ + size_t z_buflen; + unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ + uLong z_crc; /* internal gzip crc */ + float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ + float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ +#endif +#ifdef WMW_RPM_IO + void *rpmreqid; +#endif +#ifndef WITH_LEAN +#ifdef __cplusplus + soap(); + soap(soap_mode); + soap(soap_mode, soap_mode); + soap(struct soap&); + ~soap(); +#endif +#endif +}; + +struct soap_code_map +{ long code; + const char *string; +}; + +/* forwarding list */ +struct soap_flist +{ struct soap_flist *next; + int type; + void *ptr; + unsigned int level; + size_t len; + void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t); +}; + +/* id-ref forwarding list */ +struct soap_ilist +{ struct soap_ilist *next; + int type; + size_t size; + void *link; + void *copy; + struct soap_flist *flist; + void *ptr; + unsigned int level; + char id[1]; /* the actual id string value flows into the allocated region below this struct */ +}; + +struct soap_plugin +{ struct soap_plugin *next; + const char *id; + void *data; + int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); + void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ +}; + +#ifndef WITH_NONAMESPACES +extern SOAP_NMAC struct Namespace namespaces[]; +#endif + +#ifndef WITH_LEAN +# define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) +# define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) +#else +soap_wchar soap_get0(struct soap*); +soap_wchar soap_get1(struct soap*); +#endif + +#define soap_revget1(soap) ((soap)->bufidx--) +#define soap_unget(soap, c) ((soap)->ahead = c) +#define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) +#define soap_imode(soap, n) ((soap)->mode = (soap)->imode = (n)) +#define soap_set_imode(soap, n) ((soap)->imode |= (n)) +#define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) +#define soap_omode(soap, n) ((soap)->mode = (soap)->omode = (n)) +#define soap_set_omode(soap, n) ((soap)->omode |= (n)) +#define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) +#define soap_set_mode(soap, n) ((soap)->imode |= (n), (soap)->omode |= (n)) +#define soap_clr_mode(soap, n) ((soap)->imode &= ~(n), (soap)->omode &= ~(n)) +#define soap_destroy(soap) soap_delete((soap), NULL) + +#ifdef HAVE_STRRCHR +# define soap_strrchr(s, t) strrchr(s, t) +#else + SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); +#endif + +#ifdef HAVE_STRTOL +# define soap_strtol(s, t, b) strtol(s, t, b) +#else + SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b); +#endif + +#ifdef HAVE_STRTOUL +# define soap_strtoul(s, t, b) strtoul(s, t, b) +#else + SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b); +#endif + +#if defined(WITH_OPENSSL) +# define soap_random soap_rand() +SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); +#elif defined(HAVE_RANDOM) +# define soap_random (int)random() +#else +# define soap_random rand() +#endif + +#ifdef WITH_NOIDREF +# define soap_embedded(s, p, t) (0) +# define soap_id_lookup(s, i, p, t, n, k) (p) +# define soap_id_forward(s, h, p, len, st, tt, n, k, fc) (p) +# define soap_reference(s, a, t) (1) +# define soap_array_reference(s, p, a, n, t) (1) +# define soap_embed(s, p, a, n, t, pp) (0) +# define soap_embedded_id(s, i, p, t) (i) +# define soap_is_embedded(s, p) (0) +# define soap_is_single(s, p) (1) +# define soap_lookup_type(s, i) (0) +# define soap_getindependent(s) (0) +# define soap_putindependent(s) (0) +# define soap_getelement(s, n) (n) +# define soap_putelement(s, p, t, i, n) (0) +# define soap_markelement(s, p, n) (0) +#endif + +SOAP_FMAC1 void SOAP_FMAC2 soap_fault(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultcode(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultsubcode(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultstring(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultdetail(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializefault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); +SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_accept(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); +SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); + +SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); +SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap*, unsigned char**, int*, char**, char**, char**); +#endif + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +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); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const struct soap_array *a, int n, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); + +SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); +SOAP_FMAC1 long SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); +SOAP_FMAC1 long SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long); + +SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); + +SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); +SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, void (*fdelete)(struct soap_clist*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_unlink(struct soap*, const void*); +SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*); + +SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void(*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t)); +#endif +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct 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*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t, const void *q, size_t n); + +SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *, const char *, int *); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsize(struct soap*, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizes(struct soap*, const char *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffset(struct soap*, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); + +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new(void); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new1(soap_mode); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new2(soap_mode, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(struct soap*); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init1(struct soap*, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_init2(struct soap*, soap_mode, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); + +#ifdef SOAP_DEBUG +SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); +#endif + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); +SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const struct soap_array *a, int d, const char *type, int n); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); +SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); +SOAP_FMAC1 const char * SOAP_FMAC2 soap_strsearch(const char *big, const char *little); + +SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); +SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long); + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); +SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, int n1, int n2); + +SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag); + +SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n); + +SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); + +SOAP_FMAC1 int SOAP_FMAC2 soap_new_block(struct soap*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, size_t); +SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, char*, int); +SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); +SOAP_FMAC1 int soap_envelope_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*); + +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); +#endif + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); + +#ifndef WITH_LEAN +SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); +#endif + + +SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); +SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); +SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); +SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); +SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); +SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); +SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); +SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); +SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); +SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); +SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long); +SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); + +#ifndef WITH_LEAN +SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long); +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, long); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); +SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap); +SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap); +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle); +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); +SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); + +#ifdef WITH_COOKIES +SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char*, char*, size_t); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, struct soap*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/org.glite.security.proxyrenewal/.cvsignore b/org.glite.security.proxyrenewal/.cvsignore deleted file mode 100644 index 3a4edf6..0000000 --- a/org.glite.security.proxyrenewal/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project diff --git a/org.glite.security.proxyrenewal/LICENSE b/org.glite.security.proxyrenewal/LICENSE deleted file mode 100644 index 01b973b..0000000 --- a/org.glite.security.proxyrenewal/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.security.proxyrenewal/Makefile b/org.glite.security.proxyrenewal/Makefile deleted file mode 100644 index 24252c7..0000000 --- a/org.glite.security.proxyrenewal/Makefile +++ /dev/null @@ -1,167 +0,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 -# -# Top Makefile file for the GLite Security Proxyrenewal module -# -# Authors: Ales Krenek -# Version info: $Id$ -# Release: $Name$ -# -# Revision history: -# $Log -# - -# defaults -top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -distdir=. -globalprefix=glite -lbprefix=lb -package=glite-security-proxyrenewal -version=0.0.0 -PREFIX=/opt/glite - -glite_location=$PREFIX -globus_prefix=/opt/globus -nothrflavour=gcc32 -thrflavour=gcc32pthr -myproxy_prefix=$globus_prefix - --include Makefile.inc - -VPATH:=${top_srcdir}/src:${top_srcdir}/examples - -GLOBUSINC:= -I${globus_prefix}/include/${nothrflavour} \ - -I${globus_prefix}/include/${nothrflavour}/openssl - -GLOBUSTHRINC:= -I${globus_prefix}/include/${thrflavour} \ - -I${globus_prefix}/include/${thrflavour}/openssl - -MYPROXYINC:= -I${myproxy_prefix}/include/${nothrflavour} -MYPROXYTHRINC:= -I${myproxy_prefix}/include/${thrflavour} - -DEBUG:=-g -O0 - -CFLAGS:= ${DEBUG} \ - ${MYPROXYINC} \ - -I${top_srcdir}/src -I${top_srcdir}/interface \ - -I${glite_location}/include - -GLOBUS_LIBS:=-L${globus_prefix}/lib \ - -lglobus_common_${nothrflavour} \ - -lssl_${nothrflavour} - -MYPROXY_LIB_NOTHR :=-L${myproxy_prefix}/lib -lmyproxy_${nothrflavour} -MYPROXY_LIB_THR:=-L${myproxy_prefix}/lib -lmyproxy_${thrflavour} - -offset=1 -version_info:=-version-info ${shell \ - perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -INSTALL:=libtool --mode=install install - -DAEMONOBJ:=renewd.o renew.o common.o commands.o api.o voms.o -LIBOBJ:=api.o common.o -LIB_CORE_OBJS := renewal_core.o voms.o -CLIENTOBJ:=client.o - -THRLIBOBJ:=${LIBOBJ:.o=.thr.o} -LIBLOBJ:=${LIBOBJ:.o=.lo} -THRLIBLOBJ:=${LIBOBJ:.o=.thr.lo} - -LIB_CORE_NOTHR_OBJS := ${LIB_CORE_OBJS} -LIB_CORE_NOTHR_LOBJS := ${LIB_CORE_OBJS:.o=.lo} -LIB_CORE_THR_OBJS := ${LIB_CORE_OBJS:.o=.thr.o} -LIB_CORE_THR_LOBJS := ${LIB_CORE_OBJS:.o=.thr.lo} - -LIB:=libglite_security_proxyrenewal_${nothrflavour}.la -THRLIB:=libglite_security_proxyrenewal_${thrflavour}.la -LIB_CORE_NOTHR := libglite_security_proxyrenewal_core_${nothrflavour}.la -LIB_CORE_THR := libglite_security_proxyrenewal_core_${thrflavour}.la - -VOMS_LIB_NOTHR := -L${glite_location}/lib -lvomsc_${nothrflavour} -VOMS_LIB_THR := -L${glite_location}/lib -lvomsc_${thrflavour} - -DAEMON:=glite-proxy-renewd -CLIENT:=glite-proxy-renew -EXAMPLES := renew_core - -default: all -compile all: ${LIB} ${THRLIB} ${LIB_CORE_NOTHR} ${DAEMON} ${CLIENT} - -${LIB}: ${LIBOBJ} - ${LINK} ${version_info} -o $@ ${LIBLOBJ} -rpath ${glite_location}/lib - -${THRLIB}: ${THRLIBOBJ} - ${LINK} ${version_info} -o $@ ${THRLIBLOBJ} -rpath ${glite_location}/lib - -${LIB_CORE_NOTHR}: ${LIB_CORE_NOTHR_OBJS} - ${LINK} ${version_info} -o $@ ${LIB_CORE_NOTHR_LOBJS} -rpath ${glite_location}/lib ${MYPROXY_LIB_NOTHR} ${VOMS_LIB_NOTHR} - -${LIB_CORE_THR}: ${LIB_CORE_THR_OBJS} - ${LINK} ${version_info} -o $@ ${LIB_CORE_THR_LOBJS} -rpath ${glite_location}/lib ${MYPROXY_LIB_THR} ${VOMS_LIB_THR} - -${DAEMON}: ${DAEMONOBJ} ${LIB_CORE_NOTHR} - ${LINK} -o $@ ${DAEMONOBJ} ${LIB_CORE_NOTHR} - -${CLIENT}: ${CLIENTOBJ} ${LIB} - ${LINK} -o $@ ${CLIENTOBJ} ${LIB} ${GLOBUS_LIBS} - -${THRLIBOBJ} ${LIB_CORE_THR_OBJS}: %.thr.o: %.c - ${COMPILE} ${GLOBUSTHRINC} -o $@ -c $< - -%.o: %.c - ${COMPILE} ${GLOBUSINC} -c $< - -${EXAMPLES}: %: %.o - ${LINK} -o $@ $< ${LIB_CORE_NOTHR} - -stage: compile - $(MAKE) install PREFIX=${stagedir} - -check: - echo No unit tests - -examples: ${EXAMPLES} - -dist: distsrc distbin - -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=`pwd`/tmpbuilddir - cd tmpbuilddir && tar -czf ../${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz * - rm -rf tmpbuilddir - -install: - -mkdir -p ${PREFIX}/bin ${PREFIX}/lib ${PREFIX}/include/glite/security/proxyrenewal ${PREFIX}/share/doc/${package}-${version} ${PREFIX}/etc/init.d - ${INSTALL} -m 644 ${LIB} ${THRLIB} ${LIB_CORE_NOTHR} ${PREFIX}/lib - ${INSTALL} -m 755 ${DAEMON} ${CLIENT} ${PREFIX}/bin - ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - cd ${top_srcdir}/interface && ${INSTALL} -m 644 renewal.h renewal_core.h ${PREFIX}/include/glite/security/proxyrenewal - - ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-proxy-renewald - - -clean: - $(RM) $(LIB) ${THRLIB} ${LIB_CORE_NOTHR} ${LIB_CORE_THR} $(DAEMON) $(CLIENT) $(EXAMPLES) *.o *.lo core - -.PHONY: default all compile examples check stage dist distsrc distbin install clean diff --git a/org.glite.security.proxyrenewal/build.xml b/org.glite.security.proxyrenewal/build.xml deleted file mode 100755 index 2ddf1c0..0000000 --- a/org.glite.security.proxyrenewal/build.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.security.proxyrenewal/config/startup b/org.glite.security.proxyrenewal/config/startup deleted file mode 100755 index 26ba757..0000000 --- a/org.glite.security.proxyrenewal/config/startup +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh - -GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite} -GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/opt/glite/var} - -[ -f /etc/glite.conf ] && . /etc/glite.conf -[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf -[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf - -PROXY_REPOSITORY="$GLITE_LOCATION_VAR/spool/glite-renewd" - -unset creds - -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="-t $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="-t /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 - - # workaround for VOMS_FindByVO that seems to always require user's own VOMS config file (bug #7511) - user_voms_config=$HOME/.glite/vomses - if [ ! -f "$user_voms_config" ]; then - rm -f /tmp/renewal_vomses - su - $GLITE_USER -c "touch /tmp/renewal_vomses && chmod 644 /tmp/renewal_vomses" - user_voms_config=/tmp/renewal_vomses - fi - - echo -n Starting ProxyRenewal Daemon: glite-proxy-renewd ... - - if [ ! -d "$PROXY_REPOSITORY" ]; then - mkdir -p $PROXY_REPOSITORY || exit 1 - chown $GLITE_USER $PROXY_REPOSITORY - chmod 0700 $PROXY_REPOSITORY - fi - - su - $GLITE_USER -c "VOMS_USERCONF=$user_voms_config \ - $GLITE_LOCATION/bin/glite-proxy-renewd \ - -r $PROXY_REPOSITORY $creds -A" && echo " done" -} - -stop() -{ - echo -n "Stopping ProxyRenewal Daemon: glite-proxy-renewd ..." - killall glite-proxy-renewd - echo " done" -} - -status() -{ - if netstat -an --unix | grep "^unix .* LISTEN.* /tmp/dgpr_renew_" >/dev/null 2>&1 ;then - echo glite-proxy-renewd running - else - echo glite-proxy-renewd not running - return 1 - fi -} - -case x$1 in - xstart) start;; - xstop) stop;; - xrestart) stop; start;; - xstatus) status;; - x*) echo usage: $0 start,stop,restart,status >&2 - exit 1;; -esac diff --git a/org.glite.security.proxyrenewal/examples/renew_core.c b/org.glite.security.proxyrenewal/examples/renew_core.c deleted file mode 100644 index 69518ea..0000000 --- a/org.glite.security.proxyrenewal/examples/renew_core.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -#include -#include - -static struct option const long_options[] = { - { "server", required_argument, 0, 's' }, - { "proxy", required_argument, 0, 'p' }, - { "help", no_argument, 0, 'h' }, - { NULL, 0, NULL, 0} -}; - -static char short_options[] = "s:p:h"; - -int -main(int argc, char *argv[]) -{ - char *server = NULL; - char *proxy = NULL; - char *new_proxy = NULL; - extern int optind; - char arg; - glite_renewal_core_context ctx = NULL; - int ret; - - while ((arg = getopt_long(argc, argv, short_options, long_options, NULL)) != EOF) { - switch(arg) { - case 's': - server = optarg; break; - case 'p': - proxy = optarg; break; - case 'h': - fprintf(stdout, "Usage: %s --server --proxy \n", argv[0]); - exit(1); - } - } - - if (server == NULL || proxy == NULL) { - fprintf(stderr, "both server and proxy parameters must be given\n"); - exit(1); - } - - ret = glite_renewal_core_init_ctx(&ctx); - if (ret) { - fprintf(stderr, "glite_renewal_core_init_ctx() failed\n"); - exit(1); - } - - ctx->log_dst = GLITE_RENEWAL_LOG_NONE; - - ret = glite_renewal_core_renew(ctx, server, 0, proxy, &new_proxy); - if (ret) { - fprintf(stderr, "%s: glite_renewal_core_renew() failed: %s", - argv[0], ctx->err_message); - exit(1); - } - - ret = glite_renewal_core_destroy_ctx(ctx); - - printf("%s\n", new_proxy); - - return 0; -} diff --git a/org.glite.security.proxyrenewal/interface/renewal.h b/org.glite.security.proxyrenewal/interface/renewal.h deleted file mode 100644 index cf61a41..0000000 --- a/org.glite.security.proxyrenewal/interface/renewal.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * \file proxyrenewal/renewal.h - * \author Daniel Kouril - * \author Miroslav Ruda - * \brief API for proxy renewal. - * \version 2.0 - * - * General rules: - * - functions return 0 on success, nonzero on error, errror details can - * be found via edg_wlpr_GetErrorText() - */ - -#ifndef RENEWAL_H -#define RENEWAL_H - -#ident "$Header$" - -#include "glite/wmsutils/jobid/cjobid.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define EDG_WLPR_FLAG_UNIQUE 1 -#define EDG_WLPR_FLAG_UPDATE 2 - -typedef enum _edg_wlpr_ErrorCode { -/** - * Base for proxy renewal specific code. - * Start sufficently high not to collide with standard errno. */ - /* XXX see common/exception_codes.h */ - EDG_WLPR_ERROR_BASE = 1900, - EDG_WLPR_ERROR_UNEXPECTED_EOF, - EDG_WLPR_ERROR_GENERIC, - EDG_WLPR_ERROR_PROTO_PARSE_ERROR, - EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND, - EDG_WLPR_ERROR_UNKNOWN_COMMAND, - EDG_WLPR_ERROR_SSL, - EDG_WLPR_ERROR_MYPROXY, - EDG_WLPR_PROXY_NOT_REGISTERED, - EDG_WLPR_PROXY_EXPIRED, - EDG_WLPR_ERROR_VOMS, - EDG_WLPR_ERROR_TIMEOUT, - EDG_WLPR_ERROR_ERRNO, -} edg_wlpr_ErrorCode; - -/** - * Return a human readable string containg description of the errorcode - * \retval char* pointer to a error description - */ -const char * -edg_wlpr_GetErrorText(int err_code); - -/** - * This function contacts the renewal daemon and registers the specified proxy - * for periodic renewal. - * \param filename IN: specification of the proxy to register. - * \param jdl IN: JDL of the job owing the proxy. The JDL is looked for a - * myproxy server contact. - * \param flags IN: one of EDG_WLPR_FLAG_UNIQUE or EDG_WLPR_FLAG_UPDATE, or - * their bitwise OR. - * \param repository_filename OUT: filename of registered proxy in repository. - * \retval 0 success - * \retval nonzero on error. Human readable form of the error can be get via - * edg_wlpr_GetErrorText(). - */ -int -edg_wlpr_RegisterProxy( - const char * filename, - const char *jdl, - int flags, - char ** repository_filename -); - -/** - * The same function as edg_wlpr_RegisterProxy() but information about the - * myproxy server and jobid are passed as parameters instead of in JDL. - */ -#ifdef RENEWAL_HAVE_JOBID -int -edg_wlpr_RegisterProxyExt( - const char * filename, - const char * server, - unsigned int port, - edg_wlc_JobId jobid, - int flags, - char ** repository_filename -); -#endif - -int -glite_renewal_RegisterProxy( - const char * filename, - const char * server, - unsigned int port, - const char *jobid, - int flags, - char ** repository_filename -); - -/** - * Unregister proxy from the renewal daemon. - * \param jobid IN: specification of job whose proxy shall be unregistered - * \param filename IN: (optional) specification of the proxy to unregister. - * \retval 0 success - * \retval nonzero on error. Human readable form of the error can be get via - * edg_wlpr_GetErrorText(). - */ -#ifdef RENEWAL_HAVE_JOBID -int -edg_wlpr_UnregisterProxy( - edg_wlc_JobId jobid, - const char * repository_filename -); -#endif - -int -glite_renewal_UnregisterProxy( - const char * jobid, - const char * repository_filename -); - -/** - * Get a list of registered proxies maintained by the renewal daemon. - * \param count OUT: number of proxies - * \param list OUT: a list of filenames separated by '\n' - * specifying the registered proxies. - * \warning The caller is responsible for freeing the data. - * \retval 0 success - * \retval nonzero on error. Human readable form of the error can be get via - * edg_wlpr_GetErrorText(). - */ -int -edg_wlpr_GetList(int *count, char **list); - -/** - * Get a status message about a proxy. - * The function contacts the renewal daemon and retrieve information it - * maintains about the proxy. - * \param filename IN: specification of the proxy to query - * \param info OUT: status message. - * \warning The caller is responsible for freeing the data. - * \retval 0 success - * \retval nonzero on error. Human readable form of the error can be get via - * edg_wlpr_GetErrorText(). - */ -int -edg_wlpr_GetStatus(const char *repository_filename, char **info); - -/** - * For given jobid return registered proxy filename from repository - * \param jobid IN: specification of jobid - * \param repository_filename OUT: proxy regitered for given jobid - * \warning The caller is responsible for freeing the data. - * \retval 0 success - * \retval nonzero on error. Human readable form of the error can be get via - * edg_wlpr_GetErrorText(). - */ -#ifdef RENEWAL_HAVE_JOBID -int -edg_wlpr_GetProxy(edg_wlc_JobId jobid, char **repository_filename); -#endif - -int -glite_renewal_GetProxy( - const char * jobid, - char **repository_filename); - -#ifdef __cplusplus -} -#endif - -#endif /* RENEWAL_H */ diff --git a/org.glite.security.proxyrenewal/interface/renewal_core.h b/org.glite.security.proxyrenewal/interface/renewal_core.h deleted file mode 100644 index 8348963..0000000 --- a/org.glite.security.proxyrenewal/interface/renewal_core.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef RENEWAL_CORE_H -#define RENEWAL_CORE_H - -#ident "$Id$" - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - GLITE_RENEWAL_LOG_NONE, - GLITE_RENEWAL_LOG_STDOUT, - GLITE_RENEWAL_LOG_SYSLOG, -} glite_renewal_log_dst; - -typedef struct glite_renewal_core_context_data { - int log_level; - glite_renewal_log_dst log_dst; - char *err_message; - char *voms_conf; -} glite_renewal_core_context_data; - -typedef struct glite_renewal_core_context_data *glite_renewal_core_context; - -/** - * This cal initializes the context and sets default values - */ -int -glite_renewal_core_init_ctx(glite_renewal_core_context *context); - -/** - * This call frees the context and all memory used by the context - */ -int -glite_renewal_core_destroy_ctx(glite_renewal_core_context context); - -/** - * This call tries to renew the proxy certificate using the MyProxy - * repository. If VOMS attributes are present in the proxy they are renewed - * as well. - * \param context IN: context with authentication information - * \param myproxy_server IN: hostname of the myproxy repository - * \param myproxy_port IN: TCP port of the myproxy repository, if 0 the - * default value will be used - * \param current_proxy IN: filename with the proxy to renew - * \param new_proxy OUT: filename with the renewed proxy, the caller is - * responsible for removing the file when it's not needed. - */ -int -glite_renewal_core_renew(glite_renewal_core_context context, - const char *myproxy_server, - unsigned int myproxy_port, - const char *current_proxy, - char **new_proxy); - -#ifdef __cplusplus -} -#endif - -#endif /* RENEWAL_CORE_H */ diff --git a/org.glite.security.proxyrenewal/project/build.number b/org.glite.security.proxyrenewal/project/build.number deleted file mode 100644 index 1936771..0000000 --- a/org.glite.security.proxyrenewal/project/build.number +++ /dev/null @@ -1 +0,0 @@ -module.build=137 diff --git a/org.glite.security.proxyrenewal/project/build.properties b/org.glite.security.proxyrenewal/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.security.proxyrenewal/project/configure.properties.xml b/org.glite.security.proxyrenewal/project/configure.properties.xml deleted file mode 100644 index 3d6914b..0000000 --- a/org.glite.security.proxyrenewal/project/configure.properties.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -package=${module.package.name} -PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} -globus_prefix=${with.globus.prefix} -thrflavour=${with.globus.thr.flavor} -nothrflavour=${with.globus.nothr.flavor} -myproxy_prefix=${with.myproxy.prefix} - - - diff --git a/org.glite.security.proxyrenewal/project/properties.xml b/org.glite.security.proxyrenewal/project/properties.xml deleted file mode 100755 index f1e51dd..0000000 --- a/org.glite.security.proxyrenewal/project/properties.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.security.proxyrenewal/project/tar_exclude b/org.glite.security.proxyrenewal/project/tar_exclude deleted file mode 100644 index e1fcd1a..0000000 --- a/org.glite.security.proxyrenewal/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure.properties.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.security.proxyrenewal/project/taskdefs.xml b/org.glite.security.proxyrenewal/project/taskdefs.xml deleted file mode 100755 index 13e894e..0000000 --- a/org.glite.security.proxyrenewal/project/taskdefs.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/org.glite.security.proxyrenewal/project/version.properties b/org.glite.security.proxyrenewal/project/version.properties deleted file mode 100644 index 1441742..0000000 --- a/org.glite.security.proxyrenewal/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version=1.3.0 -module.age=1 diff --git a/org.glite.security.proxyrenewal/src/api.c b/org.glite.security.proxyrenewal/src/api.c deleted file mode 100644 index a72d692..0000000 --- a/org.glite.security.proxyrenewal/src/api.c +++ /dev/null @@ -1,550 +0,0 @@ -#include "renewal.h" -#include "renewal_locl.h" - -#ident "$Header$" - -#define SEPARATORS "\n" - -/* prototypes of static routines */ -static int -encode_request(edg_wlpr_Request *request, char **msg); - -static int -decode_response(const char *msg, const size_t msg_len, edg_wlpr_Response *response); - -static int -do_connect(char *socket_name, struct timeval *timeout, int *sock); - -static int -send_request(int sock, struct timeval *timeout, edg_wlpr_Request *request, edg_wlpr_Response *response); - -static int -encode_request(edg_wlpr_Request *request, char **msg) -{ - char *buf; - size_t buf_len; - int ret; - - buf_len = EDG_WLPR_BUF_SIZE; - buf = malloc(buf_len); - if (buf == NULL) - return ENOMEM; - buf[0] = '\0'; - - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_VERSION, - EDG_WLPR_VERSION, SEPARATORS); - if (ret) - goto err; - - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_COMMAND, - edg_wlpr_EncodeInt(request->command), - SEPARATORS); - if (ret) - goto err; - - if (request->myproxy_server) { - char host[1024]; - -#if 0 - snprintf(host, sizeof(host), "%s:%d", request->myproxy_server, - (request->myproxy_port) ? request->myproxy_port : EDG_WLPR_MYPROXY_PORT); /* XXX let server decide ? */ -#else - snprintf(host, sizeof(host), "%s", request->myproxy_server); -#endif - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_MYPROXY_SERVER, - host, SEPARATORS); - if (ret) - goto err; - } - - if (request->proxy_filename) { - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_PROXY, - request->proxy_filename, SEPARATORS); - if (ret) - goto err; - } - - if (request->jobid) { - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_JOBID, - request->jobid, SEPARATORS); - if (ret) - goto err; - } - - if (request->entries) { - char **p = request->entries; - while (*p) { - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_ENTRY, - *p, SEPARATORS); - if (ret) - goto err; - p++; - } - } - - buf[strlen(buf)] = '\0'; - *msg = buf; - return 0; - -err: - free(buf); - *msg = NULL; - return ret; -} - -static int -decode_response(const char *msg, const size_t msg_len, edg_wlpr_Response *response) -{ - int ret; - char *value = NULL; - /* char *p; */ - int i; - int current_size = 0; - - /* XXX add an ending zero '\0' */ - - assert(msg != NULL); - assert(response != NULL); - - memset(response, 0, sizeof(*response)); - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_VERSION, SEPARATORS, - 0, &response->version); - if (ret) - goto err; - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_RESPONSE, SEPARATORS, - 0, &value); - if (ret) - goto err; - - ret = edg_wlpr_DecodeInt(value, (int *)(&response->response_code)); - free(value); - if (ret) - goto err; - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_MYPROXY_SERVER, - SEPARATORS, 0, &response->myproxy_server); - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) - goto err; - -#if 0 - response->myproxy_port = EDG_WLPR_MYPROXY_PORT; /* ??? */ - if (response->myproxy_server && (p = strchr(response->myproxy_server, ':'))) { - int port; - *p = '\0'; - port = atol(p+1); /* XXX */ - response->myproxy_port = port; - } -#endif - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_START_TIME, SEPARATORS, - 0, &value); - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) - goto err; - if (ret == 0) { - ret = edg_wlpr_DecodeInt(value, (int *)(&response->start_time)); - free(value); - if (ret) - goto err; - } - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_END_TIME, SEPARATORS, - 0, &value); - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) - goto err; - if (ret == 0) { - ret = edg_wlpr_DecodeInt(value, (int *)(&response->end_time)); - free(value); - if (ret) - goto err; - } - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_RENEWAL_TIME, - SEPARATORS, 0, &value); - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) - goto err; - if (ret == 0) { - ret = edg_wlpr_DecodeInt(value, (int *)(&response->next_renewal_time)); - free(value); - if (ret) - goto err; - } - - /* XXX Counter */ - - i = 0; - while ((ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_PROXY, - SEPARATORS, i, &value)) == 0) { - if (i >= current_size) { - char **tmp; - - tmp = realloc(response->filenames, - (current_size + 16 + 1) * sizeof(*tmp)); - if (tmp == NULL) { - ret = ENOMEM; - goto err; - } - response->filenames = tmp; - current_size += 16; - } - response->filenames[i] = value; - i++; - } - if (ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) - goto err; - if (response->filenames) - response->filenames[i] = NULL; - - return 0; - -err: - edg_wlpr_CleanResponse(response); - - return ret; -} - -static int -do_connect(char *socket_name, struct timeval *timeout, int *sock) -{ - struct sockaddr_un my_addr; - int s; - int ret; - struct timeval before,after; - int sock_err; - socklen_t err_len; - - assert(sock != NULL); - memset(&my_addr, 0, sizeof(my_addr)); - - s = socket(AF_UNIX, SOCK_STREAM, 0); - if (s == -1) { - return errno; - } - - if (timeout) { - int flags = fcntl(s, F_GETFL, 0); - if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) - return errno; - } - - my_addr.sun_family = AF_UNIX; - strncpy(my_addr.sun_path, socket_name, sizeof(my_addr.sun_path)); - - ret = connect(s, (struct sockaddr *) &my_addr, sizeof(my_addr)); - if (ret == -1) { - if (errno == EINPROGRESS) { - struct pollfd pollfds[1]; - - pollfds[0].fd = s; - pollfds[0].events = POLLOUT; - - gettimeofday(&before,NULL); - switch (poll(pollfds, 1, timeout->tv_sec*1000+timeout->tv_usec/1000)) { - case -1: close(s); - return errno; - case 0: close(s); - return EDG_WLPR_ERROR_TIMEOUT; - } - gettimeofday(&after,NULL); - if (edg_wlpr_DecrementTimeout(timeout, before, after)) { - close (s); - return EDG_WLPR_ERROR_TIMEOUT; - } - - err_len = sizeof sock_err; - if (getsockopt(s,SOL_SOCKET,SO_ERROR,&sock_err,&err_len)) { - close(s); - return errno; - } - if (sock_err) { - close(s); - errno = sock_err; - return errno; - } - } else { - close(s); - return errno; - } - } - - *sock = s; - return 0; -} - -static int -send_request(int sock, struct timeval *timeout, edg_wlpr_Request *request, edg_wlpr_Response *response) -{ - int ret; - char *buf = NULL; - size_t buf_len; - - /* timeouts ?? */ - - ret = encode_request(request, &buf); - if (ret) - return ret; - - ret = edg_wlpr_Write(sock, timeout, buf, strlen(buf) + 1); - free(buf); - if (ret) - return ret; - - ret = edg_wlpr_Read(sock, timeout, &buf, &buf_len); - if (ret) - return ret; - - ret = decode_response(buf, buf_len, response); - free(buf); - if (ret) - return ret; - - return 0; -} - -int -edg_wlpr_RequestSend(edg_wlpr_Request *request, edg_wlpr_Response *response) -{ - char sockname[1024]; - int ret; - int sock; - struct timeval timeout; - const char *s = NULL; - double d; - - s = getenv("GLITE_PR_TIMEOUT"); - d = s ? atof(s) : GLITE_PR_TIMEOUT_DEFAULT; - timeout.tv_sec = (long) d; - timeout.tv_usec = (long) ((d-timeout.tv_sec) * 1e6); - - snprintf(sockname, sizeof(sockname), "%s%d", - DGPR_REG_SOCKET_NAME_ROOT, getuid()); - ret = do_connect(sockname, &timeout, &sock); - if (ret) - return ret; - - ret = send_request(sock, &timeout, request, response); - - close(sock); - return ret; -} - -int -glite_renewal_RegisterProxy(const char *filename, const char * server, - unsigned int port, - const char *jobid, int flags, - char **repository_filename) -{ - edg_wlpr_Request request; - edg_wlpr_Response response; - int ret; - - memset(&request, 0, sizeof(request)); - memset(&response, 0, sizeof(response)); - - if (jobid == NULL) - return EINVAL; - - request.command = EDG_WLPR_COMMAND_REG; - request.myproxy_server = server; - request.proxy_filename = filename; - request.jobid = strdup(jobid); - if (request.jobid == NULL) - return ENOMEM; - - ret = edg_wlpr_RequestSend(&request, &response); - free(request.jobid); - if (ret == 0 && response.response_code == 0 && repository_filename && - response.filenames && response.filenames[0] ) - *repository_filename = strdup(response.filenames[0]); - - if (ret == 0) - ret = response.response_code; - - edg_wlpr_CleanResponse(&response); - - return ret; -} - -#ifdef RENEWAL_HAVE_JOBID -int -edg_wlpr_RegisterProxyExt(const char *filename, const char * server, - unsigned int port, - edg_wlc_JobId jobid, int flags, - char **repository_filename) -{ - char *ji; - int ret; - - ji = edg_wlc_JobIdUnparse(jobid); - if (ji == NULL) - return EINVAL; - - ret = glite_renewal_RegisterProxy(filename, server, port, ji, flags, - repository_filename); - free(ji); - return ret; -} -#endif /* RENEWAL_HAVE_JOBID */ - -#if 0 -int -edg_wlpr_RegisterProxy(const char *filename, const char *jdl, - int flags, char **repository_filename) -{ - char server[1024]; - size_t server_len; - unsigned int port = 0; - char *p, *q; - - memset(server, 0, sizeof(server)); - - /* parse JDL and find information about myproxy server */ - p = strstr(jdl, JDL_MYPROXY); - if (p == NULL) - return 0; /* XXX */ - q = strchr(p, '\n'); /* XXX */ - if (q) - server_len = q - p; - else - server_len = jdl + strlen(jdl) - p; - if (server_len >= sizeof(server)) - return EINVAL; /* XXX */ - strncmp(server, p, sizeof(server)); - - return (edg_wlpr_RegisterProxyExt(filename, server, port, NULL, flags, - repository_filename)); -} -#endif - -int -glite_renewal_UnregisterProxy(const char *jobid, const char *repository_filename) -{ - edg_wlpr_Request request; - edg_wlpr_Response response; - int ret; - - memset(&request, 0, sizeof(request)); - memset(&response, 0, sizeof(response)); - - if (jobid == NULL) - return EINVAL; - - request.command = EDG_WLPR_COMMAND_UNREG; - request.proxy_filename = repository_filename; - request.jobid = strdup(jobid); - if (request.jobid == NULL) - return ENOMEM; - - ret = edg_wlpr_RequestSend(&request, &response); - free(request.jobid); - - if (ret == 0) - ret = response.response_code; - edg_wlpr_CleanResponse(&response); - - return ret; -} - -#ifdef RENEWAL_HAVE_JOBID -int -edg_wlpr_UnregisterProxy(edg_wlc_JobId jobid, const char *repository_filename) -{ - char *ji; - int ret; - - ji = edg_wlc_JobIdUnparse(jobid); - if (ji == NULL) - return EINVAL; - ret = glite_renewal_UnregisterProxy(ji, repository_filename); - free(ji); - return ret; -} -#endif /* RENEWAL_HAVE_JOBID */ - -int -edg_wlpr_GetList(int *count, char **list) -{ - return ENOSYS; /* XXX */ -} - -int -edg_wlpr_GetStatus(const char *filename, char **info) -{ - return ENOSYS; /* XXX */ -} - -static const char* const errTexts[] = { - "Unexpected EOF from peer", - "Generic error", - "Protocol parse error", - "Compulsory element not found in message", - "Unknown protocol command", - "SSL error", - "Error from Myproxy server", - "Proxy not registered", - "Proxy expired", - "VOMS error", - "Operation timed out", - "System error" -}; - -const char * -edg_wlpr_GetErrorText(int code) -{ - return code ? - (code <= EDG_WLPR_ERROR_BASE ? - strerror(code) : - errTexts[code - EDG_WLPR_ERROR_BASE - 1] - ) : - NULL; -} - -int -glite_renewal_GetProxy(const char *jobid, char **repository_filename) -{ - edg_wlpr_Request request; - edg_wlpr_Response response; - int ret; - - memset(&request, 0, sizeof(request)); - memset(&response, 0, sizeof(response)); - - if (jobid == NULL) - return EINVAL; - - request.command = EDG_WLPR_COMMAND_GET; - request.jobid = strdup(jobid); - if (request.jobid == NULL) - return ENOMEM; - - ret = edg_wlpr_RequestSend(&request, &response); - free(request.jobid); - - if (ret == 0 && response.response_code == 0 && repository_filename && - response.filenames && response.filenames[0] ) - *repository_filename = strdup(response.filenames[0]); - - if (ret == 0) - ret = response.response_code; - edg_wlpr_CleanResponse(&response); - - return ret; -} - -#ifdef RENEWAL_HAVE_JOBID -int -edg_wlpr_GetProxy(edg_wlc_JobId jobid, char **repository_filename) -{ - char *ji; - int ret; - - ji = edg_wlc_JobIdUnparse(jobid); - if (ji == NULL) - return EINVAL; - - ret = glite_renewal_GetProxy(ji, repository_filename); - free(ji); - return ret; -} -#endif /* RENEWAL_HAVE_JOBID */ diff --git a/org.glite.security.proxyrenewal/src/client.c b/org.glite.security.proxyrenewal/src/client.c deleted file mode 100644 index 87efd78..0000000 --- a/org.glite.security.proxyrenewal/src/client.c +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include -#include -#include -#include "renewal.h" - -static const char rcsid[] = "$Header$"; - -static struct option const long_options[] = { - { "help", no_argument, 0, 'h' }, - { "version", no_argument, 0, 'v' }, - { "server", required_argument, 0, 's' }, - { "port", required_argument, 0, 'p' }, - { "file", required_argument, 0, 'f' }, - { "jobid", required_argument, 0, 'j' }, - { NULL, 0, NULL, 0} -}; - -static char short_options[] = "hvs:p:f:j:"; - -static void -usage(exit_code) -{ - fprintf(stdout, "Usage: edg-wl-renew [option] operation\n" - "\t-s myproxy_server [-p port] -f filename -j jobid start |\n" - "\t-j jobid [-f filename] stop |\n" - "\t-j jobid get\n" - "-h, --help display this help and exit\n" - "-v, --version output version information and exit\n" - "-s, --server address of myproxy server\n" - "-p, --port port of myproxy server\n" - "-f, --file filename with proxy\n" - "-j, --jobid datagrid jobid\n"); - exit(exit_code); -} - -int -main(int argc, char *argv[]) -{ - char *server = NULL; - int port = 0; - char *proxyfile = NULL; - char *jobid_str = NULL; - char *repository_filename = NULL; - int ret; - int arg; - extern int optind; - - while ((arg = getopt_long(argc, argv, - short_options, long_options, (int *) 0)) != EOF) - switch(arg) { - case 'h': - usage(0); break; - case 'v': - fprintf(stdout, "%s:\t%s\n", argv[0], rcsid); exit(0); - case 's': - server = strdup(optarg); break; - case 'p': - port = atoi(optarg); break; - case 'f': - proxyfile = strdup(optarg); break; - case 'j': - jobid_str = strdup(optarg); break; - default: - usage(1); break; - } - - if (optind >= argc) - usage(1); - - if (strcmp(argv[optind], "start") == 0) { - if (proxyfile == NULL || server == NULL || jobid_str == NULL) - usage(1); - ret = glite_renewal_RegisterProxy(proxyfile, server, port, jobid_str, 0, - &repository_filename); - if (ret) { - fprintf(stderr, "Registering proxy failed: %s\n", - edg_wlpr_GetErrorText(ret)); - exit(1); - } - printf("%s\n", repository_filename); - free(repository_filename); - exit(0); - } - else if (strcmp(argv[optind], "stop") == 0) { - if (jobid_str == NULL) - usage(1); - ret = glite_renewal_UnregisterProxy(jobid_str, proxyfile); - if (ret) { - fprintf(stderr, "Unregistering proxy failed: %s\n", - edg_wlpr_GetErrorText(ret)); - exit(1); - } - } - else if (strcmp(argv[optind], "get") == 0) { - if (jobid_str == NULL) - usage(1); - ret = glite_renewal_GetProxy(jobid_str, &proxyfile); - if (ret) { - fprintf(stderr, "GET request failed: %s\n", - edg_wlpr_GetErrorText(ret)); - exit(1); - } - printf("%s\n", proxyfile); - free(proxyfile); - } - else - usage(1); - - return 0; -} diff --git a/org.glite.security.proxyrenewal/src/commands.c b/org.glite.security.proxyrenewal/src/commands.c deleted file mode 100644 index abc4809..0000000 --- a/org.glite.security.proxyrenewal/src/commands.c +++ /dev/null @@ -1,1256 +0,0 @@ -#include "renewal_locl.h" -#include "renewd_locl.h" - -#include "glite/security/voms/voms_apic.h" - -#ident "$Header$" - -#define SEPARATORS ",\n" -#define RENEWAL_START_FRACTION 0.75 /* XXX */ -#define RENEWAL_MIN_LIFETIME (15 * 60) - -extern char *repository; -extern time_t condor_limit; -extern char *cadir; -extern char *vomsdir; -extern int voms_enabled; - -static char * -strmd5(glite_renewal_core_context ctx, const char *s, unsigned char *digest); - -static int -get_record_ext(glite_renewal_core_context ctx, FILE *fd, proxy_record *record, int *last_used_suffix); - -static int -get_record(glite_renewal_core_context ctx, FILE *fd, proxy_record *record); - -static int -store_record(glite_renewal_core_context ctx, char *basename, proxy_record *record); - -static int -copy_file_content(glite_renewal_core_context ctx, FILE *in, FILE *out); - -static int -copy_file(glite_renewal_core_context ctx, char *src, char *dst); - -static int -get_base_filename(glite_renewal_core_context ctx, char *proxy_file, char **basefilename); - -int -decode_record(glite_renewal_core_context ctx, char *line, proxy_record *record); - -int -encode_record(glite_renewal_core_context ctx, proxy_record *record, char **line); - -static int -open_metafile(glite_renewal_core_context ctx, char *proxy_file, FILE **fd); - -void -free_record(glite_renewal_core_context ctx, proxy_record *record); - -static int -realloc_prd_list(glite_renewal_core_context ctx, prd_list *list); - -/* make public: */ -static int -edg_wlpr_GetTokenInt(glite_renewal_core_context ctx, const char *msg, const size_t msg_len, - const char *key, const char *separators, - int req_index, int *value); - -static void -record_to_response(glite_renewal_core_context ctx, int status_code, proxy_record *record, - edg_wlpr_Response *response); - -static int -filename_to_response(glite_renewal_core_context ctx, char *filename, edg_wlpr_Response *response); - - - - -static char * -strmd5(glite_renewal_core_context ctx, const char *s, unsigned char *digest) -{ - MD5_CTX md5; - unsigned char d[16]; - int i; - static char mbuf[33]; - - MD5_Init(&md5); - MD5_Update(&md5,s,strlen(s)); - MD5_Final(d,&md5); - - if (digest) - memcpy(digest,d,sizeof(d)); - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - mbuf[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - mbuf[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - mbuf[32] = 0; - return mbuf; -} - -static int -get_base_filename(glite_renewal_core_context ctx, char *proxy_file, char **basefilename) -{ - char *subject = NULL; - char file[FILENAME_MAX]; - int ret; - - assert(basefilename != NULL); - - ret = glite_renewal_get_proxy_base_name(ctx, proxy_file, &subject); - if (ret) - goto end; - - snprintf(file, sizeof(file), "%s/%s", repository, strmd5(ctx, subject, NULL)); - *basefilename = strdup(file); /* XXX test ENOMEM */ - ret = 0; - -end: - if (subject) - free(subject); - return ret; -} - -static int -copy_file_content(glite_renewal_core_context ctx, FILE *in, FILE *out) -{ - char buf[1024]; - size_t num; - int ret; - - while (1) { - num = fread(buf, sizeof(*buf), sizeof(buf), in); - if ((ret = ferror(in))) { - glite_renewal_log(ctx, LOG_ERR, "Reading failed: %s", strerror(errno)); - return ret; - } - num = fwrite(buf, sizeof(*buf), num, out); - if ((ret = ferror(in))) { - glite_renewal_log(ctx, LOG_ERR, "Writing failed: %s", strerror(errno)); - return ret; - } - if (feof(in)) - return 0; - } -} - -/* return the time interval, after which the renewal should be started */ -static time_t -get_delta(glite_renewal_core_context ctx, time_t current_time, time_t start_time, time_t end_time) -{ - time_t remaining_life; - time_t life_to_lose; - time_t limit; - time_t delta; - - if (RENEWAL_MIN_LIFETIME > condor_limit) { - limit = RENEWAL_MIN_LIFETIME; - } else { - limit = condor_limit; - } - - limit += RENEWAL_CLOCK_SKEW; - - if (current_time + limit >= end_time) { - /* if the proxy is too short, renew it as soon as possible */ - - if (current_time + condor_limit > end_time ) { - glite_renewal_log(ctx, LOG_ERR, "Remaining proxy lifetime fell below the value of the Condor limit!"); - } - - return 0; - } - - remaining_life = end_time - current_time; - - /* renewal should gain the jobs an extra lifetime of - RENEWAL_START_FRACTION (default 3/4) of the new proxy's - lifetime. If the time remaining on the current proxy is already - small then the jobs may gain an extra lifetime of more than that. - - In any case, a renewal will be scheduled to happen before the - lifetime limit. - - 'life_to_lose' is the lifetime that will be lost, ie the time that - will still remain on the current proxy when it is renewed - */ - - life_to_lose = (1.0-RENEWAL_START_FRACTION)*60*60*DGPR_RETRIEVE_DEFAULT_HOURS; - - if (life_to_lose < limit) { - life_to_lose = limit; - } - - delta = life_to_lose - limit; - - while( remaining_life < (limit + delta) ) { - delta *= (1.0-RENEWAL_START_FRACTION); - } - - life_to_lose = limit + delta; - - return (remaining_life - life_to_lose); -} - -int -get_times(glite_renewal_core_context ctx, char *proxy_file, proxy_record *record) -{ - FILE *fd; - X509 *cert = NULL; - ASN1_UTCTIME *asn1_time = NULL; - int ret; - time_t current_time, start_time, end_time; - - assert(record != NULL); - assert(proxy_file != NULL); - - fd = fopen(proxy_file, "r"); - if (fd == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Opening proxy file %s failed: %s", - proxy_file, strerror(errno)); - return errno; - } - - cert = PEM_read_X509(fd, NULL, NULL, NULL); - if (cert == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot read X.509 certificate from %s", - proxy_file); - ret = -1; /* XXX SSL_ERROR */ - goto end; - } - - asn1_time = ASN1_UTCTIME_new(); - X509_gmtime_adj(asn1_time,0); - globus_gsi_cert_utils_make_time(X509_get_notAfter(cert), &end_time); - globus_gsi_cert_utils_make_time(X509_get_notBefore(cert), &start_time); - current_time = time(NULL); - ASN1_UTCTIME_free(asn1_time); - /* if (end_time - RENEWAL_CLOCK_SKEW < current_time) { Too short proxy } */ - if (end_time + RENEWAL_CLOCK_SKEW < current_time) { - glite_renewal_log(ctx, LOG_ERR, "Expired proxy in %s", proxy_file); - ret = EDG_WLPR_PROXY_EXPIRED; - goto end; - } - - /* Myproxy seems not to do check on expiration and return expired proxies - if credentials in repository are expired */ - X509_free(cert); - cert = NULL; - while (1) { - time_t tmp_end; - /* see http://www.openssl.org/docs/crypto/pem.html section BUGS */ - cert = PEM_read_X509(fd, NULL, NULL, NULL); - if (cert == NULL) { - if (ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE) { - /* End of file reached. no error */ - ERR_clear_error(); - break; - } - glite_renewal_log(ctx, LOG_ERR, "Cannot read additional certificates from %s", - proxy_file); - ret = -1; /* XXX SSL_ERROR */ - goto end; - } - globus_gsi_cert_utils_make_time(X509_get_notAfter(cert), &tmp_end); - if (tmp_end + RENEWAL_CLOCK_SKEW < current_time) { - glite_renewal_log(ctx, LOG_ERR, "Expired proxy in %s", proxy_file); - ret = EDG_WLPR_PROXY_EXPIRED; - goto end; - } - X509_free(cert); - cert = NULL; - } - - record->next_renewal = current_time + get_delta(ctx, current_time, start_time, - end_time); - record->end_time = end_time; - ret = 0; - -end: - fclose(fd); - if (cert) - X509_free(cert); - - return ret; -} - -static int -copy_file(glite_renewal_core_context ctx, char *src, char *dst) -{ - FILE *from = NULL; - FILE *tmp_to = NULL; - int tmp_fd; - char tmpfile[FILENAME_MAX]; - int ret; - - if (strcmp(src, dst) == 0) - return 0; - - from = fopen(src, "r"); - if (from == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot open file %s for reading (%s)", - src, strerror(errno)); - return errno; - } - - snprintf(tmpfile, sizeof(tmpfile), "%s.XXXXXX", dst); - tmp_fd = mkstemp(tmpfile); - if (tmp_fd == -1) { - glite_renewal_log(ctx, LOG_ERR, "Cannot create temporary file (%s)", - strerror(errno)); - ret = errno; - goto end; - } - - - tmp_to = fdopen(tmp_fd, "w"); - if (tmp_to == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot associate stream with temporary file (%s)", - strerror(errno)); - unlink(tmpfile); - ret = errno; - goto end; - } - - ret = copy_file_content(ctx, from, tmp_to); - fclose(tmp_to); - if (ret) { - goto end; - } - - ret = rename(tmpfile, dst); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Cannot replace repository file %s with temporary file (%s)", - strerror(errno)); - unlink(tmpfile); - ret = errno; - goto end; - } - tmp_to = NULL; - -end: - fclose(from); - close(tmp_fd); - unlink(tmpfile); - - return ret; -} - -void -free_record(glite_renewal_core_context ctx, proxy_record *record) -{ - int i; - - if (record == NULL) - return; - if (record->myproxy_server) - free(record->myproxy_server); - if (record->jobids.val) { - for (i = 0; i < record->jobids.len; i++) - free(record->jobids.val[i]); - free(record->jobids.val); - } - memset(record, 0, sizeof(*record)); -} - -static int -realloc_prd_list(glite_renewal_core_context ctx, prd_list *list) -{ - char **tmp; - - tmp = realloc(list->val, (list->len + 1) * sizeof(*list->val)); - if (tmp == NULL) - return ENOMEM; - list->val = tmp; - list->len++; - return 0; -} - -static int -get_jobids(glite_renewal_core_context ctx, const char *msg, const size_t msg_len, proxy_record *record) -{ - int index = 0; - int ret; - char *value; - char **tmp; - - memset(&record->jobids, 0, sizeof(record->jobids)); - while ((ret = edg_wlpr_GetToken(msg, msg_len, "jobid=", SEPARATORS, - index, &value)) == 0) { - tmp = realloc(record->jobids.val, (record->jobids.len + 1) * sizeof(*tmp)); - if (tmp == NULL) { - ret = ENOMEM; - break; - } - record->jobids.val = tmp; - record->jobids.val[index] = value; - record->jobids.len++; - index++; - } - if (ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) { - if (record->jobids.len) - free(record->jobids.val); - record->jobids.len = 0; - record->jobids.val = NULL; - return ret; - } - - return 0; -} - -static int -edg_wlpr_GetTokenInt(glite_renewal_core_context ctx, const char *msg, const size_t msg_len, - const char *key, const char *separators, - int req_index, int *value) -{ - int ret; - char *str_value = NULL; - - ret = edg_wlpr_GetToken(msg, msg_len, key, separators, req_index, &str_value); - if (ret) - return ret; - - ret = edg_wlpr_DecodeInt(str_value, value); - free(str_value); - return ret; -} - -int -decode_record(glite_renewal_core_context ctx, char *line, proxy_record *record) -{ - /* line must be ended with '\0' */ - int ret; - size_t len; - - assert(line != NULL); - assert(record != NULL); - - memset(record, 0, sizeof(*record)); - - len = strlen(line) + 1; - - ret = edg_wlpr_GetTokenInt(ctx, line, len, "suffix=", SEPARATORS, 0, - &record->suffix); - if (ret) - return ret; - -#if 0 - ret = edg_wlpr_GetTokenInt(ctx, line, len, "counter=", SEPARATORS, 0, - &record->counter); - if (ret) - goto end; -#endif - - ret = edg_wlpr_GetTokenInt(ctx, line, len, "unique=", SEPARATORS, 0, - &record->unique); - if (ret) - goto end; - - ret = edg_wlpr_GetTokenInt(ctx, line, len, "voms_exts=", SEPARATORS, 0, - &record->voms_exts); - - ret = edg_wlpr_GetToken(line, len, "server=", SEPARATORS, 0, - &record->myproxy_server); - if (ret) - goto end; - - ret = edg_wlpr_GetTokenInt(ctx, line, len, "next_renewal=", SEPARATORS, 0, - (int *)&record->next_renewal); - if (ret) - goto end; - - ret = edg_wlpr_GetTokenInt(ctx, line, len, "end_time=", SEPARATORS, 0, - (int *)&record->end_time); - if (ret) - goto end; - - ret = get_jobids(ctx, line, len, record); - if (ret) - goto end; - -end: - if (ret) - free_record(ctx, record); - - return ret; -} - -int -encode_record(glite_renewal_core_context ctx, proxy_record *record, char **line) -{ - char tmp_line[1024]; - size_t jobids_len = 0; - int i; - - snprintf(tmp_line, sizeof(tmp_line), "suffix=%d, unique=%d, voms_exts=%d, server=%s, next_renewal=%ld, end_time=%ld", - record->suffix, record->unique, record->voms_exts, - (record->myproxy_server) ? record->myproxy_server : "", - record->next_renewal, record->end_time); - for (i = 0; i < record->jobids.len; i++) - /* alloc space for string ", jobid=" */ - jobids_len += 2 + strlen("jobid=") + strlen(record->jobids.val[i]); - - *line = calloc(1, strlen(tmp_line) + jobids_len + 1); - if (*line == NULL) - return ENOMEM; - - strcat(*line, tmp_line); - memset(tmp_line, 0, sizeof(tmp_line)); - - for (i = 0; i < record->jobids.len; i++) { - snprintf(tmp_line, sizeof(tmp_line), ", jobid=%s", record->jobids.val[i]); - strcat(*line, tmp_line); - } - - return 0; -} - -/* Get proxy record from the index file. If no suffix is defined return a free - record with the smallest index */ -static int -get_record_ext(glite_renewal_core_context ctx, FILE *fd, proxy_record *record, int *last_used_suffix) -{ - char line[1024]; - int last_suffix = -1; - int ret; - char *p; - proxy_record tmp_record; - time_t current_time; - int line_num = 0; - - assert(record != NULL); - memset(&tmp_record, 0, sizeof(tmp_record)); - - current_time = time(NULL); - while (fgets(line, sizeof(line), fd) != NULL) { - line_num++; - free_record(ctx, &tmp_record); - p = strchr(line, '\n'); - if (p) - *p = '\0'; - ret = decode_record(ctx, line, &tmp_record); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Skipping invalid entry at line %d", line_num); - continue; - } - if (record->suffix >= 0) { - if (record->suffix == tmp_record.suffix) { - record->suffix = tmp_record.suffix; - record->jobids.len = tmp_record.jobids.len; - record->jobids.val = tmp_record.jobids.val; - record->unique = tmp_record.unique; - record->voms_exts = tmp_record.voms_exts; - if (record->myproxy_server) - free(record->myproxy_server); - record->myproxy_server = tmp_record.myproxy_server; - record->end_time = tmp_record.end_time; - record->next_renewal = tmp_record.next_renewal; - return 0; - } else - continue; - } - if (tmp_record.suffix > last_suffix) - last_suffix = tmp_record.suffix; - - /* if no particular suffix was specified get the first free record - available */ - if (tmp_record.jobids.len >= MAX_PROXIES || tmp_record.unique || - tmp_record.voms_exts) - continue; - - if (tmp_record.jobids.len == 0) { - /* no jobs registered for this record, so use it initialized with the - * parameters (currently myproxy location) provided by user */ - record->suffix = tmp_record.suffix; - record->next_renewal = record->end_time = 0; - free_record(ctx, &tmp_record); - return 0; - } - - /* Proxies with VOMS attributes require a separate record, which is not - * shared with another proxies. The same applies it the unique flag was - * set by the caller */ - if (record->voms_exts || record->unique) - continue; - - if (tmp_record.jobids.len > 0 && record->myproxy_server && - strcmp(record->myproxy_server, tmp_record.myproxy_server) != 0) - continue; - - if (tmp_record.jobids.len > 0 && - current_time + condor_limit + RENEWAL_CLOCK_SKEW > tmp_record.end_time) { - - /* skip expired proxy (or ones that are going to expire soon), - leaving it untouched (it will be removed after next run of the - renewal process) */ - - continue; - } - - record->suffix = tmp_record.suffix; - record->jobids.len = tmp_record.jobids.len; - record->jobids.val = tmp_record.jobids.val; - record->unique = tmp_record.unique; - record->voms_exts = tmp_record.voms_exts; - if (record->myproxy_server) - free(record->myproxy_server); - record->myproxy_server = tmp_record.myproxy_server; - record->end_time = tmp_record.end_time; - record->next_renewal = tmp_record.next_renewal; - return 0; - } - - if (last_used_suffix) - *last_used_suffix = last_suffix; - - if (record->suffix >= 0) { - glite_renewal_log(ctx, LOG_DEBUG, "Requested suffix %d not found in meta file", - record->suffix); - } - - free_record(ctx, &tmp_record); - - return EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND; -} - -static int -get_record(glite_renewal_core_context ctx, FILE *fd, proxy_record *record) -{ - return get_record_ext(ctx, fd, record, NULL); -} - -static int -store_record(glite_renewal_core_context ctx, char *basename, proxy_record *record) -{ - int stored = 0; - FILE *fd = NULL; - int temp; - char line[1024]; - char *new_line = NULL; - int ret, i; - char *p; - proxy_record tmp_record; - char tmp_file[FILENAME_MAX]; - char meta_file[FILENAME_MAX]; - int line_num = 0; - - assert (record != NULL); - - memset(&tmp_record, 0, sizeof(tmp_record)); - - snprintf(meta_file, sizeof(meta_file), "%s.data", basename); - snprintf(tmp_file, sizeof(tmp_file), "%s.XXXXXX", meta_file); - - temp = mkstemp(tmp_file); - if (temp < 0) - return errno; - - fd = fopen(meta_file, "r"); - if (fd == NULL) { - ret = errno; - goto end; - } - while (fgets(line, sizeof(line), fd) != NULL) { - line_num++; - free_record(ctx, &tmp_record); - p = strchr(line, '\n'); - if (p) - *p = '\0'; - ret = decode_record(ctx, line, &tmp_record); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Removing invalid entry at line %d in %s", line_num, basename); - continue; - } - if (record->suffix == tmp_record.suffix && - record->unique == tmp_record.unique) { - tmp_record.next_renewal = record->next_renewal; - tmp_record.end_time = record->end_time; - tmp_record.voms_exts = record->voms_exts; - if (tmp_record.myproxy_server != NULL) - free(tmp_record.myproxy_server); - tmp_record.myproxy_server = strdup(record->myproxy_server); - if (tmp_record.jobids.val) { - for (i = 0; i < tmp_record.jobids.len; i++) - free(tmp_record.jobids.val[i]); - free(tmp_record.jobids.val); - } - tmp_record.jobids.len = 0; - tmp_record.jobids.val = NULL; - for (i = 0; i < record->jobids.len; i++) { - realloc_prd_list(ctx, &tmp_record.jobids); - tmp_record.jobids.val[tmp_record.jobids.len - 1] = - strdup(record->jobids.val[i]); - } - stored = 1; - } - ret = encode_record(ctx, &tmp_record, &new_line); - if (ret) - goto end; - dprintf(temp, "%s\n", new_line); - free(new_line); - new_line = NULL; - } - if (! stored) { - ret = encode_record(ctx, record, &new_line); - if (ret) - goto end; - ret = dprintf(temp, "%s\n", new_line); - free(new_line); - new_line = NULL; - } - fclose(fd); fd = NULL; - close(temp); - - ret = rename(tmp_file, meta_file); - if (ret) - ret = errno; - -end: - free_record(ctx, &tmp_record); - if (fd) - fclose(fd); - close(temp); - return ret; -} - -static int -open_metafile(glite_renewal_core_context ctx, char *basename, FILE **fd) -{ - FILE *meta_fd; - char meta_filename[FILENAME_MAX]; - - snprintf(meta_filename, sizeof(meta_filename), "%s.data", basename); - meta_fd = fopen(meta_filename, "a+"); - if (meta_fd == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Opening meta file %s failed (%s)", - meta_filename, strerror(errno)); - return errno; - } - rewind(meta_fd); - *fd = meta_fd; - glite_renewal_log(ctx, LOG_DEBUG, "Using meta file %s", meta_filename); - return 0; -} - -static int -filename_to_response(glite_renewal_core_context ctx, char *filename, edg_wlpr_Response *response) -{ - response->filenames = malloc(2 * sizeof(*response->filenames)); - if (response->filenames == NULL) { - glite_renewal_log(ctx, LOG_DEBUG, "Not enough memory"); - return errno; - } - response->filenames[0] = strdup(filename); - if (response->filenames[0] == NULL) { - glite_renewal_log(ctx, LOG_DEBUG, "Not enough memory"); - free(response->filenames); - return errno; - } - response->filenames[1] = NULL; - return 0; -} - -static void -record_to_response(glite_renewal_core_context ctx, int status_code, proxy_record *record, - edg_wlpr_Response *response) -{ - /* XXX Neni struktrura proxy_record zbytecna? Mohla by se pouzivat primo - edg_wlpr_Response? */ - response->response_code = status_code; /* XXX chyba parsovatelna pres API */ - if (status_code) - return; - - if (response->myproxy_server) { - response->myproxy_server = strdup(record->myproxy_server); - if (response->myproxy_server == NULL) { - response->response_code = ENOMEM; /* XXX */ - return; - } - } - response->end_time = record->end_time; - response->next_renewal_time = record->next_renewal; - /* XXX use jobid response->counter = record->counter; */ -} - -int -check_proxyname(glite_renewal_core_context ctx, char *datafile, char *jobid, char **filename) -{ - proxy_record record; - FILE *meta_fd = NULL; - char line[1024]; - char proxy[FILENAME_MAX]; - char *p; - int ret, i; - - memset(&record, 0, sizeof(record)); - - meta_fd = fopen(datafile, "r"); - if (meta_fd == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot open meta file %s (%s)", - datafile, strerror(errno)); - return errno; - } - - while (fgets(line, sizeof(line), meta_fd) != NULL) { - free_record(ctx, &record); - p = strchr(line, '\n'); - if (p) - *p = '\0'; - ret = decode_record(ctx, line, &record); - if (ret) - continue; /* XXX exit? */ - for (i = 0; i < record.jobids.len; i++) { - if (strcmp(jobid, record.jobids.val[i]) == 0) { - snprintf(proxy, sizeof(proxy), "%s/%s", repository, datafile); - p = strrchr(proxy, '.'); - sprintf(p, ".%d", record.suffix); - *filename = strdup(proxy); - free_record(ctx, &record); - fclose(meta_fd); - return 0; - } - } - } - free_record(ctx, &record); - fclose(meta_fd); - return EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND; -} - -int -find_proxyname(glite_renewal_core_context ctx, char *jobid, char **filename) -{ - DIR *dir = NULL; - struct dirent *file; - int ret; - - chdir(repository); - - dir = opendir(repository); - if (dir == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot open repository directory %s (%s)", - repository, strerror(errno)); - return errno; - } - - while ((file = readdir(dir))) { - /* read files of format `md5sum`.data, where md5sum() is of fixed length - 32 chars */ - if (file->d_name == NULL || strlen(file->d_name) != 37 || - strcmp(file->d_name + 32, ".data") != 0) - continue; - ret = check_proxyname(ctx, file->d_name, jobid, filename); - if (ret == 0) { - closedir(dir); - return 0; - } - } - closedir(dir); - glite_renewal_log(ctx, LOG_ERR, "Requested proxy is not registered"); - return EDG_WLPR_PROXY_NOT_REGISTERED; -} - -#ifdef NOVOMS -int -find_voms_cert(glite_renewal_core_context ctx, char *file, int *present) -{ - *present = 0; - return 0; -} - -#else -int -find_voms_cert(glite_renewal_core_context ctx, char *file, int *present) -{ - struct vomsdata *voms_info = NULL; - STACK_OF(X509) *chain = NULL; - EVP_PKEY *privkey = NULL; - X509 *cert = NULL; - int ret, err; - - *present = 0; - - voms_info = VOMS_Init(vomsdir, cadir); - if (voms_info == NULL) { - glite_renewal_log(ctx, LOG_ERR, "check_voms_cert(): Cannot initialize VOMS context (VOMS_Init() failed, probably voms dir was not specified)"); - return EDG_WLPR_ERROR_VOMS; - } - - ret = glite_renewal_load_proxy(ctx, file, &cert, &privkey, &chain, NULL); - if (ret) { - VOMS_Destroy(voms_info); - return ret; - } - - ret = VOMS_Retrieve(cert, chain, RECURSE_CHAIN, voms_info, &err); - if (ret == 1) { - *present = 1; - } - - VOMS_Destroy(voms_info); - X509_free(cert); - EVP_PKEY_free(privkey); - sk_X509_pop_free(chain, X509_free); - return 0; -} -#endif - -void -register_proxy(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response) -{ - proxy_record record; - int ret; - FILE *meta_fd = NULL; - int last_suffix; - char *basename = NULL; - char filename[FILENAME_MAX]; - - assert(request != NULL); - assert(response != NULL); - - memset(&record, 0, sizeof(record)); - memset(response, 0, sizeof(*response)); - glite_renewal_log(ctx, LOG_DEBUG, "Registration request for %s", request->proxy_filename); - - if (request->proxy_filename == NULL || request->jobid == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Registration request doesn't contain registration information"); - return; /* EINVAL; */ - } - umask(0177); - - ret = get_base_filename(ctx, request->proxy_filename, &basename); - if (ret) - goto end; - - ret = open_metafile(ctx, basename, &meta_fd); - if (ret) - goto end; - - if (voms_enabled) - ret = find_voms_cert(ctx, request->proxy_filename, &record.voms_exts); - /* ignore VOMS related error */ - - /* Find first free record */ - record.suffix = -1; - record.myproxy_server = strdup(request->myproxy_server); - ret = get_record_ext(ctx, meta_fd, &record, &last_suffix); - fclose(meta_fd); meta_fd = NULL; - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) - goto end; - - if (ret == EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND || record.jobids.len == 0 || request->unique || record.voms_exts) { - /* create a new proxy file in the repository */ - int suffix; - - suffix = (record.jobids.len == 0 && record.suffix >= 0) ? - record.suffix : last_suffix + 1; - snprintf(filename, sizeof(filename), "%s.%d", basename, suffix); - ret = copy_file(ctx, request->proxy_filename, filename); - if (ret) - goto end; - ret = get_times(ctx, filename, &record); - if (ret) - goto end; - record.suffix = suffix; - ret = realloc_prd_list(ctx, &record.jobids); - if (ret) - goto end; - record.jobids.val[record.jobids.len - 1] = strdup(request->jobid); - record.unique = request->unique; - glite_renewal_log(ctx, LOG_DEBUG, "Created a new proxy file in repository (%s)", - filename); - } else { - ret = realloc_prd_list(ctx, &record.jobids); - if (ret) - goto end; - record.jobids.val[record.jobids.len - 1] = strdup(request->jobid); - snprintf(filename, sizeof(filename), "%s.%d", basename, record.suffix); - glite_renewal_log(ctx, LOG_DEBUG, "Inremented counter on %s", filename); - } - - ret = store_record(ctx, basename, &record); - -end: - if (meta_fd) { - fclose(meta_fd); - } - - if (basename) - free(basename); - - if (ret == 0) - ret = filename_to_response(ctx, filename, response); - record_to_response(ctx, ret, &record, response); - free_record(ctx, &record); -} - -void -unregister_proxy(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response) -{ - proxy_record record; - int ret, i, index; - FILE *meta_fd = NULL; - char *basename = NULL; - char *p; - struct stat stat_buf; - - memset(&record, 0, sizeof(record)); - glite_renewal_log(ctx, LOG_DEBUG, "Unregistration request for %s", request->jobid); - - if (request->jobid == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Unregistration request doesn't contain needed information"); - ret = EINVAL; - goto end; - } - - if (request->proxy_filename == NULL) { - ret = find_proxyname(ctx, request->jobid, &request->proxy_filename); - if (ret) - goto end; - } - - ret = get_base_filename(ctx, request->proxy_filename, &basename); - if (ret) { - goto end; - } - - if (strncmp(request->proxy_filename, basename, strlen(basename) != 0)) { - glite_renewal_log(ctx, LOG_DEBUG, "Requested proxy %s is not from repository", - request->proxy_filename); - ret = EDG_WLPR_PROXY_NOT_REGISTERED; - goto end; - } - - p = strrchr(request->proxy_filename, '.'); - if (p == NULL) { - glite_renewal_log(ctx, LOG_DEBUG, "Requested proxy %s is not from repository", - request->proxy_filename); - ret = EDG_WLPR_PROXY_NOT_REGISTERED; - goto end; - } - - ret = edg_wlpr_DecodeInt(p+1, &record.suffix); - if (ret) { - glite_renewal_log(ctx, LOG_DEBUG, "Requested proxy %s is not from repository", - request->proxy_filename); - ret = EDG_WLPR_PROXY_NOT_REGISTERED; - goto end; - } - - ret = open_metafile(ctx, basename, &meta_fd); - if (ret) { - /* fill in error response */ - return; - } - - ret = get_record(ctx, meta_fd, &record); - if (ret) - goto end; - - ret = EDG_WLPR_PROXY_NOT_REGISTERED; - for (i = 0; i < record.jobids.len; i++) - if (strcmp(request->jobid, record.jobids.val[i]) == 0) { - ret = 0; - break; - } - if (ret) { - glite_renewal_log(ctx, LOG_DEBUG, "Requested proxy %s is not registered", - request->proxy_filename); - goto end; - } - - /* remove jobid from the list */ - index = i; - free(record.jobids.val[i]); - record.jobids.len--; - for (i = index; i < record.jobids.len; i++) - record.jobids.val[i] = record.jobids.val[i+1]; - - if (record.jobids.len == 0) { - record.unique = 0; - record.voms_exts = 0; - record.end_time = 0; - record.next_renewal = 0; - } - - ret = stat(request->proxy_filename, &stat_buf); - if (ret) { - glite_renewal_log(ctx, LOG_DEBUG, "Cannot stat file %s: (%s)", - request->proxy_filename, strerror(errno)); - ret = errno; - goto end; - } - - ret = store_record(ctx, basename, &record); - if (ret) - goto end; - - if (record.jobids.len == 0) - unlink(request->proxy_filename); - -end: - if (meta_fd) { - fclose(meta_fd); - } - if (basename) - free(basename); - - if (ret == 0) - ret = filename_to_response(ctx, request->proxy_filename, response); - record_to_response(ctx, ret, &record, response); - free_record(ctx, &record); -} - -void -get_proxy(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response) -{ - char *filename = NULL; - int ret; - - memset(response, 0, sizeof(*response)); - - glite_renewal_log(ctx, LOG_DEBUG, "GET request for %s", request->jobid); - - if (request->jobid == NULL) { - glite_renewal_log(ctx, LOG_ERR, "GET request doesn't contain jobid specification"); - ret = EINVAL; - goto end; - } - - ret = find_proxyname(ctx, request->jobid, &filename); - -end: - if (ret == 0) - ret = filename_to_response(ctx, filename, response); - if (filename) - free(filename); - response->response_code = ret; -} - -void -update_db(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response) -{ - FILE *fd = NULL; - int tmp_fd = -1; - int suffix = -1; - char tmp_file[FILENAME_MAX]; - char cur_proxy[FILENAME_MAX]; - char datafile[FILENAME_MAX]; - char line[1024]; - char *new_line = NULL; - char *basename, *proxy = NULL; - char **entry; - proxy_record record; - int ret; - char *p; - time_t current_time; - - memset(&record, 0, sizeof(record)); - - glite_renewal_log(ctx, LOG_DEBUG, "UPDATE_DB request for %s", request->proxy_filename); - - chdir(repository); - basename = request->proxy_filename; - - snprintf(datafile, sizeof(datafile), "%s.data", basename); - fd = fopen(datafile, "r"); - if (fd == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot open meta file %s (%s)", - datafile, strerror(errno)); - ret = errno; - return; - } - - snprintf(tmp_file, sizeof(tmp_file), "%s.XXXXXX", datafile); - tmp_fd = mkstemp(tmp_file); - if (tmp_fd < 0) { - glite_renewal_log(ctx, LOG_ERR, "Cannot create temporary file (%s)", - strerror(errno)); - ret = errno; - goto end; - } - - entry = request->entries; - if (entry) { - p = strchr(*entry, ':'); - *p = '\0'; - suffix = atoi(*entry); - proxy = p+1; - } - - current_time = time(NULL); - - while (fgets(line, sizeof(line), fd) != NULL) { - free_record(ctx, &record); - p = strchr(line, '\n'); - if (p) - *p = '\0'; - ret = decode_record(ctx, line, &record); - if (ret) - goto end; - - if (record.suffix > suffix && entry && *entry) { - do { - entry++; - if (entry == NULL || *entry == NULL) { - suffix = -1; - break; - } - - p = strchr(*entry, ':'); - suffix = atoi(*entry); - proxy = p+1; - } while (record.suffix > suffix); - } - - if (record.suffix == suffix) { - snprintf(cur_proxy, sizeof(cur_proxy), "%s.%d", basename, suffix); - if (proxy == NULL || *proxy == '\0') { - /* if proxy isn't specified use file registered currently and - * reschedule renewal */ - if (record.end_time < current_time) { - char *server; - /* remove file with expired proxy and clean the record in db */ - unlink(cur_proxy); - server = strdup(record.myproxy_server); - free_record(ctx, &record); - record.suffix = suffix; - record.myproxy_server = server; - glite_renewal_log(ctx, LOG_WARNING, "Removed expired proxy %s", cur_proxy); - } else - get_times(ctx, cur_proxy, &record); - } else { - ret = get_times(ctx, proxy, &record); - (ret == 0) ? rename(proxy, cur_proxy) : unlink(proxy); - } - } - - ret = encode_record(ctx, &record, &new_line); - if (ret) - goto end; - - dprintf(tmp_fd, "%s\n", new_line); - free(new_line); - new_line = NULL; - } - free_record(ctx, &record); - - close(tmp_fd); - fclose(fd); - - rename(tmp_file, datafile); - - return; - -end: - if (fd) - fclose(fd); - unlink(tmp_file); - if (tmp_fd > 0) - close(tmp_fd); - free_record(ctx, &record); - - return; -} diff --git a/org.glite.security.proxyrenewal/src/common.c b/org.glite.security.proxyrenewal/src/common.c deleted file mode 100644 index 206bc2f..0000000 --- a/org.glite.security.proxyrenewal/src/common.c +++ /dev/null @@ -1,322 +0,0 @@ -#include "renewal_locl.h" - -#ident "$Header$" - -/* nread() and nwrite() never return partial data */ -static int -nread(int sock, struct timeval *to, char *buf, size_t buf_len, size_t *read_len) -{ - int count; - size_t remain = buf_len; - char *cbuf = buf; - struct pollfd pollfds[1]; - struct timeval before,after; - int ret; - - if (to) { - gettimeofday(&before,NULL); - } - - while (remain > 0) { - pollfds[0].fd = sock; - pollfds[0].events = POLLIN; - switch (poll(pollfds, 1, to ? (to->tv_sec*1000+to->tv_usec/1000) : INFTIM)) { - case 0: - ret = EDG_WLPR_ERROR_TIMEOUT; - goto end; - case -1: - ret = EDG_WLPR_ERROR_ERRNO; - goto end; - } - - count = read(sock, cbuf, remain); - if (count < 0) { - if (errno == EINTR) - continue; - else { - ret = EDG_WLPR_ERROR_ERRNO; - goto end; - } - } else - if (count == 0) { - *read_len = 0; - return 0; - } - cbuf += count; - remain -= count; - } - *read_len = buf_len; - ret = 0; - -end: - if (to) { - gettimeofday(&after,NULL); - edg_wlpr_DecrementTimeout(to, before, after); - if (to->tv_sec < 0) { - to->tv_sec = 0; - to->tv_usec = 0; - } - } - - return ret; -} - -static int -nwrite(int sock, struct timeval *to, const char *buf, size_t buf_len) -{ - const char *cbuf = buf; - int count; - size_t remain = buf_len; - struct pollfd pollfds[1]; - struct timeval before,after; - int ret; - - if (to) { - gettimeofday(&before,NULL); - } - - while (remain > 0) { - pollfds[0].fd = sock; - pollfds[0].events = POLLOUT; - switch (poll(pollfds, 1, to ? (to->tv_sec*1000+to->tv_usec/1000) : INFTIM)) { - case 0: ret = EDG_WLPR_ERROR_TIMEOUT; - goto end; - case -1: ret = EDG_WLPR_ERROR_ERRNO; - goto end; - } - - count = write(sock, cbuf, remain); - if (count < 0) { - if (errno == EINTR) - continue; - else { - ret = EDG_WLPR_ERROR_ERRNO; - goto end; - } - } - cbuf += count; - remain -= count; - } - ret = 0; - -end: - if (to) { - gettimeofday(&after,NULL); - edg_wlpr_DecrementTimeout(to, before, after); - if (to->tv_sec < 0) { - to->tv_sec = 0; - to->tv_usec = 0; - } - } - - return ret; -} - -int -edg_wlpr_Read(int sock, struct timeval *timeout, char **buf, size_t *buf_len) -{ - int ret; - unsigned char length[4]; - size_t len; - - ret = nread(sock, timeout, length, 4, &len); - if (ret) { - *buf_len = 0; - return ret; - } - if (len != 4) { - *buf_len = 0; - return EDG_WLPR_ERROR_UNEXPECTED_EOF; /* XXX vraci i kdyz peer spadne a zavre trubku */ - } - *buf_len = (length[0] << 24) | - (length[1] << 16) | - (length[2] << 8 ) | - (length[3] << 0); - - *buf = malloc(*buf_len); - if (*buf == NULL) - return ENOMEM; - - ret = nread(sock, timeout, *buf, *buf_len, &len); - if (ret) - return ret; - - if (len != *buf_len) { - free(*buf); - *buf_len = 0; - return EDG_WLPR_ERROR_UNEXPECTED_EOF; /* XXX */ - } - - return 0; -} - -int -edg_wlpr_Write(int sock, struct timeval *timeout, char *buf, size_t buf_len) -{ - unsigned char length[4]; - int ret; - - length[0] = (buf_len >> 24) & 0xFF; - length[1] = (buf_len >> 16) & 0xFF; - length[2] = (buf_len >> 8) & 0xFF; - length[3] = (buf_len >> 0) & 0xFF; - - if ((ret = nwrite(sock, timeout, length, 4)) != 0 || - (ret = nwrite(sock, timeout, buf, buf_len)) != 0) - return ret; - - return 0; -} - -int -edg_wlpr_GetToken(const char *msg, const size_t msg_len, - const char *key, const char *separators, - int req_index, char **value) -{ - char *p; - size_t len; - int index; - - assert(separators != NULL); - - /* Add ending zero ? */ - - index = 0; - p = (char *)msg; - while (p && (p = strstr(p, key))) { - if (index == req_index) - break; - index++; - p += strlen(key); - } - if (p == NULL) - return EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND; - - p = strchr(p, '='); - if (p == NULL) - return EDG_WLPR_ERROR_PROTO_PARSE_ERROR; - - len = strcspn(p+1, separators); - if (len == 0) - return EDG_WLPR_ERROR_PROTO_PARSE_ERROR; - - *value = malloc(len + 1); - if (*value == NULL) - return ENOMEM; - - memcpy(*value, p+1, len); - (*value)[len] = '\0'; - - return 0; -} - -int -edg_wlpr_StoreToken(char **buf, size_t *buf_len, char *command, - char *value, const char *separator) -{ - char line[2048]; - char *tmp; - - assert(buf != NULL); - assert(separator != NULL); - - if (strlen(command) + 1 + strlen(value) + 2 > sizeof(line)) - return ERANGE; /* XXX */ - - snprintf(line, sizeof(line), "%s%s%s", command, value, separator); - - while (strlen(*buf) + strlen(line) + 1 > *buf_len) { - tmp = realloc(*buf, *buf_len + EDG_WLPR_BUF_SIZE); - if (tmp == NULL) - return ENOMEM; - *buf = tmp; - *buf_len += EDG_WLPR_BUF_SIZE; - } - strcat(*buf, line); - - return 0; -} - -void -edg_wlpr_CleanRequest(edg_wlpr_Request *request) -{ - assert(request != NULL); - if (request->version) - free(request->version); - if (request->proxy_filename) - free(request->proxy_filename); - if (request->myproxy_server) - free(request->myproxy_server); - if (request->jobid) - free(request->jobid); - if (request->entries) { - char **p = request->entries; - char **next; - while (*p) { - next = p+1; - free(*p); - p = next; - } - free(request->entries); - } - - memset(request, 0, sizeof(request)); -} - -void -edg_wlpr_CleanResponse(edg_wlpr_Response *response) -{ - assert(response != NULL); - if (response->version) - free(response->version); - if (response->myproxy_server) - free(response->myproxy_server); - if (response->filenames) { - char **p = response->filenames; - char **next; - - while (*p) { - next = p+1; - free(*p); - p = next; - } - free(response->filenames); - } - memset(response, 0, sizeof(*response)); -} - -const char * -edg_wlpr_GetErrorString(int code) -{ - return (code == 0) ? "OK" : "Error"; -} - -char * -edg_wlpr_EncodeInt(int num) /* long? time */ -{ - static char ret[64]; - - snprintf(ret, sizeof(ret), "%d", num); - return ret; -} - -int -edg_wlpr_DecodeInt(char *str, int *num) -{ - *num = atol(str); /* XXX */ - return 0; -} - -int -edg_wlpr_DecrementTimeout(struct timeval *timeout, struct timeval before, struct timeval after) -{ - (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec); - (*timeout).tv_usec = (*timeout).tv_usec - (after.tv_usec - before.tv_usec); - while ( (*timeout).tv_usec < 0) { - (*timeout).tv_sec--; - (*timeout).tv_usec += 1000000; - } - - if ( ((*timeout).tv_sec < 0) || (((*timeout).tv_sec == 0) && ((*timeout).tv_usec == 0)) ) return(1); - else return(0); -} diff --git a/org.glite.security.proxyrenewal/src/renew.c b/org.glite.security.proxyrenewal/src/renew.c deleted file mode 100644 index 29105d2..0000000 --- a/org.glite.security.proxyrenewal/src/renew.c +++ /dev/null @@ -1,256 +0,0 @@ -#include "renewal_locl.h" -#include "renewd_locl.h" - -#include "glite/security/voms/voms_apic.h" - -#ident "$Header$" - -#define RENEWAL_COUNTS_MAX 1000 /* the slave daemon exits after that many attemtps */ - -extern char *repository; -extern char *cadir; -extern char *vomsdir; -extern int voms_enabled; -static int received_signal = -1, die = 0; - -static void -check_renewal(glite_renewal_core_context ctx, char *datafile, int force_renew, int *num_renewed); - -static int -renew_proxy(glite_renewal_core_context ctx, proxy_record *record, char *basename, char **new_proxy); - -static void -register_signal(int signal); - -static void -register_signal(int signal) -{ - received_signal = signal; - switch ((received_signal = signal)) { - case SIGINT: - case SIGTERM: - case SIGQUIT: - die = signal; - break; - default: - break; - } -} - -static int -renew_proxy(glite_renewal_core_context ctx, proxy_record *record, char *basename, char **new_proxy) -{ - char repository_file[FILENAME_MAX]; - int ret = -1; - char *p = NULL; - char *server = NULL; - unsigned int port = 0; - - snprintf(repository_file, sizeof(repository_file),"%s.%d", - basename, record->suffix); - - if (record->myproxy_server) - server = strdup(record->myproxy_server); - - if (server && (p = strchr(server, ':'))) { - *p++ = '\0'; - ret = edg_wlpr_DecodeInt(p, &port); - } - - ret = glite_renewal_core_renew(ctx, server, port, repository_file, new_proxy); - if (ret) - goto end; - - ret = 0; - -end: - if (server) - free(server); - - return ret; -} - -static void -check_renewal(glite_renewal_core_context ctx, char *datafile, int force_renew, int *num_renewed) -{ - char line[1024]; - proxy_record record; - char *p; - int ret, i; - time_t current_time; - FILE *meta_fd = NULL; - char basename[FILENAME_MAX]; - edg_wlpr_Request request; - edg_wlpr_Response response; - char *new_proxy = NULL; - char *entry = NULL; - char **tmp; - int num = 0; - - assert(datafile != NULL); - - *num_renewed = 0; - - memset(&record, 0, sizeof(record)); - memset(basename, 0, sizeof(basename)); - memset(&request, 0, sizeof(request)); - memset(&response, 0, sizeof(response)); - - strncpy(basename, datafile, sizeof(basename) - 1); - p = basename + strlen(basename) - strlen(".data"); - if (strcmp(p, ".data") != 0) { - glite_renewal_log(ctx, LOG_ERR, "Meta filename doesn't end with '.data'"); - return; - } - *p = '\0'; - - request.command = EDG_WLPR_COMMAND_UPDATE_DB; - request.proxy_filename = strdup(basename); - - meta_fd = fopen(datafile, "r"); - if (meta_fd == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot open meta file %s (%s)", - datafile, strerror(errno)); - return; - } - - current_time = time(NULL); - glite_renewal_log(ctx, LOG_DEBUG, "Reading metafile %s", datafile); - - while (fgets(line, sizeof(line), meta_fd) != NULL) { - free_record(ctx, &record); - p = strchr(line, '\n'); - if (p) - *p = '\0'; - ret = decode_record(ctx, line, &record); - if (ret) - continue; /* XXX exit? */ - if (record.jobids.len == 0) /* no jobid registered for this proxy */ - continue; - if (current_time + RENEWAL_CLOCK_SKEW >= record.end_time || - record.next_renewal <= current_time || - force_renew) { - ret = EDG_WLPR_PROXY_EXPIRED; - if ( record.end_time + RENEWAL_CLOCK_SKEW >= current_time) { - /* only try renewal if the proxy hasn't already expired */ - ret = renew_proxy(ctx, &record, basename, &new_proxy); - } - - /* if the proxy wasn't renewed have the daemon planned another renewal */ - asprintf(&entry, "%d:%s", record.suffix, (ret == 0) ? new_proxy : ""); - if (new_proxy) { - free(new_proxy); new_proxy = NULL; - } - - tmp = realloc(request.entries, (num + 2) * sizeof(*tmp)); - if (tmp == NULL) { - free_record(ctx, &record); - return; - } - request.entries = tmp; - request.entries[num] = entry; - request.entries[num+1] = NULL; - num++; - } - } - free_record(ctx, &record); - - if (num > 0) { - ret = edg_wlpr_RequestSend(&request, &response); - if (ret != 0) - glite_renewal_log(ctx, LOG_ERR, - "Failed to send update request to master (%d)", ret); - else if (response.response_code != 0) - glite_renewal_log(ctx, LOG_ERR, - "Master failed to update database (%d)", response.response_code); - - /* delete all tmp proxy files which may survive */ - for (i = 0; i < num; i++) { - p = strchr(request.entries[i], ':'); - if (p+1) - unlink(p+1); - } - } - fclose(meta_fd); - - edg_wlpr_CleanResponse(&response); - edg_wlpr_CleanRequest(&request); - - *num_renewed = num; - - return; -} - -int renewal(glite_renewal_core_context ctx, int force_renew, int *num_renewed) -{ - DIR *dir = NULL; - struct dirent *file; - FILE *fd; - int num = 0; - - glite_renewal_log(ctx, LOG_DEBUG, "Starting renewal process"); - - *num_renewed = 0; - - if (chdir(repository)) { - glite_renewal_log(ctx, LOG_ERR, "Cannot access repository directory %s (%s)", - repository, strerror(errno)); - return errno; - } - - dir = opendir(repository); - if (dir == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot open repository directory %s (%s)", - repository, strerror(errno)); - return errno; - } - - while ((file = readdir(dir))) { - /* read files of format `md5sum`.data, where md5sum() is of fixed length - 32 chars */ - if (file->d_name == NULL || strlen(file->d_name) != 37 || - strcmp(file->d_name + 32, ".data") != 0) - continue; - fd = fopen(file->d_name, "r"); - if (fd == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Cannot open meta file %s (%s)", - file->d_name, strerror(errno)); - continue; - } - check_renewal(ctx, file->d_name, force_renew, &num); - *num_renewed += num; - fclose(fd); - } - closedir(dir); - glite_renewal_log(ctx, LOG_DEBUG, "Finishing renewal process"); - return 0; -} - -void -watchdog_start(glite_renewal_core_context ctx) -{ - struct sigaction sa; - int force_renewal; - int count = 0, num; - - memset(&sa,0,sizeof(sa)); - sa.sa_handler = register_signal; - sigaction(SIGUSR1, &sa, NULL); - sigaction(SIGINT,&sa,NULL); - sigaction(SIGQUIT,&sa,NULL); - sigaction(SIGTERM,&sa,NULL); - sigaction(SIGPIPE,&sa,NULL); - - while (count < RENEWAL_COUNTS_MAX && !die) { - received_signal = -1; - sleep(60 * 5); - force_renewal = (received_signal == SIGUSR1) ? 1 : 0; - if (die) - break; - /* XXX uninstall signal handler ? */ - renewal(ctx, force_renewal, &num); - count += num; - } - glite_renewal_log(ctx, LOG_DEBUG, "Terminating after %d renewal attempts", count); - exit(0); -} diff --git a/org.glite.security.proxyrenewal/src/renewal_core.c b/org.glite.security.proxyrenewal/src/renewal_core.c deleted file mode 100644 index 3bd2d1d..0000000 --- a/org.glite.security.proxyrenewal/src/renewal_core.c +++ /dev/null @@ -1,283 +0,0 @@ -#include -#include - -#include "renewal_core.h" -#include "renewal_locl.h" -#include "renewd_locl.h" - -static const char rcsid[] = "$Id$"; - -int -glite_renewal_load_proxy(glite_renewal_core_context ctx, const char *cur_file, X509 **cert, EVP_PKEY **priv_key, - STACK_OF(X509) **chain, globus_gsi_cred_handle_t *cur_proxy) -{ - globus_result_t result; - globus_gsi_cred_handle_t proxy = NULL; - int ret; - - result = globus_gsi_cred_handle_init(&proxy, NULL); - if (result) { - fprintf(stderr, "globus_gsi_cred_handle_init() failed\n"); - goto end; - } - - result = globus_gsi_cred_read_proxy(proxy, (char *) cur_file); - if (result) { - fprintf(stderr, "globus_gsi_cred_read_proxy() failed\n"); - goto end; - } - - if (cert) { - result = globus_gsi_cred_get_cert(proxy, cert); - if (result) { - fprintf(stderr, "globus_gsi_cred_get_cert() failed\n"); - goto end; - } - } - - if (priv_key) { - result = globus_gsi_cred_get_key(proxy, priv_key); - if (result) { - fprintf(stderr, "globus_gsi_cred_get_key() failed\n"); - goto end; - } - } - - if (chain) { - result = globus_gsi_cred_get_cert_chain(proxy, chain); - if (result) { - fprintf(stderr, "globus_gsi_cred_get_cert_chain() failed\n"); - goto end; - } - } - - if (cur_proxy) { - *cur_proxy = proxy; - proxy = NULL; - } - - ret = 0; - -end: - if (proxy) - globus_gsi_cred_handle_destroy(proxy); - if (result) - ret = EDG_WLPR_ERROR_GENERIC; - - return ret; -} - -int -glite_renewal_get_proxy_base_name(glite_renewal_core_context ctx, const char *file, char **name) -{ - X509 *cert = NULL; - EVP_PKEY *key = NULL; - STACK_OF(X509) *chain = NULL; - X509_NAME *subject = NULL; - int ret; - globus_result_t result; - - ret = glite_renewal_load_proxy(ctx, file, &cert, &key, &chain, NULL); - if (ret) - return ret; - - subject = X509_NAME_dup(X509_get_subject_name(cert)); - - sk_X509_insert(chain, cert, 0); - cert = NULL; - - result = globus_gsi_cert_utils_get_base_name(subject, chain); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "Cannot get subject name from proxy %s", file); - ret = EDG_WLPR_ERROR_SSL; /* XXX ??? */ - goto end; - } - - *name = X509_NAME_oneline(subject, NULL, 0); - ret = 0; - -end: - if (cert) - X509_free(cert); - if (key) - EVP_PKEY_free(key); - if (chain) - sk_X509_pop_free(chain, X509_free); - if (subject) - X509_NAME_free(subject); - - return ret; -} - -int -glite_renewal_core_renew(glite_renewal_core_context ctx, - const char * myproxy_server, - unsigned int myproxy_port, - const char *current_proxy, - char **new_proxy) -{ - char tmp_proxy[FILENAME_MAX]; - int tmp_fd; - int ret = -1; - char *p; - const char *server = NULL; - myproxy_socket_attrs_t *socket_attrs; - myproxy_request_t *client_request; - myproxy_response_t *server_response; - char *renewed_proxy; - int voms_exts; - - socket_attrs = malloc(sizeof(*socket_attrs)); - memset(socket_attrs, 0, sizeof(*socket_attrs)); - - client_request = malloc(sizeof(*client_request)); - memset(client_request, 0, sizeof(*client_request)); - - server_response = malloc(sizeof(*server_response)); - memset(server_response, 0, sizeof(*server_response)); - - myproxy_set_delegation_defaults(socket_attrs, client_request); - - glite_renewal_log(ctx, LOG_DEBUG, "Trying to renew proxy in %s", current_proxy); - - snprintf(tmp_proxy, sizeof(tmp_proxy), "%s.myproxy.XXXXXX", current_proxy); - tmp_fd = mkstemp(tmp_proxy); - if (tmp_fd == -1) { - glite_renewal_log(ctx, LOG_ERR, "Cannot create temporary file (%s)", - strerror(errno)); - return errno; - } - - ret = glite_renewal_get_proxy_base_name(ctx, current_proxy, &client_request->username); - if (ret) - goto end; - - voms_exts = glite_renewal_check_voms_attrs(ctx, current_proxy); - - client_request->proxy_lifetime = 60 * 60 * DGPR_RETRIEVE_DEFAULT_HOURS; - - server = (myproxy_server) ? myproxy_server : socket_attrs->pshost; - if (server == NULL) { - glite_renewal_log(ctx, LOG_ERR, "No myproxy server specified"); - ret = EINVAL; - goto end; - } - socket_attrs->pshost = strdup(server); - - socket_attrs->psport = (myproxy_port) ? myproxy_port : MYPROXY_SERVER_PORT; - - verror_clear(); - ret = myproxy_get_delegation(socket_attrs, client_request, (char *) current_proxy, - server_response, tmp_proxy); - if (ret == 1) { - ret = EDG_WLPR_ERROR_MYPROXY; - glite_renewal_log(ctx, LOG_ERR, "Error contacting MyProxy server for proxy %s: %s", - current_proxy, verror_get_string()); - verror_clear(); - goto end; - } - - renewed_proxy = tmp_proxy; - - if (voms_exts) { - char tmp_voms_proxy[FILENAME_MAX]; - int tmp_voms_fd; - - snprintf(tmp_voms_proxy, sizeof(tmp_voms_proxy), "%s.voms.XXXXXX", - current_proxy); - tmp_voms_fd = mkstemp(tmp_voms_proxy); - if (tmp_voms_fd == -1) { - glite_renewal_log(ctx, LOG_ERR, "Cannot create temporary file (%s)", - strerror(errno)); - ret = errno; - goto end; - } - - ret = glite_renewal_renew_voms_creds(ctx, current_proxy, renewed_proxy, tmp_voms_proxy); - close(tmp_voms_fd); - if (ret) { - unlink(tmp_voms_proxy); - goto end; - } - - renewed_proxy = tmp_voms_proxy; - unlink(tmp_proxy); - } - - if (new_proxy) - *new_proxy = strdup(renewed_proxy); - - ret = 0; - -end: - if (socket_attrs->socket_fd) - close(socket_attrs->socket_fd); - close(tmp_fd); - if (ret) - unlink(tmp_proxy); - myproxy_free(socket_attrs, client_request, server_response); - - return ret; -} - -int -glite_renewal_core_init_ctx(glite_renewal_core_context *context) -{ - glite_renewal_core_context p = NULL; - - *context = NULL; - - p = calloc(1, sizeof(*p)); - if (p == NULL) - return ENOMEM; - - p->log_level = LOG_ERR; - p->log_dst = GLITE_RENEWAL_LOG_SYSLOG; - - *context = p; - return 0; -} - -int -glite_renewal_core_destroy_ctx(glite_renewal_core_context context) -{ - if (context == NULL) - return 0; - if (context->err_message); - free(context->err_message); - free(context); - return 0; -} - -void -glite_renewal_log(glite_renewal_core_context context, int dbg_level, const char *format, ...) -{ - va_list ap; - - if (context->err_message) { - free(context->err_message); - context->err_message = NULL; - } - - /* cannot handle the %m format argument specific for syslog() */ - va_start(ap, format); - vasprintf(&context->err_message, format, ap); - va_end(ap); - - if (dbg_level > context->log_level) - return; - - switch (context->log_dst) { - case GLITE_RENEWAL_LOG_STDOUT: - printf("%s\n", context->err_message); - break; - case GLITE_RENEWAL_LOG_SYSLOG: - syslog(dbg_level, "%s", context->err_message); - break; - case GLITE_RENEWAL_LOG_NONE: - default: - break; - } - - return; -} diff --git a/org.glite.security.proxyrenewal/src/renewal_locl.h b/org.glite.security.proxyrenewal/src/renewal_locl.h deleted file mode 100644 index 256eb26..0000000 --- a/org.glite.security.proxyrenewal/src/renewal_locl.h +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef RENEWAL_LOCL_H -#define RENEWAL_LOCL_H - -#ident "$Header$" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef INFTIM -#define INFTIM (-1) -#endif - -#include -#include -#include -#include - -#include "renewal.h" - -#define JDL_MYPROXY "Myproxy_server=" - -typedef enum { - EDG_WLPR_COMMAND_NONE = 0, - EDG_WLPR_COMMAND_REG = 1, - EDG_WLPR_COMMAND_UNREG, - EDG_WLPR_COMMAND_GET, - EDG_WLPR_COMMAND_LIST, - EDG_WLPR_COMMAND_STATUS, - EDG_WLPR_COMMAND_UPDATE_DB, -} edg_wlpr_Command; - -/* prefix neni nutny */ -#define EDG_WLPR_PROTO_VERSION "Version=" -#define EDG_WLPR_PROTO_COMMAND "Command=" -#define EDG_WLPR_PROTO_MYPROXY_SERVER "Myproxy_server=" -#define EDG_WLPR_PROTO_PROXY "Proxy_name=" -#define EDG_WLPR_PROTO_UNIQUE_PROXY "Unique=" /* XXX */ -#define EDG_WLPR_PROTO_JOBID "Jobid=" -#define EDG_WLPR_PROTO_ENTRY "Entry=" - -#define EDG_WLPR_PROTO_RESPONSE "Response=" /* XXX result ?? */ -#define EDG_WLPR_PROTO_START_TIME "Start_time=" -#define EDG_WLPR_PROTO_END_TIME "End_time=" -#define EDG_WLPR_PROTO_RENEWAL_TIME "Renewal_time=" /* XXX Next renewal ?? */ - -#define EDG_WLPR_MYPROXY_PORT 7512 - -#define EDG_WLPR_REPOSITORY_ROOT "/var/spool/edg-wl-renewd" - -#define EDG_WLPR_BUF_SIZE 4096 - -#define EDG_WLPR_VERSION "EDG Proxy Renewal 1.0" - -#define MAX_PROXIES 4 /* max. number of jobids sharing one proxy */ - -#define RENEWAL_CLOCK_SKEW (5 * 60) - -#define DGPR_RETRIEVE_DEFAULT_HOURS 10 - -#define GLITE_PR_TIMEOUT_DEFAULT 120 - -typedef struct { - char *version; - edg_wlpr_Command command; - char *myproxy_server; - char *proxy_filename; - int unique; - char *jobid; - char **entries; /* for updates from the renewal part (renew.c) */ -} edg_wlpr_Request; - -typedef struct { - char *version; - int response_code; - time_t start_time; - time_t end_time; - time_t next_renewal_time; - int counter; - char *myproxy_server; - char **filenames; -} edg_wlpr_Response; - -#define DGPR_REG_SOCKET_NAME_ROOT "/tmp/dgpr_renew_" - -#if 0 -/* Errors: */ -/* XXX enum */ -#define EDG_WLPR_ERROR_EOF 1 -#define EDG_WLPR_ERROR_PARSE_NOT_FOUND 2 -#define EDG_WLPR_ERROR_PARSE_ERROR 3 -#define EDG_WLPR_ERROR_UNKNOWN_COMMAND 4 -#define EDG_WLPR_ERROR_NOTFOUND 5 -#endif - -int -edg_wlpr_GetToken(const char *msg, const size_t msg_len, - const char *key, const char *separators, - int req_index, char **value); - -int -edg_wlpr_StoreToken(char **buf, size_t *buf_len, char *command, - char *value, const char *separator); - -int -edg_wlpr_Read(int sock, struct timeval *timeout, char **buf, size_t *buf_len); - -int -edg_wlpr_Write(int sock, struct timeval *timeout, char *buf, size_t buf_len); - -void -edg_wlpr_CleanRequest(edg_wlpr_Request *request); - -void -edg_wlpr_CleanResponse(edg_wlpr_Response *response); - -const char * -edg_wlpr_GetErrorString(int err); - -char * -edg_wlpr_EncodeInt(int num); /* long? time */ - -int -edg_wlpr_DecodeInt(char *str, int *num); - -int -edg_wlpr_RequestSend(edg_wlpr_Request *request, edg_wlpr_Response *response); - -int -edg_wlpr_DecrementTimeout(struct timeval *timeout, struct timeval before, struct timeval after); - -#endif /* RENEWAL_LOCL_H */ diff --git a/org.glite.security.proxyrenewal/src/renewd.c b/org.glite.security.proxyrenewal/src/renewd.c deleted file mode 100644 index 3c8512c..0000000 --- a/org.glite.security.proxyrenewal/src/renewd.c +++ /dev/null @@ -1,609 +0,0 @@ -#include "renewal_locl.h" -#include "renewd_locl.h" - -static const char rcsid[] = "$Header$"; - -#define SEPARATORS "\n" -/* GRIDMANAGER_CHECKPROXY_INTERVAL + GRIDMANAGER_MINIMUM_PROXY_TIME */ -#define CONDOR_MINIMUM_PROXY_TIME (1800) - -int debug = 0; -char *repository = NULL; -time_t condor_limit = CONDOR_MINIMUM_PROXY_TIME; -char *cadir = NULL; -char *vomsdir = NULL; -int voms_enabled = 0; -char *cert = NULL; -char *key = NULL; -char *vomsconf = NULL; - -static volatile int die = 0, child_died = 0; -double default_timeout = 0; - -static struct option opts[] = { - { "help", no_argument, NULL, 'h' }, - { "version", no_argument, NULL, 'v' }, - { "debug", no_argument, NULL, 'd' }, - { "repository", required_argument, NULL, 'r' }, - { "condor-limit", required_argument, NULL, 'c' }, - { "CAdir", required_argument, NULL, 'C' }, - { "VOMSdir", required_argument, NULL, 'V' }, - { "enable-voms", no_argument, NULL, 'A' }, - { "voms-config", required_argument, NULL, 'G' }, - { "cert", required_argument, NULL, 't' }, - { "key", required_argument, NULL, 'k' }, - { NULL, 0, NULL, 0 } -}; - -typedef struct { - edg_wlpr_Command code; - void (*handler) (glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response); -} command_table; - -static command_table commands[] = { - { EDG_WLPR_COMMAND_REG, register_proxy, }, - { EDG_WLPR_COMMAND_UNREG, unregister_proxy, }, - { EDG_WLPR_COMMAND_GET, get_proxy, }, -#if 0 - { EDG_WLPR_COMMAND_LIST, list_proxies, }, - { EDG_WLPR_COMMAND_STATUS, status_proxy, }, -#endif - { EDG_WLPR_COMMAND_UPDATE_DB, update_db, }, - { 0, NULL }, -}; - -/* static prototypes */ -static void -usage(glite_renewal_core_context ctx, char *progname); - -static int -do_listen(glite_renewal_core_context ctx, char *socket_name, int *sock); - -static int -encode_response(glite_renewal_core_context ctx, edg_wlpr_Response *response, char **msg); - -static command_table * -find_command(glite_renewal_core_context ctx, edg_wlpr_Command code); - -static int -proto(glite_renewal_core_context ctx, int sock); - -static int -doit(glite_renewal_core_context ctx, int sock); - -static int -decode_request(glite_renewal_core_context ctx, const char *msg, const size_t msg_len, edg_wlpr_Request *request); - -int -start_watchdog(glite_renewal_core_context ctx, pid_t *pid); - -static void -catchsig(int sig) -{ - switch (sig) { - case SIGINT: - case SIGTERM: - case SIGQUIT: - die = sig; - break; - case SIGCHLD: - child_died = 1; - break; - default: - break; - } -} - -static command_table * -find_command(glite_renewal_core_context ctx, edg_wlpr_Command code) -{ - command_table *c; - - for (c = commands; c->code; c++) { - if (c->code == code) - return c; - } - return NULL; -} - -static int -proto(glite_renewal_core_context ctx, int sock) -{ - char *buf = NULL; - size_t buf_len; - int ret; - edg_wlpr_Response response; - edg_wlpr_Request request; - command_table *command; - struct timeval timeout; - - memset(&request, 0, sizeof(request)); - memset(&response, 0, sizeof(response)); - - timeout.tv_sec = (long) default_timeout; - timeout.tv_usec = (long) ((default_timeout - timeout.tv_sec) * 1e6); - - ret = edg_wlpr_Read(sock, &timeout, &buf, &buf_len); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Error reading from client: %s", - edg_wlpr_GetErrorString(ret)); - return ret; - } - - ret = decode_request(ctx, buf, buf_len, &request); - free(buf); - if (ret) - goto end; - - /* XXX check request (protocol version, ...) */ - - command = find_command(ctx, request.command); - if (command == NULL) { - ret = EDG_WLPR_ERROR_UNKNOWN_COMMAND; - glite_renewal_log(ctx, LOG_ERR, "Received unknown command (%d)", request.command); - goto end; - } - - glite_renewal_log(ctx, LOG_INFO, "Received command code %d for proxy %s and jobid %s", - request.command, - request.proxy_filename ? request.proxy_filename : "(unspecified)", - request.jobid ? request.jobid : "(unspecified)"); - - command->handler(ctx, &request, &response); - - ret = encode_response(ctx, &response, &buf); - if (ret) - goto end; - - ret = edg_wlpr_Write(sock, &timeout, buf, strlen(buf) + 1); - free(buf); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Error sending response to client: %s", - edg_wlpr_GetErrorString(ret)); - goto end; - } - -end: - edg_wlpr_CleanRequest(&request); - edg_wlpr_CleanResponse(&response); - - return ret; -} - -static int -doit(glite_renewal_core_context ctx, int sock) -{ - int newsock; - struct sockaddr_un client_addr; - int client_addr_len = sizeof(client_addr); - int flags; - - while (!die) { - - if (child_died) { - int pid, newpid, ret; - - while ((pid=waitpid(-1,NULL,WNOHANG))>0) - ; - ret = start_watchdog(ctx, &newpid); - if (ret) - return ret; - glite_renewal_log(ctx, LOG_DEBUG, "Renewal slave process re-started"); - child_died = 0; - continue; - } - - newsock = accept(sock, (struct sockaddr *) &client_addr, &client_addr_len); - if (newsock == -1) { - if (errno != EINTR) - glite_renewal_log(ctx, LOG_ERR, "accept() failed"); - continue; - } - glite_renewal_log(ctx, LOG_DEBUG, "Got connection"); - - flags = fcntl(newsock, F_GETFL, 0); - if (fcntl(newsock, F_SETFL, flags | O_NONBLOCK) < 0) { - glite_renewal_log(ctx, LOG_ERR, "Can't set O_NONBLOCK mode (%s), closing.\n", - strerror(errno)); - close(newsock); - continue; - } - - proto(ctx, newsock); - - glite_renewal_log(ctx, LOG_DEBUG, "Connection closed"); - close(newsock); - } - glite_renewal_log(ctx, LOG_DEBUG, "Terminating on signal %d\n",die); - return 0; -} - -static int -decode_request(glite_renewal_core_context ctx, const char *msg, const size_t msg_len, edg_wlpr_Request *request) -{ - char *value = NULL; -#if 0 - char *p; - int port; -#endif - int ret; - int index; - - /* XXX add an ending zero '\0' */ - - assert(msg != NULL); - assert(request != NULL); - - memset(request, 0, sizeof(*request)); - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_VERSION, SEPARATORS, - 0, &request->version); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Protocol error reading protocol specification: %s", - edg_wlpr_GetErrorString(ret)); - return ret; - } - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_COMMAND, SEPARATORS, - 0, &value); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Protocol error reading command specification: %s", - edg_wlpr_GetErrorString(ret)); - goto err; - } - - ret = edg_wlpr_DecodeInt(value, (int *)(&request->command)); - if (ret) { - glite_renewal_log(ctx, LOG_ERR, "Received non-numeric command specification (%s)", - value); - free(value); - goto err; - } - free(value); - - if (find_command(ctx, request->command) == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Received unknown command (%d)", request->command); - ret = EDG_WLPR_ERROR_UNKNOWN_COMMAND; - goto err; - } - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_MYPROXY_SERVER, - SEPARATORS, 0, &request->myproxy_server); - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) { - glite_renewal_log(ctx, LOG_ERR, "Protocol error reading myproxy server specification: %s", - edg_wlpr_GetErrorString(ret)); - goto err; - } - -#if 0 - request->myproxy_port = EDG_WLPR_MYPROXY_PORT; /* ??? */ - if (request->myproxy_server && (p = strchr(request->myproxy_server, ':'))) { - *p = '\0'; - port = atol(p+1); /* XXX see myproxy for err check */ - request->myproxy_port = port; - } -#endif - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_PROXY, SEPARATORS, - 0, &request->proxy_filename); - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) { - glite_renewal_log(ctx, LOG_ERR, "Protocol error reading proxy specification: %s", - edg_wlpr_GetErrorString(ret)); - goto err; - } - -#if 0 - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_UNIQUE_PROXY, - SEPARATORS, 0, &value); - if (ret && ret != EDG_WLPR_ERROR_PARSE_NOT_FOUND) - goto err; - if (ret == 0 && strcasecmp(value, "yes") == 0) - request->unique = 1; - free(value); -#endif - - ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_JOBID, SEPARATORS, - 0, &request->jobid); - if (ret && ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) { - glite_renewal_log(ctx, LOG_ERR, "Protocol error reading JobId : %s", - edg_wlpr_GetErrorString(ret)); - goto err; - } - - index = 0; - while ((ret = edg_wlpr_GetToken(msg, msg_len, EDG_WLPR_PROTO_ENTRY, - SEPARATORS, index, &value)) == 0) { - char **tmp; - - tmp = realloc(request->entries, (index + 2) * sizeof(*tmp)); - if (tmp == NULL) { - ret = ENOMEM; - goto err; - } - request->entries = tmp; - request->entries[index] = value; - index++; - } - if (ret != EDG_WLPR_ERROR_PROTO_PARSE_NOT_FOUND) - goto err; - if (request->entries) - request->entries[index] = NULL; - - return 0; - -err: - edg_wlpr_CleanRequest(request); - return ret; -} - -static int -encode_response(glite_renewal_core_context ctx, edg_wlpr_Response *response, char **msg) -{ - char *buf; - size_t buf_len; - int ret; - - buf_len = EDG_WLPR_BUF_SIZE; - buf = malloc(buf_len); - if (buf == NULL) - return ENOMEM; - buf[0] = '\0'; - - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_VERSION, - EDG_WLPR_VERSION, SEPARATORS); - if (ret) - goto err; - - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_RESPONSE, - edg_wlpr_EncodeInt(response->response_code), - SEPARATORS); - if (ret) - goto err; - - if (response->myproxy_server) { - char host[1024]; - -#if 0 - snprintf(host, sizeof(host), "%s:%d", response->myproxy_server, - (response->myproxy_port) ? response->myproxy_port : EDG_WLPR_MYPROXY_PORT); -#endif - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_MYPROXY_SERVER, - host, SEPARATORS); - if (ret) - goto err; - } - - if (response->start_time) { - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_START_TIME, - edg_wlpr_EncodeInt(response->start_time), - SEPARATORS); - if (ret) - goto err; - } - - if (response->end_time) { - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_END_TIME, - edg_wlpr_EncodeInt(response->end_time), - SEPARATORS); - if (ret) - goto err; - } - - if (response->next_renewal_time) { - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_RENEWAL_TIME, - edg_wlpr_EncodeInt(response->next_renewal_time), - SEPARATORS); - if (ret) - goto err; - } - - if (response->filenames) { - char **p = response->filenames; - while (*p) { - ret = edg_wlpr_StoreToken(&buf, &buf_len, EDG_WLPR_PROTO_PROXY, *p, - SEPARATORS); - if (ret) - goto err; - p++; - } - } - - buf[strlen(buf)] = '\0'; - *msg = buf; - return 0; - -err: - free(buf); - *msg = NULL; - return ret; -} - - -static void -usage(glite_renewal_core_context ctx, char *progname) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help display this help and exit\n" - "\t-v, --version output version information and exit\n" - "\t-d, --debug don't fork, print out debugging information\n" - "\t-r, --repository repository directory\n" - "\t-c, --condor-limit how long before expiration the proxy must be renewed\n" - "\t-C, --CAdir trusted certificates directory\n" - "\t-V, --VOMSdir trusted VOMS servers certificates directory\n" - "\t-A, --enable-voms renew also VOMS certificates in proxies\n" - "\t-G, --voms-config location of the vomses configuration file\n", - progname); -} - -static int -do_listen(glite_renewal_core_context ctx, char *socket_name, int *sock) -{ - struct sockaddr_un my_addr; - int s; - int ret; - - assert(sock != NULL); - - memset(&my_addr, 0, sizeof(my_addr)); - my_addr.sun_family = AF_UNIX; - strncpy(my_addr.sun_path, socket_name, sizeof(my_addr.sun_path)); - unlink(socket_name); - umask(0177); - - s = socket(AF_UNIX, SOCK_STREAM, 0); - if (s == -1) { - glite_renewal_log(ctx, LOG_ERR, "socket(): %s", strerror(errno)); - return errno; - } - - ret = bind(s, (struct sockaddr *)&my_addr, sizeof(my_addr)); - if (ret == -1) { - glite_renewal_log(ctx, LOG_ERR, "bind(): %s", strerror(errno)); - close(s); - return errno; - } - - ret = listen(s, 50); - if (ret == -1) { - glite_renewal_log(ctx, LOG_ERR, "listen(): %s", strerror(errno)); - close(s); - return errno; - } - - *sock = s; - return 0; -} - -int -start_watchdog(glite_renewal_core_context ctx, pid_t *pid) -{ - pid_t p; - - switch ((p = fork())) { - case -1: - glite_renewal_log(ctx, LOG_ERR, "fork() failed: %s", - strerror(errno)); - return errno; - case 0: - watchdog_start(ctx); - exit(0); - break; - default: - *pid = p; - return 0; - } - /* not reachable */ - exit(0); -} - -int main(int argc, char *argv[]) -{ - int sock; - char *progname; - int opt; - int fd; - char sockname[PATH_MAX]; - int ret; - pid_t pid; - struct sigaction sa; - const char *s = NULL; - glite_renewal_core_context ctx = NULL; - - progname = strrchr(argv[0],'/'); - if (progname) progname++; - else progname = argv[0]; - - repository = EDG_WLPR_REPOSITORY_ROOT; - debug = 0; - - while ((opt = getopt_long(argc, argv, "hvdr:c:C:V:AG:t:k:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(ctx, progname); exit(0); - case 'v': fprintf(stdout, "%s:\t%s\n", progname, rcsid); exit(0); - case 'd': debug = 1; break; - case 'r': repository = optarg; break; - case 'c': condor_limit = atoi(optarg); break; - case 'C': cadir = optarg; break; - case 'V': vomsdir = optarg; break; - case 'A': voms_enabled = 1; break; - case 'G': vomsconf = optarg; break; - case 't': cert = optarg; break; - case 'k': key = optarg; break; - case '?': usage(ctx, progname); return 1; - } - - if (optind < argc) { - usage(ctx, progname); - exit(1); - } - - ret = glite_renewal_core_init_ctx(&ctx); - if (ret) { - fprintf(stderr, "Cannot initialize context\n"); - exit(1); - } - if (debug) { - ctx->log_level = LOG_DEBUG; - ctx->log_dst = GLITE_RENEWAL_LOG_STDOUT; - } - ctx->voms_conf = vomsconf; - - if (chdir(repository)) { - glite_renewal_log(ctx, LOG_ERR, "Cannot access repository directory %s (%s)", - repository, strerror(errno)); - exit(1); - } - - globus_module_activate(GLOBUS_GSI_CERT_UTILS_MODULE); - globus_module_activate(GLOBUS_GSI_PROXY_MODULE); - - if (!debug) - for (fd = 3; fd < OPEN_MAX; fd++) close(fd); - - if (!debug) { - /* chdir ? */ - if (daemon(1,0) == -1) { - perror("deamon()"); - exit(1); - } - openlog(progname, LOG_PID, LOG_DAEMON); - } - - if (cert) - setenv("X509_USER_CERT", cert, 1); - - if (key) - setenv("X509_USER_KEY", key, 1); - - if (cadir) - setenv("X509_CERT_DIR", cadir, 1); - - s = getenv("GLITE_PR_TIMEOUT"); - default_timeout = s ? atof(s) : GLITE_PR_TIMEOUT_DEFAULT; - - memset(&sa,0,sizeof(sa)); - sa.sa_handler = catchsig; - sigaction(SIGINT,&sa,NULL); - sigaction(SIGQUIT,&sa,NULL); - sigaction(SIGTERM,&sa,NULL); - sigaction(SIGCHLD,&sa,NULL); - sigaction(SIGPIPE,&sa,NULL); - - ret = start_watchdog(ctx, &pid); - if (ret) - return 1; - - umask(0177); - snprintf(sockname, sizeof(sockname), "%s%d", - DGPR_REG_SOCKET_NAME_ROOT, getuid()); - /* XXX check that the socket is not already active */ - ret = do_listen(ctx, sockname, &sock); - if (ret) - return 1; - glite_renewal_log(ctx, LOG_DEBUG, "Listening at %s", sockname); - - ret = doit(ctx, sock); - - close(sock); - return ret; -} diff --git a/org.glite.security.proxyrenewal/src/renewd_locl.h b/org.glite.security.proxyrenewal/src/renewd_locl.h deleted file mode 100644 index 489e909..0000000 --- a/org.glite.security.proxyrenewal/src/renewd_locl.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef RENEWALD_LOCL_H -#define RENEWALD_LOCL_H - -#ident "$Header$" - -#include -#include -#include - -#include "renewal.h" -#include "renewal_core.h" - -#ifdef HAVE_DMALLOC_H -#include -#endif - -/* XXX */ -#if 0 -#define EDG_WLPR_ERROR_PARSE_NOT_FOUND EDG_WLPR_ERROR_PROTO_PARSE_ERROR -#define EDG_WLPR_ERROR_NOTFOUND EDG_WLPR_PROXY_NOT_REGISTERED -#endif - -typedef struct { - unsigned int len; - char **val; -} prd_list; - -typedef struct { - int suffix; - prd_list jobids; - int unique; - int voms_exts; - char *myproxy_server; - time_t end_time; - time_t next_renewal; -} proxy_record; - -/* commands */ -void -register_proxy(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response); - -void -unregister_proxy(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response); - -void -get_proxy(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response); - -void -update_db(glite_renewal_core_context ctx, edg_wlpr_Request *request, edg_wlpr_Response *response); - -int -get_times(glite_renewal_core_context ctx, char *proxy_file, proxy_record *record); - -void -watchdog_start(glite_renewal_core_context ctx); - -void -glite_renewal_log(glite_renewal_core_context ctx, int dbg_level, const char *format, ...); - -int -decode_record(glite_renewal_core_context ctx, char *line, proxy_record *record); - -int -encode_record(glite_renewal_core_context ctx, proxy_record *record, char **line); - -void -free_record(glite_renewal_core_context ctx, proxy_record *record); - -int -glite_renewal_load_proxy(glite_renewal_core_context ctx, const char *filename, X509 **cert, EVP_PKEY **privkey, - STACK_OF(X509) **chain, globus_gsi_cred_handle_t *proxy); - -int -glite_renewal_get_proxy_base_name(glite_renewal_core_context ctx, const char *file, char **subject); - -int -glite_renewal_renew_voms_creds(glite_renewal_core_context ctx, const char *cur_file, const char *renewed_file, const char *new_file); - -int -glite_renewal_check_voms_attrs(glite_renewal_core_context ctx, const char *proxy); - -#endif /* RENEWALD_LOCL_H */ diff --git a/org.glite.security.proxyrenewal/src/voms.c b/org.glite.security.proxyrenewal/src/voms.c deleted file mode 100644 index 687d93b..0000000 --- a/org.glite.security.proxyrenewal/src/voms.c +++ /dev/null @@ -1,356 +0,0 @@ -#include "renewal_locl.h" -#include "renewd_locl.h" - -#include -#include - -#include "glite/security/voms/voms_apic.h" - -#include "glite/security/voms/newformat.h" - -char * Decode(const char *, int, int *); -char **listadd(char **, char *, int); - -static int -generate_proxy(glite_renewal_core_context ctx, globus_gsi_cred_handle_t cur_proxy, - X509_EXTENSION *voms_extension, const char *new_file) -{ - globus_result_t result; - globus_gsi_proxy_handle_t proxy_handle = NULL; - globus_gsi_cred_handle_t proxy = NULL; - EVP_PKEY *cur_proxy_priv_key = NULL; - X509 *new_cert = NULL; - X509 *voms_cert = NULL; - globus_gsi_cert_utils_cert_type_t proxy_type; - - result = globus_gsi_proxy_handle_init(&proxy_handle, NULL); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "globus_gsi_proxy_handle_init() failed\n"); - goto end; - } - - result = globus_gsi_cred_get_key(cur_proxy, &cur_proxy_priv_key); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "globus_gsi_cred_get_key() failed\n"); - goto end; - } - - /* Create and sign a new proxy */ - result = globus_gsi_cred_get_cert_type(cur_proxy, &proxy_type); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "globus_gsi_cred_get_cert_type() failed\n"); - goto end; - } - - result = globus_gsi_proxy_handle_set_type(proxy_handle, proxy_type); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "globus_gsi_proxy_handle_set_type() failed\n"); - goto end; - } - - result = globus_gsi_proxy_create_signed(proxy_handle, cur_proxy, &proxy); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "globus_gsi_proxy_handle_init() failed\n"); - goto end; - } - - /* Get the new proxy */ - result = globus_gsi_cred_get_cert(proxy, &new_cert); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "globus_gsi_cred_get_cert() failed\n"); - goto end; - } - - /* The Globus API doesn't allow to store custom X.509 extensions */ - voms_cert = X509_dup(new_cert); - if (voms_cert->cert_info->extensions == NULL) - voms_cert->cert_info->extensions = sk_X509_EXTENSION_new_null(); - sk_X509_EXTENSION_push(voms_cert->cert_info->extensions, voms_extension); - - /* Openssl ensures that memory containing old signature structures is unallocated */ -#if 0 - X509_sign(voms_cert, cur_proxy_priv_key, proxy_handle->attrs->signing_algorithm); -#else - X509_sign(voms_cert, cur_proxy_priv_key, EVP_md5()); -#endif - - /* And put the cert back, older one is unallocated by the function */ - result = globus_gsi_cred_set_cert(proxy, voms_cert); - if (result) { - glite_renewal_log(ctx, LOG_ERR, "globus_gsi_cred_set_cert() failed\n"); - goto end; - } - - result = globus_gsi_cred_write_proxy(proxy, (char *)new_file); - -end: - - return 0; -} - -static int -my_VOMS_Export(glite_renewal_core_context ctx, void *buf, int buf_len, X509_EXTENSION **extension) -{ - AC *ac = NULL; - unsigned char *p, *pp; - AC **voms_attrs = NULL; - - p = pp = buf; - ac = d2i_AC(NULL, &p, buf_len+1); - if (ac == NULL) { - glite_renewal_log(ctx, LOG_ERR, "d2i_AC() failed\n"); - return 1; - } - - voms_attrs = (AC **)listadd((char **)voms_attrs, (char *)ac, sizeof(AC *)); - - *extension = X509V3_EXT_conf_nid(NULL, NULL, OBJ_txt2nid("acseq"), - (char*)voms_attrs); - return 0; -} - -static int -create_voms_command(glite_renewal_core_context ctx, struct vomsdata *vd, struct voms **voms_cert, char **command) -{ - int voms_error, ret; - struct data **attribs; - -#if 0 - VOMS_ResetOrder(vd, &voms_error); - for (i = 2; i < argc; i++) { - ret = VOMS_Ordering(argv[i], vd, &voms_error); - if (ret == 0) { - glite_renewal_log(ctx, LOG_ERR, "VOMS_Ordering() failed\n"); - return 1; - } - } -#endif - - if (voms_cert == NULL || *voms_cert == NULL || (*voms_cert)->std == NULL) { - glite_renewal_log(ctx, LOG_ERR, "Invalid VOMS certificate\n"); - return 1; - } - - attribs = (*voms_cert)->std; - - if (strcmp (attribs[0]->role, "NULL") == 0 ) - ret = asprintf(command, "G%s", attribs[0]->group); - else - ret = asprintf(command, "B%s:%s", attribs[0]->group, attribs[0]->role); - -end: - - return 0; -} - -static int -renew_voms_cert(glite_renewal_core_context ctx, struct vomsdata *vd, struct voms **voms_cert, - char **buf, size_t *buf_len) -{ - int voms_error = 0, i, ret, voms_version; - struct contactdata **voms_contacts = NULL; - char *command = NULL; - - voms_contacts = VOMS_FindByVO(vd, (*voms_cert)->voname, ctx->voms_conf, NULL, &voms_error); - - if (voms_contacts == NULL) { - glite_renewal_log(ctx, LOG_ERR, "VOMS_FindByVO() failed\n"); - return 1; - } - - ret = create_voms_command(ctx, vd, voms_cert, &command); - - /* XXX the lifetime should be taken from the older proxy */ - ret = VOMS_SetLifetime(60*60*12, vd, &voms_error); - - /* XXX iterate over all servers on the list on errors */ - ret = VOMS_ContactRaw(voms_contacts[0]->host, voms_contacts[0]->port, - voms_contacts[0]->contact, command, - (void**) buf, buf_len, &voms_version, - vd, &voms_error); - if (ret == 0) { - glite_renewal_log(ctx, LOG_ERR, "VOMS_Contact() failed\n"); - return 1; - } - - VOMS_DeleteContacts(voms_contacts); - - if (command) - free(command); - - return 0; -} - -static int -renew_voms_certs(glite_renewal_core_context ctx, const char *cur_file, const char *renewed_file, const char *new_file) -{ - globus_gsi_cred_handle_t cur_proxy = NULL; - globus_gsi_cred_handle_t new_proxy = NULL; - struct vomsdata *vd = NULL; - struct voms **voms_cert = NULL; - int voms_err, ret; - X509 *cert = NULL; - STACK_OF(X509) *chain = NULL; - char *buf = NULL; - size_t buf_len = 0; - X509_EXTENSION *extension = NULL; - char *old_env_proxy = getenv("X509_USER_PROXY"); - char *old_env_cert = getenv("X509_USER_CERT"); - char *old_env_key = getenv("X509_USER_KEY"); - - setenv("X509_USER_PROXY", cur_file, 1); - setenv("X509_USER_CERT", renewed_file, 1); - setenv("X509_USER_KEY", renewed_file, 1); - - ret = glite_renewal_load_proxy(ctx, cur_file, &cert, NULL, &chain, &cur_proxy); - if (ret) - goto end; - - vd = VOMS_Init(NULL, NULL); - if (vd == NULL) { - glite_renewal_log(ctx, LOG_ERR, "VOMS_Init() failed\n"); - return 1; - } - - ret = VOMS_Retrieve(cert, chain, RECURSE_CHAIN, vd, &voms_err); - if (ret == 0) { - if (voms_err == VERR_NOEXT) { - /* no VOMS cred, no problem; continue */ - /* XXX this part shouldn't be reachable, this call is only called - * if the proxy does contain VOMS attributes */ - glite_renewal_log(ctx, LOG_ERR, "No VOMS attributes found in proxy %s\n", cur_file); - ret = 0; - goto end; - } else { - glite_renewal_log(ctx, LOG_ERR, "Cannot get VOMS certificate(s) from proxy"); - ret = 1; - goto end; - } - } - - /* XXX make sure this loop can really work for multiple voms certificates - * embedded in the proxy */ - for (voms_cert = vd->data; voms_cert && *voms_cert; voms_cert++) { - char *tmp, *ptr; - size_t tmp_len; - - ret = renew_voms_cert(ctx, vd, voms_cert, &tmp, &tmp_len); - if (ret) - goto end; - ptr = realloc(buf, buf_len + tmp_len); - if (ptr == NULL) { - ret = ENOMEM; - goto end; - } - buf = ptr; - memcpy(buf + buf_len, tmp, tmp_len); - buf_len += tmp_len; - } - - if (buf == NULL) { - /* no extension renewed, return */ - ret = 0; - goto end; - } - - ret = my_VOMS_Export(ctx, buf, buf_len, &extension); - if (ret) - goto end; - - ret = glite_renewal_load_proxy(ctx, renewed_file, NULL, NULL, NULL, &new_proxy); - if (ret) - goto end; - - ret = generate_proxy(ctx, new_proxy, extension, new_file); - -end: - (old_env_proxy) ? setenv("X509_USER_PROXY", old_env_proxy, 1) : - unsetenv("X509_USER_PROXY"); - (old_env_cert) ? setenv("X509_USER_CERT", old_env_cert, 1) : - unsetenv("X509_USER_CERT"); - (old_env_key) ? setenv("X509_USER_KEY", old_env_key, 1) : - unsetenv("X509_USER_KEY"); - - if (cert) - X509_free(cert); - if (chain) - sk_X509_pop_free(chain, X509_free); - if (vd) - VOMS_Destroy(vd); - if (cur_proxy) - globus_gsi_cred_handle_destroy(cur_proxy); - if (new_proxy) - globus_gsi_cred_handle_destroy(new_proxy); - if (buf) - free(buf); - - return ret; -} - -int -glite_renewal_renew_voms_creds(glite_renewal_core_context ctx, const char *cur_file, const char *renewed_file, const char *new_file) -{ - return renew_voms_certs(ctx, cur_file, renewed_file, new_file); -} - -int -glite_renewal_check_voms_attrs(glite_renewal_core_context ctx, const char *proxy) -{ - int ret, voms_err, present; - X509 *cert = NULL; - STACK_OF(X509) *chain = NULL; - struct vomsdata *vd = NULL; - - ret = glite_renewal_load_proxy(ctx, proxy, &cert, NULL, &chain, NULL); - if (ret) - return 0; - - vd = VOMS_Init(NULL, NULL); - if (vd == NULL) { - present = 0; - goto end; - } - - ret = VOMS_Retrieve(cert, chain, RECURSE_CHAIN, vd, &voms_err); - if (ret == 0) { - present = 0; - goto end; - } - - present = 1; - -end: - if (cert) - X509_free(cert); - if (chain) - sk_X509_pop_free(chain, X509_free); - if (vd) - VOMS_Destroy(vd); - - return present; -} - -#if 0 -int -main(int argc, char *argv[]) -{ - int ret; - const char *current_proxy = "/tmp/x509up_u11930"; - const char *renewed_proxy = "/tmp/proxy"; - - if (argc > 1) - current_proxy = argv[1]; - if (argc > 2) - renewed_proxy = argv[2]; - - if (globus_module_activate(GLOBUS_GSI_PROXY_MODULE) != GLOBUS_SUCCESS || - globus_module_activate(GLOBUS_GSI_CERT_UTILS_MODULE) != GLOBUS_SUCCESS) { - glite_renewal_log(ctx, LOG_ERR, "[%d]: Unable to initialize Globus modules\n", getpid()); - return 1; - } - - ret = renew_voms_certs(current_proxy, renewed_proxy); - - return 0; -} -#endif diff --git a/org.glite.wms-utils.exception/.cvsignore b/org.glite.wms-utils.exception/.cvsignore deleted file mode 100644 index e970233..0000000 --- a/org.glite.wms-utils.exception/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project \ No newline at end of file diff --git a/org.glite.wms-utils.exception/LICENSE b/org.glite.wms-utils.exception/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.wms-utils.exception/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.wms-utils.exception/Makefile.am b/org.glite.wms-utils.exception/Makefile.am deleted file mode 100755 index b66c2bb..0000000 --- a/org.glite.wms-utils.exception/Makefile.am +++ /dev/null @@ -1,67 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -## Process this file with automake to produce Makefile.in -EXTRA_DIST = LICENSE - -docdir = $(datadir)/doc/@PACKAGE@-@VERSION@ -doc_DATA = LICENSE -## Subdirectories list -SUBDIRS = interface src - -## Default flags to run aclocal -ACLOCAL_AMFLAGS = -I project - -stage: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target="install"; \ - prefix_arg="@prefix@"; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target $$prefix_arg in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target $$prefix_arg) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" $$prefix_arg || exit 1; \ - fi; test -z "$$fail" - -distsrc: dist - mv $(distdir).tar.gz $(DISTTAR)/$(distdir)_src.tar.gz - -distbin: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target="install"; \ - tmpdistbin="$(WORKDIR)/dist_bin"; \ - prefix_arg="prefix=$$tmpdistbin"; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target $$prefix_arg in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target $$prefix_arg) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" $$prefix_arg || exit 1; \ - fi; test -z "$$fail"; \ - pushd $$tmpdistbin; \ - $(AMTAR) -zcf $(DISTTAR)/$(distdir)_bin.tar.gz .; \ - popd; \ - rm -rf $$tmpdistbin - diff --git a/org.glite.wms-utils.exception/bootstrap b/org.glite.wms-utils.exception/bootstrap deleted file mode 100755 index ceeb099..0000000 --- a/org.glite.wms-utils.exception/bootstrap +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh - -mkdir -p src/autogen -set -x -aclocal -I project -libtoolize --force -autoheader -automake --foreign --add-missing --copy -autoconf diff --git a/org.glite.wms-utils.exception/build.xml b/org.glite.wms-utils.exception/build.xml deleted file mode 100755 index d12e8c2..0000000 --- a/org.glite.wms-utils.exception/build.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.wms-utils.exception/configure.ac b/org.glite.wms-utils.exception/configure.ac deleted file mode 100755 index 398817a..0000000 --- a/org.glite.wms-utils.exception/configure.ac +++ /dev/null @@ -1,127 +0,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 -# -# Common configure.ac file for the GLite WMS Common module -# -# Authors: Alberto Di Meglio -# Version info: $Id$ -# Release: $Name$ -# -# Revision history: -# $Log$ -# Revision 1.13 2006/03/20 15:29:52 eronchie -# Increased version -# -# Revision 1.12 2005/10/15 07:54:17 eronchie -# Increased version -# -# Revision 1.11 2005/09/20 10:20:52 eronchie -# Started merged with 1.4 -# -# Revision 1.10 2004/12/10 07:31:35 eronchie -# Increased version -# -# Revision 1.9 2004/11/16 15:31:13 eronchie -# Increased version -# -# Revision 1.8 2004/09/22 00:25:17 glbuild -# Fixed missing parenthesis -# -# Revision 1.7 2004/09/21 19:21:57 glbuild -# modified module.version -# -# Revision 1.6 2004/08/17 10:41:47 eronchie -# Added optimize option -# -# Revision 1.5 2004/07/23 08:02:09 eronchie -# Updated configure.ac -# -# Revision 1.4 2004/07/21 18:49:26 eronchie -# Added AC_GLITE -# -# Revision 1.3 2004/07/21 18:47:49 eronchie -# Removed obsolete things -# -# Revision 1.2 2004/07/21 18:44:22 eronchie -# Updated header file -# -# Revision 1.1.1.1 2004/07/21 18:16:57 eronchie -# Moved out exception from org.glite.wms.common/src/utilitiesY -# -# -# - -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.57) -AC_INIT([GLite WMS Utils Exception], [3.1.1]) -AC_CONFIG_AUX_DIR([./project]) -AM_INIT_AUTOMAKE([1.6.3 subdir-objects]) -AC_CONFIG_SRCDIR([src/Exception.cpp]) - -# Notices. -AC_COPYRIGHT([Copyright (c) 2004 The EU EGEE Project -See LICENCE file for details -]) -AC_REVISION([$Revision$]) - -#Environment. -WORKDIR=`pwd` -AC_SUBST(WORKDIR) - -# Checks for programs. -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXX -AC_PROG_CXXCPP -AM_PROG_CC_C_O -AC_PROG_LIBTOOL - -# Checks for libraries. - -# Checks for header files. -AC_CHECK_HEADERS([fcntl.h mntent.h sys/vfs.h syslog.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_C_INLINE -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_CHECK_MEMBERS([struct stat.st_rdev]) -AC_TYPE_UID_T -AC_CHECK_TYPES([ptrdiff_t]) - -# Checks for library functions. -AC_HEADER_STDC -AC_FUNC_ERROR_AT_LINE -AC_FUNC_GETMNTENT -AC_FUNC_MEMCMP -AC_FUNC_STAT -AC_FUNC_STRFTIME -AC_FUNC_VPRINTF -AC_CHECK_FUNCS([bzero endpwent ftruncate getmntent memset mkdir pow strerror strtol]) - -AC_GLITE - -AC_OPTIMIZE - -# Configuration items -AC_PREFIX_DEFAULT([/opt/glite]) -AM_CONFIG_HEADER([src/autogen/config.h]) -AC_CONFIG_FILES([Makefile]) -AC_CONFIG_FILES([src/Makefile]) -AC_CONFIG_FILES([interface/Makefile]) - -AC_OUTPUT - diff --git a/org.glite.wms-utils.exception/interface/Makefile.am b/org.glite.wms-utils.exception/interface/Makefile.am deleted file mode 100755 index 3c4ccb7..0000000 --- a/org.glite.wms-utils.exception/interface/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -exceptiondir = $(includedir) -nobase_exception_HEADERS = \ - glite/wmsutils/exception/exception_codes.h \ - glite/wmsutils/exception/Exception.h - -MAINTAINERCLEANFILES = Makefile.in diff --git a/org.glite.wms-utils.exception/interface/glite/wmsutils/exception/Exception.h b/org.glite.wms-utils.exception/interface/glite/wmsutils/exception/Exception.h deleted file mode 100644 index 19ca7c7..0000000 --- a/org.glite.wms-utils.exception/interface/glite/wmsutils/exception/Exception.h +++ /dev/null @@ -1,138 +0,0 @@ -#ifndef GLITE_WMS_UTILS_EXCEPTION_EXCEPTION_H -#define GLITE_WMS_UTILS_EXCEPTION_EXCEPTION_H - -/* - * Exception.h - * Copyright (c) 2001 The European Datagrid Project - IST programme, all rights reserved. - * Contributors are mentioned in the code where appropriate. - */ - -#include -#include -//#include -#include // For logging exceptions to log file -#include // list the exception codes -#include -#include -#include // base ancestor stl::exception - - -namespace glite { - namespace wmsutils { - namespace exception { - -extern pthread_mutex_t METHOD_MUTEX; // used in order to store info into a file (rather then syslog) -#define GLITE_STACK_TRY(method_name) std::string METHOD = method_name ; int LINE = __LINE__ ; try { -#define GLITE_STACK_CATCH() } catch (glite::wmsutils::exception::Exception &exc){ exc.push_back ( __FILE__ , LINE, METHOD ); throw exc ; } catch (std::exception &ex){ glite::wmsutils::exception::Exception exc( __FILE__ , LINE, METHOD, 0, "Standard exception: " + std::string(ex.what()) ); throw exc; } - -/** - * The Exception base classe contains attributes into which are placed exception information and provides - * constructor that beyond the error code take parameters specifying the source file and line number - * (e.g. through __FILE__ and __LINE__) where the error has been generated and string messages, - * allowing an easy way of storing the origin of the exception. - * Moreover it provides methods for getting all the exception information and for logging them either - * in a log file or to the syslog daemon. - * Each of the derived types may contain its private attributes describing the actual error instance in detail. - * Moreover each exception has an attribute representing the exception identifier that is set by the - * class constructor and allows the identification of the original exception. - * - * @version 0.1 - * @date 22 July 2004 - * @author Alessandro Maraschini -*/ - -class Exception : public std::exception{ - public: - /** - * Constructor Update all mandatory fields - * @param method the name of the method that raised the exception - * @param source The source that raised the exception (could be the file path, the class Name, etc etc) - * @param exc the previous exception as in the stack trace */ - Exception ( const std::string& source, const std::string& method, Exception *exc); - /** - * Constructor Update all mandatory fields - * @param code the code representing the thrown exception - * @param exception the name of the thrown exception - * @param method the name of the method that raised the exception - * @param source The source that raised the exception (could be the file path, the class Name, etc etc) */ - Exception ( const std::string& source, const std::string& method, int code, const std::string& exception); - - /** - * Constructor Update all mandatory fields - * @param source the path of the file that raised the exception - * @param line_number the number of the line in the file that raised the exception - * @param method the name of the method that raised the exception - * @param code the code representing the thrown exception - * @param exception the name of the thrown exception */ - Exception (const std::string& source, int line_number, const std::string& method, int code, const std::string& exception); - /** - * Default Destructor - */ - virtual ~Exception() throw (); - /** - * Return a string debug message containing information about Exception thrown - * Debug message contains all the attributes stored in an exception instance such as the method, the file and the line - * that threw the exception. - *@return the debug message string representation - */ - virtual std::string dbgMessage(); - /** - * Return the error code - * @return The integer representing the code of the error that generated the exception - */ - virtual int getCode(); - - /** - * return the Error Message associated to the Exception - * @return The Exception string message representation - */ - virtual const char* what() const throw (); - - /** - * Print Exception error information into a log file - * @param logfile the file where to log exception information - */ - virtual void log(const std::string& logfile = ""); - /** - * Retrieve the Exception name - * @return the name of the Exception thrown - */ - virtual std::string getExceptionName(); - - /** - * Retrieve the Stack of the exception as a list of previous generated exceptions - *@return the string representation of the stack trace: each line correspond to an exception message - */ - virtual std::string printStackTrace() ; - /** - * Return the list of methods that caused the Exception - */ - virtual std::vector getStackTrace() ; - /** - * Update stack information - */ - virtual void push_back ( const std::string& source, int line_number, const std::string& method ) ; - protected: - /** Empty constructor*/ - Exception(); - /** integer error code representing the cause of the error */ - int error_code; - /** string exception message representation*/ - std::string error_message ; - /** line number where the exception was raised */ - int line; - /** The name of the file where the exception was raised */ - std::string source_file; - /** the name of the exception */ - std::string exception_name; - /** the name of the method where the expceiton was raised */ - std::string method_name ; - /** a string representation of the stacktrace */ - std::string stack; - /** the actual internal stacktrace representation */ - std::vector< std::string> stack_strings ; - /** the name of the ancestor exception */ - std::string ancestor ; -}; //End Exception Class -}}} // Closing namespace -#endif diff --git a/org.glite.wms-utils.exception/interface/glite/wmsutils/exception/exception_codes.h b/org.glite.wms-utils.exception/interface/glite/wmsutils/exception/exception_codes.h deleted file mode 100755 index fce99aa..0000000 --- a/org.glite.wms-utils.exception/interface/glite/wmsutils/exception/exception_codes.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef GLITE_WMSUTILS_EXCEPTION_CODES_H -#define GLITE_WMSUTILS_EXCEPTION_CODES_H -// pure C-style code (needed by some libraries) -#define GLITE_WMS_COMMON_ERROR_BASE 900 -#define GLITE_WMS_USERINTERFACE_ERROR_BASE 1000 -#define GLITE_WMS_NETWORKSERVER_ERROR_BASE 1200 -#define GLITE_WMS_SOCKET_ERROR_BASE 1300 -#define GLITE_WMS_LDAP_ERROR_BASE 1350 -#define GLITE_WMS_LOGGING_ERROR_BASE 1400 -#define GLITE_WMS_REQUESTAD_ERROR_BASE 1500 -#define GLITE_WMS_CHECKPOINT_ERROR_BASE 1600 -#define GLITE_WMS_CONFIGURATION_ERROR_BASE 1800 -#ifdef __cplusplus -namespace glite { -namespace wmsutils { -namespace exception { - /** - * The Error Code - */ - enum { - WMS_COMMON_BASE = GLITE_WMS_COMMON_ERROR_BASE, - THREAD_INIT , // pthread_attr_init method failed - THREAD_DETACH , // pthread_attr_setdetachstate method failed - THREAD_CREATE , // pthread_create method failed - THREAD_JOIN, - THREAD_SSL, - WMS_FATAL_ERROR, - WMS_UI_ERROR_BASE = GLITE_WMS_USERINTERFACE_ERROR_BASE, - WMS_NS_ERROR_BASE = GLITE_WMS_NETWORKSERVER_ERROR_BASE, - WMS_SOCKET_ERROR_BASE = GLITE_WMS_SOCKET_ERROR_BASE, - WMS_LDAP_ERROR_BASE = GLITE_WMS_LDAP_ERROR_BASE, - WMS_LB_ERROR_BASE = GLITE_WMS_LOGGING_ERROR_BASE , - WMS_REQUESTAD_ERROR_BASE = GLITE_WMS_REQUESTAD_ERROR_BASE, - WMS_CHKPT_ERROR_BASE = GLITE_WMS_CHECKPOINT_ERROR_BASE, - WMS_CONFIGURATION_ERROR_BASE = GLITE_WMS_CONFIGURATION_ERROR_BASE - }; -} // exception namespace -} // wmsutils namespace -} // glite namespace -#endif //ifdef c++ -#endif diff --git a/org.glite.wms-utils.exception/project/build.number b/org.glite.wms-utils.exception/project/build.number deleted file mode 100644 index 95bc38e..0000000 --- a/org.glite.wms-utils.exception/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Sat Oct 15 02:08:14 CEST 2005 -module.build=154 diff --git a/org.glite.wms-utils.exception/project/build.properties b/org.glite.wms-utils.exception/project/build.properties deleted file mode 100755 index f4aef51..0000000 --- a/org.glite.wms-utils.exception/project/build.properties +++ /dev/null @@ -1,2 +0,0 @@ -build.package.summary="files for gLite wms utils exception" -build.package.description="exception api" diff --git a/org.glite.wms-utils.exception/project/configure.properties.xml b/org.glite.wms-utils.exception/project/configure.properties.xml deleted file mode 100644 index 04d3b17..0000000 --- a/org.glite.wms-utils.exception/project/configure.properties.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/org.glite.wms-utils.exception/project/properties.xml b/org.glite.wms-utils.exception/project/properties.xml deleted file mode 100755 index 1e49af0..0000000 --- a/org.glite.wms-utils.exception/project/properties.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.wms-utils.exception/project/version.properties b/org.glite.wms-utils.exception/project/version.properties deleted file mode 100755 index 40c3916..0000000 --- a/org.glite.wms-utils.exception/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version=3.1.1 -module.age=1 diff --git a/org.glite.wms-utils.exception/src/Exception.cpp b/org.glite.wms-utils.exception/src/Exception.cpp deleted file mode 100644 index 546f253..0000000 --- a/org.glite.wms-utils.exception/src/Exception.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* ************************************************************************** -* filename : Exceptions.cpp -* author : Alessandro Maraschini -* copyright : (C) 2002 by DATAMAT -***************************************************************************/ - -#include "glite/wmsutils/exception/Exception.h" -#include "glite/wmsutils/exception/exception_codes.h" - -namespace glite { -namespace wmsutils{ -namespace exception { -using namespace std ; -pthread_mutex_t METHOD_MUTEX ; // This mutex is used in order to lock the file for writing log infornation - -/* ********************************* -* Exception Class Implementation -************************************/ -//Constructor/Destructor - -Exception::Exception () { - line = 0; -}; - -Exception::~Exception() throw(){ } - -/** -* Exception chainig -*/ -void Exception::push_back (const string& source, int line_number, const string& method){ - stack_strings.push_back (dbgMessage()); - ancestor = what(); - source_file = source; - line = line_number; - method_name = method; - error_message = ""; - exception_name = ""; -} - -Exception::Exception( const std::string& file, int line_number, const std::string& method, int code, const std::string& name) - : error_code(code), exception_name(name){ - source_file = file; - line = line_number; - method_name = method; -}; - -Exception::Exception (const string& source, const string& method, int code, const string& exception) - : error_code(code), exception_name(exception){ - source_file = source; - method_name = method; - // stack= ""; - line = 0; -}; - -int Exception::getCode(){ - if (error_code != 0) return error_code; - else - return WMS_COMMON_BASE; -}; - -const char* Exception::what() const throw(){ - if (!ancestor.empty()) return ancestor.c_str(); - - return error_message.c_str(); -}; - -string Exception::getExceptionName(){ - return exception_name; -}; - -void Exception::log(const std::string& logfile) -{ - if (logfile == "") - syslog (LOG_PERROR, (char *)(dbgMessage()).c_str()); - else{ - pthread_mutex_lock( &METHOD_MUTEX); // LOCK - //TBD : test if file exist-->>Create HEADER ?? - ofstream fout ((char *) logfile.c_str() , ios::app ); //Open the file for writing (if it doesn't exist then it will be created) - fout << "\n" << dbgMessage() ; //write (append) the message - fout.close(); //close the file - pthread_mutex_unlock( &METHOD_MUTEX); // UNLOCK - } -}; - -string Exception::printStackTrace(){ - string stack = "" ; - for (unsigned int i = 0 ; i < stack_strings.size() ; i++ ){ - stack+=stack_strings[i] +"\n" ; - } - return stack +dbgMessage(); -}; - -vector Exception::getStackTrace(){ - // make a copy of the stack - vector stack = stack_strings ; - stack.push_back(dbgMessage()) ; - return stack; -}; - -string Exception::dbgMessage(){ - string result ; - //Adding exception Name - result = exception_name; - - //Adding error msg - if (error_message!="") result +=": " + string(what()); - - if (result != "") result+="\n"; - - //Adding Source - result +="\tat " + method_name +"[" +source_file; - - //Adding line number - if (line!=0){ - char buffer [1024] ; - sprintf (buffer, "%i" , line) ; - result += ":" + string ( buffer ); - } - result +="]" ; - return result; -} - -}}} // Closing namespace - diff --git a/org.glite.wms-utils.exception/src/Makefile.am b/org.glite.wms-utils.exception/src/Makefile.am deleted file mode 100755 index 0c5caac..0000000 --- a/org.glite.wms-utils.exception/src/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -lib_LTLIBRARIES = libglite_wmsutils_exception.la - -libglite_wmsutils_exception_la_SOURCES = \ - Exception.cpp - -AM_CPPFLAGS = -I$(top_srcdir)/interface \ - -I$(top_srcdir)/src - -MAINTAINERCLEANFILES = Makefile.in *.*~ diff --git a/org.glite.wms-utils.exception/test/Makefile.am b/org.glite.wms-utils.exception/test/Makefile.am deleted file mode 100755 index a972450..0000000 --- a/org.glite.wms-utils.exception/test/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -EXCEPTION_LIBS = $(top_builddir)/src/libglite_wmsutils_exception.la - -TESTS = glite-wmsutils-exception - -check_PROGRAMS = $(TESTS) - -glite_wmsutils_exception_SOURCES = exception_cu_suite.cpp \ - exception_cu_suite.h \ - exception_cu_main.cpp - -glite_wmsutils_exception_LDADD = \ - $(GLITE_WMSUTILS_EXCEPTION_LIBS) \ - $(GLOBUS_GSS_THR_LIBS) \ - $(EXCEPTION_LIBS) \ - $(CPPUNIT_LIBS) - -AM_CPPFLAGS = \ - -I$(top_srcdir)/src \ - -I$(top_srcdir)/test \ - $(GLITE_CFLAGS) \ - $(GLOBUS_THR_CFLAGS) \ - $(CPPUNIT_CFLAGS) - -MAINTAINERCLEANFILES = Makefile.in *~ - diff --git a/org.glite.wms-utils.exception/test/exception_cu_main.cpp b/org.glite.wms-utils.exception/test/exception_cu_main.cpp deleted file mode 100644 index 182df4c..0000000 --- a/org.glite.wms-utils.exception/test/exception_cu_main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -#include "exception_cu_suite.h" - -#include -#include -#include -#include -#include - -using namespace CppUnit; -using namespace std; - -int main (int argc , char** argv) -{ - std::ofstream xml("./cppUnit_output.xml",ios::app); - - CppUnit::TestResult controller; - CppUnit::TestResultCollector result; - controller.addListener( &result ); - - TestRunner runner; - runner.addTest(Exception_test::suite()); - runner.run(controller); - - CppUnit::XmlOutputter outputter( &result, xml ); - CppUnit::TextOutputter outputter2( &result, std::cerr ); - outputter.write(); - outputter2.write(); - - return result.wasSuccessful() ? 0 : 1 ; -} diff --git a/org.glite.wms-utils.exception/test/exception_cu_suite.cpp b/org.glite.wms-utils.exception/test/exception_cu_suite.cpp deleted file mode 100644 index f749af9..0000000 --- a/org.glite.wms-utils.exception/test/exception_cu_suite.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "exception_cu_suite.h" -#include "glite/wmsutils/exception/Exception.h" -#include -#include - -using namespace CppUnit; -using namespace std; -using namespace glite::wmsutils::exception; - -void Exception_test::setUp() -{} - -void Exception_test::tearDown() -{} - - -void Exception_test::constructor_case() -{ - - //constructor class name, line number, method name, code, exception name - glite::wmsutils::exception::Exception exc_5("TEST_Class", 3, "test_method", 1, "exception_test"); - - //constructor class name, method name, code, exception name - glite::wmsutils::exception::Exception exc_4("TEST_Class", "test_method", 1, "exception_test"); - - CPPUNIT_ASSERT(exc_5.getExceptionName() == "exception_test"); - CPPUNIT_ASSERT(exc_5.getCode() == 1); -} - -void Exception_test::tostring_case() -{ - cout<<"TEST TO STRING METHODS"< msgvec = exc_5.getStackTrace(); - - for (int i=0; i -#include -#include - -#include - - -class Exception_test : public CppUnit::TestFixture { - - CPPUNIT_TEST_SUITE(Exception_test); - CPPUNIT_TEST(constructor_case); - CPPUNIT_TEST(tostring_case); - CPPUNIT_TEST(stackTrace_case); - CPPUNIT_TEST_SUITE_END(); - - -public: - - void setUp(); - void tearDown(); - - void constructor_case(); - void tostring_case(); - void stackTrace_case(); - -}; - - - diff --git a/org.glite.wms-utils.jobid/.cvsignore b/org.glite.wms-utils.jobid/.cvsignore deleted file mode 100755 index 1df717b..0000000 --- a/org.glite.wms-utils.jobid/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.wms-utils.jobid/LICENSE b/org.glite.wms-utils.jobid/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.wms-utils.jobid/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -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), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.wms-utils.jobid/Makefile.am b/org.glite.wms-utils.jobid/Makefile.am deleted file mode 100755 index bf956e1..0000000 --- a/org.glite.wms-utils.jobid/Makefile.am +++ /dev/null @@ -1,69 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -## Process this file with automake to produce Makefile.in - -EXTRA_DIST = LICENSE - -docdir = $(datadir)/doc/@PACKAGE@-@VERSION@ -doc_DATA = LICENSE - -## Subdirectories list -SUBDIRS = interface src examples - -## Default flags to run aclocal -ACLOCAL_AMFLAGS = -I project - -stage: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target="install"; \ - prefix_arg="@prefix@"; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target $$prefix_arg in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target $$prefix_arg) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" $$prefix_arg || exit 1; \ - fi; test -z "$$fail" - -distsrc: dist - mv $(distdir).tar.gz $(DISTTAR)/$(distdir)_src.tar.gz - -distbin: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target="install"; \ - tmpdistbin="$(WORKDIR)/dist_bin"; \ - prefix_arg="prefix=$$tmpdistbin"; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target $$prefix_arg in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target $$prefix_arg) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" $$prefix_arg || exit 1; \ - fi; test -z "$$fail"; \ - pushd $$tmpdistbin; \ - $(AMTAR) -zcf $(DISTTAR)/$(distdir)_bin.tar.gz .; \ - popd; \ - rm -rf $$tmpdistbin - diff --git a/org.glite.wms-utils.jobid/bootstrap b/org.glite.wms-utils.jobid/bootstrap deleted file mode 100755 index ceeb099..0000000 --- a/org.glite.wms-utils.jobid/bootstrap +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh - -mkdir -p src/autogen -set -x -aclocal -I project -libtoolize --force -autoheader -automake --foreign --add-missing --copy -autoconf diff --git a/org.glite.wms-utils.jobid/build.xml b/org.glite.wms-utils.jobid/build.xml deleted file mode 100755 index 44c110c..0000000 --- a/org.glite.wms-utils.jobid/build.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.wms-utils.jobid/configure.ac b/org.glite.wms-utils.jobid/configure.ac deleted file mode 100755 index e255849..0000000 --- a/org.glite.wms-utils.jobid/configure.ac +++ /dev/null @@ -1,147 +0,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 -# -# Common configure.ac file for the GLite WMS Common module -# -# Authors: Alberto Di Meglio -# Version info: $Id$ -# Release: $Name$ -# -# Revision history: -# $Log$ -# Revision 1.19 2006/03/20 15:30:43 eronchie -# Increased version -# -# Revision 1.18 2005/10/15 07:55:00 eronchie -# Increased version -# -# Revision 1.17 2005/09/20 10:41:49 eronchie -# Started merging with rc1.4 -# -# Revision 1.16 2004/12/10 07:33:42 eronchie -# Increased version -# -# Revision 1.15 2004/11/16 15:35:22 eronchie -# Increased version -# -# Revision 1.14 2004/11/16 15:15:45 eronchie -# Increased version -# -# Revision 1.13 2004/09/22 00:25:17 glbuild -# Fixed missing parenthesis -# -# Revision 1.12 2004/09/21 19:22:09 glbuild -# modified module.version -# -# Revision 1.11 2004/08/17 13:46:28 eronchie -# Added interface -# -# Revision 1.10 2004/08/17 13:41:20 eronchie -# Moved out JobIdExceptions.h cjobid.h JobId.h -# Put in interface/glite/wmsutils/jobid -# -# Revision 1.9 2004/08/17 10:40:34 eronchie -# Added optimize option -# -# Revision 1.8 2004/07/27 09:14:19 eronchie -# Removed AC_WMSUTILS_EXCEPTION and AC_GLOBUS_SSL_UTILS checks -# Set directly exception library macro -# -# Revision 1.7 2004/07/21 17:53:36 eronchie -# Moved out org.glite.wms.jobid from org.glite.wms and put in org.glite.wms-utils -# -# -# - -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.57) -AC_INIT([GLite WMS Utils Jobid], [3.1.1]) -AC_CONFIG_AUX_DIR([./project]) -AM_INIT_AUTOMAKE([1.6.3 subdir-objects]) -AC_CONFIG_SRCDIR([src/jobid/strmd5.h]) - -# Notices. -AC_COPYRIGHT([Copyright (c) 2004 The EU EGEE Project -See LICENCE file for details -]) -AC_REVISION([$Revision$]) - -#Environment. -WORKDIR=`pwd` -AC_SUBST(WORKDIR) - -# Checks for programs. -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXX -AC_PROG_CXXCPP -AM_PROG_CC_C_O -AC_PROG_LIBTOOL - -# Checks for libraries. - -# Checks for header files. -AC_CHECK_HEADERS([fcntl.h mntent.h sys/vfs.h syslog.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_C_INLINE -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_CHECK_MEMBERS([struct stat.st_rdev]) -AC_TYPE_UID_T -AC_CHECK_TYPES([ptrdiff_t]) - -# Checks for library functions. -AC_HEADER_STDC -AC_FUNC_ERROR_AT_LINE -AC_FUNC_GETMNTENT -AC_FUNC_MEMCMP -AC_FUNC_STAT -AC_FUNC_STRFTIME -AC_FUNC_VPRINTF -AC_CHECK_FUNCS([bzero endpwent ftruncate getmntent memset mkdir pow strerror strtol]) - -have_globus=no - -AC_GLOBUS([], have_globus=yes, have_globus=no) -AC_MSG_RESULT(["GLOBUS found $have_globus"]) - -if test "$have_globus" = "no"; then - AC_MSG_RESULT(["Please verify GLOBUS package"]) -fi - -if test "$have_globus" = "no"; then - AC_MSG_ERROR([Cannot continue building]) -fi -AC_GLITE - -GLITE_WMSUTILS_EXCEPTION_LIBS="-L$GLITE_LOCATION/lib -lglite_wmsutils_exception" - -AC_SUBST(GLITE_WMSUTILS_EXCEPTION_LIBS) - -AC_OPTIMIZE - -# Configuration items -AC_PREFIX_DEFAULT([/opt/glite]) -AM_CONFIG_HEADER([src/autogen/config.h]) -AC_CONFIG_FILES([Makefile]) -AC_CONFIG_FILES([examples/Makefile]) -AC_CONFIG_FILES([interface/Makefile]) -AC_CONFIG_FILES([src/Makefile]) -AC_CONFIG_FILES([src/jobid/Makefile]) - -AC_OUTPUT - diff --git a/org.glite.wms-utils.jobid/examples/Makefile.am b/org.glite.wms-utils.jobid/examples/Makefile.am deleted file mode 100755 index fa9a407..0000000 --- a/org.glite.wms-utils.jobid/examples/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -STDCPP = -lstdc++ - -JOBID = $(top_builddir)/src/jobid/libglite_wmsutils_cjobid.la - -check_PROGRAMS = testjobid - -testjobid_SOURCES = testjobid.c -testjobid_LDADD = \ - $(JOBID) \ - $(GLITE_WMSUTILS_EXCEPTION_LIBS) \ - $(GLOBUS_SSL_THR_LIBS) \ - $(STDCPP) - -AM_CPPFLAGS = -I$(top_srcdir)/src \ - -I$(top_srcdir)/interface \ - $(GLITE_CFLAGS) \ - $(GLOBUS_THR_CFLAGS) - -MAINTAINERCLEANFILES = Makefile.in *~ - diff --git a/org.glite.wms-utils.jobid/examples/testjobid.c b/org.glite.wms-utils.jobid/examples/testjobid.c deleted file mode 100755 index 56f6cba..0000000 --- a/org.glite.wms-utils.jobid/examples/testjobid.c +++ /dev/null @@ -1,33 +0,0 @@ -/* test code for jobid routines */ - -#include -#include - -#include "glite/wmsutils/jobid/cjobid.h" - -int main(int argc, char* argv[]) -{ - char* ju; - char* bkserver = "ujsa.uhjs"; - - edg_wlc_JobId ji = 0; - edg_wlc_JobId ji2 = 0; - - int r = edg_wlc_JobIdCreate(bkserver, 0, &ji); - printf("Create: %d\n", r); - - ju = edg_wlc_JobIdUnparse(ji); - printf("Unparse: %s\n", ju); - - edg_wlc_JobIdParse(ju, &ji2); - free(ju); - - ju = edg_wlc_JobIdUnparse(ji); - printf("Unparse2: %s\n", ju); - free(ju); - - edg_wlc_JobIdFree(ji); - edg_wlc_JobIdFree(ji2); - - return 0; -} diff --git a/org.glite.wms-utils.jobid/interface/Makefile.am b/org.glite.wms-utils.jobid/interface/Makefile.am deleted file mode 100755 index 8737f19..0000000 --- a/org.glite.wms-utils.jobid/interface/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -jobiddir = $(includedir) -nobase_jobid_HEADERS = \ - glite/wmsutils/jobid/cjobid.h \ - glite/wmsutils/jobid/manipulation.h \ - glite/wmsutils/jobid/JobIdExceptions.h \ - glite/wmsutils/jobid/JobId.h - -MAINTAINERCLEANFILES = Makefile.in diff --git a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobId.h b/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobId.h deleted file mode 100755 index 8d0b7b4..0000000 --- a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobId.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef GLITE_WMSUTILS_JOBID_JOBID_H -#define GLITE_WMSUTILS_JOBID_JOBID_H - -/* - * JobId.h - * Copyright (c) 2001 The European Datagrid Project - IST programme, all rights reserved. - * - */ - -#include -#include - -#include "glite/wmsutils/jobid/cjobid.h" - -typedef struct _edg_wlc_jobid_s* edg_wlc_jobid_t; - -namespace glite { -namespace wmsutils { -namespace jobid { - -/** - * Managing Identification, checking, retreiving info from a job - * File name: JobId.h - * The JobId class provides a representation of the Datagrid job identifier - * (dg_jobId) and the methods for manipulating it. - * We remind that the format of the dg_jobId is as follows: - * :/ - * - * @ingroup common - * @version 0.1 - * @date 15 April 2002 - * @author Alessandro Maraschini */ - -class JobId { -public: - /**@name Constructors/Destructor */ - //@{ - /** Instantiates an empty JobId object */ - JobId() ; - /** - * Instantiates a JobId object from the passed dg_jobId in string format. - * @param job_id_string a string representig a classAd expression - * @throws WrongIdException When a string is passed in a wrong format - */ - JobId(const std::string& job_id_string); - JobId(const JobId&); - JobId(const edg_wlc_JobId&); - /** - * Destructor - * Destroy the Job Id instance - */ - ~JobId() ; - //@} - - /**@name Miscellaneous */ - //@{ - /** Unsets the JobId instance. Clear all it's memebers */ - void clear() ; - /** - * Check wheater the jobId has been already created (true) or not (false) - *@return true (jobId created) or false (jobId not yet created) - */ - bool isSet() { return ( m_JobId != 0 ) ; } - /** - * Set the JobId instance according to the LB and RB server addresses and the unique string passed as input parameters. - * @param lb_server Loggin and Bookkeeping server address - * @param port Loggin and Bookkeeping port ( dafault value is 9000 ) - * @param unique A Unique identification ( automatically generatad by md5 protocol ) - * @throws WrongIdException When one parameter has been passed in a wrong format */ - void setJobId(const std::string& lb_server, int port = 0, const std::string& unique = ""); - //@} - /**@name Get Methods */ - //@{ - /** @return the LB address into its string format - * @throws EmptyIdException If the jobId has not been initialised yet */ - std::string getServer() const; - /** @return the Unique string into its string format - * @throws EmptyIdException If the jobId has not been initialised yet */ - std::string getUnique() const; - //@} - /** This method sets the JobId instance from the JobId in string format given - * as input. - * @param dg_JobId the string representing the job - * @throws WrongIdException When a string is passed in a wrong format */ - void fromString ( const std::string& dg_JobId ); - /** Converts the jobId into a string - @return the string representation of a JobId*/ - std::string toString() const; - /** casting operator */ - operator const edg_wlc_JobId() const { return m_JobId; } - /** Operator "=" create a deep copy of the JobId instance*/ - JobId & operator=(JobId const &); - /** Operator "=" create a deep copy of the JobId instance*/ - JobId & operator=(const edg_wlc_JobId &); - /** Retrieve the internal id reference - *@return the JobId internal reference used by some LB methods */ - edg_wlc_JobId getId() const ; -private: - // This Variable stores the Job unique identification String - edg_wlc_JobId m_JobId; - mutable char* m_pStr; - mutable char* m_pBkserver; - mutable char* m_pUnique; - /** Operator "<"*/ - friend bool operator<(JobId const& lhs, JobId const& rhs); - /** Operator "=="*/ - friend bool operator==(JobId const& lhs, JobId const& rhs); -}; - -inline bool operator<(JobId const& lhs, JobId const& rhs) -{ - return strcmp ( lhs.m_pStr , rhs.m_pStr ) <0 ; -} - -inline bool operator==(JobId const& lhs, JobId const& rhs) -{ -return strcmp ( lhs.m_pStr , rhs.m_pStr ) ==0 ; -} - -std::ostream& operator<<(std::ostream& os, JobId const& id); - -} // namespace jobid -} // namespace wmsutils -} // namespace glite - -#endif // GLITE_WMSUTILS_JOBID_JOBID_H diff --git a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobIdExceptions.h b/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobIdExceptions.h deleted file mode 100755 index 42cbdf4..0000000 --- a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/JobIdExceptions.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef GLITE_WMSUTILS_JOBID_EXCEPTIONS_H -#define GLITE_WMSUTILS_JOBID_EXCEPTIONS_H - -/* - * JobIdExceptions.h - * Copyright (c) 2001 The European Datagrid Project - IST programme, all rights reserved. - */ - -#include "glite/wmsutils/exception/Exception.h" - -namespace glite { -namespace wmsutils { -namespace jobid { - -/** - * JobIdException - Exception thrown by JobId Class - * @ingroup Common - * @version 0.1 - * @date 15 April 2002 - * @author Alessandro Maraschini -*/ - -class JobIdException : public glite::wmsutils::exception::Exception { -public: - /** - * Update all mandatory Exception Information - */ - JobIdException (const std::string& file, - int line, - const std::string& method, - int code, - const std::string& exception_name) ; -};//End CLass JobIdException - -/** -* WrongIdFieldException -* This Exception is thrown when a Job Id syntax error is found -* A valid Job Identification string should be made as follows: -* :/ */ -class WrongIdException : public JobIdException { -public: - /** - * Constructor - * @param file - The source file which has generated the Exception - * @param line - The line number in the source file where the Exception has been thrown - * @param method - The Name of the method which has thrown the Exception - * @param code - The Code of the Error raised - * @param field - The wrong expression catched */ - WrongIdException(const std::string& file, - int line, - const std::string& method, - int code ); -}; //End CLass WrongIdException -/** -* EmptyIdException -* This Exception is thrown when the user tries to get information from a JobId -* which has not been initialized yet, i.e tries to use the get Methods -*/ -class EmptyIdException : public JobIdException { -public: - /** - * Constructor - * @param file - The source file which has generated the Exception - * @param line - The line number in the source file where the Exception has been thrown - * @param method - The Name of the method which has thrown the Exception - * @param code - The Code of the Error raised - * @param field - The Empty filed requested for */ - EmptyIdException::EmptyIdException(const std::string& file, - int line, - const std::string& method, - int code , - const std::string& field ); -}; //End CLass EmptyIdException - -} // namespace jobid -} // namespace wmsutils -} // namespace glite - -#endif // GLITE_WMSUTILS_JOBID_EXCEPTIONS_H - diff --git a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/cjobid.h b/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/cjobid.h deleted file mode 100755 index e8f84f5..0000000 --- a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/cjobid.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef _GLITE_JOBID_H -#define _GLITE_JOBID_H - -/*! - * \file cjobid.h - * \brief L&B consumer API - */ - -#ident "$Header$" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _edg_wlc_JobId *edg_wlc_JobId; - -#define GLITE_WMSC_JOBID_DEFAULT_PORT 9000 /**< Default port where bookkeeping server listens */ -#define GLITE_WMSC_JOBID_PROTO_PREFIX "https://" /**< JobId protocol prefix */ - - -/* All the pointer functions return malloc'ed objects (or NULL on error) */ - -/** - * Create a Job ID. - * See the lb_draft document for details on its construction and components - * \param bkserver book keeping server hostname - * \param port port for the bk service - * \param jobid new created job id - * \ret al 0 success - * \retval EINVAL invalid bkserver - * \retval ENOMEM if memory allocation fails - */ -int edg_wlc_JobIdCreate(const char * bkserver, int port, edg_wlc_JobId * jobid); - -/** - * Recreate a Job ID - * \param bkserver bookkeeping server hostname - * \param port port for the bk service - * \param unique string which represent created jobid (if NULL then new - * one is created) - * \param jobid new created job id - * \retval 0 success - * \retval EINVAL invalid bkserver - * \retval ENOMEM if memory allocation fails - */ -int edg_wlc_JobIdRecreate(const char *bkserver, int port, const char * unique, edg_wlc_JobId * jobid); - -/** - * Create copy of Job ID - * \param in jobid for duplication - * \param jobid duplicated jobid - * \retval 0 for success - * \retval EINVAL invalid jobid - * \retval ENOMEM if memory allocation fails - */ -int edg_wlc_JobIdDup(const edg_wlc_JobId in, edg_wlc_JobId * jobid); - -/* - * Free jobid structure - * \param jobid for dealocation - */ -void edg_wlc_JobIdFree(edg_wlc_JobId jobid); - -/** - * Parse Job ID string and creates jobid structure - * \param jobidstr string representation of jobid - * \param jobid parsed job id - * \retval 0 for success - * \retval EINVAL jobidstr can't be parsed - * \retval ENOMEM if memory allocation fails - */ -int edg_wlc_JobIdParse(const char* jobidstr, edg_wlc_JobId * jobid); - -/** - * Unparse Job ID (produce the string form of JobId). - * \param jobid to be converted to string - * \return allocated string which represents jobid - */ -char* edg_wlc_JobIdUnparse(const edg_wlc_JobId jobid); - -/** - * Extract bookkeeping server address (address:port) - * \param jobid from which the bkserver address should be extracted - * \retval pointer to allocated string with bkserver address - * \retval NULL if jobid is 0 or memory allocation fails - */ -char* edg_wlc_JobIdGetServer(const edg_wlc_JobId jobid); - -/** - * Extract bookkeeping server address and port - * \param jobid from which the bkserver address should be extracted - * \param srvName pointer where to return server name - * \param srvPort pointer where to return server port - * */ -void edg_wlc_JobIdGetServerParts(const edg_wlc_JobId jobid, char **srvName, unsigned int *srvPort); - -/** - * Extract unique string - * \param jobid - * \retval pointer to allocated unique string representing jobid - * \retval NULL if jobid is 0 or memory allocation fails - */ -char* edg_wlc_JobIdGetUnique(const edg_wlc_JobId jobid); - -#ifdef __cplusplus -} -#endif - -#endif /* _GLITE_JOBID_H */ diff --git a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/manipulation.h b/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/manipulation.h deleted file mode 100755 index 9f862ae..0000000 --- a/org.glite.wms-utils.jobid/interface/glite/wmsutils/jobid/manipulation.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef GLITE_WMSUTILS_JOBID_MANIPULATION_H -#define GLITE_WMSUTILS_JOBID_MANIPULATION_H - -#include - -namespace glite { -namespace wmsutils { -namespace jobid { - -class JobId; - -std::string get_reduced_part( const JobId &id, int level = 0 ); -std::string to_filename( const JobId &id ); -JobId from_filename( const std::string &filename ); - -} // namespace jobid -} // namespace wmsutils -} // namespace glite - -#endif /* GLITE_WMSUTILS_JOBID_MANIPULATION_H */ - -// Local Variables: -// mode: c++ -// End: diff --git a/org.glite.wms-utils.jobid/project/build.number b/org.glite.wms-utils.jobid/project/build.number deleted file mode 100644 index 1acc27a..0000000 --- a/org.glite.wms-utils.jobid/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Sat Oct 15 02:12:40 CEST 2005 -module.build=152 diff --git a/org.glite.wms-utils.jobid/project/build.properties b/org.glite.wms-utils.jobid/project/build.properties deleted file mode 100755 index f5a9095..0000000 --- a/org.glite.wms-utils.jobid/project/build.properties +++ /dev/null @@ -1,2 +0,0 @@ -build.package.summary="files for gLite wms utils jobid" -build.package.description="jobid api" diff --git a/org.glite.wms-utils.jobid/project/configure.properties.xml b/org.glite.wms-utils.jobid/project/configure.properties.xml deleted file mode 100644 index 04d3b17..0000000 --- a/org.glite.wms-utils.jobid/project/configure.properties.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/org.glite.wms-utils.jobid/project/properties.xml b/org.glite.wms-utils.jobid/project/properties.xml deleted file mode 100755 index 9662658..0000000 --- a/org.glite.wms-utils.jobid/project/properties.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.wms-utils.jobid/project/version.properties b/org.glite.wms-utils.jobid/project/version.properties deleted file mode 100755 index 40c3916..0000000 --- a/org.glite.wms-utils.jobid/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version=3.1.1 -module.age=1 diff --git a/org.glite.wms-utils.jobid/src/Makefile.am b/org.glite.wms-utils.jobid/src/Makefile.am deleted file mode 100755 index 5225c64..0000000 --- a/org.glite.wms-utils.jobid/src/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -## Subdirectories list -SUBDIRS = jobid - -MAINTAINERCLEANFILES = Makefile.in diff --git a/org.glite.wms-utils.jobid/src/jobid/JobId.cpp b/org.glite.wms-utils.jobid/src/jobid/JobId.cpp deleted file mode 100755 index 273f9f9..0000000 --- a/org.glite.wms-utils.jobid/src/jobid/JobId.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* ************************************************************************** - * filename : JobId.cpp - * author : Alessandro Maraschini - * copyright : (C) 2002 by DATAMAT - ***************************************************************************/ - -#include "glite/wmsutils/jobid/JobId.h" - -#include - -#include "glite/wmsutils/jobid/JobIdExceptions.h" - -namespace glite { -namespace wmsutils { -namespace jobid { - -using namespace std ; - -/****************************************************************** - Constructor / Destructor - *******************************************************************/ -JobId::JobId() : m_JobId( 0 ), m_pStr( 0 ), m_pBkserver( 0 ), m_pUnique( 0 ) -{ -} - -JobId::JobId(const std::string& job_id_string ) - : m_JobId( 0 ), m_pStr( 0 ), m_pBkserver( 0 ), m_pUnique( 0 ) -{ - fromString( job_id_string ) ; -} - -JobId::JobId(const JobId &old) -{ - edg_wlc_JobIdDup(old.m_JobId,&m_JobId); - m_pStr = old.m_pStr ? strdup(old.m_pStr) : 0; - m_pBkserver = old.m_pBkserver ? strdup(old.m_pBkserver) : 0; - m_pUnique = old.m_pUnique ? strdup(old.m_pUnique) : 0; -} - -JobId & JobId::operator=(JobId const &old) -{ - clear(); - edg_wlc_JobIdDup(old.m_JobId,&m_JobId); - m_pStr = old.m_pStr ? strdup(old.m_pStr) : 0; - m_pBkserver = old.m_pBkserver ? strdup(old.m_pBkserver) : 0; - m_pUnique = old.m_pUnique ? strdup(old.m_pUnique) : 0; - - return *this; -} - - -JobId::JobId(const edg_wlc_JobId &old) - : m_pStr(0), m_pBkserver(0), m_pUnique(0) -{ - edg_wlc_JobIdDup(old,&m_JobId); -} - - -JobId & JobId::operator=(const edg_wlc_JobId &old) -{ - clear(); - edg_wlc_JobIdDup(old,&m_JobId); - m_pStr = 0; - m_pBkserver = 0; - m_pUnique = 0; - return(*this); -} - -JobId::~JobId() -{ - clear(); -} - -/****************************************************************** - method : clear - unsets the JobId instance. - *******************************************************************/ -void JobId::clear() -{ - if ( m_JobId ) - { - edg_wlc_JobIdFree( m_JobId ); - m_JobId = 0; - if (m_pStr) - free(m_pStr); - if (m_pBkserver) - free(m_pBkserver); - if (m_pUnique) - free(m_pUnique); - m_pStr = m_pBkserver = m_pUnique = NULL; - } -} - - -/****************************************************************** - method : setJobId - sets the JobId instance according to the LB and RB - server addresses and the unique string passed as input parameters. - *******************************************************************/ -void JobId::setJobId(const string& bkserver, int port, const string& unique) -{ - int code = edg_wlc_JobIdRecreate(bkserver.c_str(), port, unique.size() ? unique.c_str() : NULL, &m_JobId) ; - if ( code != 0 ) - throw WrongIdException(__FILE__ , __LINE__ , "setJobId(const string& bkserver, int port, const string& unique)" , code ) ; -} - - -/****************************************************************** - Protected method : fromString - sets the JobId instance from the dg_jobId in string format given as input. - *******************************************************************/ -void JobId::fromString (const string& dg_JobId) -{ - clear(); - int code = edg_wlc_JobIdParse(dg_JobId.c_str(), &m_JobId) ; - if ( code != 0 ) - throw WrongIdException(__FILE__ , __LINE__ , "fromString (const string& dg_JobId)" , code ) ; -} - -/****************************************************************** - method : ToString - converts the JobId instance into its string format. - and put it in the dg_jobId output variable - *******************************************************************/ -std::string JobId::toString() const -{ - if ( m_JobId && !m_pStr ) - m_pStr = edg_wlc_JobIdUnparse(m_JobId) ; - if ( !m_pStr ) - throw EmptyIdException (__FILE__ , __LINE__ ,"toString()" ,ENOENT , "JobId") ; - return m_pStr; -} - -/****************************************************************** - method : getServer - return a string containing the LB server address, - *******************************************************************/ -std::string JobId::getServer() const -{ - if ( m_JobId && !m_pBkserver ) - m_pBkserver = edg_wlc_JobIdGetServer( m_JobId ) ; - - if ( !m_pBkserver ) - throw EmptyIdException (__FILE__ , __LINE__ , "getServer()", ENOENT , "LB server Address") ; - - return m_pBkserver; -} - -/****************************************************************** - method : getUnique - return a string containing unique jobid string - *******************************************************************/ -std::string JobId::getUnique() const -{ - if ( m_JobId && !m_pUnique ) - m_pUnique = edg_wlc_JobIdGetUnique( m_JobId ) ; - - if ( !m_pUnique ) - throw EmptyIdException (__FILE__ , __LINE__ , "getUnique()" , ENOENT , "Unique") ; - - return m_pUnique; -} -/****************************************************************** - method : getId - return the c JobId struct representing this instance - *******************************************************************/ -edg_wlc_JobId JobId::getId() const -{ - edg_wlc_JobId out ; - if ( edg_wlc_JobIdDup(m_JobId, &out) ) - throw EmptyIdException (__FILE__ , __LINE__ , "getId()" , ENOENT , "JobId") ; - return out ; -} - -std::ostream& -operator<<(std::ostream& os, JobId const& id) -{ - return os << id.toString(); -} - -} // namespace jobid -} // namespace wmsutils -} // namespace glite diff --git a/org.glite.wms-utils.jobid/src/jobid/JobIdExceptions.cpp b/org.glite.wms-utils.jobid/src/jobid/JobIdExceptions.cpp deleted file mode 100755 index 6be40b7..0000000 --- a/org.glite.wms-utils.jobid/src/jobid/JobIdExceptions.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* ************************************************************************** -* filename : JobIdExecptions.cpp -* author : Alessandro Maraschini -* copyright : (C) 2002 by DATAMAT -***************************************************************************/ - -#include "glite/wmsutils/jobid/JobIdExceptions.h" - -namespace glite { -namespace wmsutils { -namespace jobid { - -using namespace std; -using namespace glite::wmsutils::exception; - -/***************************** -* JobIdException -*****************************/ -JobIdException::JobIdException (const string& file, - int line, - const string& method, - int code, - const string& exception_name) - : Exception(file, line, method, code, exception_name) -{ -} - -/***************************** -* WrongIdException -*****************************/ -WrongIdException::WrongIdException(const string& file, - int line, - const string& method, - int code ) - : JobIdException(file, line, method, code, - "WrongIdException") -{ - error_message = "Wrong Field caught while parsing Job Id" ; -} - -/***************************** -* EmptyIdException -*****************************/ -EmptyIdException::EmptyIdException(const string& file, - int line, - const string& method, - int code , - const string& field ) - : JobIdException(file, line, method, code, - "EmptyIdException") -{ - error_message = "Unable to retrieve " + field + ": the instance has not been initialized yet"; -} - -} // namespace jobid -} // namespace wmsutils -} // namespace glite - diff --git a/org.glite.wms-utils.jobid/src/jobid/Makefile.am b/org.glite.wms-utils.jobid/src/jobid/Makefile.am deleted file mode 100755 index 7a23118..0000000 --- a/org.glite.wms-utils.jobid/src/jobid/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -lib_LTLIBRARIES = libglite_wmsutils_jobid.la libglite_wmsutils_cjobid.la - -libglite_wmsutils_jobid_la_SOURCES = \ - JobId.cpp \ - JobIdExceptions.cpp \ - manipulation.cpp - -libglite_wmsutils_cjobid_la_SOURCES = \ - cjobid.c \ - strmd5.c - -jobidincludedir = $(includedir)/glite/wmsutils/jobid -jobidinclude_HEADERS = \ - strmd5.h - -AM_CPPFLAGS = -I$(top_srcdir)/src \ - -I$(top_srcdir)/interface \ - $(GLITE_CFLAGS) \ - $(GLOBUS_THR_CFLAGS) \ - -D_GNU_SOURCE - -MAINTAINERCLEANFILES = Makefile.in diff --git a/org.glite.wms-utils.jobid/src/jobid/cjobid.c b/org.glite.wms-utils.jobid/src/jobid/cjobid.c deleted file mode 100755 index 2fa0010..0000000 --- a/org.glite.wms-utils.jobid/src/jobid/cjobid.c +++ /dev/null @@ -1,258 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "glite/wmsutils/jobid/cjobid.h" -#include "strmd5.h" - -struct _edg_wlc_JobId { - char *id; /* unique job identification */ - /* additional information */ - char *BShost;/* bookkeeping server hostname */ - unsigned int BSport; /* bookkeeping server port */ - char *info; /* additional information (after ? in URI) */ -}; - -int edg_wlc_JobIdCreate(const char *bkserver, int port, edg_wlc_JobId *jobId) -{ - return edg_wlc_JobIdRecreate(bkserver, port, NULL, jobId); -} - - -int edg_wlc_JobIdRecreate(const char* bkserver, int port, const char *unique, edg_wlc_JobId *jobId) -{ - edg_wlc_JobId out; - char hostname[200]; /* used to hold string for encrypt */ - struct timeval tv; - int skip; - char* portbeg; - - struct hostent* he; - - if (!bkserver) - return EINVAL; - - if (unique == NULL) { - gethostname(hostname, 100); - he = gethostbyname(hostname); - assert(he->h_length > 0); - gettimeofday(&tv, NULL); - srandom(tv.tv_usec); - - skip = strlen(hostname); - skip += sprintf(hostname + skip, "-IP:0x%x-pid:%d-rnd:%d-time:%d:%d", - *((int*)he->h_addr_list[0]), getpid(), (int)random(), - (int)tv.tv_sec, (int)tv.tv_usec); - } - - *jobId = NULL; - out = (edg_wlc_JobId) malloc (sizeof(*out)); - if (!out) - return ENOMEM; - - memset(out, 0, sizeof(*out)); - - /* check if it begins with prefix */ - /* unsupported */ - if (strncmp(bkserver, GLITE_WMSC_JOBID_PROTO_PREFIX, sizeof(GLITE_WMSC_JOBID_PROTO_PREFIX)-1) == 0) - return EINVAL; - - out->BShost = strdup(bkserver); - portbeg = strchr(out->BShost, ':'); - if (portbeg) { - *portbeg = 0; - /* try to get port number */ - if (port == 0) - port = atoi(portbeg + 1); - } - - if (port == 0) - port = GLITE_WMSC_JOBID_DEFAULT_PORT; - - out->BSport = port; - - out->id = (unique) ? strdup(unique) : str2md5base64(hostname); - //printf("Encrypt: %s\nBASE64 %s\n", hostname, out->id); - - if (!out->id || !out->BShost) { - edg_wlc_JobIdFree(out); - return ENOMEM; - } - - *jobId = out; - return 0; -} - - -int edg_wlc_JobIdDup(const edg_wlc_JobId in, edg_wlc_JobId *out) -{ - edg_wlc_JobId jid; - *out = NULL; - if (in == NULL) - return 0; - - jid = malloc(sizeof(*jid)); - if (!jid) - return ENOMEM; - - memset(jid, 0,sizeof(*jid)); - jid->BShost = strdup(in->BShost); - jid->id = strdup(in->id); - if (in->info) - jid->info = strdup(in->info); - - if (jid->BShost == NULL || jid->id == NULL) { - edg_wlc_JobIdFree(jid); - return ENOMEM; - } - - jid->BSport = in->BSport; - *out = jid; - return 0; -} - - -// XXX -// use recreate -// parse name, port, unique -int edg_wlc_JobIdParse(const char *idString, edg_wlc_JobId *jobId) -{ - char *pom, *pom1, *pom2; - edg_wlc_JobId out; - - *jobId = NULL; - - out = (edg_wlc_JobId) malloc (sizeof(*out)); - if (out == NULL ) - return ENOMEM; - - memset(out,0,sizeof(*out)); - - if (strncmp(idString, GLITE_WMSC_JOBID_PROTO_PREFIX, sizeof(GLITE_WMSC_JOBID_PROTO_PREFIX) - 1)) { - out->BShost = (char *) NULL; - out->BSport = 0; - - free(out); - return EINVAL; - } - - pom = strdup(idString + sizeof(GLITE_WMSC_JOBID_PROTO_PREFIX) - 1); - pom1 = strchr(pom, '/'); - pom2 = strchr(pom, ':'); - - if (!pom1) { free(pom); free(out); return EINVAL; } - - if ( pom2 && (pom1 > pom2)) { - pom[pom2-pom] = '\0'; - out->BShost = strdup(pom); - pom[pom1-pom] = '\0'; - out->BSport = (unsigned int) strtoul(pom2 + 1,NULL,10); - } else { - pom[pom1-pom] = '\0'; - out->BShost = strdup(pom); - out->BSport = GLITE_WMSC_JOBID_DEFAULT_PORT; - } - - /* XXX: localhost not supported in jobid - if (!strncmp(out->BShost,"localhost",9) { - free(pom); - free(out->BShost); - free(out); - return EINVAL; - } - */ - - /* additional info from URI */ - pom2 = strchr(pom1+1,'?'); - if (pom2) { - *pom2 = 0; - out->info = strdup(pom2+1); - } - - /* extract the unique part */ - out->id = strdup(pom1+1); - - for (pom1 = out->BShost; *pom1; pom1++) - if (isspace(*pom1)) break; - - for (pom2 = out->id; *pom2; pom2++) - if (isspace(*pom2)) break; - - if (*pom1 || *pom2) { - free(pom); - edg_wlc_JobIdFree(out); - return EINVAL; - } - - free(pom); - *jobId = out; - return 0; -} - - -void edg_wlc_JobIdFree(edg_wlc_JobId job) -{ - if (job) { - free(job->id); - free(job->BShost); - free(job->info); - free(job); - } -} - - -char* edg_wlc_JobIdUnparse(const edg_wlc_JobId jobid) -{ - char *out, port[40]; - - if (!jobid) - return NULL; - - if (jobid->BSport) - sprintf(port,":%d",jobid->BSport); - else - *port = 0; - - asprintf(&out, GLITE_WMSC_JOBID_PROTO_PREFIX"%s%s/%s%s%s", - jobid->BShost,port, - jobid->id, - (jobid->info ? "?" : ""), - (jobid->info ? jobid->info : "")); - - return out; -} - - -char* edg_wlc_JobIdGetServer(const edg_wlc_JobId jobid) -{ - char *bs = NULL; - - if (jobid) - asprintf(&bs, "%s:%u", jobid->BShost, - jobid->BSport ? jobid->BSport : GLITE_WMSC_JOBID_DEFAULT_PORT); - - return bs; -} - - -void edg_wlc_JobIdGetServerParts(const edg_wlc_JobId jobid, char **srvName, unsigned int *srvPort) -{ - if (jobid) { - *srvName = strdup(jobid->BShost); - *srvPort = jobid->BSport ? jobid->BSport : GLITE_WMSC_JOBID_DEFAULT_PORT; - } -} - - -char* edg_wlc_JobIdGetUnique(const edg_wlc_JobId jobid) -{ - return jobid ? strdup(jobid->id) : NULL; -} diff --git a/org.glite.wms-utils.jobid/src/jobid/manipulation.cpp b/org.glite.wms-utils.jobid/src/jobid/manipulation.cpp deleted file mode 100755 index cf3a710..0000000 --- a/org.glite.wms-utils.jobid/src/jobid/manipulation.cpp +++ /dev/null @@ -1,180 +0,0 @@ -#include - -#include -#include - -#include "glite/wmsutils/jobid/JobId.h" - -using namespace std; - -namespace glite { -namespace wmsutils { -namespace jobid { - -namespace { - -class HexInt { -public: - HexInt( unsigned int i = 0 ); - HexInt( const string &str ); - HexInt( string::const_iterator begin, string::const_iterator end ); - ~HexInt( void ); - - inline operator unsigned int( void ) const { return this->hi_int; } - inline operator const string &( void ) const { return this->hi_str; } - - static unsigned int least( void ) { return hi_s_least; } - static void least( unsigned int least ) { hi_s_least = least; } - -private: - void parseString( void ); - - unsigned int hi_int; - string hi_str; - - static unsigned int hi_s_least; - static const char *hi_s_map; -}; - -class BadChar { -public: - BadChar( void ); - ~BadChar( void ); - - inline bool operator()( char c ) - { return( !(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')) || - (c == '.') || (c == '-') || (c == ' ')) ); } -}; - -unsigned int HexInt::hi_s_least = 2; -const char *HexInt::hi_s_map = "0123456789abcdef"; - -HexInt::HexInt( unsigned int ui ) : hi_int( ui ), hi_str( hi_s_least, '0' ) -{ - int n; - string::reverse_iterator pos = this->hi_str.rbegin(); - - while( ui != 0 ) { - n = ui % 16; - if( pos != this->hi_str.rend() ) { - *pos = hi_s_map[n]; - pos += 1; - } - else this->hi_str.insert( this->hi_str.begin(), hi_s_map[n] ); - - ui /= 16; - } - - if( this->hi_str.length() < hi_s_least ) - this->hi_str.insert( this->hi_str.begin(), (hi_s_least - this->hi_str.length()), '0' ); -} - -HexInt::HexInt( const string &str ) : hi_int( 0 ), hi_str( str ) -{ - this->parseString(); -} - -HexInt::HexInt( string::const_iterator begin, string::const_iterator end ) : hi_int( 0 ), hi_str( begin, end ) -{ - this->parseString(); -} - -void HexInt::parseString( void ) -{ - int hexbase; - char *pos, *end = (char *) hi_s_map + 16; - string::reverse_iterator it; - - for( it = this->hi_str.rbegin(), hexbase = 1; it != this->hi_str.rend(); ++it, hexbase *= 16 ) { - pos = find( (char *) hi_s_map, end, (char) tolower(*it) ); - - if( pos != end ) this->hi_int += hexbase * (pos - hi_s_map); - else { - this->hi_int = 0; - break; - } - } - - return; -} - -HexInt::~HexInt( void ) {} - -BadChar::BadChar( void ) {} - -BadChar::~BadChar( void ) {} - -/* - Helper function for the get_reduced_part(...) -*/ -string get_reduced_part_internal( const string &unique, int level ) -{ - string::size_type length = unique.length(); - string piece( unique.substr(0, 2) ), answer; - - if( (level == 0) || (length <= 2) ) answer.assign( piece ); - else if( length != 0 ) { - answer.assign( piece ); - answer.append( 1, '/' ); - answer.append( get_reduced_part_internal(unique.substr(2, length - 2), level - 1) ); - } - - return answer; -} - -}; // Unnamed namespace - -string get_reduced_part( const JobId &id, int level ) -{ - return get_reduced_part_internal( id.getUnique(), level ); -} - -string to_filename( const JobId &id ) -{ - string sid( id.toString() ), coded; - string::iterator last, next; - - last = sid.begin(); - do { - next = find_if( last, sid.end(), BadChar() ); - - if( next != sid.end() ) { - if( last != next ) coded.append( last, next ); - coded.append( 1, '_' ); - coded.append( HexInt(*next) ); - - last = next + 1; - } - else coded.append( last, sid.end() ); - } while( next != sid.end() ); - - return coded; -} - -JobId from_filename( const string &filename ) -{ - char c; - string decoded; - string::const_iterator last, next; - - last = filename.begin(); - do { - next = find( last, filename.end(), '_' ); - - if( next != filename.end() ) { - c = HexInt( next + 1, next + 3 ); - - if( last != next ) decoded.append( last, next ); - decoded.append( 1, c ); - - last = next + 3; - } - else decoded.append( last, filename.end() ); - } while( next != filename.end() ); - - return JobId( decoded ); -} - -} // namespace jobid -} // namespace wmsutils -} // namespace glite diff --git a/org.glite.wms-utils.jobid/src/jobid/strmd5.c b/org.glite.wms-utils.jobid/src/jobid/strmd5.c deleted file mode 100755 index 0433f55..0000000 --- a/org.glite.wms-utils.jobid/src/jobid/strmd5.c +++ /dev/null @@ -1,118 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include - -#include "jobid/strmd5.h" - -#warning Thread unsafe! -static char mbuf[33]; - -static int base64_encode(const void *enc, int enc_size, char *out, int out_max_size) -{ - static const char* b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - - unsigned char* enc_buf = (unsigned char*)enc; - int out_size = 0; - unsigned int bits = 0; - unsigned int shift = 0; - - while ( out_size < out_max_size ) { - if ( enc_size>0 ) { - // Shift in byte - bits <<= 8; - bits |= *enc_buf; - shift += 8; - // Next byte - enc_buf++; - enc_size--; - } else if ( shift>0 ) { - // Pad last bits to 6 bits - will end next loop - bits <<= 6 - shift; - shift = 6; - } else { - // Terminate with Mime style '=' - *out = '='; - out_size++; - - return out_size; - } - - // Encode 6 bit segments - while ( shift>=6 ) { - shift -= 6; - *out = b64[ (bits >> shift) & 0x3F ]; - out++; - out_size++; - } - } - - // Output overflow - return -1; -} - -char *strmd5(const char *s, unsigned char *digest) -{ - MD5_CTX md5; - unsigned char d[16]; - int i; - - MD5_Init(&md5); - MD5_Update(&md5,s,strlen(s)); - MD5_Final(d,&md5); - - if (digest) memcpy(digest,d,sizeof(d)); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - mbuf[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - mbuf[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - mbuf[32] = 0; - return (char *) mbuf; -} - -char *str2md5(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char* ret = malloc(33); - int i; - - if (!ret) - return NULL; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - ret[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - ret[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - ret[32] = 0; - return ret; -} - -char *str2md5base64(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char buf[50]; - int l; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - l = base64_encode(d, 16, buf, sizeof(buf) - 1); - if (l < 1) - return NULL; - buf[l - 1] = 0; - return strdup(buf); -} diff --git a/org.glite.wms-utils.jobid/src/jobid/strmd5.h b/org.glite.wms-utils.jobid/src/jobid/strmd5.h deleted file mode 100755 index c5d76b6..0000000 --- a/org.glite.wms-utils.jobid/src/jobid/strmd5.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _GLITE_STRMD5_H -#define _GLITE_STRMD5_H - -#ident "$Header$" - -/* Compute MD5 sum of the first argument. - * The sum is returned in the 16-byte array pointed to by 2nd argument - * (if not NULL) - * - * Return value: ASCII string of the sum, i.e. 32 characters [0-9a-f] - * (pointer to static area, changed by subsequent calls) - */ - -char *strmd5(const char *src, unsigned char *dst); - -/** - * Returns: allocated 32bytes long ASCII string with md5 sum - * of the first argument - */ -char *str2md5(const char *src); - -/** - * Returns: allocated 22bytes long ASCII string with md5 sum in base64 - * format of the source argument - */ -char *str2md5base64(const char *src); - -#endif /* _GLITE_STRMD5_H */ diff --git a/org.glite.wms-utils.jobid/test/Makefile.am b/org.glite.wms-utils.jobid/test/Makefile.am deleted file mode 100755 index 5111c30..0000000 --- a/org.glite.wms-utils.jobid/test/Makefile.am +++ /dev/null @@ -1,48 +0,0 @@ -## ********************************************************************* -## * -## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid. -## * For license conditions see LICENSE file or -## * http://www.edg.org/license.html -## * -## ********************************************************************* - -JOBID_LIBS = $(top_builddir)/src/jobid/libglite_wmsutils_jobid.la -CJOBID_LIBS = $(top_builddir)/src/jobid/libglite_wmsutils_cjobid.la - -TESTS = glite-wmsutils-jobid \ - glite-wmsutils-manipulation - -check_PROGRAMS = $(TESTS) - -glite_wmsutils_jobid_SOURCES = jobid_cu_suite.cpp \ - jobid_cu_suite.h \ - jobid_cu_main.cpp - -glite_wmsutils_jobid_LDADD = \ - $(GLITE_WMSUTILS_EXCEPTION_LIBS) \ - $(GLOBUS_GSS_THR_LIBS) \ - $(CPPUNIT_LIBS) \ - $(JOBID_LIBS) \ - $(CJOBID_LIBS) - -glite_wmsutils_manipulation_SOURCES = manipulation_cu_suite.cpp \ - manipulation_cu_suite.h \ - manipulation_cu_main.cpp - -glite_wmsutils_manipulation_LDADD = \ - $(GLITE_WMSUTILS_EXCEPTION_LIBS) \ - $(GLOBUS_GSS_THR_LIBS) \ - $(CPPUNIT_LIBS) \ - $(JOBID_LIBS) \ - $(CJOBID_LIBS) - - -AM_CPPFLAGS = -I$(top_srcdir)/interface \ - -I$(top_srcdir)/src \ - -I$(top_srcdir)/test \ - $(GLITE_CFLAGS) \ - $(GLOBUS_THR_CFLAGS) \ - $(CPPUNIT_CFLAGS) - -MAINTAINERCLEANFILES = Makefile.in *~ - diff --git a/org.glite.wms-utils.jobid/test/jobid_cu_main.cpp b/org.glite.wms-utils.jobid/test/jobid_cu_main.cpp deleted file mode 100644 index 770e306..0000000 --- a/org.glite.wms-utils.jobid/test/jobid_cu_main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -#include "jobid_cu_suite.h" - -#include -#include -#include -#include -#include - -using namespace CppUnit; -using namespace std; - -int main (int argc , char** argv) -{ - std::ofstream xml("./cppUnit_output.xml",ios::app); - - CppUnit::TestResult controller; - CppUnit::TestResultCollector result; - controller.addListener( &result ); - - TestRunner runner; - runner.addTest(Jobid_test::suite()); - runner.run(controller); - - CppUnit::XmlOutputter outputter( &result, xml ); - CppUnit::TextOutputter outputter2( &result, std::cerr ); - outputter.write(); - outputter2.write(); - - return result.wasSuccessful() ? 0 : 1 ; -} diff --git a/org.glite.wms-utils.jobid/test/jobid_cu_suite.cpp b/org.glite.wms-utils.jobid/test/jobid_cu_suite.cpp deleted file mode 100644 index ebe04da..0000000 --- a/org.glite.wms-utils.jobid/test/jobid_cu_suite.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "jobid_cu_suite.h" - - -using namespace CppUnit; -using namespace std; -using namespace glite::wmsutils::jobid; - - -void Jobid_test::setUp() -{} - -void Jobid_test::tearDown() -{} - -void Jobid_test::Constructor_case() -{ - //EMPTY CONSTRUCTOR - JobId empty; - - CPPUNIT_ASSERT(empty.isSet()==false); - - //create a string with cjobid - string bkserver="grid012g.cnaf.infn.it"; - edg_wlc_JobId jobid; - int bkport=6000; - int ok=edg_wlc_JobIdCreate(bkserver.c_str(), bkport, &jobid); - CPPUNIT_ASSERT(ok == 0); - if (ok==0) - { - string jobstring=edg_wlc_JobIdUnparse(jobid); - - //STRING CONSTRUCTOR - JobId stringCons(jobstring); - - //EDG_WLC CONSTRUCTOR - JobId edg_wlc_Cons(jobid); - - //test copy constructor - JobId copycon(stringCons); - - CPPUNIT_ASSERT(stringCons.isSet()); - CPPUNIT_ASSERT(edg_wlc_Cons.isSet()); - CPPUNIT_ASSERT(copycon.isSet()); - - //test = - JobId testequal; - testequal=stringCons; - CPPUNIT_ASSERT(testequal.isSet()); - - JobId testoperator; - testoperator=jobid; - CPPUNIT_ASSERT(testoperator.isSet()); - - edg_wlc_JobId testget = edg_wlc_Cons.getId(); - char *server; - unsigned int port; - edg_wlc_JobIdGetServerParts(testget, &server, &port); - string serverstring = server; - CPPUNIT_ASSERT(port==bkport); - CPPUNIT_ASSERT(serverstring==bkserver); - } - - CPPUNIT_ASSERT_THROW( JobId stringwrong("grid012"), WrongIdException); -} - -void Jobid_test::Clear_case() -{ - JobId *element; - string jobstring="https://grid012g.cnaf.infn.it:6000/qaKyEoV3G144rmoyXeW6QA"; - CPPUNIT_ASSERT_NO_THROW(element= new JobId(jobstring)); - - CPPUNIT_ASSERT(element->isSet()); - element->clear(); - CPPUNIT_ASSERT(element->isSet()==false); - delete element; -} - -void Jobid_test::SetandGet_case() -{ - JobId element; - string lbserver="grid012g.cnaf.infn.it"; - int port=6000; - string unique ="qaKyEoV3G144rmoyXeW6QA"; - element.setJobId(lbserver, port, unique); - - string server=element.getServer(); - lbserver=lbserver+":6000"; - - CPPUNIT_ASSERT(server==lbserver); - string lonely=element.getUnique(); - CPPUNIT_ASSERT(lonely==unique); - - string descr=element.toString(); - cout << "!!! BEGIN TEST toString() METHOD!!!"<< endl; - cout << descr < -#include -#include - -#include - -#include "glite/wmsutils/jobid/JobId.h" -#include "glite/wmsutils/jobid/cjobid.h" -#include "glite/wmsutils/jobid/JobIdExceptions.h" - -class Jobid_test : public CppUnit::TestFixture { - - CPPUNIT_TEST_SUITE(Jobid_test); - - CPPUNIT_TEST(Constructor_case); - CPPUNIT_TEST(Clear_case); - CPPUNIT_TEST(SetandGet_case); - - CPPUNIT_TEST_SUITE_END(); - - -public: - - void setUp(); - void tearDown(); - - void Constructor_case(); - void Clear_case(); - void SetandGet_case(); - -}; - - - diff --git a/org.glite.wms-utils.jobid/test/manipulation_cu_main.cpp b/org.glite.wms-utils.jobid/test/manipulation_cu_main.cpp deleted file mode 100644 index 07d2914..0000000 --- a/org.glite.wms-utils.jobid/test/manipulation_cu_main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -#include "manipulation_cu_suite.h" - -#include -#include -#include -#include -#include - -using namespace CppUnit; -using namespace std; - -int main (int argc , char** argv) -{ - std::ofstream xml("./cppUnit_output.xml",ios::app); - - CppUnit::TestResult controller; - CppUnit::TestResultCollector result; - controller.addListener( &result ); - - TestRunner runner; - runner.addTest(Manipulation_test::suite()); - runner.run(controller); - - CppUnit::XmlOutputter outputter( &result, xml ); - CppUnit::TextOutputter outputter2( &result, std::cerr ); - outputter.write(); - outputter2.write(); - - return result.wasSuccessful() ? 0 : 1 ; -} diff --git a/org.glite.wms-utils.jobid/test/manipulation_cu_suite.cpp b/org.glite.wms-utils.jobid/test/manipulation_cu_suite.cpp deleted file mode 100644 index a6a69d8..0000000 --- a/org.glite.wms-utils.jobid/test/manipulation_cu_suite.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "manipulation_cu_suite.h" - - -using namespace CppUnit; -using namespace std; -using namespace glite::wmsutils::jobid; - - -void Manipulation_test::setUp() -{} - -void Manipulation_test::tearDown() -{} - -void Manipulation_test::to_fromfile_case() -{ - JobId element; - - string lbserver="grid012g.cnaf.infn.it"; - int port=6000; - string unique ="qaKyEoV3G144rmoyXeW6QA"; - element.setJobId(lbserver, port, unique); - - string filename=to_filename(element); - - JobId newelement = from_filename(filename); - - string reduced = get_reduced_part(element, 7); - - string newreduced = get_reduced_part(newelement, 7); - - CPPUNIT_ASSERT(reduced==newreduced); -} - diff --git a/org.glite.wms-utils.jobid/test/manipulation_cu_suite.h b/org.glite.wms-utils.jobid/test/manipulation_cu_suite.h deleted file mode 100644 index 287b902..0000000 --- a/org.glite.wms-utils.jobid/test/manipulation_cu_suite.h +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include - -#include - -#include "glite/wmsutils/jobid/JobId.h" -#include "glite/wmsutils/jobid/manipulation.h" - -class Manipulation_test : public CppUnit::TestFixture { - - CPPUNIT_TEST_SUITE(Manipulation_test); - - CPPUNIT_TEST(to_fromfile_case); - - CPPUNIT_TEST_SUITE_END(); - - -public: - - void setUp(); - void tearDown(); - - void to_fromfile_case(); - -}; - - - diff --git a/org.gridsite.core/.cvsignore b/org.gridsite.core/.cvsignore deleted file mode 100644 index e970233..0000000 --- a/org.gridsite.core/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project \ No newline at end of file diff --git a/org.gridsite.core/CHANGES b/org.gridsite.core/CHANGES deleted file mode 100644 index 28c8d2c..0000000 --- a/org.gridsite.core/CHANGES +++ /dev/null @@ -1,355 +0,0 @@ -* Wed Aug 6 2006 Andrew McNab -- ==== GridSite version 1.3.4 ==== -* Mon Jul 17 2006 Andrew McNab -- Add Shibboleth handling from Joseph Dada's branch to - mod_gridsite in main GridSite tree. -* Tue Jun 27 2006 Andrew McNab -- Merge delegation services back into core. -- Add OCSP options -* Thu Jun 22 2006 Andrew McNab -- Lots of additions to SiteCast/SlashGrid, including - /grid/local/ filesystem with DNs from gridmapdir -- GridSiteCastAlias now allows any URL scheme (gsiftp, - xrootd, ...) not just HTTP(S). -- Replace static gridsite.spec with make-gridsite-spec -* Fri Jun 9 2006 Andrew McNab -- Add patch from Jan Pospisil to - Makefile, to allow standalone building of libraries. -- Include code for June 2006 version of delegation - protocol (ie userproxy.pem rather than usercert.pem - and userkey.pem) -* Thu Jun 8 2006 Andrew McNab -- SiteCast support in SlashGrid -* Mon Jun 5 2006 Andrew McNab -- ==== GridSite version 1.3.1 ==== -* Sun May 26 2006 Andrew McNab -- Include SlashGrid code, and in gridsite.spec etc -- Add sample fuse.spec to docs for use with SlashGrid -* Fri May 26 2006 Andrew McNab -- ==== GridSite version 1.3.0 ==== -* Mon Apr 24 2006 Andrew McNab -- Reworked SSL session caching: passcodes directory now - because /var/www/sessions by default, and also used - to cache credentials according to SSL Session ID. -* Mon Apr 10 2006 Andrew McNab -- Patch from Alberto di Meglio - to allow use of relocated httpd include files. -* Mon Apr 3 2006 Andrew McNab -- Use dist for building tar balls -* Mon Apr 3 2006 Andrew McNab -- ==== GridSite version 1.1.19 ==== -* Fri Mar 31 2006 Andrew McNab -- Final tidy up for gLite 3.1 -* Fri Mar 31 2006 Andrew McNab -- ==== GridSite version 1.1.18 ==== -* Wed Mar 29 2006 Andrew McNab -- New proxy destroy and time functions. -* Tue Mar 28 2006 Shiv Kaushal -- Fixed bug in GACL admin interface that would cause - internal server erorr sometimes when adding new - entries to and ACL. -* Sat Mar 25 2006 Shiv Kaushal -- Change delegation header to Proxy-Delegation-Service - instead of Grst- -* Wed Mar 22 2006 Andrew McNab -- Add GRSTx509MakeDelegationID() to grst_x509.c -- Include code for new style delegation proxy storage -* Fri Mar 17 2006 Andrew McNab -- Associate ldconfig %post in spec with -shared RPM -* Thu Mar 16 2006 Andrew McNab -- Fixes for 200/201 error pages produced by Apache -- Fixes for onetime passcode non-removal if HTTPS -- Include new multi-RPM spec file: gridsite-shared, - gridsite-devel, gridsite-apache, gridsite-commands - (replacing htcp) and gridsite-gsexec -* Fri Mar 03 2006 Shiv Kaushal -- Modify GridSiteDelegationURI directive to insert HTTP - headers instead of modifying HTML -* Mon Feb 6 2006 Shiv Kaushal -- Add GridSiteDelegationURI directive to mod_gridsite - to allow Firefox extension to locate delegation service -* ==== GridSite version 1.1.17 ==== -* Thu Jan 12 2005 Andrew McNab -- Add 5 minute window for VOMS attributes valid slightly - in the future. -- Include Content-Range PUT support in mod_gridsite, - adapted from mod_dav by David O Callaghan -- Return 201 Created when PUT creates a file -* Mon Dec 5 2005 Andrew McNab -- Change GRIDHTTP_ONETIME to GRIDHTTP_PASSCODE -- Remove onetime=yes default from mod_gridsite -- Update gridsite.spec and Makefile for gridsite-copy.cgi -* Wed Nov 16 2005 Andrew McNab -- ==== GridSite version 1.1.16 ==== -* Wed Nov 16 2005 Andrew McNab -- Add -fPIC option to Makefile for IA64, as suggested - by Andreas Unterkircher. -* Wed Oct 12 2005 Andrew McNab -- ==== GridSite version 1.1.15 ==== -* Wed Oct 12 2005 Andrew McNab -- Fix for older OpenSSL to grst_x509.c from - Zoltan.Farkas -* Wed Oct 12 2005 Andrew McNab -- ==== GridSite version 1.1.14 ==== -* Tue Oct 11 2005 Andrew McNab -- Modify VOMS AC parsing to handle multiple ACs inside - the same X.509 AC extension. -* Mon Oct 10 2005 Andrew McNab -- ==== GridSite version 1.1.13 ==== -* Mon Oct 10 2005 Andrew McNab -- Add target_gname patch to gsexec from - Gerben Venekamp -* Thu Oct 6 2005 Andrew McNab -- Fix session reuse with Shared-Memory SSL Session - Cache bug #8856 in mod_gridsite. -- Add SiteCast support to file copying in htcp. -* Tue Oct 4 2005 Andrew McNab -- Move User, Config, Admin and Install guides from - doc directory into GridSite Wiki. -- Create/update man pages for htcp, mod_gridsite and - gsexec to be distributed with source/binaries. -* Mon Oct 3 2005 Andrew McNab -- Fix to gsexec GRST_CRED_0/SSL_CLIENT_S_DN bug found - by Ian Stokes-Rees -* Fri Sep 30 2005 Andrew McNab -- Add SiteCast ping (NOP) support to htcp -* Thu Sep 29 2005 Andrew McNab -- Add SiteCast support to mod_gridsite (file location - discovery via UDP multicast of HTCP messages.) -* Wed Sep 21 2005 Andrew McNab -- Add ports 777 and 488 to example httpd.conf files in - docs. See http://www.gridsite.org/wiki/IP_Ports -* Tue Sep 13 2005 Andrew McNab -- ==== GridSite version 1.1.12 ==== -* Tue Sep 13 2005 Andrew McNab -- Fix bug #10031 submitted by Fabrizio Pacini - (invalid free in - GRSTgaclAclLoadFile if ACL format not valid.) -* Mon Sep 12 2005 Andrew McNab -- Accept GRIDHTTP_ONETIME when passed in HTTP query - (still overridden by a GRIDHTTP_ONETIME in a cookie.) -* Sat Sep 10 2005 Andrew McNab -- Fix problem with attempted upgrades to GridHTTP when - already on the HTTP virtual server. -* Fri Sep 9 2005 Andrew McNab -- GRST_DESTINATION_TRANSLATED and GRST_DESTINATION_PERM - environment variables, for use with CGI-based COPY. -- Rework GridHTTP (ex-Downgrade) code to store method - and URI with permission, rather than credentials. -- Restrict use of GridSiteOnetimesDir to main server. -* Fri Aug 26 2005 Andrew McNab -- Fix for HTTP PUT lack-of-truncation bug found by - Mike Jones, and support for HTTP/WebDAV MOVE. -- Add MOVE support to htcp and update htcp manpage. -- Unset CURLOPT_SSL_VERIFYPEER in htcp etc when using - --noverify option. -* Fri Jun 10 2005 Andrew McNab -- ==== GridSite version 1.1.11 ==== -* Fri Jun 10 2005 Andrew McNab -- Tidy up gsexec vs GridSiteDiskMode -* Fri Jun 10 2005 Andrew McNab -- ==== GridSite version 1.1.10 ==== -* Wed Jun 8 2005 Andrew McNab -- Add GridSiteDiskMode Apache directive to set file - permissions. -- Add GridSiteExecMethod and GridSiteUserGroup to - configure suexec or extended gsexec functionality. -* Thu Jun 2 2005 Andrew McNab -- HTML improvements for Bug #4083 -- Note that GridSite currently doesn't work with SHM - SSL session cache, in httpd-*.conf and config guide. -- Add GridSiteExecMethod for use with gsexec -* Thu May 26 2005 Andrew McNab -- Include gsexec, a drop-in replacement for suexec, - which can do suexec execution of CGI programs or - pool-account mapping based on client DN. -* Tue May 24 2005 Shiv Kaushal -- Add XACML support to GACL code in libgridsite. -* Tue May 24 2005 Andrew McNab -- ==== GridSite version 1.1.9 ==== -* Mon Apr 25 2005 Andrew McNab -- Avoid build problems when using pre-0.9.7 OpenSSL - (ie with Globus compatibility.) -* Mon Apr 25 2005 Andrew McNab -- ==== GridSite version 1.1.8 ==== -* Mon Feb 28 2005 Andrew McNab -- Fix to GRSTgaclUndenyPerm in gridsite.h (bug #7135) - from Marco Sottilaro -* Mon Feb 28 2005 Andrew McNab -- ==== GridSite version 1.1.7 ==== -* Thu Feb 24 2005 Andrew McNab -- Add more sanity checking (signatures, dates, issuer,) - holder) to VOMS attribute parser. -* Mon Feb 21 2005 Andrew McNab -- Add bugfix for Bug #6357 from Fabrizio Pacini - to fix delegation proxy - cache names in OpenSSL 0.9.7. -* Sun Feb 20 2005 Andrew McNab -- Add basic VOMS support (signature checking not yet - in) for X.509 Attribute Certificates. -* Tue Feb 8 2005 Andrew McNab -- ==== GridSite version 1.1.6 ==== -* Tue Feb 8 2005 Andrew McNab -- Include GRSTx509MakeProxyFileName() and - GRSTx509StringToChain() (code to used hashes in cached - proxy file names.) Bug #6357 -- Change ordering of output proxy file produced by - GRSTx509CacheProxy so proxy private key is the 2nd PEM - encoded block (rather than at the end.) Bug #6365 -- Add libgridsite_globus[.so|.a] in preparation for - separate Globus OpenSSL and system OpenSSL versions -* Tue Feb 8 2005 Andrew McNab -- ==== GridSite version 1.1.5 ==== -* Tue Dec 14 2004 Andrew McNab -- Patch from Daniel Kouril to allow - switching Globus vs system OpenSSL libraries/headers. -* Tue Dec 14 2004 Andrew McNab -- ==== GridSite version 1.1.4 ==== -* Mon Nov 15 2004 Andrew McNab -- Back out of (most of) redone VOMS support for committing - to JRA1 CVS. -* Thu Oct 19 2004 Andrew McNab -- ==== GridSite version 1.1.3 ==== -* Thu Oct 19 2004 Andrew McNab -- Fix Bug #5203 from Martijn Steenbakkers - by fixing GACLparseEntry in gridsite-gacl.h -- Change to C style comments (mostly) in gridsite.h and - gridsite-gacl.h (fixes part of Bug #4222 from - ) -- Fix Bug #4225 from in - GRSTgaclCredsFree() -- Add GRSTx509CachedProxyFind() and findproxyfile - command to allow proxies to be found in proxy cache -- Change GRSTx509StoreProxy() to GRSTx509CacheProxy() for - consistency with this and GRSTx509CachedProxyKeyFind() -* Wed Oct 18 2004 Andrew McNab -- ==== GridSite version 1.1.2 ==== -* Tue Oct 19 2004 Andrew McNab -- Copy code from delegation prototype into grst_x509.c - and include htproxyput.c and grst-delegation.c - optional targets (which depend on gSOAP.) -* Wed Oct 13 2004 Andrew McNab -- Include per-file patch to GRSTgaclFileFindAclname: - .gacl:FILENAME controls FILENAME if it exists. -* Tue Jul 27 2004 Andrew McNab -- ==== GridSite version 1.1.1 ==== -* Tue Jul 27 2004 Andrew McNab -- Include HTTP Downgrade support in htcp -* Sat Jul 24 2004 Andrew McNab -- Include HTTP Downgrade support in mod_gridsite. -* Thu Jul 22 2004 Andrew McNab -- Begin development version 1.1.x -* Thu Jul 22 2004 Andrew McNab -- ==== GridSite version 1.1.0 ==== -* Mon Jul 19 2004 Andrew McNab -- Changes in line with EGEE SCM - most importantly - the top level directory becomes org.gridsite.core -* Mon Jul 19 2004 Andrew McNab -- ==== GridSite version 1.0.3 ==== -* Mon Jun 28 2004 Andrew McNab -- In GRSTx509CheckChain() and GRSTx509CompactCreds() - we now accept the first cert in a chain as a CA - even if it is X509v3 but without the CA bits set. - (On the basis that the first chain is from the - administrator-installed CA files store.) -* Sun Jun 27 2004 Andrew McNab -- ==== GridSite version 1.0.2 ==== -* Sun Jun 27 2004 Andrew McNab -- Fix for Bug #2860 (so can now read DN Lists over - HTTPS when have no user certificate if relevant - .gacl gives permission but not ) -- Include gridsite-gacl.h mods from Daniel Kouril - to fix faulty definitions - of GACLnewEntry() and GACLnewAcl() and to make - a legacy non-static GACLparseEntry() wrapper. -* Thu Jun 17 2004 Andrew McNab -- Changes to mod_gridsite.h for Fedora Core 2 / - Apache 2.0.49+ mod_ssl changes (mod_ssl-private.h) -* Wed Jun 9 2004 Andrew McNab -- Incorporate EGEE CVS layout changes in production - branch. -* Wed Jun 9 2004 Andrew McNab -- ==== GridSite version 1.0.1 ==== -* Sun Dec 14 2003 Andrew McNab -- 1.0.0 is first full production release - (development now in 1.1.x branch) -* Sun Dec 14 2003 Andrew McNab -- ==== GridSite version 1.0.0 ==== -* Sat Dec 13 2003 Andrew McNab -- Remove need for modified mod_ssl-gridsite: now - mod_gridsite intercepts callbacks with wrappers. -- Add GRSTx509NameCmp() which compares string reps of - DNs across OpenSSL version changes (ie Email=) -* Fri Dec 12 2003 Andrew McNab -- ==== GridSite version 0.9.11 ==== -* Thu Dec 11 2003 Andrew McNab -- Simplify checking of cert/proxy chain in - mod_ssl-gridsite: rely on mod_ssl/OpenSSL more. -* Wed Dec 2 2003 Andrew McNab -- ==== GridSite version 0.9.10 ==== -* Tue Dec 1 2003 Andrew McNab -- GACL ignores leading/trailing spaces in values. -* Sat Nov 29 2003 Andrew McNab -- Better directory listing in htcp. -- htcp now built as separate binary RPM. -- gridsite-admin.cgi upload now redirects to same - directory after upload (Bug #1939); allows - optional new name for file (Request / Bug #1940); - and has better checking of ../dir/file attacks. -* Sat Nov 29 2003 Andrew McNab -- ==== GridSite version 0.9.8 ==== -* Thu Nov 27 2003 Andrew McNab -- Shiv's updated GACL editor, with redirects. -* Wed Nov 26 2003 Andrew McNab -- Include Daniel Stenberg's roffit script to make - HTML man pages for htcp and urlencode. -- Various fixes found when installing GridPP WWW. -* Wed Nov 26 2003 Andrew McNab -- ==== GridSite version 0.9.7 ==== -* Thu Nov 20 2003 Andrew McNab -- Major updates to htcp (htrm/htls/htll) -- GACL now recurses subdirectories when examining - the DN List directories path. -* Sat Nov 15 2003 Andrew McNab -- ==== GridSite version 0.9.6 ==== -* Fri Nov 14 2003 Andrew McNab -- Function call fixes in grst-admin.cgi -* Thu Nov 13 2003 Andrew McNab -- Add htcp (curl-url-get reborn) -* Thu Nov 13 2003 Andrew McNab -- ==== GridSite version 0.9.5 ==== -* Thu Nov 13 2003 Andrew McNab -- More grst-admin.cgi GACL updates from Shiv. -- .gacl security improvements to grst-admin.cgi from - Shiv Kaushal and Peter Moore. -* Tue Nov 11 2003 Andrew McNab -- One RPM instead of three, with version from VERSION -- Textarea for HTML/Text editing now 80 columns -* Mon Nov 10 2003 Andrew McNab -- Add delegation level and GridSiteGSIProxyLimit - support. -- Add GridSiteAdminList handling to mod_gridsite - and real-gridsite-admin.cgi -* Sun Nov 9 2003 Andrew McNab -- Add directory create/delete, and file/dir rename. -- Add ZIP listing/unzipping via external unzip - utility from http://www.info-zip.org/pub/infozip/ -* Mon Nov 3 2003 Andrew McNab -- Include next version of Shiv's GACL editor. -- Add rpm-usr target to Makefile, to make RPMs - out-of-the-box compatible with RH9 and its Apache2 -- Use REMOTE_DOUBLE_REV for GACL hostname creds in - mod_gridsite.c/mod_gridsite_perm_handler() -* Sun Oct 26 2003 Andrew McNab -- Include GACL editor in real-gridsite-admin.cgi - from Shiv Kaushal -* Sun Oct 26 2003 Andrew McNab -- Reorganise into a single build tree, including - Apache 2.0 .h files to remove circular dependency. -* Sun Oct 26 2003 Andrew McNab -- ==== GridSite version 0.9.4 ==== -* Sun Oct 19 2003 Andrew McNab -- Include many pieces of GridSite code from 0.3.x (CGI) - fileGridSite and mod_gridsite 0.9.0 -* Sun Oct 19 2003 Andrew McNab -- ==== GridSite version 0.9.3 ==== diff --git a/org.gridsite.core/INSTALL b/org.gridsite.core/INSTALL deleted file mode 100644 index 4943047..0000000 --- a/org.gridsite.core/INSTALL +++ /dev/null @@ -1,37 +0,0 @@ -BUILDING/INSTALLING GRIDSITE -============================ - -For more detailed instructions, see the Installation and Build -pages in the GridSite Wiki http://www.gridsite.org/wiki/ - -GridSite is currently only supported on Linux, but should be -trivially portable to other Unix platforms where the GNU build -tools are available. - -When building from source, two routes are available: building -with Make or with RPM. - -BUILDING WITH MAKE -================== - -make -make install - -will build all components and install them all under the default -locations of /usr/local/[lib|bin|include|sbin] The default prefix -/usr/local is set by the prefix variable in the top level Makefile - -BUILDING WITH RPM -================= - -For RedHat Linux and derivatives, building with RPM is recommended. -The command - -make rpm - -will build the gridsite and htcp binary RPMs in the directory -../RPMTMP/RPMS/i386 relative to the working directory. A SRPM is -put into ../RPMTMP/SRPMS - -Building with RPM uses the default prefix /usr, although the -resulting RPMs are relocatable to other hierarchies. diff --git a/org.gridsite.core/LICENSE b/org.gridsite.core/LICENSE deleted file mode 100644 index befd74b..0000000 --- a/org.gridsite.core/LICENSE +++ /dev/null @@ -1,47 +0,0 @@ -Copyright (c) 2002-5, Andrew McNab and Shiv Kaushal, -University of Manchester. All rights reserved. - -Redistribution and use in source and binary forms, with or -without modification, are permitted provided that the following -conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -Clearly marked portions of the published GridSite source code -are derived from Apache httpd or its modules, and are covered -by the Apache Software License: - -Copyright 2001-2005 The Apache Software Foundation - -Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/org.gridsite.core/README b/org.gridsite.core/README deleted file mode 100644 index df81f32..0000000 --- a/org.gridsite.core/README +++ /dev/null @@ -1,6 +0,0 @@ -See INSTALL for build and installation instructions, and the -man pages for reference information. - -The GridSite Wiki at http://www.gridsite.org/wiki/ has guides -( http://www.gridsite.org/wiki/Category:Guides ) and cookbook -examples ( http://www.gridsite.org/wiki/Category:Cookbooks ) diff --git a/org.gridsite.core/VERSION b/org.gridsite.core/VERSION deleted file mode 100644 index 907cf98..0000000 --- a/org.gridsite.core/VERSION +++ /dev/null @@ -1,4 +0,0 @@ -MAJOR_VERSION=1 -MINOR_VERSION=1.3 -PATCH_VERSION=1.3.4 -VERSION=$(PATCH_VERSION) diff --git a/org.gridsite.core/build.xml b/org.gridsite.core/build.xml deleted file mode 100644 index 0f47b59..0000000 --- a/org.gridsite.core/build.xml +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - Ant build file to build the Gridsite Core Component - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${global.prefix} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - New tag is ${cvs.label} - - - - - - - - - - - - - - - - - - New tag is ${cvs.label} - - - - - - - - - - - - - - - - - diff --git a/org.gridsite.core/doc/README.htcp-bin b/org.gridsite.core/doc/README.htcp-bin deleted file mode 100644 index ac546fc..0000000 --- a/org.gridsite.core/doc/README.htcp-bin +++ /dev/null @@ -1,13 +0,0 @@ -Binaries (and links) are in ./bin; man pages are in ./man/man1 - -Install by copying binaries/links onto your path, or by copying htcp -and making symbolic links to htcp from htls, htll, htrm and htmkdir. - -All the .1 man pages should be copied to a suitable ./man/man1 -directory on your man path. - -If you just want to install htcp in /usr/local, then unpacking this -tgz file in /usr/local should do the trick. (Delete this README when -you're finished!) - -For more about htcp see http://www.gridsite.org/ diff --git a/org.gridsite.core/doc/build-apache2.sh b/org.gridsite.core/doc/build-apache2.sh deleted file mode 100644 index 507be31..0000000 --- a/org.gridsite.core/doc/build-apache2.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2002-3, Andrew McNab, University of Manchester -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or -# without modification, are permitted provided that the following -# conditions are met: -# -# o Redistributions of source code must retain the above -# copyright notice, this list of conditions and the following -# disclaimer. -# o Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials -# provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -#--------------------------------------------------------------- -# For more information about GridSite: http://www.gridsite.org/ -#--------------------------------------------------------------- -# -# This script takes an Apache .tar.gz as the single command line argument, -# unpacks the file, modifies the httpd.spec it contains to work without -# the "-C" option to configure (which RedHat 7.3 doesnt like) and -# outputs source and binary RPMs in SRPMS and RPMS/i386 - -if [ "$1" = "" ] ; then - echo Must give a tar.gz file name - exit -fi - -export MYTOPDIR=`pwd` - -if [ -x /usr/bin/rpmbuild ] ; then - export RPMCMD=rpmbuild -else - export RPMCMD=rpm -fi - -echo "$1" | grep '\.tar\.gz$' >/dev/null 2>&1 -if [ $? = 0 ] ; then # a gzipped source tar ball - - rm -Rf $MYTOPDIR/BUILD $MYTOPDIR/BUILDROOT $MYTOPDIR/SOURCES - mkdir -p $MYTOPDIR/SOURCES $MYTOPDIR/SPECS $MYTOPDIR/BUILD \ - $MYTOPDIR/SRPMS $MYTOPDIR/RPMS/i386 $MYTOPDIR/BUILDROOT - - shortname=`echo $1 | sed 's:^.*/::' | sed 's:\.tar\.gz$::'` - - cp -f $1 SOURCES - - tar zxvf SOURCES/$shortname.tar.gz $shortname/httpd.spec - cp -f $shortname/httpd.spec SPECS - - sed -e 's/configure -C /configure /' \ - SPECS/httpd.spec >SPECS/httpd-2.spec - - $RPMCMD --define "_topdir $MYTOPDIR" \ - -ba --buildroot $MYTOPDIR/BUILDROOT SPECS/httpd-2.spec - - exit -fi - -echo I dont recognise the file type (must be .tar.gz) - -exit diff --git a/org.gridsite.core/doc/delegation-1.1.0.wsdl b/org.gridsite.core/doc/delegation-1.1.0.wsdl deleted file mode 100644 index df7e1f2..0000000 --- a/org.gridsite.core/doc/delegation-1.1.0.wsdl +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - - - - - The cause of the delegation exception on the server side. - - - - - - - - - - New proxy certificate request, containing the certificate - request and a generated delegation ID. - - - - - - - The new RFC 3280 style proxy certificate request - in PEM format with Base64 encoding. - - - - - - - The ID associated with the new delegation session. - - - - - - - - - - - - The ID of the new delegation session, specified by the client. - The ID can be empty. - - - - - - - The new RFC 3280 style proxy certificate request - in PEM format with Base64 encoding. - - - - - - - - The ID of an already existing delegation session, - initiated by getProxyReq() or getNewProxyReq(). - - - - - RFC 3280 style proxy certificate, signed by the - client, in PEM format with Base64 encoding. - - - - - - - - - The ID of an already existing delegation session, - where the client wants to renew the delegated - credential. - - - - - - - The new RFC 3280 style proxy certificate request, - which is to replace the existing one, - in PEM format with Base64 encoding. - - - - - - - - - The server side generated ID of the new delegation - session and the new RFC 3280 style proxy certificate - request in PEM format with Base64 encoding. - - - - - - - - The ID of an already existing delegation session to be queried. - - - - - - - The date and time when the delegated credentials will expire. - - - - - - - - The ID of an already existing delegation session to be destroyed. - - - - - - - - - - - - Delegation interface. - - - - - - Starts the delegation procedure by asking for a certificate - signing request from the server. The server answers with a - certificate signing request which includes the public key - for the new delegated credentials. putProxy() has to be - called to finish the procedure. - - - - Check if a delegation ID was provided. If not, generate a delegation - id by hashing the client DN and client VOMS attributes. - - - Check if the delegation ID already exists in the - storage-area. If it does - (a credential renewal is happening), check - existing info (DN and VOMS attributes) against client info. - Throw exception if they do not match. - - - Create a new private/public key-pair (see also Key - Generation Semantics). - - - Generate a new proxy certificate request. - - - Store private key and cert request in - storage-cache-area, along with the - requesting DN and VOMS attributes. - - - - - - - - The client's DN and VOMS attributes do not match the stored ones, - i.e. the client is not authorized. - - - - - - - - Starts the delegation procedure by asking for a certificate - signing request from the server. The server answers with a - certificate signing request which includes the public key - for the new delegated credentials. putProxy() has to be - called to finish the procedure. - - - - Generate a delegation - ID by hashing the client DN and client VOMS attributes. - - - Check if the delegation ID already exists in the - storage-area. If it does, check - existing info (DN and VOMS attributes) against client info. - Throw exception if they do not match, because then this is - the rare case of hash collision, i.e. two different clients - are mapped to the same delegation ID. - - - Create a new private/public key-pair (see also Key - Generation Semantics). - - - Generate a new certificate request. - - - Store private key and cert request in - storage-cache-area, along with the - requesting DN and VOMS attributes. - - - - - - - - There were already credentials associated to the delegation ID. - - - - - - - - Finishes the delegation procedure by sending the signed - proxy certificate to the server. - - - - Check if a delegation ID was provided. If not, generate a - delegation id by hashing the client DN and client VOMS - attributes. - - - Check if the delegation ID already exists in the - storage-area. If it does, check - existing info (DN and VOMS attributes) against client info. - Throw exception if it does not match. - - - Check, if client information matches proxy information. - - - Check given proxy against private key of delegation ID in - storage-cache-area. If they do not - match, throw exception. - - - Store proxy in storage-area - and clean up the storage-cache-area. - - - - - - - - - There were no cached credentials associated to the delegation ID - (neither - getNewProxyReq() nor - - renewProxyReq() was called previously), - or the client's DN and VOMS attributes do not match the stored ones, - i.e. the client is not authorized. - - - - - - - - - Restarts the delegation procedure by asking for a certificate - signing request from the server for an already existing delegation ID. - The server answers with a certificate signing request which includes - the public key for new delegated credentials. putProxy() has to be - called to finish the procedure. - - - - Check if a delegation ID was provided. If not, generate a delegation - id by hashing the client DN and client VOMS attributes. - - - Check if the delegation ID already exists in the - storage-area. If it does - not, then throw an exception. - - - Check if the existing info (DN and VOMS attributes) against client info. - Throw exception if they do not match. - - - Create a new private/public key-pair (see also Key - Generation Semantics). - - - Generate a new certificate request. - - - Store private key and cert request in - storage-cache-area, along with the - requesting DN and VOMS attributes. - - - - - - - - There were no credentials associated to the delegation ID, or the - client's DN and VOMS attributes do not match the stored ones, i.e. - the client is not authorized. - - - - - - - Returns the termination (expiration) date and time of the credential, - associated with the given delegaion ID. If there was no delegation ID, - then generate one by hashing the client DN and client VOMS attributes. - - - - - - There were no credentials associated to the delegation ID, or the - client's DN and VOMS attributes do not match the stored ones, i.e. - the client is not authorized. - - - - - - - - Destroys the delegated credentials associated with the - given delegation ID immediately. If there was no delegation ID, - then generate one by hashing the client DN and client VOMS attributes. - - - - - - There were no credentials associated to the delegation ID, or the - client's DN and VOMS attributes do not match the stored ones, i.e. - the client is not authorized. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.gridsite.core/doc/findproxyfile.1 b/org.gridsite.core/doc/findproxyfile.1 deleted file mode 100644 index 9de4d47..0000000 --- a/org.gridsite.core/doc/findproxyfile.1 +++ /dev/null @@ -1,63 +0,0 @@ -.TH findproxyfile 1 "October 2004" "findproxyfile" "GridSite Manual" -.SH NAME -.B findproxyfile -\- returns full path to GSI Proxy file -.SH SYNOPSIS -.B findproxyfile -[--proxycache=PATH] [--delegation-id=ID] [--user-dn=DN] [--outsidecache] -.SH DESCRIPTION -.B findproxyfile -returns full path to a GSI Proxy file, either in the proxy cache maintained -by the GridSite G-HTTPS and delegation portType functions, or in other -standard places. - -If a User DN is given -.B findproxyfile -uses the value of the -.B --proxycache -argument, the GRST_PROXY_PATH or the -compile time default to detemine the location of the proxy cache directory. -The directory is searched for a proxy having the given User DN and -Delegation ID. (If no Delegation ID is specificed, then the default value is -used.) - -If -.B findproxyfile -does not find a proxy or if a User DN is not given, but -.B --outsidecache -was given, then the environment variable X509_USER_PROXY and the standard -location /tmp/x509up_uUID are searched as well. - -.SH OPTIONS - -.IP "--proxycache=PATH" -Give the path of the proxy cache directory explicitly, overriding the -default and the GRST_PROXY_PATH environment variable if present. - -.IP "--delegation-id=ID" -The optional delegation ID is search for in the proxy cache in addition to -the User DN. If absent, the default Delegation ID value is searched for. - -.IP "--user-dn=DN" -The DN of the full user certificate associated with the proxy to be searched -for in the proxy cache. (This is not the DN of any proxy earlier in the -chain: it is a the DN of a certificate issued by a recognised CA.) - -.IP "--outsidecache" -If a User DN is not given, or a proxy not found in the cache, then search -for a proxy using X509_USER_PROXY environment variable and file name of -form /tmp/x509up_uUID as well. - -.SH RETURN VALUE -If a proxy is found, its full path is output on standard out. - -.SH EXIT CODES -0 is returned on succcess. Non-zero otherwise. - -.SH BUGS -In this version, no attempt is made to verify or validate the proxies. - -.SH AUTHOR -Andrew McNab - -findproxyfile is part of GridSite: http://www.gridsite.org/ diff --git a/org.gridsite.core/doc/fuse.spec b/org.gridsite.core/doc/fuse.spec deleted file mode 100644 index ac785a2..0000000 --- a/org.gridsite.core/doc/fuse.spec +++ /dev/null @@ -1,139 +0,0 @@ -# -# You should be able to build your own FUSE RPMs for use with SlashGrid -# by fetching an up-to-date stable FUSE tar file from SourceForge, -# putting it in /usr/src/redhat/SOURCES, updating the Version: header in -# this file, and then executing rpmbuild -ba fuse.spec -# -Name: fuse -Version: 2.5.3 -URL: http://fuse.sourceforge.net -Source: %{name}-%{version}.tar.gz -Release: 3%(sed 's/^\([A-Z]\)[^ ]* \([A-Z]\)[^0-9]*\([0-9][^ ]*\).*/\1\2\3/g' /etc/redhat-release | sed 's/[^A-Z,a-z,0-9]//g')_%(uname -r | sed 's/-/_/g') -Summary: File System in Userspace (FUSE) utilities -Group: System Environment/Base -License: GPL -Packager: Andrew McNab -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) - -%description -With FUSE it is possible to implement a fully functional filesystem in a -userspace program. This package contains the FUSE userspace tools to -mount a FUSE filesystem. - -(This version is designed for use with the SlashGrid daemon: - http://www.gridsite.org/slashgrid/ ) - -%package libs -Summary: File System in Userspace (FUSE) libraries -Group: System Environment/Libraries -License: LGPL - -%description libs -Devel With FUSE it is possible to implement a fully functional filesystem in a -userspace program. This package contains the FUSE libraries. - -%package devel -Summary: File System in Userspace (FUSE) devel files -Group: Development/Libraries -Requires: %{name}-libs = %{version}-%{release} -Requires: pkgconfig -License: LGPL - -%description devel -With FUSE it is possible to implement a fully functional filesystem in a -userspace program. This package contains development files (headers, -pgk-config) to develop FUSE based applications/filesystems. - -%prep -%setup -q -#disable device creation during build/install -sed -i 's|mknod|echo Disabled: mknod |g' util/Makefile.in -sed -i 's|install-data-local | |g' util/Makefile.in -sed -i 's| install-data-local| |g' util/Makefile.in - -%build -%configure --disable-static -make %{?_smp_mflags} - -%install -rm -rf $RPM_BUILD_ROOT -make install DESTDIR=$RPM_BUILD_ROOT -find $RPM_BUILD_ROOT -type f -name "*.la" -exec rm -f {} ';' - -# change from 4755 to 0755 to allow stripping (setuid not needed by SlashGrid) -chmod 0755 $RPM_BUILD_ROOT/%{_bindir}/fusermount - -%clean -rm -rf $RPM_BUILD_ROOT - -%post -mknod --mode=0660 /dev/fuse c 10 229 -chown root.root /dev/fuse -depmod - -%postun - -%post libs -p /sbin/ldconfig - -%postun libs -p /sbin/ldconfig - -%files -%doc AUTHORS ChangeLog COPYING FAQ Filesystems NEWS README README.NFS -/sbin/mount.fuse -%attr(0755,root,root) %{_bindir}/fusermount -/lib/modules/%(uname -r)/kernel/fs/fuse/fuse.*o - -%files libs -%doc COPYING.LIB -%{_libdir}/libfuse.so.* - -%files devel -%defattr(-,root,root,-) -%{_libdir}/libfuse.so -%{_libdir}/pkgconfig/*.pc -%{_includedir}/fuse.h -%{_includedir}/fuse - -%changelog - -* Sun May 28 2006 Andrew McNab 2.5.3-3 -- Simplify for use with SlashGrid daemon (which only runs as root) on - Scientific Linux 3.*/4.* too - -* Wed May 03 2006 Peter Lemenkov 2.5.3-1%{?dist} -- Update to 2.5.3 - -* Thu Mar 30 2006 Peter Lemenkov 2.5.2-4%{?dist} -- rebuild - -* Mon Feb 13 2006 Peter Lemenkov - 2.5.2-3 -- Proper udev rule - -* Mon Feb 13 2006 Peter Lemenkov - 2.5.2-2 -- Added missing requires - -* Tue Feb 07 2006 Peter Lemenkov - 2.5.2-1 -- Update to 2.5.2 -- Dropped fuse-mount.fuse.patch - -* Wed Nov 23 2005 Thorsten Leemhuis - 2.4.2-1 -- Use dist - -* Wed Nov 23 2005 Thorsten Leemhuis - 2.4.2-1 -- Update to 2.4.2 (solves CVE-2005-3531) -- Update README.fedora - -* Sat Nov 12 2005 Thorsten Leemhuis - 2.4.1-3 -- Add README.fedora -- Add hint to README.fedora and that you have to be member of the group "fuse" - in the description -- Use groupadd instead of fedora-groupadd - -* Fri Nov 04 2005 Thorsten Leemhuis - 2.4.1-2 -- Rename packages a bit -- use makedev.d/40-fuse.nodes -- fix /sbin/mount.fuse -- Use a fuse group to restict access to fuse-filesystems - -* Fri Oct 28 2005 Thorsten Leemhuis - 2.4.1-1 -- Initial RPM release. diff --git a/org.gridsite.core/doc/gridsite-delegation.8 b/org.gridsite.core/doc/gridsite-delegation.8 deleted file mode 100644 index 41ce1e3..0000000 --- a/org.gridsite.core/doc/gridsite-delegation.8 +++ /dev/null @@ -1,19 +0,0 @@ -.TH gridsite-delegation 8 "March 2006" "gridsite-delegation" "GridSite Manual" -.SH NAME -.B gridsite-delegation.cgi -\- CGI implementation of GridSite/gLite GSI delegation Web Service -.SH SYNOPSIS -.B gridsite-delegation.cgi - -.SH DESCRIPTION -.B gridsite-delegation.cgi -is a server-side implementation of the GridSite/gLite GSI delegation Web -Service - -.SH AUTHOR -Andrew McNab - -gridsite-delegation.cgi is part of GridSite: http://www.gridsite.org/ - -.SH "SEE ALSO" -.BR htproxyput(1) diff --git a/org.gridsite.core/doc/gsexec.8 b/org.gridsite.core/doc/gsexec.8 deleted file mode 100644 index e229663..0000000 --- a/org.gridsite.core/doc/gsexec.8 +++ /dev/null @@ -1,134 +0,0 @@ -.TH GSEXEC 8 "October 2005" "gsexec" "GridSite Manual" -.SH NAME -.B gsexec -\- Switch user before executing external programs - -.SH "SYNOPSIS" - -.BR gsexec -[-V] - -.SH "SUMMARY" - -gsexec is used by the Apache HTTP Server to switch to another user before -executing CGI programs\&. In order to achieve this, it must run as root\&. -Since the HTTP daemon normally doesn't run as root, the gsexec executable -needs the setuid bit set and must be owned by root\&. It should never be -writable for any other person than root\&. - -gsexec is based on Apache's suexec, and its behaviour is controlled with -the Apache configuration file directives -.BR GridSiteExecMethod -and -.BR GridSiteUserGroup -added to Apache by -.BR mod_gridsite(8) -Four execution methods are supported: nosetuid, suexec, X509DN and directory, -and these may be set on a per-directory basis within the Apache configuration -file. - -.SH "NOSETUID METHOD" - -This is the default behaviour, but can also be produced by giving -.BR "GridSiteExecMethod nosetuid" - -CGI programs will then be executed without using gsexec, and will -run as the Unix user given by the User and Group Apache directives (normally -apache.apache on Red Hat derived systems.) - -.SH "SUEXEC METHOD" - -If -.BR "GridSiteExecMethod suexec" -is given for this virtual host or directory, then CGI programs will be -executed using the user and group given by the -.BR "GridSiteUserGroup user group" -directive, which may also be set on a per-directory basis (unlike suexec's -.BR SuexecUserGroup -which is per-server only.) The CGI program must either be owned by root, -the Apache user -and group specified at gsexec build-time (normally apache.apache) or by -the user and group given with the -.BR GridSiteUserGroup -directive. - -.SH "X509DN METHOD" - -If -.BR "GridSiteExecMethod X509DN" -is given, then the CGI program runs as a pool user, detemined using lock -files in the exec mapping directory chosen as build time of gsexec. -The pool user is chosen according -to the client's full certificate X.509 DN (ie with any trailing GSI proxy -name components stripped off.) Subsequent requests by the same X.509 -identity will be mapped to the same pool user. The CGI program must either be -owned by root, the Apache user -and group specified at gsexec build-time (normally apache.apache) or by -the pool user selected. - -.SH "DIRECTORY METHOD" - -If -.BR "GridSiteExecMethod directory" -is given, then the CGI program runs as a pool user chosen according -to the directory in which the CGI is located: all CGIs in that directory -run as the same pool user. The CGI program must either be -owned by root, the Apache user -and group specified at gsexec build-time (normally apache.apache) or by -the pool user selected. - - -.SH "EXECMAPDIR" - -The default exec mapping directory is /var/www/execmapdir and this is fixed -when the gsexec executable is built. The exec mapping directory and all -of its lock files must be owned and only writable by root. To initialise the -lock files, create an empty lock file for each pool user, with the pool -username as the filename (eg user0001, user0002, ...) As the pool users are -leased to X.509 identities or directories, they will become hard linked to -lock files with the URL-encoded X.509 DN or full directory path. - -You can recycle pool users by removing the corresponding URL-encoded -hard link. -.BR stat(1) -and -.BR "ls(1)" -with option -.BR "-i" -can be used to print the inodes of lock files to match up the hard links. - -.BR "However, you must ensure that all files and processes owned by the pool" -.BR "user are deleted before recycling!" - -.SH "OPTIONS" - -.TP --V -If you are root, this option displays the compile options of gsexec\&. -For security reasons all configuration options are changeable only at -compile time\&. - -.SH "MORE INFORMATION" -For further information about the concepts and the security model of -the original Apache suexec -please refer to the suexec documentation: - -http://httpd\&.apache\&.org/docs-2\&.0/suexec\&.html - -For examples using the gsexec extensions, please see the GridSite gsexec -page: - -http://www.gridsite.org/wiki/Gsexec - -.SH AUTHORS - -Apache project, for original suexec - -Andrew McNab for gsexec modifications. - -gsexec is part of GridSite: http://www.gridsite.org/ - -.SH "SEE ALSO" -.BR httpd(8), -.BR suexec(8), -.BR mod_gridsite(8) diff --git a/org.gridsite.core/doc/htcp.1 b/org.gridsite.core/doc/htcp.1 deleted file mode 100644 index 0731d33..0000000 --- a/org.gridsite.core/doc/htcp.1 +++ /dev/null @@ -1,200 +0,0 @@ -.TH HTCP 1 "October 2005" "htcp" "GridSite Manual" -.SH NAME -.B htcp, htmv, htrm, htls, htll, htmkdir, htfind, htping -\- file transfers and queries via HTTP/HTTPS/SiteCast -.SH SYNOPSIS -.B htcp, htmv -[options] Source-URL[s] Destination-URL - -.B htrm, htls, htll, htmkir, htfind -[options] Target-URL[s] - -.B htping -[options] -.SH DESCRIPTION -.B htcp -is a client to fetch files or directory listings from remote servers using -HTTP or HTTPS, or to put or delete files or directories onto remote servers -using HTTPS. htcp is similar to scp(1), but uses HTTP/HTTPS rather than ssh -as its transfer protocol. htcp can also use the HTCP protocol to query -HTTP(S) fileservers via SiteCast. - -When talking to a fileserver with HTTPS, htcp can run "anonymously", with a -standard X.509 user certificate and key, or with a GSI Proxy. This makes -htcp very useful in Grid environments where many users have certificates -and where jobs and users have access to GSI proxies. - -.SH URLs -htcp supports the file:, http: and https: URL schemes as sources and -destinations. If no scheme is given, the URL scheme is assumed to be file: -and relative to the current directory if not an absolute path. - -If multiple sources are given during a copy, they will be used in turn and -the destination must be a directory (directories are indicated by a trailing -/) However, source and destination cannot both refer to remote servers. - -.SH OPTIONS -.IP "-v/--verbose" -Turn on debugging information. Used once, this option will enable htcp's -messages to stderr. Used twice, will also enable the underlying libcurl -messages. - -.IP "--delete" -Instead of copying files, delete all the URLs given on the command line. -Calling the program as htrm has the same effect. - -.IP "--list" -Instead of copying files, output lists of files located in the URL-directories -given on the command line. Calling the program as htls has the same effect. - -.IP "--long-list" -Instead of copying files, output long listings of files located in the -URL-directories given on the command line. If available, the size in bytes -and modification time of each file is given. Calling the program as -htll has the same effect. - -.IP "--mkdir" -Instead of copying files, attempt to create a directory on a remote server -with HTTP PUT. The server must support the convention that PUT to a URL with -a trailing slash means create a directory. No file body is sent. Calling the -program as htmkdir has the same effect. - -.IP "--move" -Move/rename files on a single remote server, given the two, absolute URLs -of the remote file names. Server must support HTTP/WebDAV MOVE. Calling the -program as htmv has the same effect. - -.IP "--ping" -Query specified multicast groups with the HTCP NOP ("No Operation") code. -SiteCast enabled servers will respond immediately with a NOP reply, and all -of the responses will be listed, with the round trip time in milliseconds. -Any waiting times specified in the --groups option will be ignored. Calling -the program as htping has the same effect. -(--groups must be used for this option to work.) - -.IP "--find" -Query specified multicast groups with the HTCP TST code. SiteCast enabled -servers will respond with TST replies if they have the files corresponding -to the given SiteCast target URL(s). All of the transfer URLs returned -will be listed. Waiting times specified in the --groups option will be used -to space out the multicast queries, but the program listens for responses -continuously. Calling the program as htfind has the same effect. -(--groups must be used for this option to work.) - -.IP "--groups " -IP multicast groups to use for SiteCast queries. IP Groups is a comma -separated list of groups, in the format: nnn.nnn.nnn.nnn:port[:ttl[:seconds]] -The IP number and port must be specified. The IP time-to-live, ttl, controls -how many networks the multicast packets may pass through - the default, 1, -limits packets to the local network. Multiple groups may be specified, -separated by commas. If multiple groups are specified, then seconds is the -time to wait before making the next multicast - 1 second is the default. - -.IP "--timeout " -A request timeout used for multicast ping. - -.IP "--anon" -Do not attempt to use X.509 user certificates or GSI proxies to authenticate -to the remote HTTPS server. This means you are "anonymous", but the server's -identity may still be verified and the connection is still encrypted. - -.IP "--cert and --key " -Path to the PEM-encoded -X.509 or GSI Proxy user certificate and key to use for HTTPS -connections, intead of "anonymous mode." If only one of --key or --cert -is given, then that will be tried for both. If neither is given, then the -following order of precedence is used: -the file name held by the variable X509_USER_PROXY; the file -/tmp/x509up_uID (with Unix UID equal to ID); the file names held by -X509_USER_CERT / X509_USER_KEY; the files ~/.globus/usercert.pem and -~/.globus/userkey.pem (where ~/ is the home directory of the user.) - -.IP "--capath " -Path to the PEM-encoded CA root certificates to use when -verifying remote servers' host certificates in HTTPS connections. Ideally -this should be a directory of hash.0 files as described in the OpenSSL -verify(1) man page, but a file may be used instead. If --capath is not -given, the value of the environment variable X509_CERT_DIR will be tried. -If this is not valid, then /etc/grid-security/certificates will be used. - -.IP "--no-verify" -Do not use CA root certificates to verify remote servers' host certificates. -This is useful for testing sites before their certificate is set up properly, -but leaves you vulnerable to "man in the middle" attacks by hostile servers -masquerading as your target. - -.IP "--grid-http" -Try to use GridHTTP redirection for HTTPS URLs. Compatible servers will perform -authentication and authorization on the HTTPS connection and then redirect -to HTTP for the GET or PUT file transfer. htcp makes the HTTP request using -the GRID_AUTH_PASSCODE single-use passcode obtained via HTTPS. The --grid-http -option will be ignored for directory operations or HTTP URLs. If a redirected -transfer isn't possible, a normal HTTPS data transfer will be attempted. - -.IP "--sitecast" -Try to use SiteCast to locate remote files which are to be copied (currently -only for the -.BR fetching -of remote files.) If no location is found via SiteCast, then a direct request -for the given URL is tried. (--groups must be used for this option to work.) - -.IP "--domain " -Try to use SiteCast to locate remote files which are to be copied (currently -only for the -.BR fetching -of remote files) -.BR "if the domain component of the URL matches" -the SiteCast domain given. -If no location is found via SiteCast, then a direct request -for the given URL is tried. (--groups must be used for this option to work.) - -.SH FILES -.IP /tmp/x509up_uID -Default GSI Proxy file for Unix UID equal to ID. - -.IP /etc/grid-security/certificates -Default location for trusted Certification Authority root certificates to use -when checking server certificates. - -.IP /tmp/.ca-roots-XXXXXX -Prior to 7.9.8, the underlying curl library did not support the CA root -certificates directory. -If built with an old version of libcurl, htcp will concatenate the -certificates in the CA roots directory into a unique temporary file and use -that. - -.SH ENVIRONMENT - -.IP X509_CERT_DIR -Holds directory to search for Certification Authority root certificates when -verifying server certificates. (Tried if --capath is not given on the -command line.) - -.IP X509_USER_PROXY -Holds file name of a GSI Proxy to use as user certificate. (Tried if --cert or ---key are not given on the command line.) - -.IP "X509_USER_CERT and X509_USER_KEY" -Holds file name of X.509 user certificate and key. (Tried if X509_USER_PROXY -is not valid.) - -.SH EXIT CODES -0 is returned on complete success. Curl error codes are returned when -reported by the underlying curl library, and CURLE_HTTP_RETURNED_ERROR (22) -is returned when the HTTP(S) server returns a code outside the range 200-299. -The manpage libcurl-errors(3) lists all the curl error codes. - -.SH TO DO -Recursive copying. Server-side wildcards. Parallel streams. Better error -recovery. - -.SH AUTHOR -Andrew McNab - -htcp is part of GridSite: http://www.gridsite.org/ -.SH "SEE ALSO" -.BR scp(1), -.BR curl(1), -.BR wget(1), -.BR verify(1), -.BR libcurl-errors(3) diff --git a/org.gridsite.core/doc/htfind.1 b/org.gridsite.core/doc/htfind.1 deleted file mode 100644 index 11a60d1..0000000 --- a/org.gridsite.core/doc/htfind.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htcp.1 diff --git a/org.gridsite.core/doc/htll.1 b/org.gridsite.core/doc/htll.1 deleted file mode 100644 index 11a60d1..0000000 --- a/org.gridsite.core/doc/htll.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htcp.1 diff --git a/org.gridsite.core/doc/htls.1 b/org.gridsite.core/doc/htls.1 deleted file mode 100644 index 11a60d1..0000000 --- a/org.gridsite.core/doc/htls.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htcp.1 diff --git a/org.gridsite.core/doc/htmkdir.1 b/org.gridsite.core/doc/htmkdir.1 deleted file mode 100644 index 11a60d1..0000000 --- a/org.gridsite.core/doc/htmkdir.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htcp.1 diff --git a/org.gridsite.core/doc/htmv.1 b/org.gridsite.core/doc/htmv.1 deleted file mode 100644 index 11a60d1..0000000 --- a/org.gridsite.core/doc/htmv.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htcp.1 diff --git a/org.gridsite.core/doc/htping.1 b/org.gridsite.core/doc/htping.1 deleted file mode 100644 index 11a60d1..0000000 --- a/org.gridsite.core/doc/htping.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htcp.1 diff --git a/org.gridsite.core/doc/htproxydestroy.1 b/org.gridsite.core/doc/htproxydestroy.1 deleted file mode 100644 index 57f80ce..0000000 --- a/org.gridsite.core/doc/htproxydestroy.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htproxyput.1 diff --git a/org.gridsite.core/doc/htproxyput.1 b/org.gridsite.core/doc/htproxyput.1 deleted file mode 100644 index 3d2bf04..0000000 --- a/org.gridsite.core/doc/htproxyput.1 +++ /dev/null @@ -1,109 +0,0 @@ -.TH HTPROXYPUT 1 "March 2006" "htproxyput" "GridSite Manual" -.SH NAME -.B htproxyput, htproxydestroy, htproxytime, htproxyunixtime, htproxyrenew -\- GSI proxy delegations and querying, using GridSite/gLite delegation API -.SH SYNOPSIS -.B htproxyput, htproxydestroy, htproxytime, htproxyunixtime, htproxyrenew -[options] Service-URL - -.SH DESCRIPTION -.B htproxyput -is a client to perform GSI proxy delegations using the GridSite/gLite -delegation Web Service portType. The gridsite-delegation(8) CGI program is -the complementary server-side implementation. - -.SH OPTIONS -.IP "-v/--verbose" -Turn on debugging information. - -.IP "--delegation-id " -Explicitly specify the Delegation ID to use. - -.IP "--destroy" -Instead of delegating a proxy, delete the proxy from the service's proxy -cache. Calling the program as htproxydestroy has the same effect. - -.IP "--time" -Instead of delegating a proxy, report the expiration time of the proxy, -in the local time of the client. Calling the program as htproxytime has the -same effect. - -.IP "--unixtime" -Instead of delegating a proxy, report the expiration time of the proxy, as -the number of seconds since 00:00:00 1970-01-01 UTC. Calling the program as -htproxyunixtime has the same effect. - -.IP "--renew" -Delegate an updated version of an existing proxy. The Delegation ID -.B must -be given when using this option. Calling the program as htproxyrenew has the -same effect. - -.IP "--cert and --key " -Path to the PEM-encoded -X.509 or GSI Proxy user certificate and key to use for HTTPS -connections, intead of "anonymous mode." If only one of --key or --cert -is given, then that will be tried for both. If neither is given, then the -following order of precedence is used: -the file name held by the variable X509_USER_PROXY; the file -/tmp/x509up_uID (with Unix UID equal to ID); the file names held by -X509_USER_CERT / X509_USER_KEY; the files ~/.globus/usercert.pem and -~/.globus/userkey.pem (where ~/ is the home directory of the user.) - -.IP "--capath " -Path to the PEM-encoded CA root certificates to use when -verifying remote servers' host certificates in HTTPS connections. Ideally -this should be a directory of hash.0 files as described in the OpenSSL -verify(1) man page, but a file may be used instead. If --capath is not -given, the value of the environment variable X509_CERT_DIR will be tried. -If this is not valid, then /etc/grid-security/certificates will be used. - -.IP "--no-verify" -Do not use CA root certificates to verify remote servers' host certificates. -This is useful for testing sites before their certificate is set up properly, -but leaves you vulnerable to "man in the middle" attacks by hostile servers -masquerading as your target. - -.SH FILES -.IP /tmp/x509up_uID -Default GSI Proxy file for Unix UID equal to ID. - -.IP /etc/grid-security/certificates -Default location for trusted Certification Authority root certificates to use -when checking server certificates. - -.IP /tmp/.ca-roots-XXXXXX -Prior to 7.9.8, the underlying curl library did not support the CA root -certificates directory. -If built with an old version of libcurl, htproxyput will concatenate the -certificates in the CA roots directory into a unique temporary file and use -that. - -.SH ENVIRONMENT - -.IP X509_CERT_DIR -Holds directory to search for Certification Authority root certificates when -verifying server certificates. (Tried if --capath is not given on the -command line.) - -.IP X509_USER_PROXY -Holds file name of a GSI Proxy to use as user certificate. (Tried if --cert or ---key are not given on the command line.) - -.IP "X509_USER_CERT and X509_USER_KEY" -Holds file name of X.509 user certificate and key. (Tried if X509_USER_PROXY -is not valid.) - -.SH EXIT CODES -0 is returned on complete success, and non-zero on error. - -.SH TO DO -Better error recovery. - -.SH AUTHOR -Andrew McNab - -htproxyput is part of GridSite: http://www.gridsite.org/ -.SH "SEE ALSO" -.BR htcp(1), -.BR gridsite-delegation(8) diff --git a/org.gridsite.core/doc/htproxyrenew.1 b/org.gridsite.core/doc/htproxyrenew.1 deleted file mode 100644 index 57f80ce..0000000 --- a/org.gridsite.core/doc/htproxyrenew.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htproxyput.1 diff --git a/org.gridsite.core/doc/htproxytime.1 b/org.gridsite.core/doc/htproxytime.1 deleted file mode 100644 index 57f80ce..0000000 --- a/org.gridsite.core/doc/htproxytime.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htproxyput.1 diff --git a/org.gridsite.core/doc/htproxyunixtime.1 b/org.gridsite.core/doc/htproxyunixtime.1 deleted file mode 100644 index 57f80ce..0000000 --- a/org.gridsite.core/doc/htproxyunixtime.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htproxyput.1 diff --git a/org.gridsite.core/doc/htrm.1 b/org.gridsite.core/doc/htrm.1 deleted file mode 100644 index 11a60d1..0000000 --- a/org.gridsite.core/doc/htrm.1 +++ /dev/null @@ -1 +0,0 @@ -.so man1/htcp.1 diff --git a/org.gridsite.core/doc/httpd-fileserver.conf b/org.gridsite.core/doc/httpd-fileserver.conf deleted file mode 100644 index fbc170c..0000000 --- a/org.gridsite.core/doc/httpd-fileserver.conf +++ /dev/null @@ -1,155 +0,0 @@ -############################################################################## -## GridSite httpd-fileserver.conf - Andrew McNab -## -## For GridSite documentation, see http://www.gridsite.org/ -## -## Example configuration file for GridSite as an HTTP(S) fileserver, -## listening on ports 80/777 (HTTP) and 443/488 (HTTPS) -## -## (777/488 is to allow firewalls to distinguish between Grid and -## Web HTTP(S) traffic. See http://www.gridsite.org/wiki/IP_Ports ) -## -## This file should be renamed /etc/httpd/conf/httpd.conf and Apache -## restarted to use Apache2/GridSite as a simple HTTP(S) fileserver. -## -## You do not need to install the GridSite mod_ssl.so module if you -## do not wish to use Globus Proxies or VOMS attributes, but you must -## have the mod_gridsite.so in /usr/lib/httpd/modules -## -## We're assuming you have (a) the host's hostcert.pem and hostkey.pem -## in /etc/grid-security/ and (b) the Certification Authorities' you -## trust have their root certs in /etc/grid-security/certificates -## -## (You can get RPMs for many European and North American Grid CAs -## from https://datagrid.in2p3.fr/distribution/datagrid/security/ ) -## -## If you want to use DN Lists in ACLs, they should be placed/downloaded -## in /etc/grid-security/dn-lists/ -## -## To start serving files, make a directory /var/www/htdocs owned by -## apache.apache, including the file .gacl containing: -## -## -## -## -## -## -## -## -## To enable writing, add DN List, Person or VOMS entries to the GACL -## (see the GridSite GACL document for the syntax.) For example: -## -## -## -## -## -## -## -## -## /C=UK/O=eScience/OU=Manchester/L=HEP/CN=Andrew McNab -## -## -## -## -## -## and add the following directive to the HTTPS section: -## -## GridSiteMethods GET PUT DELETE MOVE -## -## If you wish to accept Globus GSI Proxies as well as full X.509 user -## certificates, set GridSiteGSIProxyLimit to the depth of proxy you -## wish to accept. -## -## (As a _rough_ guide: 0=No Proxies; 1=Proxy on user's machine; 2=Proxy -## owned by running Globus job; 3=Proxy delegated by a Globus job.) -## -## With this done and Apache restarted, you can upload a file with: -## -## curl -v --cert ~/.globus/usercert.pem --key ~/.globus/userkey.pem \ -## --capath /etc/grid-security/certificates --upload-file /tmp/tmp.txt \ -## https://INSERT.HOSTNAME.HERE/tmp.txt -## -## (or with --cert /tmp/x509up_u`id -u` --key /tmp/x509up_u`id -u` to use -## a Globus GSI Proxy created with grid-proxy-init.) -## -############################################################################## - -ServerRoot "/etc/httpd" - -PidFile logs/httpd.pid - -Timeout 300 -KeepAlive On -MaxKeepAliveRequests 100 -KeepAliveTimeout 15 - -LoadModule log_config_module /usr/lib/httpd/modules/mod_log_config.so -LoadModule ssl_module /usr/lib/httpd/modules/mod_ssl.so -LoadModule gridsite_module /usr/lib/httpd/modules/mod_gridsite.so -LoadModule mime_module /usr/lib/httpd/modules/mod_mime.so -LoadModule dir_module /usr/lib/httpd/modules/mod_dir.so - -TypesConfig /etc/mime.types - -# User and group who will own files created by Apache -User apache -Group apache - -DocumentRoot "/var/www/htdocs" - - - AllowOverride None - - -LogLevel debug -LogFormat "%h \"%{SSL_CLIENT_S_DN}x\" %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - -CustomLog logs/httpd-gridsite-access combined -ErrorLog logs/httpd-gridsite-errors - -HostnameLookups On - -###################################################################### -# Plain unauthenticated HTTP on ports 80 and 777 -###################################################################### - -Listen 80 -Listen 777 - - - - GridSiteIndexes on - GridSiteAuth on - GridSiteDNlists /etc/grid-security/dn-lists/ - - - - -###################################################################### -# Secured and possibly authenticated HTTPS on ports 443 and 488 -###################################################################### -Listen 443 -Listen 488 -SSLSessionCacheTimeout 300 -SSLSessionCache shm:/var/cache/mod_ssl/shm_cache - - - -SSLEngine on -SSLCertificateFile /etc/grid-security/hostcert.pem -SSLCertificateKeyFile /etc/grid-security/hostkey.pem -SSLCACertificatePath /etc/grid-security/certificates -#SSLCARevocationPath YOUR CRL DIRECTORY WOULD GO HERE -SSLVerifyClient optional -SSLVerifyDepth 10 -SSLOptions +ExportCertData +StdEnvVars - - - GridSiteIndexes on - GridSiteAuth on - GridSiteDNlists /etc/grid-security/dn-lists/ - GridSiteGSIProxyLimit 0 -# GridSiteMethods GET PUT DELETE MOVE - - - diff --git a/org.gridsite.core/doc/httpd-webserver.conf b/org.gridsite.core/doc/httpd-webserver.conf deleted file mode 100644 index 710bb12..0000000 --- a/org.gridsite.core/doc/httpd-webserver.conf +++ /dev/null @@ -1,226 +0,0 @@ -############################################################################## -## GridSite httpd-webserver.conf - Andrew McNab -## -## For GridSite documentation, see http://www.gridsite.org/ -## -## Example configuration file for GridSite as a Web Server -## (that is, primarily for interactive use with a browser.) -## Listening is on ports 80/777 (HTTP) and 443/488 (HTTPS). -## -## (777/488 is to allow firewalls to distinguish between Grid and -## Web HTTP(S) traffic. See http://www.gridsite.org/wiki/IP_Ports ) -## -## This file should be renamed /etc/httpd/conf/httpd.conf and Apache -## restarted to use Apache2/GridSite as a webserver. -## -## You do not need to install the GridSite mod_ssl.so module if you -## do not wish to use Globus Proxies or VOMS attributes, but you must -## have the mod_gridsite.so in /usr/lib/httpd/modules -## -## We're assuming you have (a) the host's hostcert.pem and hostkey.pem -## in /etc/grid-security/ and (b) the Certification Authorities' you -## trust have their root certs in /etc/grid-security/certificates -## -## (You can get RPMs for many European and North American Grid CAs -## from https://datagrid.in2p3.fr/distribution/datagrid/security/ ) -## -## If you want to use DN Lists in ACLs, they should be placed/downloaded -## in /etc/grid-security/dn-lists/ or /var/www/htdocs/dn-lists/ -## (Lists in /etc/grid-security/dn-lists/ override lists elsewhere.) -## -## To start serving files, make a directory /var/www/htdocs owned by -## apache.apache, including the file .gacl containing: -## -## -## -## -## -## -## -## -## To enable writing, add DN List, Person or VOMS entries to the GACL -## (see the GridSite GACL document for the syntax.) For example: -## -## -## -## -## -## -## -## -## /C=UK/O=eScience/OU=Manchester/L=HEP/CN=Andrew McNab -## -## -## -## -## -## and add the following directive to the HTTPS section: -## -## GridSiteMethods GET PUT DELETE MOVE -## -## If you wish to accept Globus GSI Proxies as well as full X.509 user -## certificates, set GridSiteGSIProxyLimit to the depth of proxy you -## wish to accept. -## -## (As a _rough_ guide: 0=No Proxies; 1=Proxy on user's machine; 2=Proxy -## owned by running Globus job; 3=Proxy delegated by a Globus job.) -## -## With this done and Apache restarted, you can upload a file with: -## -## curl -v --cert ~/.globus/usercert.pem --key ~/.globus/userkey.pem \ -## --capath /etc/grid-security/certificates --upload-file /tmp/tmp.txt \ -## https://INSERT.HOSTNAME.HERE/tmp.txt -## -## (or with --cert /tmp/x509up_u`id -u` --key /tmp/x509up_u`id -u` to use -## a Globus GSI Proxy created with grid-proxy-init.) -############################################################################## - -ServerRoot "/etc/httpd" - -## You MUST put your server's fully qualified domain name here -## This, the DOMAIN part of the https://DOMAIN/... URLs you want -ServerName FULL.SERVER.NAME - -PidFile logs/httpd.pid - -Timeout 300 -KeepAlive On -MaxKeepAliveRequests 100 -KeepAliveTimeout 15 - -LoadModule log_config_module /usr/lib/httpd/modules/mod_log_config.so -LoadModule ssl_module /usr/lib/httpd/modules/mod_ssl.so -LoadModule gridsite_module /usr/lib/httpd/modules/mod_gridsite.so -LoadModule mime_module /usr/lib/httpd/modules/mod_mime.so -LoadModule dir_module /usr/lib/httpd/modules/mod_dir.so -LoadModule alias_module /usr/lib/httpd/modules/mod_alias.so -LoadModule cgi_module /usr/lib/httpd/modules/mod_cgi.so - -TypesConfig /etc/mime.types - -# User and group who will own files created by Apache -User apache -Group apache - -DocumentRoot "/var/www/htdocs" - - - AllowOverride None - - -LogLevel debug -LogFormat "%h \"%{SSL_CLIENT_S_DN}x\" %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - -CustomLog logs/httpd-gridsite-access combined -ErrorLog logs/httpd-gridsite-errors - -HostnameLookups On - -###################################################################### -# Plain unauthenticated HTTP on ports 80 and 777 -###################################################################### - -Listen 80 -Listen 777 - - -## This is used to serve the Manage Directory links in footers, -## and to allow you to edit files and ACLs via your browser. -ScriptAlias /real-gridsite-admin.cgi /usr/sbin/real-gridsite-admin.cgi - - - ## This sets up GACL authorization for this server. - GridSiteAuth on - - ## This exports various bits of info into the CGI environment - ## variables (and is needed for gridsite-admin.cgi to work.) - GridSiteEnvs on - - ## Nice GridSite directory listings (without truncating file names!) - GridSiteIndexes on - - ## If this is on, GridSite will look for gridsitehead.txt and - ## gridsitefoot.txt in the current directory or its parents, and - ## use them to replace the and tags in .html files. - GridSiteHtmlFormat on - - ## These directives (and the ScriptAlias above) allow authorized - ## people to manage files, ACLs and DN Lists through their web - ## browsers. Via HTTP, this just means extended directory listings - ## and History pages. - GridSiteAdminURI /real-gridsite-admin.cgi - GridSiteAdminFile gridsite-admin.cgi - - - - -###################################################################### -# Secured and possibly authenticated HTTPS on ports 443 and 488 -###################################################################### -Listen 443 -Listen 488 -SSLSessionCacheTimeout 300 -SSLSessionCache shm:/var/cache/mod_ssl/shm_cache - - - -SSLEngine on -SSLCertificateFile /etc/grid-security/hostcert.pem -SSLCertificateKeyFile /etc/grid-security/hostkey.pem -SSLCACertificatePath /etc/grid-security/certificates -#SSLCARevocationPath YOUR CRL DIRECTORY WOULD GO HERE -SSLVerifyClient optional -SSLVerifyDepth 10 -SSLOptions +ExportCertData +StdEnvVars - -## This is used to serve the Manage Directory links in footers, -## and to allow you to edit files and ACLs via your browser. -ScriptAlias /real-gridsite-admin.cgi /usr/sbin/real-gridsite-admin.cgi - - - ## This sets up GACL authorization for this server. - GridSiteAuth on - - ## This exports various bits of info into the CGI environment - ## variables (and is needed for gridsite-admin.cgi to work.) - GridSiteEnvs on - - ## Nice GridSite directory listings (without truncating file names!) - GridSiteIndexes on - - ## If this is on, GridSite will look for gridsitehead.txt and - ## gridsitefoot.txt in the current directory or its parents, and - ## use them to replace the and tags in .html files. - GridSiteHtmlFormat on - - ## This is the path of directories (and all their subdirectories) for - ## GACL to search when it encounters a dn-list credential. The DN List - ## files are plain text, one DN per line, and must have the full url - ## as the file name, but URL Encoded - eg with urlencode(1) - GridSiteDNlists /etc/grid-security/dn-lists/:/var/www/htdocs/dn-lists/ - - ## This is used to form the URL at which DN Lists "owned" by this - ## server are exported. https://FULL.SERVER.NAME/dn-lists/file - ## ALL FILES WITH URLs ON THIS SERVER WILL BE EXPORTED IRRESPECTIVE - ## OF WHERE THEY ARE FOUND ON THE DN-LISTS PATH!! - GridSiteDNlistsURI /dn-lists/ - - ## If this is greater than zero, we will accept GSI Proxies for clients - ## (full client certificates - eg inside web browsers - are always ok) - GridSiteGSIProxyLimit 0 - - ## This directive allows authorized people to write/delete files - ## from non-browser clients - eg with htcp(1) - GridSiteMethods GET PUT DELETE MOVE - - ## These directives (and the ScriptAlias above) allow authorized - ## people to manage files, ACLs and DN Lists through their web - ## browsers via HTTPS. The value of GridSiteAdminFile appears to - ## exist in every directory, but is internally redirected by - ## mod_gridsite to the value of GridSiteAdminURI (the ScriptAlias - ## then maps that onto the real-gridsite-admin.cgi executable.) - GridSiteAdminURI /real-gridsite-admin.cgi - GridSiteAdminFile gridsite-admin.cgi - - - diff --git a/org.gridsite.core/doc/index.html b/org.gridsite.core/doc/index.html deleted file mode 100644 index 21c702c..0000000 --- a/org.gridsite.core/doc/index.html +++ /dev/null @@ -1,82 +0,0 @@ -GridSite 1.3.x Documentation - -

GridSite 1.3.x Documentation

- -

-GridSite -is a set of extensions to the Apache 2.0 webserver, which support -Grid security based on X.509 certificates. Since GridSite applies access -control within Apache itself, via mod_gridsite, Grid authorization and -the associated verified credentials are available to all technologies -supported by Apache, including static file serving, SSI, CGI, PHP, JSP and -mod_perl. - -

-The GridSite Wiki includes -guides and cookbook examples about using GridSite, along with up to date -information about the APIs. - -

Reference

- -

-The following reference documents and man pages are put in -/usr/share/doc/gridsite-VERSION when GridSite is installed. - -

-

- -
htcp(1) -
A command line tool for copying files to or from HTTP(S) servers. -

- -

mod_gridsite(8) -
An Apache 2.0 module which enforces access control via Grid Access - Control Lists, and X.509, GSI or VOMS credentials. mod_gridsite also - gives Apache built-in support for the HTTP PUT and DELETE methods, and - formatting of HTML pages with standard headers and footers. -

- -

gsexec(8) -
A modified version of suexec(8), for use with mod_gridsite(8). gsexec - allows CGI programs to be run as pool users, depending on the client's - X.509 identity or the directory in which the CGI is located. -

- -

httpd-fileserver.conf and - httpd-webserver.conf -
Example configuration files for simple HTTP(S) fileservers and - webservers, with explanatory comments. -

- -

urlencode(1) -
A command for URL-encoding strings. -

- -

findproxyfile(1) -
The findproxyfile command returns full path to a GSI Proxy file, - either in the proxy cache maintained by the GridSite G-HTTPS and - delegation portType functions, or in other standard places. -

- - - -

fuse.spec -
An RPM SPEC file which can be used to build the - FUSE kernel module, - library and commands on Linux 2.4.x and 2.6.x systems, for use with - SlashGrid. -

- -

gridsite.h API reference -
A detailed description of the C API provided by libgridsite, generated - from the sources by doxygen. -

- -

- - diff --git a/org.gridsite.core/doc/mod_gridsite.8 b/org.gridsite.core/doc/mod_gridsite.8 deleted file mode 100644 index cfbea3f..0000000 --- a/org.gridsite.core/doc/mod_gridsite.8 +++ /dev/null @@ -1,313 +0,0 @@ -.TH MOD_GRIDSITE 8 "October 2005" "mod_gridsite" "GridSite Manual" -.SH NAME -.B mod_gridsite -\- Grid extensions to Apache httpd -.SH SYNOPSIS -.B LoadModule gridsite_module mod_gridsite.so -.SH DESCRIPTION -.B mod_gridsite -is an Apache 2.0 module which enforces access control via Grid -Access Control Lists, and X.509, GSI or VOMS credentials. mod_gridsite also -gives Apache built-in support for the HTTP PUT and DELETE methods, and -formatting of HTML pages with standard headers and footers. - -Since mod_gridsite access -control within Apache itself, Grid authorization and -the associated verified credentials are available to all technologies -supported by Apache, including static file serving, SSI, CGI, PHP, mod_perl -and Java servlets via a connector to Tomcat. - -Operation of mod_gridsite can be configured using runtime directives -in Apache's standard httpd.conf configuration file. The module must first be -loaded with a LoadModule directive: - -LoadModule gridsite_module /PATH/TO/MODULES/mod_gridsite.so - -The module's behaviour is then controlled by GridSite... directives within -Apache sections, allowing different directories to use -GridSite features in different ways. - -.SH DIRECTIVES - -.IP "GridSiteIndexes on|off" -Determines whether GridSite generates HTML directory listings. These -have some advantages over standard Apache directory listings (eg the -displayed filenames are never truncated) and will include standard -headers and footers if GridSiteHtmlFormat is on. -(Default: GridSiteIndexes off) - -.IP "GridSiteIndexHeader file" -If the named file is found in the directory being listed, the file -is included verbatim at the top of the listing and excluded from -the file-by-file listing. The file can either be HTML or plain text (in -which case browsers will be treat it as one HTML paragraph.) -(Default: none) - -.IP "GridSiteHtmlFormat on|off" -Determines where HTML pages receive additional formatting before being -sent to the client. This includes the "Last modified", -"View page history", "Switch to HTTP(S)", -"Print View" and "Built with GridSite" footer -elements. If header and footer files are found, they will be used too. -(Default: GridSiteHtmlFormat off) - -.IP "GridSiteHeadFile file" -.IP "GridSiteFootFile file" -Set the filenames to be searched for as standard headers and footers -for HTML pages. For each HTML page, the directory of that page is tried -first, and then parent directories in ascending order until a header / -footer file is found. Header files are inserted in place of HTML - tags; footer files in place of . (These -standard files should each include the appropriate body tag as a -replacement.) -(Defaults: GridSiteHeadFile gridsitehead.txt, -GridSiteFootFile gridsitefoot.txt) - -.IP "GridSiteAuth on|off" -Enables GridSite access control features, using -GACL files. The files are named .gacl and are -per-directory. The current directory is tried and then parent -directories in ascending order until a .gacl file is found. -(Default: GridSiteAuth off) - -.IP "GridSiteAdminList uri" -All members of the DN List with name "uri" receive the full set -of permissions, irrespective of per-directory .gacl files. People in -this group have full control over the whole site. -(Default: none) - -.IP "GridSiteGSIProxyLimit limit" -When using GSI Proxy credentials, -proxies with delegation depth greater than "limit" will -be ignored by mod_gridsite authorization decisions. A limit of zero -implies only full X.509 -certificates (and no proxies) will be accepted. A limit of 1 implies -that only the initial proxy, usually created on the user's own machine, -is acceptable. Higher levels lead to proxies on remote machines, eg -used by running jobs, being accepted. -(Default: GridSiteGSIProxyLimit 1) - -.IP "GridSiteMethods [GET] [PUT] [DELETE] [MOVE]" -Specifies which HTTP methods are supported by GridSite. GET (and HEAD) -are always supported. PUT and DELETE support is turned on by this -directive, subject to a positive statement that write permission is -allowed for the directory in question, by a GACL file. -(Default: GridSite GET) - -.IP "GridSiteDNlists directory1[:directory2[:directory3]...]" -Sets up the DN List path used by GACL for -evaluating credentials. If this directive is not used, -then GACL will use the GRST_DN_LISTS variable from Apache's own -environment. If that is not set either, then /etc/grid-security/dn-lists -is searched. -(Default: none) - -.IP "GridSiteDNlistsURI uri" -If GridSiteDNlistsURI is used, then the URI given appears to be -populated with all the DN lists on the current DN lists path which -match the current server. That is, for server https://example.org/ -with DN lists URI /dn-lists/, all DN lists with URLs starting -https://example.org/dn-lists/ will appear to be present in /dn-lists/, -irrespective of where in the path they are stored. -(Default: none) -

- -.IP "GridSiteAdminURI uri" -GridSiteAdminURI gives the absolute URI on the server of the GridSite -Admin CGI program, which is used for file management, HTML and GACL -editing. This should be used in conjunction with the standard Apache -directive ScriptAlias to map that URI to the real-gridsite-admin.cgi -executable. For example: - -ScriptAlias /real-gridsite-admin.cgi /PATH/TO/real-gridsite-admin.cgi - -This URI is always reached by an internal redirection from the value -set by GridSiteAdminFile, and is never visible to users. -(Default: none) - -.IP "GridSiteAdminFile cgifilename" -If GridSiteAdminURI is set, then the cgifilename of GridSiteAdminFile -appears to be present in all directories when explicitly -requested (it does not appear in directory listings.) Requests for these -ghost CGI URIs are internally redirected to the value set by -GridSiteAdminURI. (Default: GridSiteAdminFile gridsite-admin.cgi) - -.IP "GridSiteEnvs on|off" -This makes mod_gridsite export several variables into the environment -of CGI programs and other dynamic content systems. The variable names -are listed below. For gridsite-admin.cgi mechanism to work, this switch -must be left in its default state of on. -(Default: GridSiteEnvs on) - -.IP "GridSiteEditable [ext1 [ext2 [ext3] ...]]]" -A space-separated list of file extensions which can safely be edited -by the GridSite Text/HTML editor. The extensions are given without the -initial dot. -(Default: GridSiteEditable txt shtml html htm css js php jsp) - -.IP "GridSiteHelpURI uri" -If set, gives the URI to use for "Website Help" links in HTML -page footers. (Default: none) - -.IP "GridSiteLink on|off" -Turns off the link in the HTML page footers which gives credit to GridSite. -(Default: GridSiteLink on) - -.IP "GridSiteUnzip path" -If "path" is set by this directive, then real-gridsite-admin.cgi -will offer to list the contents of .zip archives on the server. -Users with write access are able to unpack the contents into the same -directory as the .zip file. The value of "path" must point -to the location of the unzip binary. (Default: none) - -.IP "GridSiteGridHTTP on|off" -Enable GridHTTP for this server, virtual server or directory: -HTTPS requests made with the header -.BR "Upgrade: GridHTTP/1.0" -will be redirected to an HTTP version of the file. (Default: off) - -.IP "GridSiteGridHTTPport port" -Sets the port to use for the unencrypted HTTP component of GridHTTP -HTTPS->HTTP transfers. The same setting will be used for all virtual hosts -which support GridHTTP. (Default: 777) - -.IP "GridSiteSessionsDir path" -Location of authentication cookies and SSL session credentials directory, -relative to ServerRoot. Used by GridHTTP to record the credentials obtained -via HTTPS, and available to the corresponding HTTP request or subsequent -HTTPS requests following a session restart. -(Default: /var/www/sessions) - -.IP "GridSiteACLFormat GACL|XACML" -Format to use when writing .gacl files. (Both formats are automatically -recognised when reading.) (Default: GACL) - -.IP "GridSiteExecMethod nosetuid|suexec|X509DN|directory" -Execution strategy for CGI scripts and executables. For options other -than nosetuid, suexec (or gsexec renamed suexec) must installed. For -X509DN and directory, gsexec must be installed, as suexec. See -.BR "gsexec(8)" -for an explanation of the different execution strategies. -(Default: nosetuid) - -.IP "GridSiteUserGroup user group" -Unix user and group when using suexec (or gsexec as suexec.) This -is equivalent to the suexec SuexecUserGroup directive, but can be -specified on a per-directory basis. (Default: none) - -.IP "GridSiteDiskMode GroupNone|GroupRead|GroupWrite WorldNone|WorldRead" -The file creation permissions mode, taking two arguments to specify -the group and other permissions. The mode always includes read and write -permission for the CGI user itself. -(Default: GroupNone WorldNone) - -.IP "GridSiteCastUniPort port" -The -.BR UDP -unicast port to listen on for HTCP queries, and from which to -send replies to HTCP unicast and multicast queries. Ideally, this should be -a privileged port below 1024. This directive may not appear within a virtual -server. (Default: 777) - -.IP "GridSiteCastGroup group[:port]" -A UDP multicast group on which to listen for HTCP queries, plus an optional -port. If no port is given, then 777 is used. Multiple GridSiteCastGroup -directives can be given to cause the UDP responder to listen to more than -one multicast group. This directive may not appear within a virtual server. - -.IP "GridSiteCastAlias URL-prefix path-prefix" -Maps SiteCast generic URLs to the local filesystem. When processing -HTCP queries, matching SiteCast URLs will have URL-prefix stripped off -and the remaining portion of the URL added to path-prefix to construct a -local path and filename. If a file is found with that name, a SiteCast HTCP -response will be returned to the querying host. Otherwise the queries are -ignored. -This directive may appear within virtual servers, and the virtual server's -servername and first port will determine the host and port name used to -construct the transfer URL. - -.SH ENVIRONMENT - -The following variables are present in the environment of CGI programs and -other dynamic content systems if the -.BR "GridSiteEnvs on" -directive is in effect. - -.IP GRST_PERM -Numerical value of the permission bit-map obtained by comparing the -user with the GACL in force. (These should be tested using the -GRSTgaclPermHasXXXX functions from GACL.) - -.IP GRST_ADMIN_LIST -URI of the DN List, listing people with full admin and write access -to the whole site. - -.IP GRST_GSIPROXY_LIMIT -Maximum valid delegation level for GSI Proxies. - -.IP GRST_DIR_PATH -Absolute path in the local filesystem to the directory holding the -file being requested. - -.IP GRST_DESTINATION_TRANSLATED -Present if a WebDAV -.BR "Destination:" -header was given in the request with a local URL. Contains the translation of -the URL given into an absolute path in the local filesystem. - -.IP GRST_HELP_URI -URI of website help pages set by GridSiteHelpURI directive. - -.IP GRST_ADMIN_FILE -Filename of per-directory ghost gridsite-admin.cgi program. (This is -used by real-gridsite-admin.cgi to construct links in its pages.) - -.IP GRST_EDITABLE -Space-separated list of extensions which can safely be edited with a -Text/HTML editor. - -.IP "GRST_HEAD_FILE and GRST_FOOT_FILE" -Filenames of standard header and footer files. - -.IP GRST_DN_LISTS -DN lists search path. - -.IP GRST_DN_LISTS_URI -Directory of virtual URIs used to publish this site's DN Lists. - -.IP GRST_UNZIP -Full path to the -.BR "unzip(1)" -binary, used to list and unpack .zip files. - -.IP GRST_NO_LINK -If set, do not include credit links to GridSite in page footers. - -.IP GRST_ACL_FORMAT -Format to use when writing .gacl files: either GACL or XACML. - -.IP GRST_EXEC_METHOD -Specified by -.BR GridSiteExecMethod -either suexec, X509DN or directory. - -.IP GRST_EXEC_DIRECTORY -The directory containing the CGI script or executable (used by gsexec -to determine which pool account to use in directory mapping mode.) - -.IP GRST_DISK_MODE -The -.BR Apache -disk permission modes bit pattern, in hexadecimal, starting with 0x. -(Similar to the Unix bit pattern, except with hexadecimal rather than -octal values: eg 0x600 [Apache] vs 0600 [Unix] -are both read/write for user only.) - -.SH AUTHOR -Andrew McNab - -mod_gridsite is part of GridSite: http://www.gridsite.org/ -.SH "SEE ALSO" -.BR htcp(1), -.BR httpd(8), -.BR gsexec(8) diff --git a/org.gridsite.core/doc/urlencode.1 b/org.gridsite.core/doc/urlencode.1 deleted file mode 100644 index 7cdfbc3..0000000 --- a/org.gridsite.core/doc/urlencode.1 +++ /dev/null @@ -1,43 +0,0 @@ -.TH URLENCODE 1 "November 2003" "urlencode" "GridSite Manual" -.SH NAME -.B urlencode -\- convert strings to or from URL-encoded form -.SH SYNOPSIS -.B urlencode -[-m|-d] -.I string [string ...] -.SH DESCRIPTION -.B urlencode -encodes strings according to RFC 1738. - -That is, characters A-Z a-z 0-9 . _ -and - are passed through unmodified, but all other characters are -represented as %HH, where HH is their two-digit upper-case hexadecimal ASCII -representation. -For example, the URL http://www.gridpp.ac.uk/ becomes -http%3A%2F%2Fwww.gridpp.ac.uk%2F - -.B urlencode -converts each character in all the strings given on the command line. If -multiple strings are given, they are concatenated with separating spaces -before conversion. - -.SH OPTIONS -.IP "-m" -Instead of full conversion, do GridSite "mild URL encoding" in which A-Z a-z -0-9 . = - _ @ and / are passed through unmodified. This results in slightly -more human-readable strings but the application must be prepared to create -or simulate the directories implied by any slashes. - -.IP "-d" -Do URL-decoding rather than encoding, according to RFC 1738. %HH and %hh -strings are converted and other characters are passed through unmodified, -with the exception that + is converted to space. - -.SH EXIT CODES -0 is always returned. - -.SH AUTHOR -Andrew McNab - -urlencode is part of GridSite: http://www.gridsite.org/ diff --git a/org.gridsite.core/interface/gridsite-gacl.h b/org.gridsite.core/interface/gridsite-gacl.h deleted file mode 100644 index f739c00..0000000 --- a/org.gridsite.core/interface/gridsite-gacl.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - Copyright (c) 2002-4, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*---------------------------------------------------------------* - * For more about GridSite: http://www.gridsite.org/ * - *---------------------------------------------------------------*/ - -#ifndef HEADER_GACL_H -#define HEADER_GACL_H -#endif - -#ifndef GACL_LIB_VERSION -#define GACL_LIB_VERSION "x.x.x" -#endif - -typedef GRSTgaclCred GACLcred; - -typedef int GACLaction; -typedef unsigned int GACLperm; - -typedef GRSTgaclEntry GACLentry; - -typedef GRSTgaclAcl GACLacl; - -typedef GRSTgaclUser GACLuser; - -extern char *gacl_perm_syms[]; -extern GACLperm gacl_perm_vals[]; - -#define GACL_PERM_NONE GRST_PERM_NONE -#define GACL_PERM_READ GRST_PERM_READ -#define GACL_PERM_LIST GRST_PERM_LIST -#define GACL_PERM_WRITE GRST_PERM_WRITE -#define GACL_PERM_ADMIN GRST_PERM_ADMIN - -#define GACLhasNone(perm) (perm == 0) -#define GACLhasRead(perm) ((perm & GRST_PERM_READ) != 0) -#define GACLhasList(perm) ((perm & GRST_PERM_LIST) != 0) -#define GACLhasWrite(perm) ((perm & GRST_PERM_WRITE) != 0) -#define GACLhasAdmin(perm) ((perm & GRST_PERM_ADMIN) != 0) - -#define GACL_ACTION_ALLOW GRST_ACTION_ALLOW -#define GACL_ACTION_DENY GRST_ACTION_DENY - -#define GACL_ACL_FILE GRST_ACL_FILE -#define GACL_DN_LISTS GRST_DN_LISTS - -#define GACLinit() GRSTgaclInit() - -#define GACLnewCred(x) GRSTgaclCredNew((x)) -/* GACLcred *GACLnewCred(char *); */ - -#define GACLaddToCred(x,y,z) GRSTgaclCredAddValue((x),(y),(z)) -/* int GACLaddToCred(GACLcred *, char *, char *); */ - -#define GACLfreeCred(x) GRSTgaclCredFree((x)) -/* int GACLfreeCred(GACLcred *); */ - -#define GACLaddCred(x,y) GRSTgaclEntryAddCred((x),(y)) -/* int GACLaddCred(GACLentry *, GACLcred *); */ - -#define GACLdelCred(x,y) GRSTgaclEntryDelCred((x),(y)) -/* int GACLdelCred(GACLentry *, GACLcred *); */ - -#define GACLprintCred(x,y) GRSTgaclCredPrint((x),(y)) -/* int GACLprintCred(GACLcred *, FILE *); */ - - -#define GACLnewEntry() GRSTgaclEntryNew() -/* GACLentry *GACLnewEntry(void); */ - -#define GACLfreeEntry(x) GRSTgaclEntryFree((x)) -/* int GACLfreeEntry(GACLentry *); */ - -#define GACLaddEntry(x,y) GRSTgaclAclAddEntry((x),(y)) -/* int GACLaddEntry(GACLacl *, GACLentry *); */ - -#define GACLprintEntry(x,y) GRSTgaclEntryPrint((x),(y)) -/* int GACLprintEntry(GACLentry *, FILE *); */ - - -#define GACLprintPerm(x,y) GRSTgaclPermPrint((x),(y)) -/* int GACLprintPerm(GACLperm, FILE *); */ - -#define GACLallowPerm(x,y) GRSTgaclEntryAllowPerm((x),(y)) -/* int GACLallowPerm(GACLentry *, GACLperm); */ - -#define GACLunallowPerm(x,y) GRSTgaclEntryUnallowPerm((x),(y)) -/* int GACLunallowPerm(GACLentry *, GACLperm); */ - -#define GACLdenyPerm(x,y) GRSTgaclEntryDenyPerm((x),(y)) -/* int GACLdenyPerm(GACLentry *, GACLperm); */ - -#define GACLundenyPerm(x,y) GRSTgaclEntryUndenyPerm((x),(y)) -/* int GACLundenyPerm(GACLentry *, GACLperm); */ - -#define GACLpermToChar(x) GRSTgaclPermToChar((x)) -/* char *GACLpermToChar(GACLperm); */ - -#define GACLcharToPerm(x) GRSTgaclPermFromChar((x)) -/* GACLperm GACLcharToPerm(char *); */ - -#define GACLnewAcl() GRSTgaclAclNew() -/* GACLacl *GACLnewAcl(void); */ - -#define GACLfreeAcl(x) GRSTgaclAclFree((x)) -/* int GACLfreeAcl(GACLacl *); */ - -#define GACLprintAcl(x,y) GRSTgaclAclPrint((x),(y)) -/* int GACLprintAcl(GACLacl *, FILE *); */ - -#define GACLsaveAcl(x,y) GRSTgaclAclSave((y),(x)) -/* int GACLsaveAcl(char *, GACLacl *); */ - -#define GACLloadAcl(x) GRSTgaclAclLoadFile((x)) -/* GACLacl *GACLloadAcl(char *); */ - -#define GACLfindAclForFile(x) GRSTgaclFileFindAclname((x)) -/* char *GACLfindAclForFile(char *); */ - -#define GACLloadAclForFile(x) GRSTgaclAclLoadforFile((x)) -/* GACLacl *GACLloadAclForFile(char *); */ - -#define GACLisAclFile(x) GRSTgaclFileIsAcl((x)) -/* int GACLisAclFile(char *); */ - - -#define GACLnewUser(x) GRSTgaclUserNew((x)) -/* GACLuser *GACLnewUser(GACLcred *); */ - -#define GACLfreeUser(x) GRSTgaclUserFree((x)) -/* int GACLfreeUser(GACLuser *); */ - -#define GACLuserAddCred(x,y) GRSTgaclUserAddCred((x),(y)) -/* int GACLuserAddCred(GACLuser *, GACLcred *); */ - -#define GACLuserHasCred(x,y) GRSTgaclUserHasCred((x),(y)) -/* int GACLuserHasCred(GACLuser *, GACLcred *); */ - -#define GACLuserFindCredType(x,y) GRSTgaclUserFindCredtype((x),(y)) -/* GACLcred *GACLuserFindCredType(GACLuser *, char *); */ - -#define GACLtestDnList(x,y) GRSTgaclDNlistHasUser((x),(y)) -/* int GACLtestDnList(char *, GACLuser *); */ - -#define GACLtestUserAcl(x,y) GRSTgaclAclTestUser((x),(y)) -/* GACLperm GACLtestUserAcl(GACLacl *, GACLuser *); */ - -#define GACLtestExclAcl(x,y) GRSTgaclAclTestexclUser((x),(y)) -/* GACLperm GACLtestExclAcl(GACLacl *, GACLuser *); */ - - -#define GACLurlEncode(x) GRSThttpUrlEncode((x)) -/* char *GACLurlEncode(char *); */ - -#define GACLmildUrlEncode(x) GRSThttpUrlMildencode((x)) -/* char *GACLmildUrlEncode(char *); */ - -GACLentry *GRSTgaclEntryParse(xmlNodePtr cur); -/* special function for legacy EDG LB service */ diff --git a/org.gridsite.core/interface/gridsite.h b/org.gridsite.core/interface/gridsite.h deleted file mode 100644 index ab150b1..0000000 --- a/org.gridsite.core/interface/gridsite.h +++ /dev/null @@ -1,379 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*---------------------------------------------------------------* - * For more about GridSite: http://www.gridsite.org/ * - *---------------------------------------------------------------*/ - -#ifndef HEADER_SSL_H -#include -#endif - -#ifndef HEADER_CRYPTO_H -#include -#endif - -#ifndef FALSE -#define FALSE (0) -#endif -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -/// Everything ok (= OpenSSL X509_V_OK) -#define GRST_RET_OK 0 - -/// Failed for unspecified reason -#define GRST_RET_FAILED 1000 - -/// Failed to find certificate in some cert store / directory -#define GRST_RET_CERT_NOT_FOUND 1001 - -/// Bad signature -#define GRST_RET_BAD_SIGNATURE 1002 - -/// No such file or directory -#define GRST_RET_NO_SUCH_FILE 1003 - - -// #define GRSTerrorLog(GRSTerrorLevel, GRSTerrorFmt, ...) if (GRSTerrorLogFunc != NULL) (GRSTerrorLogFunc)(__FILE__, __LINE__, GRSTerrorLevel, GRSTerrorFmt, __VA_ARGS__) - -#define GRSTerrorLog(GRSTerrorLevel, ...) if (GRSTerrorLogFunc != NULL) (GRSTerrorLogFunc)(__FILE__, __LINE__, GRSTerrorLevel, __VA_ARGS__) - -void (*GRSTerrorLogFunc)(char *, int, int, char *, ...); - -/* these levels are the same as Unix syslog() and Apache ap_log_error() */ - -#define GRST_LOG_EMERG 0 -#define GRST_LOG_ALERT 1 -#define GRST_LOG_CRIT 2 -#define GRST_LOG_ERR 3 -#define GRST_LOG_WARNING 4 -#define GRST_LOG_NOTICE 5 -#define GRST_LOG_INFO 6 -#define GRST_LOG_DEBUG 7 - -typedef struct { char *name; - char *value; - void *next; } GRSTgaclNamevalue; - -typedef struct { char *type; - int delegation; - GRSTgaclNamevalue *firstname; - void *next; } GRSTgaclCred; - -typedef int GRSTgaclAction; -typedef unsigned int GRSTgaclPerm; - -typedef struct { GRSTgaclCred *firstcred; - GRSTgaclPerm allowed; - GRSTgaclPerm denied; - void *next; } GRSTgaclEntry; - -typedef struct { GRSTgaclEntry *firstentry; } GRSTgaclAcl; - -typedef struct { GRSTgaclCred *firstcred; - char *dnlists; } GRSTgaclUser; - -#define GRST_PERM_NONE 0 -#define GRST_PERM_READ 1 -#define GRST_PERM_EXEC 2 -#define GRST_PERM_LIST 4 -#define GRST_PERM_WRITE 8 -#define GRST_PERM_ADMIN 16 -#define GRST_PERM_ALL 31 - -/* DO NOT USE PermIsNone!! */ -#define GRSTgaclPermIsNone(perm) ((perm) == 0) - -#define GRSTgaclPermHasNone(perm) ((perm) == 0) -#define GRSTgaclPermHasRead(perm) (((perm) & GRST_PERM_READ ) != 0) -#define GRSTgaclPermHasExec(perm) (((perm) & GRST_PERM_EXEC ) != 0) -#define GRSTgaclPermHasList(perm) (((perm) & GRST_PERM_LIST ) != 0) -#define GRSTgaclPermHasWrite(perm) (((perm) & GRST_PERM_WRITE) != 0) -#define GRSTgaclPermHasAdmin(perm) (((perm) & GRST_PERM_ADMIN) != 0) - -#define GRST_ACTION_ALLOW 0 -#define GRST_ACTION_DENY 1 - -#define GRST_HIST_PREFIX ".grsthist" -#define GRST_ACL_FILE ".gacl" -#define GRST_DN_LISTS "/etc/grid-security/dn-lists" -#define GRST_RECURS_LIMIT 9 - -#define GRST_PROXYCERTINFO_OID "1.3.6.1.4.1.3536.1.222" -#define GRST_VOMS_OID "1.3.6.1.4.1.8005.100.100.5" -#define GRST_VOMS_DIR "/etc/grid-security/vomsdir" - -#define GRST_ASN1_MAXCOORDLEN 50 -#define GRST_ASN1_MAXTAGS 500 - -struct GRSTasn1TagList { char treecoords[GRST_ASN1_MAXCOORDLEN+1]; - int start; - int headerlength; - int length; - int tag; } ; - -typedef struct { int type; /* CA, user, proxy, VOMS, ... */ - int errors; /* unchecked, bad sig, bad time */ - char *ca; /* Cert CA DN, or VOMS issuer CA */ - char *dn; /* Cert DN, or VOMS issuer DN */ - char *value; /* VOMS FQAN or NULL */ - time_t start; - time_t finish; - int serial; - char *ocsp; /* accessLocation field */ - void *raw; /* X509 or VOMS Extension object */ - void *next; } GRSTx509Cert; - -#define GRST_CERT_BAD_FORMAT 1 -#define GRST_CERT_BAD_CHAIN 2 -#define GRST_CERT_BAD_SIG 4 -#define GRST_CERT_BAD_TIME 8 -#define GRST_CERT_BAD_OCSP 16 - -#define GRST_CERT_TYPE_CA 1 -#define GRST_CERT_TYPE_EEC 2 -#define GRST_CERT_TYPE_PROXY 3 -#define GRST_CERT_TYPE_VOMS 4 - -/* a chain of certs, starting from the first CA */ -typedef struct { GRSTx509Cert *firstcert; } GRSTx509Chain; - -int GRSTx509CertLoad(GRSTx509Cert *, X509 *); -int GRSTx509ChainLoadCheck(GRSTx509Chain **, STACK_OF(X509) *, X509 *, char *); -int GRSTx509ChainFree(GRSTx509Chain *); - -#define GRST_HTTP_PORT 777 -#define GRST_HTTPS_PORT 488 -#define GRST_HTCP_PORT 777 -#define GRST_GSIFTP_PORT 2811 - -#define GRSThtcpNOPop 0 -#define GRSThtcpTSTop 1 - -typedef struct { unsigned char length_msb; - unsigned char length_lsb; - char text[1]; } GRSThtcpCountstr; - -#define GRSThtcpCountstrLen(string) (256*((string)->length_msb) + (string)->length_lsb) - -typedef struct { unsigned char total_length_msb; - unsigned char total_length_lsb; - unsigned char version_msb; - unsigned char version_lsb; - unsigned char data_length_msb; - unsigned char data_length_lsb; - unsigned int response : 4; - unsigned int opcode : 4; - unsigned int rr : 1; - unsigned int f1 : 1; - unsigned int reserved : 6; - unsigned int trans_id; /* must be 4 bytes */ - GRSThtcpCountstr *method; - GRSThtcpCountstr *uri; - GRSThtcpCountstr *version; - GRSThtcpCountstr *req_hdrs; - GRSThtcpCountstr *resp_hdrs; - GRSThtcpCountstr *entity_hdrs; - GRSThtcpCountstr *cache_hdrs; } GRSThtcpMessage; - -int GRSTgaclInit(void); - -/* #define GACLnewCred(x) GRSTgaclCredNew((x)) */ -GRSTgaclCred *GRSTgaclCredNew(char *); - -/* #define GACLaddToCred(x,y,z) GRSTgaclCredAddValue((x),(y),(z)) */ -int GRSTgaclCredAddValue(GRSTgaclCred *, char *, char *); - -#define GRSTgaclCredSetDelegation(cred, level) ((cred)->delegation = (level)) -#define GRSTgaclCredGetDelegation(cred) ((cred)->delegation) - -/* #define GACLfreeCred(x) GRSTgaclCredFree((x)) */ -int GRSTgaclCredFree(GRSTgaclCred *); - -/* #define GACLaddCred(x,y) GRSTgaclEntryAddCred((x),(y)) */ -int GRSTgaclEntryAddCred(GRSTgaclEntry *, GRSTgaclCred *); - -/* #define GACLdelCred(x,y) GRSTgaclEntryDelCred((x),(y)) */ -int GRSTgaclEntryDelCred(GRSTgaclEntry *, GRSTgaclCred *); - -/* #define GACLprintCred(x,y) GRSTgaclCredPrint((x),(y)) */ -int GRSTgaclCredCredPrint(GRSTgaclCred *, FILE *); - - -/* #define GACLnewEntry(x) GRSTgaclEntryNew((x)) */ -GRSTgaclEntry *GRSTgaclEntryNew(void); - -/* #define GACLfreeEntry(x) GRSTgaclEntryFree((x)) */ -int GRSTgaclEntryFree(GRSTgaclEntry *); - -/* #define GACLaddEntry(x,y) GRSTgaclAclAddEntry((x),(y)) */ -int GRSTgaclAclAddEntry(GRSTgaclAcl *, GRSTgaclEntry *); - -/* #define GACLprintEntry(x,y) GRSTgaclEntryPrint((x),(y)) */ -int GRSTgaclEntryPrint(GRSTgaclEntry *, FILE *); - - -/* #define GACLprintPerm(x,y) GRSTgaclPermPrint((x),(y)) */ -int GRSTgaclPermPrint(GRSTgaclPerm, FILE *); - -/* #define GACLallowPerm(x,y) GRSTgaclEntryAllowPerm((x),(y)) */ -int GRSTgaclEntryAllowPerm(GRSTgaclEntry *, GRSTgaclPerm); - -/* #define GACLunallowPerm(x,y) GRSTgaclEntryUnallowPerm((x),(y)) */ -int GRSTgaclEntryUnallowPerm(GRSTgaclEntry *, GRSTgaclPerm); - -/* #define GACLdenyPerm(x,y) GRSTgaclEntryDenyPerm((x),(y)) */ -int GRSTgaclEntryDenyPerm(GRSTgaclEntry *, GRSTgaclPerm); - -/* #define GACLundenyPerm(x,y) GRSTgaclEntryUndenyPerm((x),(y)) */ -int GRSTgaclEntryUndenyPerm(GRSTgaclEntry *, GRSTgaclPerm); - -/* #define GACLpermToChar(x) GRSTgaclPermToChar((x)) */ -char *GRSTgaclPermToChar(GRSTgaclPerm); - -/* #define GACLcharToPerm(x) GRSTgaclPermFromChar((x)) */ -GRSTgaclPerm GRSTgaclPermFromChar(char *); - -/* #define GACLnewAcl(x) GRSTgaclAclNew((x)) */ -GRSTgaclAcl *GRSTgaclAclNew(void); - -/* #define GACLfreeAcl(x) GRSTgaclAclFree((x)) */ -int GRSTgaclAclFree(GRSTgaclAcl *); - -/* #define GACLprintAcl(x,y) GRSTgaclAclPrint((x),(y)) */ -int GRSTgaclAclPrint(GRSTgaclAcl *, FILE *); - -/* #define GACLsaveAcl(x,y) GRSTgaclAclSave((y),(x)) */ -int GRSTgaclAclSave(GRSTgaclAcl *, char *); - -/* #define GACLloadAcl(x) GRSTgaclFileLoadAcl((x)) */ -GRSTgaclAcl *GRSTgaclAclLoadFile(char *); - -/* #define GACLfindAclForFile(x) GRSTgaclFileFindAclname((x)) */ -char *GRSTgaclFileFindAclname(char *); - -/* #define GACLloadAclForFile(x) GRSTgaclFileLoadAcl((x)) */ -GRSTgaclAcl *GRSTgaclAclLoadforFile(char *); - -/* #define GACLisAclFile(x) GRSTgaclFileIsAcl((x)) */ -int GRSTgaclFileIsAcl(char *); - - -/* #define GACLnewUser(x) GRSTgaclUserNew((x)) */ -GRSTgaclUser *GRSTgaclUserNew(GRSTgaclCred *); - -/* #define GACLfreeUser(x) GRSTgaclUserFree((x)) */ -int GRSTgaclUserFree(GRSTgaclUser *); - -/* #define GACLuserAddCred(x,y) GRSTgaclUserAddCred((x),(y)) */ -int GRSTgaclUserAddCred(GRSTgaclUser *, GRSTgaclCred *); - -/* #define GACLuserHasCred(x,y) GRSTgaclUserHasCred((x),(y)) */ -int GRSTgaclUserHasCred(GRSTgaclUser *, GRSTgaclCred *); - -int GRSTgaclUserSetDNlists(GRSTgaclUser *, char *); - -/* #define GACLuserFindCredType(x,y) GRSTgaclUserFindCredtype((x),(y)) */ -GRSTgaclCred *GRSTgaclUserFindCredtype(GRSTgaclUser *, char *); - -/* #define GACLtestDnList(x,y) GRSTgaclDNlistHasUser((x),(y)) */ -int GRSTgaclDNlistHasUser(char *, GRSTgaclUser *); - -/* #define GACLtestUserAcl(x,y) GRSTgaclAclTestUser((x),(y)) */ -GRSTgaclPerm GRSTgaclAclTestUser(GRSTgaclAcl *, GRSTgaclUser *); - -/* #define GACLtestExclAcl(x,y) GRSTgaclAclTestexclUser((x),(y)) */ -GRSTgaclPerm GRSTgaclAclTestexclUser(GRSTgaclAcl *, GRSTgaclUser *); - -char *GRSThttpUrlDecode(char *); - -/* #define GACLurlEncode(x) GRSThttpUrlEncode((x)) */ -char *GRSThttpUrlEncode(char *); - -/* #define GACLmildUrlEncode(x) GRSThttpMildUrlEncode((x)) */ -char *GRSThttpUrlMildencode(char *); - -int GRSTx509NameCmp(char *, char *); - -int GRSTx509KnownCriticalExts(X509 *); - -int GRSTx509IsCA(X509 *); -int GRSTx509CheckChain(int *, X509_STORE_CTX *); -int GRSTx509VerifyCallback(int, X509_STORE_CTX *); - -int GRSTx509GetVomsCreds(int *, int, size_t, char *, X509 *, STACK_OF(X509) *, char *); -GRSTgaclCred *GRSTx509CompactToCred(char *); -int GRSTx509CompactCreds(int *, int, size_t, char *, STACK_OF(X509) *, char *, X509 *); -char *GRSTx509CachedProxyFind(char *, char *, char *); -char *GRSTx509FindProxyFileName(void); -int GRSTx509MakeProxyCert(char **, FILE *, char *, char *, char *, int); -char *GRSTx509CachedProxyKeyFind(char *, char *, char *); -int GRSTx509ProxyDestroy(char *, char *, char *); -int GRSTx509ProxyGetTimes(char *, char *, char *, time_t *, time_t *); -int GRSTx509CreateProxyRequest(char **, char **, char *); -int GRSTx509MakeProxyRequest(char **, char *, char *, char *); -int GRSTx509StringToChain(STACK_OF(X509) **, char *); -char *GRSTx509MakeDelegationID(void); -char *GRSTx509MakeProxyFileName(char *, STACK_OF(X509) *); -int GRSTx509CacheProxy(char *, char *, char *, char *); - -#define GRST_HEADFILE "gridsitehead.txt" -#define GRST_FOOTFILE "gridsitefoot.txt" -#define GRST_ADMIN_FILE "gridsite-admin.cgi" - -typedef struct { char *text; - void *next; } GRSThttpCharsList; - -typedef struct { size_t size; - GRSThttpCharsList *first; - GRSThttpCharsList *last; } GRSThttpBody; - -void GRSThttpBodyInit(GRSThttpBody *); -void GRSThttpPrintf(GRSThttpBody *, char *, ...); -int GRSThttpCopy(GRSThttpBody *, char *); -void GRSThttpWriteOut(GRSThttpBody *); -int GRSThttpPrintHeaderFooter(GRSThttpBody *, char *, char *); -char *GRSThttpGetCGI(char *); - -time_t GRSTasn1TimeToTimeT(char *, size_t); -int GRSTasn1SearchTaglist(struct GRSTasn1TagList taglist[], int, char *); -int GRSTasn1ParseDump(BIO *, unsigned char *, long, - struct GRSTasn1TagList taglist[], int, int *); -int GRSTasn1GetX509Name(char *, int, char *, char *, - struct GRSTasn1TagList taglist[], int); - -int GRSThtcpNOPrequestMake(char **, int *, unsigned int); -int GRSThtcpNOPresponseMake(char **, int *, unsigned int); -int GRSThtcpTSTrequestMake(char **, int *, unsigned int, char *, char *, char *); -int GRSThtcpTSTresponseMake(char **, int *, unsigned int, char *, char *, char *); -int GRSThtcpMessageParse(GRSThtcpMessage *, char *, int); diff --git a/org.gridsite.core/project/build.number b/org.gridsite.core/project/build.number deleted file mode 100644 index e3c0104..0000000 --- a/org.gridsite.core/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Feb 23 03:19:54 CET 2005 -module.build=141 diff --git a/org.gridsite.core/project/build.properties b/org.gridsite.core/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.gridsite.core/project/configure.properties.xml b/org.gridsite.core/project/configure.properties.xml deleted file mode 100644 index c4067ab..0000000 --- a/org.gridsite.core/project/configure.properties.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/org.gridsite.core/project/dependencies.properties b/org.gridsite.core/project/dependencies.properties deleted file mode 100644 index 2a7383b..0000000 --- a/org.gridsite.core/project/dependencies.properties +++ /dev/null @@ -1,9 +0,0 @@ -################################################################### -# System dependencies -################################################################### - -org.glite.version = HEAD -org.glite.core.version = HEAD - -# Component dependencies tag = do not remove this line = - diff --git a/org.gridsite.core/project/gridsite.core.csf.xml b/org.gridsite.core/project/gridsite.core.csf.xml deleted file mode 100644 index 7ca38dc..0000000 --- a/org.gridsite.core/project/gridsite.core.csf.xml +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The org.glite and org.gridsite.core modules have been updated, please rerun the configuration file - - - - The org.glite and org.gridsite.core modules have been updated, please rerun the configuration file - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.gridsite.core/project/properties.xml b/org.gridsite.core/project/properties.xml deleted file mode 100644 index 74f88dc..0000000 --- a/org.gridsite.core/project/properties.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.gridsite.core/project/taskdefs.xml b/org.gridsite.core/project/taskdefs.xml deleted file mode 100644 index 9c35cef..0000000 --- a/org.gridsite.core/project/taskdefs.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/org.gridsite.core/project/version.properties b/org.gridsite.core/project/version.properties deleted file mode 100644 index 3a10dac..0000000 --- a/org.gridsite.core/project/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -module.version=1.3.4 -module.age=1 diff --git a/org.gridsite.core/src/Doxyfile b/org.gridsite.core/src/Doxyfile deleted file mode 100644 index 14f88e0..0000000 --- a/org.gridsite.core/src/Doxyfile +++ /dev/null @@ -1,993 +0,0 @@ -# Doxyfile 1.2.18 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# General configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with english messages), Korean, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish and Ukrainian. - -OUTPUT_LANGUAGE = English - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these class will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. - -STRIP_FROM_PATH = - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower case letters. If set to YES upper case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# users are adviced to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explict @brief command for a brief description. - -JAVADOC_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# reimplements. - -INHERIT_DOCS = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consist of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. -# For instance some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = . ../interface - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. - -INPUT_FILTER = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = doxygen - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet - -HTML_STYLESHEET = doxygen.css - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output dir. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non empty doxygen will try to run -# the html help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the Html help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = YES - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, -# or Internet explorer 4.0+). Note that for large projects the tree generation -# can take a very long time. In such cases it is better to disable this feature. -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimised for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assigments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_XML = NO - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = NO - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::addtions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES tag can be used to specify one or more tagfiles. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superceded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yield more powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermedate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO - -# The CGI_NAME tag should be the name of the CGI script that -# starts the search engine (doxysearch) with the correct parameters. -# A script with this name will be generated by doxygen. - -CGI_NAME = search.cgi - -# The CGI_URL tag should be the absolute URL to the directory where the -# cgi binaries are located. See the documentation of your http daemon for -# details. - -CGI_URL = - -# The DOC_URL tag should be the absolute URL to the directory where the -# documentation is located. If left blank the absolute path to the -# documentation, with file:// prepended to it, will be used. - -DOC_URL = - -# The DOC_ABSPATH tag should be the absolute path to the directory where the -# documentation is located. If left blank the directory on the local machine -# will be used. - -DOC_ABSPATH = - -# The BIN_ABSPATH tag must point to the directory where the doxysearch binary -# is installed. - -BIN_ABSPATH = /usr/local/bin/ - -# The EXT_DOC_PATHS tag can be used to specify one or more paths to -# documentation generated for other projects. This allows doxysearch to search -# the documentation for these projects as well. - -EXT_DOC_PATHS = diff --git a/org.gridsite.core/src/Makefile b/org.gridsite.core/src/Makefile deleted file mode 100644 index 8339bc5..0000000 --- a/org.gridsite.core/src/Makefile +++ /dev/null @@ -1,480 +0,0 @@ -# -# Andrew McNab and Shiv Kaushal, University of Manchester. -# Copyright (c) 2002-6. All rights reserved. -# -# Redistribution and use in source and binary forms, with or -# without modification, are permitted provided that the following -# conditions are met: -# -# o Redistributions of source code must retain the above -# copyright notice, this list of conditions and the following -# disclaimer. -# o Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials -# provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -#--------------------------------------------------------------- -# For more information about GridSite: http://www.gridsite.org/ -#--------------------------------------------------------------- - -include ../VERSION - -RPMCMD=$(shell if [ -x /usr/bin/rpmbuild ] ; then echo /usr/bin/rpmbuild; else echo rpm; fi) - -ifndef MYRPMDIR -export MYRPMDIR=$(shell pwd)/../RPMTMP -endif - -ifndef prefix -export prefix=/usr/local -endif - -ifndef MYCFLAGS -export MYCFLAGS=-I. -I../interface $(HTTPD_FLAGS) -I/usr/include/httpd -I/usr/include/apr-0 -I/opt/glite/include -fPIC -endif - -ifndef MYLDFLAGS -export MYLDFLAGS=-L. -endif - - - -# -# Build -# - -build: apidoc build-lib \ - htcp gridsite-copy.cgi mod_gridsite.so \ - urlencode findproxyfile real-gridsite-admin.cgi gsexec - -build-lib: libgridsite_globus.so.$(VERSION) libgridsite_globus.a \ - libgridsite.so.$(VERSION) libgridsite.a - -# First, normal versions using system OpenSSL rather than Globus OpenSSL - -libgridsite.so.$(VERSION): grst_err.o grst_x509.o grst_gacl.o grst_xacml.o \ - grst_http.o grst_asn1.o grst_htcp.o - gcc -shared -Wl,-soname,libgridsite.so.$(MINOR_VERSION) \ - -o libgridsite.so.$(PATCH_VERSION) -lcrypto `xml2-config --libs` \ - grst_err.o grst_x509.o grst_gacl.o grst_xacml.o grst_http.o \ - grst_asn1.o grst_htcp.o - ln -sf libgridsite.so.$(VERSION) libgridsite.so - ln -sf libgridsite.so.$(VERSION) libgridsite.so.$(MINOR_VERSION) - -libgridsite.a: grst_err.o grst_x509.o grst_gacl.o grst_xacml.o grst_http.o grst_asn1.o grst_htcp.o - ar src libgridsite.a grst_err.o grst_x509.o grst_gacl.o grst_xacml.o grst_http.o grst_asn1.o grst_htcp.o - -grst_err.o: grst_err.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) \ - -I/usr/kerberos/include \ - -c grst_err.c - -grst_x509.o: grst_x509.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) \ - -I/usr/kerberos/include -c grst_x509.c - -grst_gacl.o: grst_gacl.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) \ - -I/usr/kerberos/include `xml2-config --cflags` -c grst_gacl.c - -grst_xacml.o: grst_xacml.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) \ - -I/usr/kerberos/include `xml2-config --cflags` -c grst_xacml.c - -grst_http.o: grst_http.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) \ - -I/usr/kerberos/include -c grst_http.c - -grst_asn1.o: grst_asn1.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) \ - -I/usr/kerberos/include -c grst_asn1.c - -grst_htcp.o: grst_htcp.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) \ - -I/usr/kerberos/include -c grst_htcp.c - -# Then build versions using Globus OpenSSL if configured - -ifdef OPENSSL_GLOBUS_LIBS - -libgridsite_globus.so.$(VERSION): grst_err_globus.o \ - grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o \ - grst_asn1_globus.o grst_xacml_globus.o grst_htcp_globus.o - gcc -shared -Wl,-soname,libgridsite_globus.so.$(MINOR_VERSION) \ - -o libgridsite_globus.so.$(PATCH_VERSION) \ - grst_err_globus.o grst_x509_globus.o grst_gacl_globus.o grst_xacml_globus.o \ - grst_http_globus.o grst_asn1_globus.o - ln -sf libgridsite_globus.so.$(VERSION) libgridsite_globus.so - -libgridsite_globus.a: grst_err_globus.o grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o grst_asn1_globus.o - ar src libgridsite_globus.a \ - grst_err_globus.o grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o grst_asn1_globus.o - -grst_err_globus.o: grst_err.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ - -I/usr/kerberos/include \ - -c grst_err.c \ - -o grst_err_globus.o - -grst_x509_globus.o: grst_x509.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ - -I/usr/kerberos/include -c grst_x509.c \ - -o grst_x509_globus.o - -grst_gacl_globus.o: grst_gacl.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ - -I/usr/kerberos/include `xml2-config --cflags` -c grst_gacl.c \ - -o grst_gacl_globus.o - -grst_xacml_globus.o: grst_xacml.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ - -I/usr/kerberos/include `xml2-config --cflags` -c grst_xacml.c \ - -o grst_xacml_globus.o - -grst_http_globus.o: grst_http.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ - -I/usr/kerberos/include -c grst_http.c \ - -o grst_http_globus.o - -grst_asn1_globus.o: grst_asn1.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ - -I/usr/kerberos/include -c grst_asn1.c \ - -o grst_asn1_globus.o - -grst_htcp_globus.o: grst_htcp.c ../interface/gridsite.h - gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ - -I/usr/kerberos/include -c grst_htcp.c \ - -o grst_htcp_globus.o - -else - -libgridsite_globus.so.$(VERSION): libgridsite.so.$(VERSION) - cp -f libgridsite.so.$(VERSION) libgridsite_globus.so.$(VERSION) - -libgridsite_globus.a: libgridsite.a - cp -f libgridsite.a libgridsite_globus.a - -endif - -gsexec: gsexec.c gsexec.h - gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \ - -o gsexec gsexec.c - -urlencode: urlencode.c libgridsite.so.$(VERSION) - gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \ - -o urlencode urlencode.c -L. \ - -I/usr/kerberos/include \ - -lgridsite - -htcp: htcp.c libgridsite.so.$(VERSION) - gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \ - -o htcp htcp.c -L. \ - -I/usr/kerberos/include \ - `curl-config --cflags` `curl-config --libs` \ - -lgridsite - -gridsite-copy.cgi: gridsite-copy.c libgridsite.so.$(VERSION) - gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \ - -o gridsite-copy.cgi gridsite-copy.c -L. \ - -I/usr/kerberos/include \ - `curl-config --cflags` `curl-config --libs` \ - -lgridsite - -mod_gridsite.so: mod_gridsite.c mod_ssl-private.h libgridsite.so.$(VERSION) - gcc -g $(MYCFLAGS) -shared -Wl,-soname=gridsite_module \ - -I/usr/kerberos/include \ - -I/usr/include/libxml2 \ - -DVERSION=\"$(VERSION)\" -o mod_gridsite.so \ - mod_gridsite.c $(MYLDFLAGS) -lxml2 -lm -lz -lgridsite - -real-gridsite-admin.cgi: grst_admin_main.c grst_admin_gacl.c \ - grst_admin_file.c grst_admin.h - gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o real-gridsite-admin.cgi \ - grst_admin_main.c \ - grst_admin_gacl.c \ - grst_admin_file.c \ - -I/usr/kerberos/include \ - -DVERSION=\"$(VERSION)\" -lgridsite -lssl -lcrypto -lxml2 -lz -lm - -findproxyfile: findproxyfile.c libgridsite.so.$(VERSION) - gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) $(MYLDFLAGS) \ - -o findproxyfile findproxyfile.c -L. \ - -I/usr/kerberos/include -lgridsite \ - -lssl -lcrypto -lxml2 -lz -lm - -showx509exts: showx509exts.c libgridsite.so.$(VERSION) - gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) $(MYLDFLAGS) \ - -o showx509exts showx509exts.c -L. \ - -I/usr/kerberos/include \ - -lgridsite \ - -lssl -lcrypto -lxml2 -lz -lm - -slashgrid: slashgrid.c libgridsite.so.$(VERSION) - gcc -g -o slashgrid -lfuse -lpthread slashgrid.c \ - $(MYCFLAGS) $(MYLDFLAGS) `xml2-config --cflags` \ - -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DFUSE_USE_VERSION=22 \ - -I/usr/kerberos/include `curl-config --cflags` \ - -L. `curl-config --libs` -lgridsite - -# This target is used by make-gridsite-spec to test for FUSE include+libs -fuse-test: fuse-test.c - gcc -g -lfuse fuse-test.c \ - $(MYCFLAGS) $(MYLDFLAGS) `xml2-config --cflags` \ - -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DFUSE_USE_VERSION=22 - -apidoc: - date - doxygen Doxyfile - mkdir -p ../doc/doxygen - cp -f doxygen/*.html doxygen/*.css doxygen/*.png ../doc/doxygen - cd ../doc ; for i in *.1 *.8 ; do ../src/roffit < $$i \ - > $$i.html ; done - -gaclexample: gaclexample.c libgridsite.a - gcc -g -o gaclexample gaclexample.c -I. -L. \ - -I/usr/kerberos/include -lgridsite \ - -lssl -lcrypto -lxml2 -lz -lm - -xacmlexample: xacmlexample.c libgridsite.a - gcc -g -o xacmlexample xacmlexample.c -I. -L. \ - -I/usr/kerberos/include -lgridsite \ - -lssl -lcrypto -lxml2 -lz -lm -# -# Delegation machinery, including SOAP delegation portType. To build this -# you either need to use the gLite build environment and set REPOSITORY -# or install gSOAP and set GSOAPDIR to the directory containing -# soapcpp2 and stdsoap2.h (unless GSOAPDIR is set already) -# - -ifndef GSOAPDIR - export GSOAPDIR=/usr -endif - -ifndef GRIDSITEDIR - export GRIDSITEDIR=/usr -endif - - -DelegationService.wsdl: delegation.h - $(GSOAPDIR)/bin/soapcpp2 -c delegation.h - -gridsite-delegation.cgi: grst-delegation.c delegation.h \ - DelegationService.wsdl libgridsite.so.$(VERSION) - gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o gridsite-delegation.cgi \ - grst-delegation.c \ - -I/usr/kerberos/include -I. -I$(GSOAPDIR)/include \ - -I$(GRIDSITEDIR)/include \ - -DVERSION=\"$(VERSION)\" -L. -L$(GSOAPDIR)/lib \ - -L$(GRIDSITEDIR)/lib \ - soapC.c soapServer.c -lgsoap \ - -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm - -htproxyput: htproxyput.c delegation.h DelegationService.wsdl libgridsite.so.$(VERSION) - gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o htproxyput \ - htproxyput.c \ - -I/usr/kerberos/include -I. \ - -g -DVERSION=\"$(VERSION)\" \ - -I$(GSOAPDIR)/include \ - -I$(GRIDSITEDIR)/include \ - -DWITH_OPENSSL -L. -L$(GSOAPDIR)/lib \ - $(STDSOAP2) \ - soapC.c soapClient.c -lgsoapssl \ - -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm - -# This target is used by make-gridsite-spec to test for gSOAP include+libs -gsoap-test: gsoap-test.c - gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o gsoap-test \ - gsoap-test.c \ - -I/usr/kerberos/include -I. \ - -g -DVERSION=\"$(VERSION)\" \ - -I$(GSOAPDIR)/include \ - -I$(GRIDSITEDIR)/include \ - -DWITH_OPENSSL -L$(GSOAPDIR)/lib \ - $(STDSOAP2) -L$(GRIDSITEDIR)/lib \ - -lgsoapssl -lz -lssl -lcrypto -lxml2 -lm - -clean: - -# -# Install -# - -install: apidoc install-lib - mkdir -p $(prefix)/include \ - $(prefix)/lib \ - $(prefix)/bin \ - $(prefix)/sbin \ - $(prefix)/share/man/man1 \ - $(prefix)/share/man/man8 \ - $(prefix)/lib/httpd/modules \ - $(prefix)/share/doc/gridsite-$(MINOR_VERSION) - cp -f ../interface/gridsite.h $(prefix)/include - cp -f ../interface/gridsite-gacl.h $(prefix)/include - cp -f urlencode $(prefix)/bin - cp -f findproxyfile $(prefix)/bin - cp -f real-gridsite-admin.cgi $(prefix)/sbin - cp -f gridsite-copy.cgi $(prefix)/sbin - cp -f ../CHANGES ../README ../INSTALL ../LICENSE ../VERSION \ - $(prefix)/share/doc/gridsite-$(MINOR_VERSION) - cp -f ../doc/index.html ../doc/*.conf ../doc/*.sh ../doc/*.spec \ - $(prefix)/share/doc/gridsite-$(MINOR_VERSION) - for i in htcp.1 htfind.1 htll.1 htls.1 htmkdir.1 htmv.1 htping.1 \ - htrm.1 urlencode.1 findproxyfile.1 ; do \ - cp -f ../doc/$$i.html $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/man/man1 ; \ - gzip -f $(prefix)/share/man/man1/$$i ; done - for i in mod_gridsite.8 gsexec.8 ; do \ - cp -f ../doc/$$i.html $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/man/man8 ; \ - gzip -f $(prefix)/share/man/man8/$$i ; done - cp -f htcp $(prefix)/bin - ln -sf htcp $(prefix)/bin/htls - ln -sf htcp $(prefix)/bin/htll - ln -sf htcp $(prefix)/bin/htrm - ln -sf htcp $(prefix)/bin/htmkdir - ln -sf htcp $(prefix)/bin/htmv - ln -sf htcp $(prefix)/bin/htping - ln -sf htcp $(prefix)/bin/htfind - cp -f gsexec $(prefix)/sbin - cp -f mod_gridsite.so $(prefix)/lib/httpd/modules - -install-lib: - mkdir -p $(prefix)/lib - cp -f libgridsite.a $(prefix)/lib - cp -f libgridsite.so.$(PATCH_VERSION) $(prefix)/lib - ln -sf libgridsite.so.$(PATCH_VERSION) \ - $(prefix)/lib/libgridsite.so - ln -sf libgridsite.so.$(PATCH_VERSION) \ - $(prefix)/lib/libgridsite.so.$(MAJOR_VERSION) - ln -sf libgridsite.so.$(PATCH_VERSION) \ - $(prefix)/lib/libgridsite.so.$(MINOR_VERSION) - cp -f libgridsite_globus.a $(prefix)/lib - cp -f libgridsite_globus.so.$(PATCH_VERSION) $(prefix)/lib - ln -sf libgridsite_globus.so.$(PATCH_VERSION) \ - $(prefix)/lib/libgridsite_globus.so - ln -sf libgridsite_globus.so.$(PATCH_VERSION) \ - $(prefix)/lib/libgridsite_globus.so.$(MAJOR_VERSION) - ln -sf libgridsite_globus.so.$(PATCH_VERSION) \ - $(prefix)/lib/libgridsite_globus.so.$(MINOR_VERSION) - -install-slashgrid: slashgrid - cp -f slashgrid $(prefix)/sbin - cp -f slashgrid.init $(RPM_BUILD_ROOT)/etc/rc.d/init.d/slashgrid - mkdir -p $(RPM_BUILD_ROOT)/var/spool/slashgrid/headers - mkdir -p $(RPM_BUILD_ROOT)/var/spool/slashgrid/blocks - mkdir -p $(RPM_BUILD_ROOT)/var/spool/slashgrid/tmp - -install-ws: gridsite-delegation.cgi htproxyput - mkdir -p $(prefix)/include \ - $(prefix)/lib \ - $(prefix)/bin \ - $(prefix)/sbin \ - $(prefix)/share/man/man1 \ - $(prefix)/share/man/man8 \ - $(prefix)/share/doc/gridsite-$(MINOR_VERSION) - cp -f ../doc/*.wsdl $(prefix)/share/doc/gridsite-$(MINOR_VERSION) - for i in htproxyput.1 htproxytime.1 htproxyrenew.1 htproxydestroy.1 \ - htproxyunixtime.1 ; do \ - cp -f ../doc/$$i.html $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/man/man1 ; \ - gzip -f $(prefix)/share/man/man1/$$i ; done - for i in gridsite-delegation.8 ; do \ - cp -f ../doc/$$i.html $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \ - cp -f ../doc/$$i $(prefix)/share/man/man8 ; \ - gzip -f $(prefix)/share/man/man8/$$i ; done - cp -f htproxyput $(prefix)/bin - ln -sf htproxyput $(prefix)/bin/htproxydestroy - ln -sf htproxyput $(prefix)/bin/htproxytime - ln -sf htproxyput $(prefix)/bin/htproxyunixtime - ln -sf htproxyput $(prefix)/bin/htproxyrenew - cp -f gridsite-delegation.cgi $(prefix)/sbin - -# -# Distributions -# - -# source files tarball -dist: - mkdir -p ../dist/gridsite-$(PATCH_VERSION)/src \ - ../dist/gridsite-$(PATCH_VERSION)/doc \ - ../dist/gridsite-$(PATCH_VERSION)/interface - cp -f ../VERSION ../README ../LICENSE ../CHANGES ../INSTALL \ - ../dist/gridsite-$(PATCH_VERSION) - cp -f Makefile grst*.c htcp.c slashgrid.c slashgrid.init \ - urlencode.c findproxyfile.c gaclexample.c mod_gridsite.c \ - htproxyput.c grst_admin.h mod_ssl-private.h \ - gsexec.c gsexec.h gridsite-copy.c delegation.h \ - roffit make-gridsite-spec \ - Doxyfile doxygen.css doxyheader.html \ - ../dist/gridsite-$(PATCH_VERSION)/src - cp -f ../doc/*.html ../doc/*.1 ../doc/*.8 ../doc/*.conf ../doc/*.sh \ - ../doc/*.spec ../doc/*.wsdl \ - ../dist/gridsite-$(PATCH_VERSION)/doc - cp -f ../interface/*.h \ - ../dist/gridsite-$(PATCH_VERSION)/interface - cd ../dist ; tar zcvf ../gridsite-$(PATCH_VERSION).src.tar.gz \ - gridsite-$(PATCH_VERSION) - rm -Rf ../dist/gridsite-$(PATCH_VERSION) - - -# binary tarball distribution for htcp users -htcp-bin: htcp - mkdir -p ../htcp-bin-$(PATCH_VERSION)/bin \ - ../htcp-bin-$(PATCH_VERSION)/man/man1 - cp -f ../doc/README.htcp-bin ../htcp-bin-$(PATCH_VERSION) - cp -f htcp ../htcp-bin-$(PATCH_VERSION)/bin - cp -f ../doc/htcp.1 ../doc/htrm.1 ../doc/htls.1 ../doc/htmkdir.1 \ - ../doc/htll.1 ../doc/htmv.1 ../doc/htping.1 ../doc/htfind.1 \ - ../htcp-bin-$(PATCH_VERSION)/man/man1 - ln -sf htcp ../htcp-bin-$(PATCH_VERSION)/bin/htls - ln -sf htcp ../htcp-bin-$(PATCH_VERSION)/bin/htll - ln -sf htcp ../htcp-bin-$(PATCH_VERSION)/bin/htrm - ln -sf htcp ../htcp-bin-$(PATCH_VERSION)/bin/htmkdir - ln -sf htcp ../htcp-bin-$(PATCH_VERSION)/bin/htmv - ln -sf htcp ../htcp-bin-$(PATCH_VERSION)/bin/htping - ln -sf htcp ../htcp-bin-$(PATCH_VERSION)/bin/htfind - cd ../htcp-bin-$(VERSION) ; tar zcvf ../htcp-$(VERSION).bin.tar.gz . - rm -Rf ../htcp-bin-$(PATCH_VERSION) - -# RPM targets: build and RPMs go into subdirectories of ../RPMTMP/ -rpm: dist - export PATCH_VERSION=$(PATCH_VERSION) ; \ - export MINOR_VERSION=$(MINOR_VERSION) ; \ - export MYPREFIX=/usr ; \ - ./make-gridsite-spec - rm -Rf $(MYRPMDIR)/BUILDROOT $(MYRPMDIR)/BUILD - mkdir -p $(MYRPMDIR)/SOURCES $(MYRPMDIR)/SPECS $(MYRPMDIR)/BUILD \ - $(MYRPMDIR)/SRPMS $(MYRPMDIR)/RPMS/i386 $(MYRPMDIR)/BUILDROOT - cp -f ../gridsite-$(PATCH_VERSION).src.tar.gz $(MYRPMDIR)/SOURCES - cp -f gridsite.spec $(MYRPMDIR)/SPECS - $(RPMCMD) --define "_topdir $(MYRPMDIR)" \ - -ba --buildroot $(MYRPMDIR)/BUILDROOT gridsite.spec - - -wtf: - pwd - printenv - ls -l - ls -lR /usr/local/ - ls -lR $(GSOAPDIR) - - diff --git a/org.gridsite.core/src/delegation.h b/org.gridsite.core/src/delegation.h deleted file mode 100644 index 01b462f..0000000 --- a/org.gridsite.core/src/delegation.h +++ /dev/null @@ -1,86 +0,0 @@ -//gsoap ns schema namespace: http://www.gridsite.org/namespaces/delegation-1 - -struct ns__DelegationExceptionType -{ - char *message; //nillable -}; - -struct ns__NewProxyReq -{ - char *proxyRequest; //nillable - char *delegationID; //nillable -}; - -struct _DelegationException -{ - struct ns__DelegationExceptionType *ns__DelegationException; -}; - -//gsoap ns service name: DelegationSoapBinding -//gsoap ns service type: Delegation -//gsoap ns service port: https://localhost/gridsite-delegation.cgi -//gsoap ns service namespace: http://www.gridsite.org/namespaces/delegation-1 - -/* *** getProxyReq method *** */ - -//gsoap ns service method-style: rpc -//gsoap ns service method-encoding: literal -//gsoap ns service method-action: "" -//gsoap ns service method-fault: getProxyReq _DelegationException - -int ns__getProxyReq(char *_delegationID, - struct ns__getProxyReqResponse { - char *getProxyReqReturn; } *); - -/* *** getNewProxyReq method *** */ - -//gsoap ns service method-style: getNewProxyReq rpc -//gsoap ns service method-encoding: getNewProxyReq literal -//gsoap ns service method-action: getNewProxyReq "" -//gsoap ns service method-fault: getNewProxyReq _DelegationException - -int ns__getNewProxyReq(struct ns__getNewProxyReqResponse { - struct ns__NewProxyReq *getNewProxyReqReturn; } *); - -/* *** renewProxyReq method *** */ - -//gsoap ns service method-style: renewProxyReq rpc -//gsoap ns service method-encoding: renewProxyReq literal -//gsoap ns service method-action: renewProxyReq "" -//gsoap ns service method-fault: renewProxyReq _DelegationException - -int ns__renewProxyReq(char *_delegationID, - struct ns__renewProxyReqResponse { - char *_renewProxyReqReturn; } *); - -/* *** putProxy method *** */ - -//gsoap ns service method-style: putProxy rpc -//gsoap ns service method-encoding: putProxy literal -//gsoap ns service method-action: putProxy "" -//gsoap ns service method-fault: putProxy _DelegationException - -int ns__putProxy(char *_delegationID, - char *_proxy, - struct ns__putProxyResponse { } *); - -/* *** getTerminationTime method *** */ - -//gsoap ns service method-style: getTerminationTime rpc -//gsoap ns service method-encoding: getTerminationTime literal -//gsoap ns service method-action: getTerminationTime "" -//gsoap ns service method-fault: getTerminationTime _DelegationException - -int ns__getTerminationTime(char *_delegationID, - struct ns__getTerminationTimeResponse { - time_t _getTerminationTimeReturn; } *); - -/* *** destroy method *** */ - -//gsoap ns service method-style: destroy rpc -//gsoap ns service method-encoding: destroy literal -//gsoap ns service method-action: destroy "" -//gsoap ns service method-fault: destroy _DelegationException - -int ns__destroy(char *_delegationID, - struct ns__destroyResponse { } *); diff --git a/org.gridsite.core/src/doxygen.css b/org.gridsite.core/src/doxygen.css deleted file mode 100644 index 97ebc25..0000000 --- a/org.gridsite.core/src/doxygen.css +++ /dev/null @@ -1,49 +0,0 @@ -H1 { text-align: center; } -CAPTION { font-weight: bold } -A.qindex {} -A.qindexRef {} -A.el { text-decoration: none; font-weight: bold } -A.elRef { font-weight: bold } -A.code { text-decoration: none; font-weight: normal; color: #4444ee } -A.codeRef { font-weight: normal; color: #4444ee } -A:hover { text-decoration: none; background-color: #f2f2ff } -DL.el { margin-left: -1cm } -DIV.fragment { width: 100%; border: none; background-color: #eeeeee } -DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } -TD.md { background-color: #f2f2ff; font-weight: bold; } -TD.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; } -TD.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; } -DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } -DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } -XXBODY { background: white } -TD.indexkey { - background-color: #eeeeff; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -TD.indexvalue { - background-color: #eeeeff; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -span.keyword { color: #008000 } -span.keywordtype { color: #604020 } -span.keywordflow { color: #e08000 } -span.comment { color: #800000 } -span.preprocessor { color: #806020 } -span.stringliteral { color: #002080 } -span.charliteral { color: #008080 } diff --git a/org.gridsite.core/src/doxyheader.html b/org.gridsite.core/src/doxyheader.html deleted file mode 100644 index af78b52..0000000 --- a/org.gridsite.core/src/doxyheader.html +++ /dev/null @@ -1 +0,0 @@ -

GridSite Version 1.1.x diff --git a/org.gridsite.core/src/findproxyfile.c b/org.gridsite.core/src/findproxyfile.c deleted file mode 100644 index 423ffa2..0000000 --- a/org.gridsite.core/src/findproxyfile.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef VERSION -#define VERSION "0.0.0" -#endif - -#define _GNU_SOURCE - -#include -#include -#include -#include - -#include - -#include "gridsite.h" - -void printsyntax(char *argv0) -{ - char *p; - - p = rindex(argv0, '/'); - if (p != NULL) ++p; - else p = argv0; - - fprintf(stderr, "%s [--outsidecache] [--proxycache=PATH] " - "[--delegation-id=DELEGATION-ID] [--user-dn=USER-DN]\n" - "(Version: %s)\n", p, VERSION); -} - -#define GRST_PROXY_CACHE "/var/www/proxycache" - -int main(int argc, char *argv[]) -{ - char *delegation_id = "_", *proxycache = "", *user_dn = "", - *proxyfile = NULL; - int c, outsidecache = 0, verbose = 0, option_index; - struct option long_options[] = { {"verbose", 0, 0, 'v'}, - {"outsidecache", 0, 0, 0}, - {"proxycache", 1, 0, 0}, - {"delegation-id", 1, 0, 0}, - {"user-dn", 1, 0, 0}, - {0, 0, 0, 0} }; - - if (argc == 1) - { - printsyntax(argv[0]); - return 0; - } - - while (1) - { - option_index = 0; - - c = getopt_long(argc, argv, "v", long_options, &option_index); - - if (c == -1) break; - else if (c == 0) - { - if (option_index == 1) outsidecache = 1; - else if (option_index == 2) proxycache = optarg; - else if (option_index == 3) delegation_id = optarg; - else if (option_index == 4) user_dn = optarg; - } - else if (c == 'v') ++verbose; - } - - if (*user_dn != '\0') /* try to find in proxy cache */ - { - if ((proxycache == NULL) || (*proxycache == '\0')) - proxycache = getenv("GRST_PROXY_CACHE"); - - if ((proxycache == NULL) || (*proxycache == '\0')) - proxycache = GRST_PROXY_CACHE; - - proxyfile = GRSTx509CachedProxyFind(proxycache, delegation_id, user_dn); - } - - if (((proxyfile == NULL) || (*proxyfile == '\0')) && outsidecache) - { - proxyfile = GRSTx509FindProxyFileName(); - } - - if ((proxyfile != NULL) && (*proxyfile != '\0')) - { - puts(proxyfile); - return 0; - } - - fputs("No proxy file found\n", stderr); - - return 1; -} diff --git a/org.gridsite.core/src/gaclexample.c b/org.gridsite.core/src/gaclexample.c deleted file mode 100644 index 5ad29b7..0000000 --- a/org.gridsite.core/src/gaclexample.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - Copyright (c) 2002-3, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*---------------------------------------------------------------* - * For more about GridSite: http://www.gridsite.org/ * - *---------------------------------------------------------------*/ - -/* - Example program using GACL - - Build with: - - gcc -o gaclexample gaclexample.c -L. -I. -lgridsite -lxml2 -lz -lm -*/ - -#include -#include -#include -#include - -int main() -{ - GRSTgaclCred *cred, *usercred; - GRSTgaclEntry *entry; - GRSTgaclAcl *acl1, *acl2; - GRSTgaclUser *user; - GRSTgaclPerm perm0, perm1, perm2; - FILE *fp; - - /* must initialise GACL before using it */ - - GRSTgaclInit(); - - /* build up an ACL, starting with a credential */ - - cred = GRSTgaclCredNew("person"); - - GRSTgaclCredAddValue(cred, "dn", "/O=Grid/CN=Mr Grid Person"); - - /* create an entry to put it in */ - - entry = GRSTgaclEntryNew(); - - /* add the credential to it */ - - GRSTgaclEntryAddCred(entry, cred); - - /* add another credential */ - - cred = GRSTgaclCredNew("dn-list"); - GRSTgaclCredAddValue(cred, "url", "example-dn-list"); - GRSTgaclEntryAddCred(entry, cred); - - fp = fopen("example-dn-list", "w"); - fputs("/O=Grid/CN=Mr Grid Person\n", fp); - fclose(fp); - - /* associate some permissions and denials to the credential */ - - GRSTgaclEntryAllowPerm( entry, GRST_PERM_READ); - GRSTgaclEntryAllowPerm( entry, GRST_PERM_WRITE); - GRSTgaclEntryAllowPerm( entry, GRST_PERM_ADMIN); - GRSTgaclEntryDenyPerm( entry, GRST_PERM_ADMIN); - GRSTgaclEntryDenyPerm( entry, GRST_PERM_LIST); - - perm0 = GRST_PERM_READ | GRST_PERM_WRITE; - - printf("test perm should be %d\n", perm0); - - /* create a new ACL and add the entry to it */ - - acl1 = GRSTgaclAclNew(); - - GRSTgaclAclAddEntry(acl1, entry); - - /* create a GRSTgaclUser to compare with the ACL */ - - usercred = GRSTgaclCredNew("person"); - - GRSTgaclCredAddValue(usercred, "dn", "/O=Grid/CN=Mr Grid Person"); - - user = GRSTgaclUserNew(usercred); - - GRSTgaclUserSetDNlists(user, getcwd(NULL, 0)); - printf("DN Lists dir %s\n", getcwd(NULL, 0)); - -// putenv("GRST_DN_LISTS=."); - - perm1 = GRSTgaclAclTestUser(acl1, user); - - printf("test /O=Grid/CN=Mr Grid Person in acl = %d\n", perm1); - - /* print and save the whole ACL */ - - GRSTgaclAclPrint(acl1, stdout); - - GRSTgaclAclSave(acl1, "example.gacl"); - - puts("gridacl.out saved"); - - puts(""); - - /* load the ACL back off the disk, print and test it */ - - acl2 = GRSTgaclAclLoadFile("example.gacl"); - - puts("gridacl.out loaded"); - - if (acl2 != NULL) GRSTgaclAclPrint(acl2, stdout); else puts("acl2 is NULL"); - - perm2 = GRSTgaclAclTestUser(acl2, user); - - printf("test /O=Grid/CN=Mr Grid Person in acl = %d\n", perm2); - - if (perm1 != perm0) return 1; - if (perm2 != perm0) return 2; - - return 0; -} diff --git a/org.gridsite.core/src/gridsite-copy.c b/org.gridsite.core/src/gridsite-copy.c deleted file mode 100644 index d59231f..0000000 --- a/org.gridsite.core/src/gridsite-copy.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - Copyright (c) 2005, Yibiao Li, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/////////////////////////////////////////////////////////////////// -// -// compile: gcc -lcurl gridsite-copy.c -o gridsite-copy.cgi -// usage: cp gridsite-copy.cgi to the cgi-bin directory -// and map the COPY method to gridsite-copy.cgi -// by adding a line in httpd.conf: -// script COPY /cgi-bin/gridsite-copy.cgi -// -/////////////////////////////////////////////////////////////////// -#include -#include -#include -#include -#include -#include -#include - -extern char **environ; - -size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) -{ - int written = fwrite(ptr, size, nmemb, (FILE *)stream); - return written; -} - -int main( int argn, char **argv ) -{ - char *getenv(); - - CURL *curl; - CURLcode res; - struct tms s_time, e_time; - FILE *fout; - - char *requestURI; - int grstPerm, srcsecure; - char passcode[100]; - char destination[500], destDir[400], destName[100]; - char *ptr, *ptr1; - - times(&s_time); - passcode[0]='\0'; - char *capath="/etc/grid-security/certificates"; - - printf("Content-type: text/html\n\n"); - printf("HTTP COPY\n"); - printf("

HTTP FILE COPY

\n"); - - curl = curl_easy_init(); - printf("Server: Initialized!\n"); - if(curl) { - //get the request URI - requestURI = curl_getenv("REQUEST_URI"); - if( strncmp( requestURI, "https://", 8 )==0 )srcsecure=1; - else srcsecure=0; - printf("The request URL is %s\n", requestURI); - - //get the destination directory and file name - strcpy(destination, getenv("HTTP_DESTINATION")); - ptr=destination; - ptr1 = strrchr(ptr, '/'); - ptr1+=1; - strcpy( destName, ptr1 ); - *ptr1 = '\0'; - strcpy( destDir, ptr ); - - // get the one time passcode from cookie string. - // the segmenty of code is tested on 19th sep. 2005 - if( (ptr=curl_getenv("HTTP_COOKIE")) != NULL) - { - ptr += 17; - strcpy( passcode, ptr ); - } - - //get permision attributes - grstPerm = atoi(curl_getenv("GRST_DESTINATION_PERM")); - - if( grstPerm & 8 ) // write right - { - curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); - - if( srcsecure == 1 ) - { - curl_easy_setopt(curl, CURLOPT_COOKIE, passcode ); - curl_easy_setopt(curl, CURLOPT_CAPATH, capath ); - } - - curl_easy_setopt(curl, CURLOPT_URL, requestURI ); - - strcpy( destination, getenv("GRST_DESTINATION_TRANSLATED")); - fout = fopen( destination, "w" ); - if( fout == NULL ){ - printf("cannot open file to write,"); - printf(" maybe you have no right to write in the directory.\n"); - exit(-1); - } - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, fout ); - res = curl_easy_perform(curl); - if( res!=0 ) - { - printf("Server: There are some things wrong with OPT parameters.%d \n", res); - } - else printf("Server: The file has been successfully copied.\n"); - fclose(fout); - } - else - { - printf("You have no permission to write in the destination directory.\n"); - } - - curl_easy_cleanup(curl); - } - else{ - printf("Server: cannot initialize CURL!\n"); - } - - curl_global_cleanup(); - - times(&e_time); - printf("Server: copying time %ld seconds\n", e_time.tms_utime-s_time.tms_utime); - printf("\n"); - return 0; -} diff --git a/org.gridsite.core/src/grst-delegation.c b/org.gridsite.core/src/grst-delegation.c deleted file mode 100644 index 87f2278..0000000 --- a/org.gridsite.core/src/grst-delegation.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*---------------------------------------------------------------------------* - * This program is part of GridSite: http://www.gridpp.ac.uk/authz/gridsite/ * - *---------------------------------------------------------------------------*/ - -#ifndef VERSION -#define VERSION "0.0.1" -#endif - -#define _GNU_SOURCE -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "soapH.h" -#include "DelegationSoapBinding.nsmap" - -#define GRST_PROXYCACHE "/../proxycache/" - -int main(int argn, char *argv[]) -{ - char *docroot, *method, *request, *p, *client_dn, *user_dn, - *delegation_id, *reqtxt, *proxydir; - struct soap soap; - - method = getenv("REQUEST_METHOD"); - if (strcmp(method, "POST") == 0) - { - soap_init(&soap); - soap_serve(&soap); /* CGI application */ - return 0; - } - - puts("Status: 501 Method Not Implemented\n"); - return 0; -} - -char *get_dn(void) -{ - int i; - char *p, *s, *dn; - GRSTgaclCred *cred = NULL; - - for (i=0; ; ++i) - { - asprintf(&p, "GRST_CRED_%d", i); - s = getenv(p); - free(p); - - if (s == NULL) break; - - if ((cred = GRSTx509CompactToCred(s)) == NULL) break; - - if ((strcmp(cred->type, "person") == 0) && - (cred->firstname != NULL) && - (cred->firstname->name != NULL) && - (strcmp(cred->firstname->name, "dn") == 0) && - (cred->firstname->value != NULL)) - { - dn = strdup(cred->firstname->value); - GRSTgaclCredFree(cred); - return dn; - } - - GRSTgaclCredFree(cred); - } - - return NULL; -} - -int ns__getProxyReq(struct soap *soap, - char *delegation_id, - struct ns__getProxyReqResponse *response) -{ - int i; - char *p, *user_dn, *docroot, *proxydir, *request; - - if ((user_dn = get_dn()) == NULL) return SOAP_ERR; - - if ((delegation_id == NULL) || (*delegation_id == '\0')) - delegation_id = GRSTx509MakeDelegationID(); - else for (i=0; delegation_id[i] != '\0'; ++i) - { - if (!isalnum(delegation_id[i]) && - (delegation_id[i] != '.') && - (delegation_id[i] != ',') && - (delegation_id[i] != '_')) - { - delegation_id = NULL; - break; - } - } - - docroot = getenv("DOCUMENT_ROOT"); - asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE); - - if ((user_dn != NULL) && - (user_dn[0] != '\0') && - (delegation_id != NULL) && - (GRSTx509MakeProxyRequest(&request, proxydir, - delegation_id, user_dn) == 0)) - { - response->getProxyReqReturn = request; - - free(user_dn); - return SOAP_OK; - } - - free(user_dn); - return SOAP_ERR; -} - -int ns__getNewProxyReq(struct soap *soap, - struct ns__getNewProxyReqResponse *response) -{ - char *p, *user_dn, *docroot, *proxydir, *request, *delegation_id; - - if ((user_dn = get_dn()) == NULL) return SOAP_ERR; - - delegation_id = GRSTx509MakeDelegationID(); - - docroot = getenv("DOCUMENT_ROOT"); - asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE); - - if ((user_dn != NULL) && - (user_dn[0] != '\0') && - (delegation_id != NULL) && - (GRSTx509MakeProxyRequest(&request, proxydir, - delegation_id, user_dn) == 0)) - { - response->getNewProxyReqReturn = malloc(sizeof(struct ns__NewProxyReq)); - response->getNewProxyReqReturn->proxyRequest = request; - response->getNewProxyReqReturn->delegationID = delegation_id; - - free(user_dn); - return SOAP_OK; - } - - free(user_dn); - return SOAP_ERR; -} - -int ns__putProxy(struct soap *soap, char *delegation_id, - char *proxy, - struct ns__putProxyResponse *response) -{ - int fd, c, len = 0, i; - char *docroot, *proxydir, *p, *user_dn; - - if ((user_dn = get_dn()) == NULL) return SOAP_ERR; - - if ((delegation_id == NULL) || (*delegation_id == '\0')) - delegation_id = GRSTx509MakeDelegationID(); - else for (i=0; delegation_id[i] != '\0'; ++i) - { - if (!isalnum(delegation_id[i]) && - (delegation_id[i] != '.') && - (delegation_id[i] != ',') && - (delegation_id[i] != '_')) - { - delegation_id = NULL; - break; - } - } - - docroot = getenv("DOCUMENT_ROOT"); - asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE); - - if ((user_dn == NULL) || - (user_dn[0] == '\0') || - (delegation_id == NULL) || - (GRSTx509CacheProxy(proxydir, delegation_id, user_dn, proxy) - != GRST_RET_OK)) - { - free(proxydir); - free(user_dn); - return SOAP_ERR; - } - - free(proxydir); - free(user_dn); - return SOAP_OK; -} - -int ns__renewProxyReq(struct soap *soap, - char *delegation_id, - struct ns__renewProxyReqResponse *response) -{ - int i; - char *p, *user_dn, *docroot, *proxydir, *request; - - if ((user_dn = get_dn()) == NULL) return SOAP_ERR; - - if (delegation_id == NULL) - { - free(user_dn); - return SOAP_ERR; - } - - for (i=0; delegation_id[i] != '\0'; ++i) - { - if (!isalnum(delegation_id[i]) && - (delegation_id[i] != '.') && - (delegation_id[i] != ',') && - (delegation_id[i] != '_')) - { - delegation_id = NULL; - break; - } - } - - if (*delegation_id == '\0') - { - free(user_dn); - return SOAP_ERR; - } - - docroot = getenv("DOCUMENT_ROOT"); - asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE); - - if ((user_dn != NULL) && - (user_dn[0] != '\0') && - (delegation_id != NULL) && - (GRSTx509MakeProxyRequest(&request, proxydir, - delegation_id, user_dn) == 0)) - { - response->_renewProxyReqReturn = request; - - free(user_dn); - return SOAP_OK; - } - - free(user_dn); - return SOAP_ERR; -} - -int ns__getTerminationTime(struct soap *soap, - char *delegation_id, - struct ns__getTerminationTimeResponse *response) -{ - char *p, *user_dn, *docroot, *proxydir; - time_t start, finish; - - if ((user_dn = get_dn()) == NULL) return SOAP_ERR; - - delegation_id = GRSTx509MakeDelegationID(); - - docroot = getenv("DOCUMENT_ROOT"); - asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE); - - if ((user_dn != NULL) && - (user_dn[0] != '\0') && - (delegation_id != NULL) && - (GRSTx509ProxyGetTimes(proxydir, delegation_id, user_dn, - &start, &finish) == 0)) - { - response->_getTerminationTimeReturn = finish; - - free(user_dn); - return SOAP_OK; - } - - free(user_dn); - return SOAP_ERR; -} - -int ns__destroy(struct soap *soap, - char *delegation_id, - struct ns__destroyResponse *response) -{ - int fd, c, len = 0, i; - char *docroot, *proxydir, *p, *client_dn, *user_dn; - - if ((user_dn = get_dn()) == NULL) return SOAP_ERR; - - if ((delegation_id == NULL) || (*delegation_id == '\0')) - delegation_id = GRSTx509MakeDelegationID(); - else for (i=0; delegation_id[i] != '\0'; ++i) - { - if (!isalnum(delegation_id[i]) && - (delegation_id[i] != '.') && - (delegation_id[i] != ',') && - (delegation_id[i] != '_')) - { - delegation_id = NULL; - break; - } - } - - docroot = getenv("DOCUMENT_ROOT"); - asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE); - - if ((user_dn == NULL) || - (user_dn[0] == '\0') || - (delegation_id == NULL) || - (GRSTx509ProxyDestroy(proxydir, delegation_id, user_dn) - != GRST_RET_OK)) - { - free(proxydir); - free(user_dn); - return SOAP_ERR; - } - - free(proxydir); - free(user_dn); - return SOAP_OK; -} diff --git a/org.gridsite.core/src/grst_admin.h b/org.gridsite.core/src/grst_admin.h deleted file mode 100644 index cddc415..0000000 --- a/org.gridsite.core/src/grst_admin.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - Copyright (c) 2002-3, Andrew McNab and Shiv Kaushal, - University of Manchester. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*------------------------------------------------------------------* - * This program is part of GridSite: http://www.gridsite.org/ * - *------------------------------------------------------------------*/ - -void GRSThttpError(char *); -void adminfooter(GRSThttpBody *, char *, char *, char *, char *); -int GRSTstrCmpShort(char *, char *); -char *makevfilename(char *, size_t, char *); - -/*CGI GACL - Edit interface functions*/ -void show_acl(int admin, GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void new_entry_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void new_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void edit_entry_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void edit_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void add_cred_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void add_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_entry_sure(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_cred_sure(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); - -/*Functions producing messages*/ -//void error(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void admin_continue(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file, GRSThttpBody *bp); - diff --git a/org.gridsite.core/src/grst_admin_file.c b/org.gridsite.core/src/grst_admin_file.c deleted file mode 100644 index b4d47f5..0000000 --- a/org.gridsite.core/src/grst_admin_file.c +++ /dev/null @@ -1,1571 +0,0 @@ -/* - Copyright (c) 2002-3, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*------------------------------------------------------------------* - * This program is part of GridSite: http://www.gridsite.org/ * - *------------------------------------------------------------------*/ - -#ifndef VERSION -#define VERSION "x.x.x" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// when porting: remember that sendfile() is very OS-specific! -#include - -#include - -#include "grst_admin.h" - -char *storeuploadfile(char *boundary, int *bufferused) -{ -// rewrite this to copy whole POSTed stdin HTTP body to disk then -// mmap() and pick apart? How to deal with 100MB uploaded files, say? - - char *filebuffer = NULL; - int bufferlen = 0, c, boundarylen; - - *bufferused = 0; - boundarylen = strlen(boundary); - - while ((c = getchar()) != EOF) - { - if (*bufferused > 1024*1024*100) return NULL; - - ++(*bufferused); - - if (*bufferused > bufferlen) - { - bufferlen = bufferlen + 1000; - filebuffer = realloc(filebuffer, (size_t) bufferlen); - } - - filebuffer[*bufferused - 1] = c; - - if ( (*bufferused >= boundarylen + 4) && - (boundary[boundarylen-1] == c) && - (boundary[boundarylen-2] == filebuffer[*bufferused - 2]) && - (strncmp(boundary, &filebuffer[*bufferused - boundarylen], - boundarylen) == 0)) - { - *bufferused = *bufferused - boundarylen - 4; - - if (filebuffer == NULL) return strdup(""); - else return filebuffer; - } - } - - return NULL; -} - -void uploadfile(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *dir_uri, char *admin_file) -{ - char *boundary, *p, oneline[200], *filename = NULL, - tmpfilename[256], *filebuffer = NULL, *filepath, - *vfile, *dir_path_vfile; - int mimestate, bufferused = 0, itworked = 0; - FILE *fp; - GRSThttpBody bp; - -#define MIMESTUNKNOWN 1 -#define MIMESTUPLOAD 2 -#define MIMESTFILENM 3 - - if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden"); - - p = getenv("CONTENT_TYPE"); - boundary = &p[30]; - - mimestate = MIMESTUNKNOWN; - - while (fgets(oneline, sizeof(oneline), stdin) != NULL) - { - if (*oneline == 13) // MIME has CR/LF line breaks, CR=13 - { - if (mimestate == MIMESTUPLOAD) - { - filebuffer = storeuploadfile(boundary, &bufferused); - mimestate = MIMESTUNKNOWN; - } - else if (mimestate == MIMESTFILENM) - { - fgets(tmpfilename, sizeof(tmpfilename), stdin); - if (*tmpfilename != 13) - { - p = index(tmpfilename, 13); - *p = '\0'; - filename = strdup(tmpfilename); - } - mimestate = MIMESTUNKNOWN; - } - } - else if (GRSTstrCmpShort(oneline, - "Content-Disposition: form-data; name=\"uploadfile\"; filename=\"") - == 0) - { - mimestate = MIMESTUPLOAD; - if (filename == NULL) - { - filename = strdup(&oneline[61]); - - p = rindex(&oneline[61], '\\'); - if (p != NULL) { ++p ; filename = p; } - - p = rindex(&oneline[61], '/'); - if (p != NULL) { ++p ; filename = p; } - - p = index(filename, '"'); - if (p != NULL) *p = '\0'; - } - } - else if (GRSTstrCmpShort(oneline, - "Content-Disposition: form-data; name=\"file\"") == 0) - { - mimestate = MIMESTFILENM; - } - } - - if ((filebuffer != NULL) && (bufferused >= 0)) - { - if (filename == NULL) GRSThttpError("403 Forbidden"); - else if ((index(filename, '/') != NULL) || - (strcmp(filename, GRST_ACL_FILE) == 0)) - { - puts("Status: 403 Forbidden filename\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Forbidden filename %s\n", filename); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Forbidden filename %s

\n", - filename); - - GRSThttpPrintf(&bp, - "

New file names cannot include slashes " - "or use the reserved ACL name, %s\n", GRST_ACL_FILE); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); - return; - } - else - { - vfile = makevfilename(filename, bufferused, dn); - asprintf(&dir_path_vfile, "%s/%s", dir_path, vfile); - - fp = fopen(dir_path_vfile, "w"); - if (fp != NULL) - { - if ((fwrite(filebuffer, - sizeof(char), bufferused, fp) == bufferused) && - (fclose(fp) == 0)) - { - asprintf(&filepath, "%s/%s", dir_path, filename); - - unlink(filepath); /* this can fail ok */ - - itworked = (link(dir_path_vfile, filepath) == 0); - } - } - } - - free((void *) filebuffer); - } - - if (itworked) - { - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file); - return; - } - - puts("Status: 500 Failed trying to upload\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp, "Failed to upload\n"); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Failed to upload

\n"); - - GRSThttpPrintf(&bp, "

GridSite considers you are authorized " - "to upload the file, but the upload failed. This is " - "probably a web server or operating system level " - "misconfiguration. Consult the site administrator."); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); -} - -void deletefileaction(char *dn, GRSTgaclPerm perm, char *help_uri, - char *dir_path, char *file, char *dir_uri, - char *admin_file) -{ - int fd, numfiles; - char *dir_path_file, *dir_path_vfile, *p, *vfile, *dnlistsuri, - *fulluri, *server_name, *realfile; - struct stat statbuf; - GRSThttpBody bp; - struct dirent *subdirfile_ent; - DIR *subDIR; - - if (((strcmp(file, GRST_ACL_FILE) != 0) && !GRSTgaclPermHasWrite(perm)) || - ((strcmp(file, GRST_ACL_FILE) == 0) && !GRSTgaclPermHasAdmin(perm))) - GRSThttpError("403 Forbidden"); - - dnlistsuri = getenv("GRST_DN_LISTS_URI"); - if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI"); - - if ((dnlistsuri != NULL) && - (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) == 0)) - realfile = GRSThttpUrlEncode(file); - else if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - else realfile = file; - - dir_path_file = malloc(strlen(dir_path) + strlen(realfile) + 2); - - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, realfile); - - if ((stat(dir_path_file, &statbuf) == 0) && S_ISDIR(statbuf.st_mode)) - { - subDIR = opendir(dir_path_file); - if (subDIR == NULL) numfiles = 99; /* stop deletion */ - else - { - numfiles = 0; - while ((subdirfile_ent = readdir(subDIR)) != NULL) - if (subdirfile_ent->d_name[0] != '.') ++numfiles; - else if (strncmp(subdirfile_ent->d_name, - GRST_ACL_FILE, - sizeof(GRST_ACL_FILE)) == 0) ++numfiles; - closedir(subDIR); - } - - if (numfiles == 0) - { - vfile = makevfilename(file, 0, dn); - dir_path_vfile = malloc(strlen(dir_path) + strlen(vfile) + 2); - strcpy(dir_path_vfile, dir_path); - strcat(dir_path_vfile, "/"); - strcat(dir_path_vfile, vfile); - - if (rename(dir_path_file, dir_path_vfile) == 0) - { - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file); - return; - } - } - } - else if (unlink(dir_path_file) == 0) - { - if (strcmp(file, GRST_ACL_FILE) != 0) - { - vfile = makevfilename(file, 0, dn); - dir_path_file = malloc(strlen(dir_path) + strlen(vfile) + 2); - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, vfile); - - fd = open(dir_path_file, O_WRONLY | O_CREAT); - if (fd != -1) close(fd); - } - - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file); - - return; - } - - puts("Status: 500 Failed trying to delete\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp, "Error deleting %s%s\n", dir_uri, file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Error deleting %s%s

\n", - dir_uri, file); - - GRSThttpPrintf(&bp, "

GridSite considers you are authorized " - "to delete %s, but the delete failed. This is " - "probably a web server or operating system level " - "misconfiguration. Consult the site administrator.", - file); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); -} - -void deletefileform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - GRSThttpBody bp; - - if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden"); - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp, "Delete %s\n", file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Delete %s

\n", file); - - GRSThttpPrintf(&bp,"
\n",dir_uri,admin_file); - GRSThttpPrintf(&bp,"

Do you really want to delete %s?", file); - GRSThttpPrintf(&bp,"

\n", file); - GRSThttpPrintf(&bp,"\n", file); - GRSThttpPrintf(&bp,"\n"); - GRSThttpPrintf(&bp,"
\n"); - - GRSThttpPrintf(&bp,"

Or " - "return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); -} - -void renameform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - GRSThttpBody bp; - - if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden"); - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp, "Rename %s\n", file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Rename %s%s

\n", dir_uri, file); - - GRSThttpPrintf(&bp,"
\n",dir_uri,admin_file); - GRSThttpPrintf(&bp,"

What do you want to rename %s to?

", file); - GRSThttpPrintf(&bp,"\n", file); - GRSThttpPrintf(&bp,"

New name: \n", file); - GRSThttpPrintf(&bp,"\n"); - GRSThttpPrintf(&bp,"\n"); - GRSThttpPrintf(&bp,"

\n"); - - GRSThttpPrintf(&bp,"

Or " - "return to " - "directory listing\n", dir_uri, admin_file, dir_uri); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); -} - -void editfileaction(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - char *pagetext, *dir_path_file, *vfile, *dir_path_vfile, - *dnlistsuri, *server_name, *fulluri, *realfile; - FILE *fp; - GRSThttpBody bp; - - if (!GRSTgaclPermHasWrite(perm) || (strcmp(file, GRST_ACL_FILE) == 0)) - GRSThttpError("403 Forbidden"); - - dnlistsuri = getenv("GRST_DN_LISTS_URI"); - if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI"); - - if ((dnlistsuri != NULL) && - (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) == 0)) - { - realfile = GRSThttpUrlEncode(file); - - if (realfile[0] == '.') GRSThttpError("403 Forbidden"); - } - else if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - else realfile = file; - - asprintf(&dir_path_file, "%s/%s", dir_path, realfile); - - pagetext = GRSThttpGetCGI("pagetext"); - vfile = makevfilename(file, strlen(pagetext), dn); - asprintf(&dir_path_vfile, "%s/%s", dir_path, vfile); - - fp = fopen(dir_path_vfile, "w"); - if (fp == NULL) - { - puts("Status: 500 Failed trying to write\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Error writing %s%s\n", dir_uri, file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Error writing %s%s

\n", - dir_uri, file); - - GRSThttpPrintf(&bp, - "

GridSite considers you are authorized " - "to write the file, but the write failed. This is " - "probably a web server or operating system level " - "misconfiguration. Consult the site administrator."); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); - return; - } - - fwrite(pagetext, strlen(pagetext), sizeof(char), fp); - - fclose(fp); - - unlink(dir_path_file); - - if (link(dir_path_vfile,dir_path_file) != 0) GRSThttpError("403 Forbidden"); - - if ((strlen(file) > 7) && (strcmp(&file[strlen(file) - 5], ".html") == 0)) - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s\n\n", dir_uri, file); - else printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file); -} - -void create_acl(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int fd; - char *tmpgacl, *newgacl; - GRSTgaclAcl *acl; - FILE *fp; - GRSThttpBody bp; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError("403 Forbidden"); - - asprintf(&tmpgacl, "%s/.tmp.XXXXXX", dir_path); - asprintf(&newgacl, "%s/%s", dir_path, GRST_ACL_FILE); - - if (((acl = GRSTgaclAclLoadforFile(dir_path)) != NULL) && - ((fd = mkstemp(tmpgacl)) != -1) && - ((fp = fdopen(fd, "w+")) != NULL) && - GRSTgaclAclPrint(acl, fp) && - (fclose(fp) == 0) && - (rename(tmpgacl, newgacl) == 0)) - { - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file); - - free(tmpgacl); - free(newgacl); - return; - } - - puts("Status: 500 Failed trying to create\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Error creating %s%s\n", dir_uri, - GRST_ACL_FILE); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Error creating %s%s

\n", - dir_uri, GRST_ACL_FILE); - - GRSThttpPrintf(&bp, "

GridSite considers you are authorized " - "to create it, but the create failed. This is " - "probably a web server or operating system level " - "misconfiguration. Consult the site administrator."); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); - - free(tmpgacl); - free(newgacl); -} - -void renameaction(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int len; - char *dir_path_file, *vfile, *dir_path_vfile, - *dnlistsuri, *newfile, *dir_path_newfile; - struct stat statbuf; - FILE *fp; - GRSThttpBody bp; - - if (!GRSTgaclPermHasWrite(perm) || (strcmp(file, GRST_ACL_FILE) == 0)) - GRSThttpError("403 Forbidden"); - - if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - - dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2); - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, file); - - if (stat(dir_path_file, &statbuf) != 0) GRSThttpError("404 Not Found"); - - newfile = GRSThttpGetCGI("newfile"); - - if ((strcmp(newfile, GRST_ACL_FILE) == 0) || - (strcmp(newfile, file) == 0)) GRSThttpError("403 Forbidden"); - - dir_path_newfile = malloc(strlen(dir_path) + strlen(newfile) + 2); - strcpy(dir_path_newfile, dir_path); - strcat(dir_path_newfile, "/"); - strcat(dir_path_newfile, newfile); - - vfile = makevfilename(newfile, statbuf.st_size, dn); - dir_path_vfile = malloc(strlen(dir_path) + strlen(vfile) + 2); - strcpy(dir_path_vfile, dir_path); - strcat(dir_path_vfile, "/"); - strcat(dir_path_vfile, vfile); - - unlink(dir_path_newfile); /* just in case */ - - if ((link(dir_path_file, dir_path_vfile ) == 0) && - (link(dir_path_file, dir_path_newfile) == 0) && - (unlink(dir_path_file) == 0)) - { - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s\n\n", dir_uri); - return; - } - - puts("Status: 500 Failed trying to rename\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Error renaming %s%s\n", dir_uri, file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Error renaming %s%s

\n", - dir_uri, file); - - GRSThttpPrintf(&bp, "

GridSite considers you are authorized " - "to rename it, but the rename failed. This is " - "probably a web server or operating system level " - "misconfiguration. Consult the site administrator."); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); -} - -void newdirectory(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int len; - char *dir_path_file, *vfile, *dir_path_vfile, *filedup; - FILE *fp; - GRSThttpBody bp; - - if ((file[0] == '\0') || - !GRSTgaclPermHasWrite(perm) || (strcmp(file, GRST_ACL_FILE) == 0)) - GRSThttpError("403 Forbidden"); - - filedup = strdup(file); - if (filedup[strlen(filedup)-1] == '/') filedup[strlen(filedup)-1] = '\0'; - if (index(filedup, '/') != NULL) GRSThttpError("403 Forbidden"); - - dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2); - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, file); - - if (mkdir(dir_path_file, 0751) == 0) - { - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file); - return; - } - - puts("Status: 500 Failed trying to create\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Error create %s%s\n", dir_uri, file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Error creating directory %s%s

\n", - dir_uri, file); - - GRSThttpPrintf(&bp, - "

GridSite considers you are authorized " - "to create the directory, but the creation failed. This " - "is probably a web server or operating system level " - "misconfiguration. Consult the site administrator."); - - GRSThttpPrintf(&bp,"

" - "Return to " - "parent directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); -} - -void editdnlistaction(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int numdn = 0, ifd, ofd, numdnlines = 0, i, found; - char *dir_path_file, *dir_path_tmpfile, *realfile, - *dnlistsuri, *server_name, *fulldiruri, *p, oneline[513], - **dnlines, name[81], *add; - FILE *ofp; - struct stat statbuf; - GRSThttpBody bp; - - if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden"); - - dnlistsuri = getenv("GRST_DN_LISTS_URI"); - if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI"); - - server_name = getenv("SERVER_NAME"); - - if ((server_name == NULL) || - (dnlistsuri == NULL) || - (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) != 0)) - GRSThttpError("403 Forbidden"); - - asprintf(&fulldiruri, "https://%s%s", server_name, dir_uri); - - if ((strncmp(fulldiruri, file, strlen(fulldiruri)) != 0) && - ((strncmp(fulldiruri, file, strlen(fulldiruri) - 1) != 0) || - (strlen(fulldiruri) - 1 != strlen(file)))) - { - puts("Status: 403 Forbidden\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Error writing %s\n", file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Error writing %s to %s

\n", - file, dir_uri); - - GRSThttpPrintf(&bp, "

You cannot create a DN List " - "with that prefix in this directory. Please see the " - "the GridSite User's Guide for an explanation."); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); - return; - } - - p = GRSThttpGetCGI("numdn"); - if ((p == NULL) || (sscanf(p, "%d", &numdn) != 1)) - GRSThttpError("500 No number of DNs"); - - if (numdn > 0) - { - dnlines = malloc(sizeof(char *) * numdn); - - for (i=1; i <= numdn; ++i) - { - sprintf(name, "dn%d", i); - p = GRSThttpGetCGI(name); - - if (*p != '\0') - { - dnlines[numdnlines] = p; - ++numdnlines; - } - } - } - - add = GRSThttpGetCGI("add"); - - realfile = GRSThttpUrlEncode(file); - - dir_path_file = malloc(strlen(dir_path) + strlen(realfile) + 2); - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, realfile); - - dir_path_tmpfile = malloc(strlen(dir_path) + 13); - strcpy(dir_path_tmpfile, dir_path); - strcat(dir_path_tmpfile, "/.tmp.XXXXXX"); - - if (((ofd = mkstemp(dir_path_tmpfile)) != -1) && - ((ofp = fdopen(ofd, "w")) != NULL)) - { - if (*add != '\0') - { - fputs(add, ofp); - fputc('\n', ofp); - } - - for (i=0; i < numdnlines; ++i) - { - fputs(dnlines[i], ofp); - fputc('\n', ofp); - } - - if ((fclose(ofp) == 0) && - ((stat(dir_path_file, &statbuf) != 0) || - (unlink(dir_path_file) == 0)) && - (rename(dir_path_tmpfile, dir_path_file) == 0)) - { - printf("Status: 302 Moved Temporarily\nContent-Length: 0\n" - "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file); - return; - } - } - - puts("Status: 500 Failed trying to write\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Error writing %s%s\n", dir_uri, file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Error writing %s%s

\n", - dir_uri, file); - - GRSThttpPrintf(&bp, "

GridSite considers you are authorized " - "to write the file, but the write failed. This is " - "probably a web server or operating system level " - "misconfiguration. Consult the site administrator."); - - GRSThttpPrintf(&bp,"

" - "Return to " - "directory listing\n", dir_uri, admin_file); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); - - /* try to clean up */ - if (stat(dir_path_tmpfile, &statbuf) == 0) unlink(dir_path_tmpfile); -} - -void printfile(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int fd; - char *dir_path_file; - struct stat statbuf; - - if (!GRSTgaclPermHasRead(perm)) GRSThttpError("403 Forbidden"); - - if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - - dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2); - - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, file); - - fd = open(dir_path_file, O_RDONLY); - if (fd == -1) GRSThttpError("500 Internal server error"); - - if ((fstat(fd, &statbuf) != 0) || - !S_ISREG(statbuf.st_mode)) GRSThttpError("403 Forbidden"); - - printf("Status: 200 OK\nContent-Type: text/html\nContent-Length: %d\n\n", - statbuf.st_size); - - fflush(stdout); - - sendfile(1, fd, 0, statbuf.st_size); -} - -void filehistory(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int fd, n, i, j, enclen, num = 0; - char *encodedfile, *p, *dndecoded, modified[99], *vfile, *q, - *encdn; - time_t file_time; - size_t file_size; - struct stat statbuf; - struct dirent **namelist; - struct tm file_tm; - GRSThttpBody bp; - - if (!GRSTgaclPermHasRead(perm)) GRSThttpError("403 Forbidden"); - - if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - GRSThttpPrintf(&bp, "History of %s%s\n", dir_uri, file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - GRSThttpPrintf(&bp, - "

History of %s%s

\n", - dir_uri, file, dir_uri, file); - - asprintf(&vfile, "%s/%s", dir_path, file); - if (stat(vfile, &statbuf) == 0) - { - localtime_r((const time_t *) &(statbuf.st_mtime), &file_tm); - strftime(modified, sizeof(modified), - "%a %e %b %Y %k:%M", &file_tm); - - GRSThttpPrintf(&bp, "

Last modified: %s\n", modified); - } - free(vfile); - - encodedfile = GRSThttpUrlEncode(file); - for (p=encodedfile; *p != '\0'; ++p) if (*p == '%') *p = '='; - enclen = strlen(encodedfile); - - n = scandir(dir_path, &namelist, 0, alphasort); - - if (n > 0) - { - for (i = n - 1; i >= 0; --i) - { - if ((strncmp(namelist[i]->d_name, GRST_HIST_PREFIX, - sizeof(GRST_HIST_PREFIX) - 1) == 0) && - ((namelist[i]->d_name)[sizeof(GRST_HIST_PREFIX) - 1] == ':') && - (strncmp(&((namelist[i]->d_name)[sizeof(GRST_HIST_PREFIX)]), - encodedfile, enclen) == 0) && - ((namelist[i]->d_name)[sizeof(GRST_HIST_PREFIX)+enclen] == ':')) - { - if (num == 0) GRSThttpPrintf(&bp, - "

\n" - "" - "\n"); - - ++num; - - p = index(namelist[i]->d_name, ':'); - p = index(&p[1], ':'); - sscanf(&p[1], "%X:", &file_time); - p = index(&p[1], ':'); /* skip over microseconds time */ - p = index(&p[1], ':'); - sscanf(&p[1], "%X:", &file_size); - p = index(&p[1], ':'); - - encdn = strdup(&p[1]); - q = index(encdn, ':'); - if (q != NULL) *q = '\0'; - - for (q=encdn; *q != '\0'; ++q) if (*q == '=') *q = '%'; - dndecoded = GRSThttpUrlDecode(encdn); - - localtime_r((const time_t *) &file_time, &file_tm); - strftime(modified, sizeof(modified), - "%a %e %b %Y %k:%M", &file_tm); - - GRSThttpPrintf(&bp, - "\n", - modified, file_size, dndecoded); - - free(dndecoded); - - asprintf(&vfile, "%s/%s", dir_path, namelist[i]->d_name); - if ((stat(vfile, &statbuf) == 0) && (statbuf.st_size > 0)) - { - GRSThttpPrintf(&bp, "\n", - dir_uri, admin_file, dir_uri, namelist[i]->d_name); - else GRSThttpPrintf(&bp, "%s%s\">View\n", - dir_uri, namelist[i]->d_name); - } - else GRSThttpPrintf(&bp, ""); - - free(vfile); - } - } - } - - if (num > 0) GRSThttpPrintf(&bp, "
DateSize afterChanged by
%s%d%sView
 
\n"); - else GRSThttpPrintf(&bp, "

No history for this file\n"); - - if (GRSTgaclPermHasList(perm)) - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - else adminfooter(&bp, dn, help_uri, dir_uri, NULL); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(&bp); -} - -void ziplist(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - char *shellcmd, *unzip, oneline[129]; - FILE *fp; - GRSThttpBody bp; - - if (!GRSTgaclPermHasRead(perm)) GRSThttpError("403 Forbidden"); - - if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - GRSThttpPrintf(&bp, "Contents of %s%s\n", dir_uri, file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - GRSThttpPrintf(&bp, - "

Contents of ZIP file %s%s

\n", - dir_uri, file, dir_uri, file); - - unzip = getenv("GRST_UNZIP"); - if (unzip == NULL) unzip = getenv("REDIRECT_GRST_UNZIP"); - - if (unzip != NULL) - { - GRSThttpPrintf(&bp, "
\n");
-      asprintf(&shellcmd, "cd %s ; %s -Z %s", dir_path, unzip, file);
-      fp = popen(shellcmd, "r");
-  
-      while (fgets(oneline, sizeof(oneline), fp) != NULL)           
-                          GRSThttpPrintf(&bp, "%s", oneline);         
-      pclose(fp);
-      GRSThttpPrintf(&bp, "
\n"); - - if (GRSTgaclPermHasWrite(perm)) - GRSThttpPrintf(&bp, - "

" - " in %s" - "" - "
" - "

(All files are placed in the same directory and files " - "beginning with "." are ignored.)

\n", - dir_uri, admin_file, dir_uri, file); - } - else GRSThttpPrintf(&bp, "

unzip path not defined!\n"); - - if (GRSTgaclPermHasList(perm)) - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - else adminfooter(&bp, dn, help_uri, dir_uri, NULL); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(&bp); -} - -void unzipfile(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - char *shellcmd, *unzip, oneline[129]; - FILE *fp; - GRSThttpBody bp; - - if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden"); - - if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - GRSThttpPrintf(&bp, "Unzipping %s%s\n", dir_uri, file); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - GRSThttpPrintf(&bp, - "

Unzipping %s%s

\n", - dir_uri, file, dir_uri, file); - - unzip = getenv("GRST_UNZIP"); - if (unzip == NULL) unzip = getenv("REDIRECT_GRST_UNZIP"); - - if (unzip != NULL) - { - GRSThttpPrintf(&bp, "
\n");
-      asprintf(&shellcmd, "cd %s ; %s -jo %s -x '.*'", dir_path, unzip, file);
-      fp = popen(shellcmd, "r");
-  
-      while (fgets(oneline, sizeof(oneline), fp) != NULL)           
-                          GRSThttpPrintf(&bp, "%s", oneline);         
-      pclose(fp);
-      GRSThttpPrintf(&bp, "
\n"); - - if (GRSTgaclPermHasList(perm)) - GRSThttpPrintf(&bp, "

" - "Back to " - "directory", dir_uri, admin_file); - } - else GRSThttpPrintf(&bp, "

unzip path not defined!\n"); - - if (GRSTgaclPermHasList(perm)) - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - else adminfooter(&bp, dn, help_uri, dir_uri, NULL); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(&bp); -} - -void editfileform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int fd, rawpagesize, i, c; - char *dir_path_file, *rawpage, *p; - FILE *fp = NULL; - struct stat statbuf; - GRSThttpBody bp; - - if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden"); - - if (index(file, '/') != NULL) GRSThttpError("403 Forbidden"); - - dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2); - - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, file); - - fd = open(dir_path_file, O_RDONLY); - if (fd != -1) - { - fp = fdopen(fd, "r"); - if (fp == NULL) GRSThttpError("500 File open failed!"); - - if ((fstat(fd, &statbuf) != 0) || - !S_ISREG(statbuf.st_mode)) GRSThttpError("500 Not a regular file!"); - } - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp, "Edit file %s\n", file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Edit file %s

\n", file); - - GRSThttpPrintf(&bp,"
\n",dir_uri,admin_file); - GRSThttpPrintf(&bp,"

\n"); - GRSThttpPrintf(&bp,"

File name: \n", file); - GRSThttpPrintf(&bp,"\n"); - GRSThttpPrintf(&bp,"

\n"); - GRSThttpPrintf(&bp, "

\n"); - GRSThttpPrintf(&bp, "

\n"); - - if (fp != NULL) fclose(fp); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(&bp); -} - -void editdnlistform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *file, char *dir_uri, char *admin_file) -{ - int fd, i, c, numdn = 0; - char *dir_path_file, *rawpage, *p, *dnlistsuri, *server_name, *fulluri, - *realfile, oneline[513]; - FILE *fp = NULL; - struct stat statbuf; - GRSThttpBody bp; - - dnlistsuri = getenv("GRST_DN_LISTS_URI"); - if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI"); - - if (!GRSTgaclPermHasWrite(perm) || - (dnlistsuri == NULL) || - (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) != 0)) - GRSThttpError("403 Forbidden"); - - realfile = GRSThttpUrlEncode(file); - - dir_path_file = malloc(strlen(dir_path) + strlen(realfile) + 2); - - strcpy(dir_path_file, dir_path); - strcat(dir_path_file, "/"); - strcat(dir_path_file, realfile); - - fd = open(dir_path_file, O_RDONLY); - if (fd != -1) /* we dont mind open failing, but it must work if it doesnt */ - { - fp = fdopen(fd, "r"); - if (fp == NULL) GRSThttpError("500 File open failed!"); - - if ((fstat(fd, &statbuf) != 0) || - !S_ISREG(statbuf.st_mode)) GRSThttpError("500 Not a regular file!"); - } - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp, "Edit DN List %s\n", file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Edit DN List

\n"); - - GRSThttpPrintf(&bp,"
\n",dir_uri,admin_file); - GRSThttpPrintf(&bp,"

\n"); - GRSThttpPrintf(&bp,"

List URL: \n", file, strlen(file)); - GRSThttpPrintf(&bp,"\n"); - - if (fp != NULL) - { - GRSThttpPrintf(&bp, "

\n" - "\n"); - - while (fgets(oneline, sizeof(oneline), fp) != NULL) - { - ++numdn; - - p = rindex(oneline, '\n'); - if (p != NULL) *p = '\0'; - - GRSThttpPrintf(&bp, "" - "\n", numdn, oneline, oneline); - } - - GRSThttpPrintf(&bp,"
Keep?Name
%s
\n"); - } - - GRSThttpPrintf(&bp,"\n", numdn); - - GRSThttpPrintf(&bp, "

Add new DN: \n"); - - GRSThttpPrintf(&bp,"

\n"); - GRSThttpPrintf(&bp, "

\n"); - - if (fp != NULL) fclose(fp); - - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(&bp); -} - -void managedir(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *dir_uri, char *admin_file) -{ - int n, is_dnlists_dir = 0, enclen, numfiles, encprefixlen; - char *d_namepath, modified[99], *absaclpath, *editable, *p, *unzip, - *dnlistsuri, *d_name, *server_name, *fulluri, *encfulluri, - *encprefix, *dnlistsprefix; - GRSThttpBody bp; - struct tm mtime_tm; - struct stat statbuf; - struct dirent **namelist, *subdirfile_ent; - DIR *subDIR; - - if (((!GRSTgaclPermHasWrite(perm)) && - (!GRSTgaclPermHasList(perm))) || - (stat(dir_path, &statbuf) != 0) || !S_ISDIR(statbuf.st_mode)) - GRSThttpError("403 Forbidden"); - - editable = getenv("GRST_EDITABLE"); - if (editable == NULL) editable = getenv("REDIRECT_GRST_EDITABLE"); - - unzip = getenv("GRST_UNZIP"); - if (unzip == NULL) unzip = getenv("REDIRECT_GRST_UNZIP"); - - dnlistsuri = getenv("GRST_DN_LISTS_URI"); - if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI"); - - if (dnlistsuri && (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) == 0)) - { - is_dnlists_dir = 1; - server_name = getenv("SERVER_NAME"); - - asprintf(&fulluri, "https://%s%s", server_name, dir_uri); - encfulluri = GRSThttpUrlEncode(fulluri); - enclen = strlen(encfulluri); - - asprintf(&dnlistsprefix, "https://%s%s", server_name, dnlistsuri); - encprefix = GRSThttpUrlEncode(dnlistsprefix); - encprefixlen = strlen(encprefix); - } - - printf("Status: 200 OK\nContent-Type: text/html\n"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintf(&bp,"Manage directory %s\n", dir_uri); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpPrintf(&bp, "

Manage directory %s

\n\n", dir_uri); - - if (dir_uri[1] != '\0') - GRSThttpPrintf(&bp, - "\n", admin_file); - - if (GRSTgaclPermHasList(perm) || GRSTgaclPermHasAdmin(perm)) - { - absaclpath = malloc(strlen(dir_path) + sizeof(GRST_ACL_FILE) + 1); - strcpy(absaclpath, dir_path); - strcat(absaclpath, "/"); - strcat(absaclpath, GRST_ACL_FILE); - - if (stat(absaclpath, &statbuf) == 0) /* ACL exists in THIS directory */ - { - localtime_r(&(statbuf.st_mtime), &mtime_tm); - strftime(modified, sizeof(modified), - "", - &mtime_tm); - - if (!is_dnlists_dir) - { - GRSThttpPrintf(&bp, - "" - "%s\n", - GRST_ACL_FILE, - GRST_ACL_FILE, - statbuf.st_size, modified); - - GRSThttpPrintf(&bp, - "", - dir_uri, admin_file, GRST_ACL_FILE); - } - else GRSThttpPrintf(&bp, - "" - "%s\n", - GRST_ACL_FILE, - statbuf.st_size, modified); - - if (GRSTgaclPermHasAdmin(perm)) - GRSThttpPrintf(&bp, - "" - "", - dir_uri, admin_file, - dir_uri, admin_file, GRST_ACL_FILE); - else if (GRSTgaclPermHasRead(perm)) - GRSThttpPrintf(&bp, - "" - "", dir_uri, admin_file); - else GRSThttpPrintf(&bp, "\n"); - - GRSThttpPrintf(&bp, "\n"); - } - else if (GRSTgaclPermHasAdmin(perm)) - GRSThttpPrintf(&bp, "\n" - "\n" - "\n", - dir_uri, admin_file); - } - - if (GRSTgaclPermHasList(perm)) - { - n = scandir(dir_path, &namelist, 0, alphasort); - while (n--) - { - if (namelist[n]->d_name[0] != '.') - { - d_namepath = malloc(strlen(dir_path) + - strlen(namelist[n]->d_name) + 2); - strcpy(d_namepath, dir_path); - strcat(d_namepath, "/"); - strcat(d_namepath, namelist[n]->d_name); - stat(d_namepath, &statbuf); - - if (S_ISDIR(statbuf.st_mode)) - { - subDIR = opendir(d_namepath); - - if (subDIR == NULL) numfiles = 99; /* stop deletion */ - else - { - numfiles = 0; - while ((subdirfile_ent = readdir(subDIR)) != NULL) - if (subdirfile_ent->d_name[0] != '.') ++numfiles; - else if (strncmp(subdirfile_ent->d_name, - GRST_ACL_FILE, - sizeof(GRST_ACL_FILE)) == 0) ++numfiles; - - closedir(subDIR); - } - } - - free(d_namepath); - - localtime_r(&(statbuf.st_mtime), &mtime_tm); - strftime(modified, sizeof(modified), - "", - &mtime_tm); - - if (S_ISDIR(statbuf.st_mode)) - { - GRSThttpPrintf(&bp, - "" - "%s\n", - dir_uri, namelist[n]->d_name, admin_file, - namelist[n]->d_name, - statbuf.st_size, modified); - - if (numfiles == 0) - GRSThttpPrintf(&bp, - "\n", - dir_uri, admin_file, namelist[n]->d_name); - else GRSThttpPrintf(&bp, "\n"); - - GRSThttpPrintf(&bp, "\n"); - } - else if (is_dnlists_dir) - { - if ((strlen(namelist[n]->d_name) <= encprefixlen) || - (strncmp(namelist[n]->d_name, encprefix, - encprefixlen) != 0)) continue; - - d_name = GRSThttpUrlDecode(namelist[n]->d_name); - - GRSThttpPrintf(&bp, "" - "%s" - "", - d_name, d_name, - statbuf.st_size, modified); - - if (GRSTgaclPermHasWrite(perm)) - GRSThttpPrintf(&bp, "" - "" - "" - "" - "\n", - dir_uri, admin_file, d_name); - else GRSThttpPrintf(&bp, "\n"); - - if (GRSTgaclPermHasWrite(perm)) - GRSThttpPrintf(&bp, "" - "" - "" - "" - "\n", - dir_uri, admin_file, d_name); - else GRSThttpPrintf(&bp, "\n"); - - GRSThttpPrintf(&bp, ""); - } - else /* regular directory, not DN Lists */ - { - d_name = namelist[n]->d_name; - - GRSThttpPrintf(&bp, - "" - "%s", - dir_uri, d_name, - d_name, - statbuf.st_size, modified); - - GRSThttpPrintf(&bp, - "", - dir_uri, admin_file, d_name); - - p = rindex(namelist[n]->d_name, '.'); - - if ((unzip != NULL) && - (p != NULL) && - (strcasecmp(&p[1], "zip") == 0) && - GRSTgaclPermHasRead(perm)) - GRSThttpPrintf(&bp, - "\n", - dir_uri, admin_file, d_name); - else if ((p != NULL) && - (strstr(editable, &p[1]) != NULL) && - GRSTgaclPermHasWrite(perm)) - GRSThttpPrintf(&bp, - "\n", - dir_uri, admin_file, d_name); - else GRSThttpPrintf(&bp, ""); - - if (GRSTgaclPermHasWrite(perm)) - GRSThttpPrintf(&bp, - "\n", dir_uri, admin_file, d_name); - else - GRSThttpPrintf(&bp, "\n"); - - if (GRSTgaclPermHasWrite(perm)) - GRSThttpPrintf(&bp, - "\n", dir_uri, admin_file, d_name); - else - GRSThttpPrintf(&bp, ""); - } - } - - free(namelist[n]); - } - - free(namelist); - } - - if (GRSTgaclPermHasWrite(perm)) - { - if (is_dnlists_dir) - { - GRSThttpPrintf(&bp, "\n" - "" - "\n" - "\n", - dir_uri, admin_file, fulluri, strlen(fulluri)+8); - - GRSThttpPrintf(&bp, "\n" - "\n" - "\n", - dir_uri, admin_file); - } - else - { - GRSThttpPrintf(&bp, "\n" - "\n" - "" - "\n" - "\n" - "\n", - dir_uri, admin_file); - - GRSThttpPrintf(&bp, - "\n" - "\n" - "" - "" - "\n" - "" - "\n" - "\n", dir_uri, admin_file); - } - } - - GRSThttpPrintf(&bp, "
[Parent " - "directory]
%R%e %b %y
%s%ld" - "History
%s%ldEditDeleteView    
%R%e %b %y
" - "%s/%ld " - "Delete  
%s%ld 
 
  
%s%ld" - "History" - "List" - "Edit " - "Delete " - "Rename
 
New list name: " - "\n" - "
New directory: " - "\n" - "

New name:\n" - "

Upload file:New name: " - "
Local name:
\n"); - - if (!is_dnlists_dir) adminfooter(&bp, dn, help_uri, dir_uri, NULL); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(&bp); -} - diff --git a/org.gridsite.core/src/grst_admin_gacl.c b/org.gridsite.core/src/grst_admin_gacl.c deleted file mode 100644 index bdcccbd..0000000 --- a/org.gridsite.core/src/grst_admin_gacl.c +++ /dev/null @@ -1,981 +0,0 @@ -/* - Copyright (c) 2003-5, Shiv Kaushal, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*-----------------------------------------------------------* -* This program is part of GridSite: http://www.gridsite.org/ * -*------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include - -extern char *grst_perm_syms[]; -extern int grst_perm_vals[]; - -#include "grst_admin.h" - -// CGI GACL Editor interface functions -void show_acl(int admin, GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void new_entry_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void new_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void edit_entry_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void edit_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void add_cred_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void add_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_entry_sure(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void del_cred_sure(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void admin_continue(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file, GRSThttpBody *bp); - -// Functions for producing HTML output -void StartHTML(GRSThttpBody *bp, char *dir_uri, char* dir_path); -void StartForm(GRSThttpBody *bp, char* dir_uri, char* dir_path, char* admin_file, int timestamp, char* target_function); -void EndForm(GRSThttpBody *bp); -void GRSTgaclCredTableStart(GRSThttpBody *bp); -void GRSTgaclCredTableAdd(GRSTgaclUser *user, GRSTgaclEntry *entry, GRSTgaclCred *cred, GRSTgaclNamevalue *namevalue, int cred_no, int entry_no, int admin, int timestamp, GRSThttpBody *bp, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); -void GRSTgaclCredTableEnd(GRSTgaclEntry* entry, int entry_no, int admin, int timestamp, GRSThttpBody *bp, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); - -// ACL Manipulation functions -int GACLentriesInAcl(GRSTgaclAcl *acl); -int GRSTgaclCredsInEntry(GRSTgaclEntry *entry); -void check_acl_save(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file, GRSTgaclUser* user, GRSTgaclAcl *acl, GRSThttpBody *bp); -void GACLeditGetPerms(GRSTgaclEntry *entry); -GRSTgaclEntry *GACLreturnEntry(GRSTgaclAcl *acl, int entry_no); -GRSTgaclCred *GACLreturnCred(GRSTgaclEntry *entry, int cred_no); - -void StringHTMLEncode (char* string, GRSThttpBody *bp); - -void revert_acl(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file); - -/*****************************************/ -/********** FUNCTIONS FOLLOW *************/ -/*****************************************/ - -void show_acl(int admin, GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Shows the contents of the ACL. Gives edit 'buttons' if (int admin) == 1 - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSTgaclNamevalue *namevalue; - int entry_no, cred_no, allow, deny,timestamp; - GRSThttpBody bp; - char* AclFilename; - struct stat file_info; - int history_mode=0; - - if (admin==2){ - history_mode=1; - admin=0; - } - - /*double-check access permision*/ - if (!GRSTgaclPermHasAdmin(perm)) admin=0; - - StartHTML(&bp, dir_uri, dir_path); - - /* Load ACL from file and get timestamp*/ - if (history_mode==1) { - AclFilename=malloc(strlen(dir_path)+strlen(file)+2); - strcpy(AclFilename, dir_path); - strcat(AclFilename, "/"); - strcat(AclFilename, file); - } - else AclFilename=GRSTgaclFileFindAclname(dir_path); - - if (AclFilename==NULL){ - GRSThttpPrintf ( &bp,"The ACL was not found !!!
\n"); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; - } - - stat(GRSTgaclFileFindAclname(dir_path), &file_info); - timestamp=file_info.st_mtime; - acl = GRSTgaclAclLoadFile(AclFilename); - - if (acl==NULL){ - GRSThttpPrintf ( &bp,"The ACL was found but could not be loaded - it could be incorrectly formatted
\n"); - adminfooter(&bp, dn, help_uri, dir_uri, NULL); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(&bp); - return; - } - - if (admin) GRSThttpPrintf (&bp,"New Entry
\n", dir_uri, admin_file, dir_uri, timestamp ); - - // Start with the first entry in the list and work through - entry=acl->firstentry; - entry_no=1; - while (entry!=NULL){ - - GRSThttpPrintf (&bp,"
Entry %d:\n", entry_no); - if (admin){ - GRSThttpPrintf (&bp,"Edit Entry ", dir_uri, admin_file, entry_no, dir_uri, timestamp ); - GRSThttpPrintf (&bp,"Delete Entry ",dir_uri, admin_file, entry_no, dir_uri, timestamp ); - GRSThttpPrintf (&bp,"

\n"); - } - - GRSTgaclCredTableStart(&bp); - - // Start with the first credential in the entry and work through - cred=entry->firstcred; - cred_no=1; - while (cred!=NULL){ - namevalue=cred->firstname; - GRSTgaclCredTableAdd(user, entry, cred, namevalue, cred_no, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - // Change to next credential - cred=cred->next; - cred_no++; - } - - GRSTgaclCredTableEnd (entry, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - // Change to next entry - entry=entry->next; - entry_no++; - } - - if (!admin && GRSTgaclPermHasAdmin(perm) && !history_mode) //Print a link for admin mode, if not in admin mode but the user has admin permissions - GRSThttpPrintf (&bp,"Admin Mode", dir_uri, admin_file, dir_uri, timestamp ); - if (history_mode==1 && GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"), user)){ - StartForm(&bp, dir_uri, dir_path, admin_file, timestamp, "revert_acl"); -//GRSThttpPrintf (&bp,"Revert to this Version", dir_uri, admin_file, dir_uri, timestamp, file ); - GRSThttpPrintf (&bp, "\n", file); - // Revert Button - GRSThttpPrintf (&bp, "

\n\n"); - } - - adminfooter(&bp, dn, help_uri, dir_uri, NULL); - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); GRSThttpWriteOut(&bp); return; -} - - -void new_entry_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm,char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Presents the user with a form asking for details required to create a new entry - GRSThttpBody bp; - int timestamp=atol(GRSThttpGetCGI("timestamp")); - GRSTgaclCred* cred; - GRSTgaclEntry *entry; - GRSTgaclNamevalue* namevalue; - - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - entry = GRSTgaclEntryNew(); - StartHTML(&bp, dir_uri, dir_path); - StartForm(&bp, dir_uri, dir_path, admin_file, timestamp, "new_entry"); - GRSThttpPrintf (&bp, "NEW ENTRY IN ACL FOR %s

\n", dir_uri); - - GRSTgaclCredTableStart(&bp); - GRSTgaclCredTableAdd(user, entry,cred, namevalue, 0, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - GRSTgaclCredTableEnd (entry, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - - /*Submit and reset buttons - submit button sends the data in the form back to the script & new_entry() to be called*/ - EndForm(&bp); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; -} - -void new_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Processes the information entered into the form from new_entry_form() and adds a new entry to the ACL - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - char *type, *value; - GRSThttpBody bp; - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - // Get new credential info and perform checks - type=GRSThttpGetCGI("type"); - value=GRSThttpGetCGI("cred0_value"); - - if (strcmp(type, "not_chosen")==0){ - GRSThttpError ("500 Invalid input - credential type not chosen"); - return; - } - - // Create the credential - cred=GRSTgaclCredNew(type); - if (strcmp(type, "person")==0) GRSTgaclCredAddValue(cred,"dn", value); - else if (strcmp(type, "dn-list")==0) GRSTgaclCredAddValue(cred, "url", value); - else if (strcmp(type, "voms")==0) GRSTgaclCredAddValue(cred, "fqan", value); - else if (strcmp(type, "dns")==0) GRSTgaclCredAddValue(cred, "hostname", value); - else if (strcmp(type, "any-user")==0) {} // namevalue not entered for any-user credential - else{ - GRSThttpError ("500 Invalid input - credential type not valid"); - return; - } - - // Create and empty entry, add the credential and get permissions - entry = GRSTgaclEntryNew(); - GRSTgaclEntryAddCred(entry, cred); - GACLeditGetPerms(entry); - - // Load the ACL, add the entry and save - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path)); - GRSTgaclAclAddEntry(acl, entry); - check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp); - return; -} - -void del_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Deletes the entry denoted by the GCI variable "entry_no"*/ - int entry_no; - GRSTgaclAcl *acl; - GRSTgaclEntry *previous, *entry; - GRSThttpBody bp; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - // Load the ACL - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path)); - - // Get the number of the entry to be deleted and check okay to delete - entry_no=atol(GRSThttpGetCGI("entry_no")); - if(GACLentriesInAcl(acl)<=1){ - StartHTML(&bp, dir_uri, dir_path); - GRSThttpPrintf (&bp, "ERROR: Cannot delete all entries from the ACL
\n"); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; - } - - // Get pointer to entry and previous entry - entry = GACLreturnEntry(acl, entry_no); - if (entry_no!=1) previous = GACLreturnEntry(acl, entry_no-1); - - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){ - GRSThttpError ("500 Unable to read entry from ACL file"); - return; - } - - // Perform deletion from the list by changing pointers - if (entry_no==1) acl->firstentry=entry->next; - else if (entry_no==GACLentriesInAcl(acl)) previous->next=NULL; - else previous->next=entry->next; - - // Save ACL and exit - check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp); - - return; -} - - -void edit_entry_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Presents the user with an editable form containing details of entry denoted by CGI variable entry_no*/ - int entry_no, cred_no, i, admin=0, timestamp=atol(GRSThttpGetCGI("timestamp")); - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSTgaclNamevalue *namevalue; - // struct _GACLnamevalue *namevalue; - GRSThttpBody bp; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - // Load ACL from file - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path)); - - // Get pointer to the entry and check okay - entry_no=atol(GRSThttpGetCGI("entry_no")); - entry = GACLreturnEntry(acl, entry_no); - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - StartHTML(&bp, dir_uri, dir_path); - GRSThttpPrintf (&bp, "EDITING ENTRY %d IN ACL FOR %s

\n", entry_no, dir_uri); - - // Start with first credential in the entry and display them in order*/ - cred=entry->firstcred; - cred_no=1; - StartForm(&bp, dir_uri, dir_path, admin_file, timestamp, "edit_entry"); - GRSThttpPrintf (&bp, "\n", entry_no); - - GRSTgaclCredTableStart(&bp); - - while (cred!=NULL){ - // Start with the first namevalue in the credential - namevalue=cred->firstname; - GRSTgaclCredTableAdd(user, entry, cred, namevalue, cred_no, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - // Change to next credential - cred=cred->next; - cred_no++; - } - GRSTgaclCredTableEnd (entry, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - EndForm(&bp); - - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; -} - - -void edit_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - //Processes the information entered into the form from edit_entry_form() and updates the entry corresponding to entry_no*/ - int entry_no, cred_no, i; - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSTgaclNamevalue *namevalue; - char variable[30]; - GRSThttpBody bp; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - // Load the ACL - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path)); - - // Get pointer to the entry and perform checks - entry_no=atol(GRSThttpGetCGI("entry_no")); - entry = GACLreturnEntry(acl, entry_no); - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - // Start with the first credential and update each one - cred=entry->firstcred; - cred_no=1; - - while (cred!=NULL){ - if (strcmp(cred->type, "any-user")!=0){ - namevalue=cred->firstname; - sprintf(variable, "cred%d_value", cred_no); - namevalue->value=GRSThttpGetCGI(variable); - } - //Change to next credential*/ - cred=cred->next; - cred_no++; - } - - // Update permissions - GACLeditGetPerms(entry); - check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp); - return; -} - - -void add_cred_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Presents the user with a form asking for details required to create a new credential in the entry denoted by entry_no - GRSThttpBody bp; - int timestamp=atol(GRSThttpGetCGI("timestamp")), entry_no=atol(GRSThttpGetCGI("entry_no")); - GRSTgaclAcl *acl; - GRSTgaclEntry* entry; - GRSTgaclCred* cred; - GRSTgaclNamevalue* namevalue; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path)); // Load the ACL - - //Get pointer to the entry and perform checks - entry = GACLreturnEntry(acl, entry_no); - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - - if (strcmp(GRSThttpGetCGI("cmd"), "add_cred_form")==0){ //if not a new entry check to see if cred exists - cred=entry->firstcred; - while (cred!=NULL) { - if (strcmp (cred->type, "any-user")==0) { - StartHTML(&bp, dir_uri, dir_path); - GRSThttpPrintf (&bp, "ERROR: AND-ing \"any-user\" credential with other credential does not make sense
\n"); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; - } - cred=cred->next; - } - } - - StartHTML(&bp, dir_uri, dir_path); - GRSThttpPrintf (&bp, " NEW CREDENTIAL IN ENTRY %d OF ACL FOR %s

\n", entry_no, dir_uri); - StartForm(&bp, dir_uri, dir_path, admin_file, timestamp, "add_cred"); - - GRSThttpPrintf (&bp, " \n", entry_no); - - GRSTgaclCredTableStart(&bp); - GRSTgaclCredTableAdd(user, entry, cred, namevalue, 0, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - GRSTgaclCredTableEnd (entry, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - - EndForm(&bp); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; -} - - -void add_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Processes the information entered into the form [add_cred_form()]and adds a new credential to the entry corresponding to entry_no - int entry_no; - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSThttpBody bp; - char *type, *value; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));// Load the ACL - - // Get pointer to the entry and perform checks - entry_no=atol(GRSThttpGetCGI("entry_no")); - entry = GACLreturnEntry(acl, entry_no); - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl)){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - // Create new credential and add it to entry - type=GRSThttpGetCGI("type"); - value=GRSThttpGetCGI("cred0_value"); - cred=GRSTgaclCredNew(type); - if (strcmp(type, "person") ==0) GRSTgaclCredAddValue(cred,"dn", value); - else if (strcmp(type, "dn-list") ==0) GRSTgaclCredAddValue(cred, "url", value); - else if (strcmp(type, "voms") ==0) GRSTgaclCredAddValue(cred, "fqan", value); - else if (strcmp(type, "dns") ==0) GRSTgaclCredAddValue(cred, "hostname", value); - else if (strcmp(type, "any-user")==0) {}// namevalue not entered for any-user credential - else{ - GRSThttpError ("500 Credential type not valid"); - return; - } - GRSTgaclEntryAddCred(entry, cred); - - check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp); - return; -} - - -void del_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Deletes the credential denoted by the GCI variable "cred_no", in the entry denoted by "entry_no" - int entry_no, cred_no; - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *previous, *cred; - GRSThttpBody bp; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path)); - - // Get pointer to the entry and perform checks - entry_no=atol(GRSThttpGetCGI("entry_no")); - entry = GACLreturnEntry(acl, entry_no); - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - // Get pointer the the credential and perform checks - cred_no=atol(GRSThttpGetCGI("cred_no")); - cred=GACLreturnCred(entry, cred_no); - if(entry==NULL || entry_no<1 || cred_no>GRSTgaclCredsInEntry(entry)){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - // Get pointer to previous credential - if needed - if (cred_no!=1) previous = GACLreturnCred(entry, cred_no-1); - - // Perform deletion from the list by changing pointers - if (cred_no==1) entry->firstcred=cred->next; - else if (cred_no==GRSTgaclCredsInEntry(entry)) previous->next=NULL; - else previous->next=cred->next; - - check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp); - return; -} - -void admin_continue(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file, GRSThttpBody *bp){ - // Single line printed out to forward users back to show_acl in admin mode - // Should ALWAYS called from another function so no HTML header required - // Should ALWAYS be the end of a page - GRSThttpPrintf (bp, "\n
Click Here to return to the editor", dir_uri,admin_file,dir_uri, time(NULL)); - adminfooter(bp, dn, help_uri, dir_uri, NULL); - GRSThttpPrintHeaderFooter(bp, dir_path, GRST_FOOTFILE); - GRSThttpWriteOut(bp); - return; -} - - -void del_entry_sure(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Prints out entry denoted by entry_no and asks if the user really wants to delete it - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSTgaclNamevalue *namevalue; - int entry_no, cred_no, allow, deny, i, timestamp; - GRSThttpBody bp; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));// Load ACL from file - - if (acl==NULL){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - // Get pointer to the entry and check okay - entry_no=atol(GRSThttpGetCGI("entry_no")); - entry = GACLreturnEntry(acl, entry_no); - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - StartHTML(&bp, dir_uri, dir_path); - GRSThttpPrintf (&bp, "

Do you really want to delete the following entry?



\n"); - GRSThttpPrintf (&bp,"
Entry %d:
\n", entry_no); - - // Print the entry out - // Start with the first credential in the entry and work through - cred=entry->firstcred; - cred_no=1; - - GRSTgaclCredTableStart(&bp); - while (cred!=NULL){ - // Start with the first namevalue in the credential - namevalue=cred->firstname; - GRSTgaclCredTableAdd(user, entry, cred, namevalue, cred_no, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - // Change to next credential - cred=cred->next; - cred_no++; - } - - GRSTgaclCredTableEnd (entry, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - - StartForm(&bp, dir_uri, dir_path, admin_file, atol(GRSThttpGetCGI("timestamp")), "del_entry"); - GRSThttpPrintf (&bp, "\n", entry_no); - GRSThttpPrintf (&bp, "

\n\n"); - - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; -} - -void del_cred_sure(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Prints out credential denoted by entry_no/cred_no and asks if the user really wants to delete it - GRSTgaclAcl *acl; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSTgaclNamevalue *namevalue; - int entry_no, cred_no, allow, deny, timestamp, i; - GRSThttpBody bp; - - if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden"); - - acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));// Load ACL from file - - if (acl==NULL){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - // Get pointer to the entry and check okay - entry_no=atol(GRSThttpGetCGI("entry_no")); - entry = GACLreturnEntry(acl, entry_no); - if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - // Get pointer to the credential and check okay - cred_no=atol(GRSThttpGetCGI("cred_no")); - cred=GACLreturnCred(entry, cred_no); - if(entry==NULL || entry_no<1 || cred_no>GRSTgaclCredsInEntry(entry)){ - GRSThttpError ("500 Unable to read from ACL file"); - return; - } - - if(GRSTgaclCredsInEntry(entry)<=1){ - del_entry_sure(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - return; - } - - StartHTML(&bp, dir_uri, dir_path); - GRSThttpPrintf (&bp, "

Do you really want to delete the following credential from entry %d?



", entry_no); - - // Print the credential out - GRSTgaclCredTableStart(&bp); - GRSTgaclCredTableAdd(user, entry, cred, cred->firstname, cred_no, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - GRSTgaclCredTableEnd (entry, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - GRSThttpPrintf (&bp,"
\n"); - - // Yes Button - StartForm(&bp, dir_uri, dir_path, admin_file, atol(GRSThttpGetCGI("timestamp")), "del_cred"); - GRSThttpPrintf (&bp, "\n", entry_no); - GRSThttpPrintf (&bp, "\n", cred_no); - GRSThttpPrintf (&bp, "

\n\n"); - - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp); - return; -} - - -int GACLentriesInAcl(GRSTgaclAcl *acl){ - // Returns the number of entries in acl - GRSTgaclEntry *entry; - int number; - - entry=acl->firstentry; - number=0; - - while (entry!=NULL) - { - number++; - entry=entry->next; - } - - return number; -} - -int GRSTgaclCredsInEntry(GRSTgaclEntry *entry){ - // Returns the number of credentials in entry - int number; - GRSTgaclCred *cred; - - cred=entry->firstcred; - number=0; - - while (cred!=NULL) - { - number++; - cred=cred->next; - } - - return number; -} - - -void GACLeditGetPerms(GRSTgaclEntry *entry){ - // Updates the permissions entry using permissions from a form produced using GRSTgaclCredTableEnd - int i; - char buf[30]; - - - for (i=0; grst_perm_syms[i]!=NULL; i++) /* Print the list of allowed permissions*/ - { - sprintf (buf, "allow_%s", grst_perm_syms[i]); // Update allowed - if (strcmp (GRSThttpGetCGI(buf), "ON") == 0 ) GRSTgaclEntryAllowPerm(entry, grst_perm_vals[i]); else GRSTgaclEntryUnallowPerm(entry, grst_perm_vals[i]); - - sprintf (buf, "deny_%s", grst_perm_syms[i]); // Update denied - if (strcmp (GRSThttpGetCGI(buf), "ON") == 0 ) GRSTgaclEntryDenyPerm(entry, grst_perm_vals[i]); else GRSTgaclEntryUndenyPerm(entry, grst_perm_vals[i]); - - } - - return; -} - -GRSTgaclEntry *GACLreturnEntry(GRSTgaclAcl *acl, int entry_no){ - // Returns a pointer to entry in ACL denoted by entry_no, returns NULL if not found - int number; - GRSTgaclEntry *entry; - - if (acl==NULL) return NULL; - - entry=acl->firstentry; - number=1; - - while (entry!=NULL) - { - if (number==entry_no) return entry; - number++; - entry=entry->next; - } - - return NULL; -} - - -GRSTgaclCred *GACLreturnCred(GRSTgaclEntry *entry, int cred_no){ - // Returns a pointer to credential denoted by cred_no in entry, returns NULL if not found - int number; - GRSTgaclCred *cred; - - if (entry==NULL) return NULL; - - cred=entry->firstcred; - number=1; - - while (cred!=NULL) - { - if (number==cred_no) return cred; - number++; - cred=cred->next; - } - - return NULL; -} -void StartHTML(GRSThttpBody *bp, char *dir_uri, char* dir_path){ - //Start HTML output and insert page title - printf("Status: 200 OK\nContent-Type: text/html\n"); - GRSThttpBodyInit(bp); - GRSThttpPrintf(bp, "Access Control List for %s\n", dir_uri); - GRSThttpPrintHeaderFooter(bp, dir_path, GRST_HEADFILE); - return; -} -void StartForm(GRSThttpBody *bp, char* dir_uri, char* dir_path, char* admin_file, int timestamp, char* target_function){ - // Starts an HTML form with gridsite admin as the target and target_function as the value of cmd. - // Also inputs the dir_uri and the timestamp - GRSThttpPrintf (bp, "
\n", dir_uri, admin_file, dir_uri); - GRSThttpPrintf (bp, " \n", target_function); - GRSThttpPrintf (bp, " \n", timestamp); - return; -} - -void EndForm(GRSThttpBody *bp){ - GRSThttpPrintf (bp, "

\n"); - GRSThttpPrintf (bp, "
\n"); - return; -} - -void GRSTgaclCredTableStart(GRSThttpBody *bp){ - //Starts an HTML table of credentials by setting the column widths and inputting the headings - GRSThttpPrintf (bp,""); - GRSThttpPrintf (bp,""); - return; -} - -void GRSTgaclCredTableAdd(GRSTgaclUser *user, GRSTgaclEntry *entry, GRSTgaclCred *cred, GRSTgaclNamevalue *namevalue, int cred_no, int entry_no, int admin, int timestamp, GRSThttpBody *bp, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Adds the credential "cred" to a table started byGRSTgaclCredTableStart allowing the user to edit if appropriate - char* cmd = GRSThttpGetCGI("cmd"); - int edit_values=0, new_cred=0, allow_new_person=1; - int site_admin=GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"), user); - - if (strcmp(cmd, "new_entry_form")==0 || strcmp(cmd, "add_cred_form")==0) new_cred=1; - if (new_cred || strcmp(cmd, "edit_entry_form")==0) edit_values=1; - - if (new_cred) { /*Print out type and descriptor*/ - if (strcmp(cmd, "add_cred_form")==0){ /*if not a new entry check to see if cred exists.*/ - cred=entry->firstcred; - while (cred!=NULL) {if (strcmp (cred->type, "person")==0) allow_new_person=0; cred=cred->next;} - } - //create dummy credential for the user to edit - cred=GRSTgaclCredNew("new"); - GRSTgaclCredAddValue(cred, "", ""); - namevalue=cred->firstname; - //Drop down list of types - GRSThttpPrintf(bp,""); - GRSThttpPrintf(bp,""); - } - - else { //Print out type and descriptor for existing cred - - GRSThttpPrintf(bp,""); -} - -void GRSTgaclCredTableEnd(GRSTgaclEntry* entry, int entry_no, int admin, int timestamp, GRSThttpBody *bp, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - // Finishes off a table of credentials by inputting "Add Credential" link and a list of premissions in the final row - int i, blank_perms, edit_perms, show_perms; - char* cmd = GRSThttpGetCGI("cmd"); - - if (strcmp(cmd, "add_cred_form")==0 ||strcmp(cmd, "del_cred_sure")==0) show_perms=0; else show_perms=1; - if (strcmp(cmd, "edit_entry_form")==0 || strcmp(cmd, "new_entry_form")==0) edit_perms=1; else edit_perms=0; - if (strcmp(cmd, "new_entry_form")==0) blank_perms=1; else blank_perms=0; - - // If showing the last row is not required then exit - if (show_perms==0){GRSThttpPrintf (bp,"
Credential No.TypeValue
New"); - GRSThttpPrintf (bp, "
%d", cred_no); - if (admin) GRSThttpPrintf (bp,"(Delete)", dir_uri,admin_file,dir_uri, entry_no, cred_no, timestamp); - GRSThttpPrintf(bp, "%s ", cred->type); - } - - if (strcmp(cred->type, "any-user")==0) GRSThttpPrintf (bp, " "); /* Do not print out namevalue for any-user credential*/ - else{ - if (edit_values){ // Place namevalue in an editable box if appropriate - GRSThttpPrintf (bp, "value, bp); - GRSThttpPrintf (bp, "\">"); - } - else if (strcmp(cred->type, "dn-list")==0){ - GRSThttpPrintf(bp, "value, bp); - GRSThttpPrintf(bp, " \">"); - StringHTMLEncode(namevalue->value, bp); - GRSThttpPrintf(bp, ""); - } - else { GRSThttpPrintf(bp, " "); StringHTMLEncode(namevalue->value, bp);} - - } - //Print out warning symbol if cred being printed relates to current user - but NOT for users in site admin list - if (GRSTgaclUserHasCred(user, cred) && !site_admin) GRSThttpPrintf(bp, " <--"); - GRSThttpPrintf(bp, "

\n"); return;} - - GRSThttpPrintf (bp,""); - - if (admin) GRSThttpPrintf (bp,"Add Credential", dir_uri,admin_file,dir_uri, entry_no, timestamp); - - GRSThttpPrintf (bp, "\n "); - - if (blank_perms==1)entry->allowed=entry->denied=GRST_PERM_NONE; - - // Show Permissions - will produce a list or a list of check boxes depending on whether the permissions are to be edited or not - GRSThttpPrintf (bp, "Allowed: "); - for (i=0; grst_perm_syms[i]!=NULL; i++) /* Print the list of allowed permissions*/ - { - if ( entry->allowed & grst_perm_vals[i]){ - if (edit_perms) GRSThttpPrintf (bp, "%s   \n", grst_perm_syms[i],grst_perm_syms[i]); - else GRSThttpPrintf(bp,"%s ", grst_perm_syms[i]); if (strcmp(grst_perm_syms[i], "none")==0) break; - } - else if (strcmp(grst_perm_syms[i], "none")!=0 && edit_perms) GRSThttpPrintf (bp, "%s   \n", grst_perm_syms[i],grst_perm_syms[i]); - } - - if (edit_perms) GRSThttpPrintf (bp, "

"); - GRSThttpPrintf (bp, "Denied: "); - for (i=0; grst_perm_syms[i]!=NULL; i++) /* Print the list of denied permissions*/ - { - if ( entry->denied & grst_perm_vals[i]) - { - if (edit_perms) GRSThttpPrintf (bp, "%s   \n", grst_perm_syms[i],grst_perm_syms[i]); - else GRSThttpPrintf(bp,"%s ", grst_perm_syms[i]); - if (strcmp(grst_perm_syms[i], "none")==0) break; - } - else if (strcmp(grst_perm_syms[i], "none")!=0 && edit_perms) GRSThttpPrintf (bp, "%s   \n", grst_perm_syms[i],grst_perm_syms[i]); - } - - GRSThttpPrintf (bp, ""); - GRSThttpPrintf (bp,"
\n"); - GRSThttpPrintf (bp,"\n"); -} - -void check_acl_save(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file, GRSTgaclUser* user, GRSTgaclAcl *acl, GRSThttpBody *bp){ - // Checks if the acl for the current directory has been changed, check the current user's permissions. - // If all is okay the ACl is saved -> returns 1 else returns 0 - struct stat file_info; - GRSTgaclPerm new_perm; - char *vfile, *dir_path_vfile, *dir_path_file; - FILE *fp; - - - /*Check ACL has not been modified*/ - stat(GRSTgaclFileFindAclname(dir_path), &file_info); - if (atol(GRSThttpGetCGI("timestamp"))!=file_info.st_mtime){ - StartHTML(bp, dir_uri, dir_path); - GRSThttpPrintf (bp, "ERROR: CANNOT SAVE CHANGES

The ACL has been modified since it was last viewed\n

"); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, bp); - return; - } - - // check users permissions in the new ACL - - if (!GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"), user)) - { - new_perm = GRSTgaclAclTestUser(acl, user); - if (new_perm != perm){ - StartHTML(bp, dir_uri, dir_path); - if (!GRSTgaclPermHasAdmin(new_perm)){//Check that user still has Admin permissions - if not then exit without saving the new ACL - GRSThttpPrintf (bp, "ERROR: CANNOT SAVE CHANGES\n\n

You cannot deny yourself admin access from within the editor\n"); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, bp); - return; - } - //Functions to inform of other permission changes come next - GRSThttpPrintf (bp, "WARNING: OPERATION CHANGED YOUR PERMISSIONS!\n\n

You still have Admin permissions

\n"); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, bp); - return; - } - } - // ACL not modified, notified of permission changes - can now save - - dir_path_file=GRSTgaclFileFindAclname(dir_path); - vfile=makevfilename(".gacl", file_info.st_size, dn); // Make temporary file name - dir_path_vfile = malloc(strlen(dir_path) + strlen(vfile) + 2); - strcpy(dir_path_vfile, dir_path); - strcat(dir_path_vfile, "/"); - strcat(dir_path_vfile, vfile); - - - // save the new ACL to the temporary file in the correct format using the GridsiteACLFormat directive - - if (strcasecmp(getenv("REDIRECT_GRST_ACL_FORMAT"), "XACML") ==0) GRSTxacmlAclSave(acl, dir_path_vfile); - else if (strcasecmp(getenv("REDIRECT_GRST_ACL_FORMAT"), "GACL") ==0) GRSTgaclAclSave(acl, dir_path_vfile); - else - { - GRSThttpPrintf (bp, "ERROR: ACL type not correctly specified"); - admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, bp); - return; - } - - - unlink(dir_path_file); - if (link (dir_path_vfile,dir_path_file)!=0) GRSThttpError("403 Forbidden"); - - printf ("Status: 302 Moved Temporarily\n Content Length: 0\nLocation: %s%s?cmd=admin_acl\n\n", dir_uri, admin_file); - return; -} - -void StringHTMLEncode (char* string, GRSThttpBody *bp){ - - char* current_char; - char* tmp; - int n; - tmp=malloc(2); - - *(tmp+1)='\0'; - current_char=string; - while(*current_char != '\0'){ - - if (*current_char == '<') GRSThttpPrintf (bp,"<"); - else if (*current_char == '>') GRSThttpPrintf (bp,">"); - else if (*current_char == '&') GRSThttpPrintf (bp,"&"); - else if (*current_char == '\'') GRSThttpPrintf (bp,"'"); - else if (*current_char == '"') GRSThttpPrintf (bp,"""); - else{ - *tmp=*current_char; - GRSThttpPrintf(bp, "%s", tmp); - - } - current_char++; - } - return; -} - -void revert_acl(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){ - char *AclFilename; - GRSTgaclAcl *acl; - GRSThttpBody bp; - // Load the old ACL, add the entry and save - AclFilename=malloc(strlen(dir_path)+strlen(file)+2); - strcpy(AclFilename, dir_path); - strcat(AclFilename, "/"); - strcat(AclFilename, file); - - acl = GRSTgaclAclLoadFile(AclFilename); - check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp); - return; -} diff --git a/org.gridsite.core/src/grst_admin_main.c b/org.gridsite.core/src/grst_admin_main.c deleted file mode 100644 index a9e9f0e..0000000 --- a/org.gridsite.core/src/grst_admin_main.c +++ /dev/null @@ -1,378 +0,0 @@ -/* - Andrew McNab and Shiv Kaushal, University of Manchester. - Copyright (c) 2002-5. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*------------------------------------------------------------------* - * This program is part of GridSite: http://www.gridsite.org/ * - *------------------------------------------------------------------*/ - -#ifndef VERSION -#define VERSION "x.x.x" -#endif - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// when porting: remember that sendfile() is very OS-specific! -#include - -#include - -#include "grst_admin.h" - -/* - - GridSite human/interactive management interface. This should produce - a CGI executable, usually ./sbin/real-gridsite-admin.cgi, which is - called from HTML forms either by GET or POST methods or both (ie input - present in both QUERY_STRING and the stdin of the CGI process.) - - The CGI name/value pairs used are: - - cmd = edit, managedir, print, history - file = short name of file, without path - - If real-gridsite-admin.cgi is run by an internal redirection inside - mod_gridsite (as should ALWAYS be the case) then the environment - variable REDIRECT_GRST_DIR_PATH will be set to the full path of - the directory holding the file in question. This respects any complex - URI -> file path mapping done by Apache. - -*/ - -void GRSThttpError(char *status) -{ - printf("Status: %s\n", status); - printf("Server-CGI: GridSite Admin %s\n", VERSION); - printf("Content-Length: %d\n", 2 * strlen(status) + 58); - puts("Content-Type: text/html\n"); - - printf("%s\n", status); - printf("

%s

\n", status); - - exit(0); -} - -void adminfooter(GRSThttpBody *bp, char *dn, char *help_uri, char *dir_uri, - char *admin_file) -{ - GRSThttpPrintf(bp, "

\n"); - - if (dn != NULL) GRSThttpPrintf(bp, "


You are %s
\n", dn); - else GRSThttpPrintf(bp, "
\n"); - - if (admin_file != NULL) - GRSThttpPrintf(bp, "" - "Manage directory .\n", - dir_uri, admin_file); - else GRSThttpPrintf(bp, "" - "Back to directory .\n", dir_uri); - - if (help_uri != NULL) - GRSThttpPrintf(bp, "Website Help .\n", help_uri); - - if ((getenv("GRST_NO_LINK") == NULL) && - (getenv("REDIRECT_GRST_NO_LINK") == NULL)) - GRSThttpPrintf(bp, "Built with " - "GridSite %s\n", - VERSION); - - GRSThttpPrintf(bp, "
\n"); -} - -int GRSTstrCmpShort(char *long_s, char *short_s) -{ - while (*short_s != '\0') - { - if (*long_s > *short_s) return +1; - if (*long_s < *short_s) return -1; - - ++long_s; - ++short_s; - } - - return 0; -} - -char *makevfilename(char *publicname, size_t size, char *dn) -{ - int i; - char *ext, *vfilename, *encpublicname, *encdn, *p; - struct timeval tv_now; - - gettimeofday(&tv_now, NULL); - - ext = rindex(publicname, '.'); - if (ext == NULL) ext = ""; - - encpublicname = GRSThttpUrlEncode(publicname); - for (p=encpublicname; *p != '\0'; ++p) if (*p == '%') *p = '='; - - encdn = GRSThttpUrlEncode(dn); - for (p=encdn; *p != '\0'; ++p) if (*p == '%') *p = '='; - - /* we used zero-padding for times so - alphanumeric sorting will sort chronologically too */ - - asprintf(&vfilename, "%s:%s:%08X:%05X:%X:%s:%s", GRST_HIST_PREFIX, - encpublicname, tv_now.tv_sec, tv_now.tv_usec, size, encdn, ext); - - return vfilename; -} - -void justheader(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *dir_uri, char *admin_file) -{ - GRSThttpBody bp; - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE); - - GRSThttpWriteOut(&bp); -} - -void justfooter(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, - char *dir_uri, char *admin_file) -{ - GRSThttpBody bp; - - puts("Status: 200 OK\nContent-Type: text/html"); - - GRSThttpBodyInit(&bp); - - if (GRSTgaclPermHasList(perm) || GRSTgaclPermHasWrite(perm) - || GRSTgaclPermHasAdmin(perm)) - adminfooter(&bp, dn, help_uri, dir_uri, admin_file); - - GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); - - GRSThttpWriteOut(&bp); -} - -int main() -{ - int i, gsiproxylimit_i = 1; - char *cmd, *dir_uri, *file, *dir_path, *admin_file, *dn = NULL, - *help_uri, *p, *content_type, *request_uri, *button, - *grst_cred_0, *gsiproxylimit, *dn_lists, buf[12]; - GRSTgaclCred *cred; - GRSTgaclUser *user = NULL; - GRSTgaclAcl *acl; - GRSTgaclPerm perm = GRST_PERM_NONE; - - help_uri = getenv("REDIRECT_GRST_HELP_URI"); /* can be NULL */ - admin_file = getenv("REDIRECT_GRST_ADMIN_FILE"); - dir_path = getenv("REDIRECT_GRST_DIR_PATH"); - request_uri = getenv("REQUEST_URI"); - - if ((dir_path == NULL) || (admin_file == NULL) || (request_uri == NULL)) - { - puts("Status: 500 Internal Server Error\nContent-type: text/plain\n\n" - "REDIRECT_GRST_DIR_PATH or REDIRECT_GRST_ADMIN_FILE " - "or REQUEST_URI missing"); - return; - } - - GRSTgaclInit(); - - grst_cred_0 = getenv("GRST_CRED_0"); - - if ((grst_cred_0 != NULL) && (cred = GRSTx509CompactToCred(grst_cred_0))) - { - gsiproxylimit = getenv("REDIRECT_GRST_GSIPROXY_LIMIT"); - if (gsiproxylimit != NULL) sscanf(gsiproxylimit, "%d", &gsiproxylimit_i); - - if (GRSTgaclCredGetDelegation(cred) <= gsiproxylimit_i) - { - user = GRSTgaclUserNew(cred); - - if ((p = index(grst_cred_0, ' ')) && - (p = index(++p, ' ')) && - (p = index(++p, ' ')) && - (p = index(++p, ' '))) dn = &p[1]; - } - /* User has a cert so check for voms attributes */ - for(i=1; ; i++) - { - sprintf (buf, "GRST_CRED_%d", i); - - - grst_cred_0 = getenv(buf); - if (grst_cred_0==NULL) break; - - if (cred=GRSTx509CompactToCred(grst_cred_0)) - GRSTgaclUserAddCred(user, cred); - } - /* no more voms attributes found found */ - } - else if ((dn = getenv("SSL_CLIENT_S_DN")) != NULL) - { - cred = GRSTgaclCredNew("person"); - GRSTgaclCredAddValue(cred, "dn", dn); - user = GRSTgaclUserNew(cred); - } - - dn_lists = getenv("REDIRECT_GRST_DN_LISTS"); - if (dn_lists == NULL) dn_lists = getenv("GRST_DN_LISTS"); - if (dn_lists != NULL) GRSTgaclUserSetDNlists(user, dn_lists); - - if (GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"), - user)) perm = GRST_PERM_ALL; - else - { - p = getenv("REMOTE_HOST"); - if (p != NULL) - { - cred = GRSTgaclCredNew("dns"); - GRSTgaclCredAddValue(cred, "hostname", p); - - if (user == NULL) user = GRSTgaclUserNew(cred); - else GRSTgaclUserAddCred(user, cred); - } - - acl = GRSTgaclAclLoadforFile(dir_path); - if (acl != NULL) perm = GRSTgaclAclTestUser(acl, user); - } - - /* we're relying on being a CGI with all this un-free()ed strdup()ing */ - - dir_uri = strdup(request_uri); - p = rindex(dir_uri, '?'); - if (p != NULL) *p = '\0'; - p = rindex(dir_uri, '/'); - if (p != NULL) p[1] = '\0'; - - content_type = getenv("CONTENT_TYPE"); - - if ((content_type != NULL) && - (GRSTstrCmpShort(content_type, "multipart/form-data; boundary=") == 0)) - { - uploadfile(dn, perm, help_uri, dir_path, dir_uri, admin_file); - return 0; - } - - cmd = GRSThttpGetCGI("cmd"); - file = GRSThttpGetCGI("file"); - button = GRSThttpGetCGI("button"); - - /* file and directory functions in grst_admin_file.c */ - - if (strcmp(cmd, "header") == 0) - justheader(dn, perm, help_uri, dir_path, dir_uri, admin_file); - else if (strcmp(cmd, "footer") == 0) - justfooter(dn, perm, help_uri, dir_path, dir_uri, admin_file); - else if (strcmp(cmd, "managedir") == 0) - managedir(dn, perm, help_uri, dir_path, dir_uri, admin_file); - else if (strcmp(cmd, "print") == 0) - printfile(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "history") == 0) - filehistory(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "editdnlist") == 0) - editdnlistform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "edit") == 0) - { - if ((strcasecmp(button, "new directory") == 0) || - (strcasecmp(button, "Create") == 0)) - newdirectory(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else - editfileform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - } - else if (strcmp(cmd, "editaction") == 0) - editfileaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "editdnlistaction") == 0) - editdnlistaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "delete") == 0) - deletefileform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "deleteaction") == 0) - deletefileaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "rename") == 0) - renameform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "renameaction") == 0) - renameaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "ziplist") == 0) - ziplist(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "unzipfile") == 0) - unzipfile(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "create_acl") == 0) - create_acl(dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - - /* GACL functions in grst_admin_gacl.c */ - - else if (strcmp(cmd, "show_acl") == 0) - show_acl(0, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "admin_acl") == 0) - show_acl(1, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "acl_history") == 0) - show_acl(2, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd, "revert_acl") == 0) - revert_acl(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - //show_acl(2, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"new_entry_form")==0) - new_entry_form(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"new_entry")==0) - new_entry(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"del_entry_sure")==0) - del_entry_sure(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"del_entry")==0) - del_entry(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"edit_entry_form")==0) - edit_entry_form(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"edit_entry")==0) - edit_entry(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"add_cred_form")==0) - add_cred_form(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"add_cred")==0) - add_cred(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"del_cred_sure")==0) - del_cred_sure(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - else if (strcmp(cmd,"del_cred")==0) - del_cred(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file); - - /* you what? */ - - else GRSThttpError("500 Internal Server Error"); -} diff --git a/org.gridsite.core/src/grst_asn1.c b/org.gridsite.core/src/grst_asn1.c deleted file mode 100644 index bc92a87..0000000 --- a/org.gridsite.core/src/grst_asn1.c +++ /dev/null @@ -1,506 +0,0 @@ - -#define _GNU_SOURCE -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include "gridsite.h" - -/// ASN1 time string (in a char *) to time_t -/** - * (Use ASN1_STRING_data() to convert ASN1_GENERALIZEDTIME to char * if - * necessary) - */ - -time_t GRSTasn1TimeToTimeT(char *asn1time, size_t len) -{ - char zone; - struct tm time_tm; - - if (len == 0) len = strlen(asn1time); - - if ((len != 13) && (len != 15)) return 0; /* dont understand */ - - if ((len == 13) && - ((sscanf(asn1time, "%02d%02d%02d%02d%02d%02d%c", - &(time_tm.tm_year), - &(time_tm.tm_mon), - &(time_tm.tm_mday), - &(time_tm.tm_hour), - &(time_tm.tm_min), - &(time_tm.tm_sec), - &zone) != 7) || (zone != 'Z'))) return 0; /* dont understand */ - - if ((len == 15) && - ((sscanf(asn1time, "20%02d%02d%02d%02d%02d%02d%c", - &(time_tm.tm_year), - &(time_tm.tm_mon), - &(time_tm.tm_mday), - &(time_tm.tm_hour), - &(time_tm.tm_min), - &(time_tm.tm_sec), - &zone) != 7) || (zone != 'Z'))) return 0; /* dont understand */ - - /* time format fixups */ - - if (time_tm.tm_year < 90) time_tm.tm_year += 100; - --(time_tm.tm_mon); - - return timegm(&time_tm); -} - -/* this function is taken from OpenSSL without modification */ - -static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, - int indent) - { - static const char fmt[]="%-18s"; - static const char fmt2[]="%2d %-15s"; - char str[128]; - const char *p,*p2=NULL; - - if (constructed & V_ASN1_CONSTRUCTED) - p="cons: "; - else - p="prim: "; - if (BIO_write(bp,p,6) < 6) goto err; -#if OPENSSL_VERSION_NUMBER >= 0x0090701fL - BIO_indent(bp,indent,128); -#endif - - p=str; - if ((xclass & V_ASN1_PRIVATE) == V_ASN1_PRIVATE) - sprintf(str,"priv [ %d ] ",tag); - else if ((xclass & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC) - sprintf(str,"cont [ %d ]",tag); - else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION) - sprintf(str,"appl [ %d ]",tag); - else p = ASN1_tag2str(tag); - - if (p2 != NULL) - { - if (BIO_printf(bp,fmt2,tag,p2) <= 0) goto err; - } - else - { - if (BIO_printf(bp,fmt,p) <= 0) goto err; - } - return(1); -err: - return(0); - } - -static void GRSTasn1AddToTaglist(struct GRSTasn1TagList taglist[], - int maxtag, int *lasttag, - char *treecoords, int start, int headerlength, - int length, int tag) -{ - if ((strlen(treecoords) > GRST_ASN1_MAXCOORDLEN) || - (*lasttag + 1 > maxtag)) return; - - ++(*lasttag); - - strncpy(taglist[*lasttag].treecoords, treecoords, GRST_ASN1_MAXCOORDLEN+1); - taglist[*lasttag].start = start; - taglist[*lasttag].headerlength = headerlength; - taglist[*lasttag].length = length; - taglist[*lasttag].tag = tag; -} - -int GRSTasn1SearchTaglist(struct GRSTasn1TagList taglist[], - int lasttag, char *treecoords) -{ - int i; - - for (i=0; i <= lasttag; ++i) - { - if (strcmp(treecoords, taglist[i].treecoords) == 0) return i; - } - - return -1; -} - -static int GRSTasn1PrintPrintable(BIO *bp, char *str, int length) -{ - int ret = 0; - char *dup, *p; - - dup = strndup(str, length); - - for (p=dup; *p != '\0'; ++p) if ((*p < ' ') || (*p > '~')) *p = '.'; - - if (bp != NULL) ret = BIO_write(bp, dup, strlen(dup)); - - free(dup); - - return ret; -} - -static int GRSTasn1Parse2(BIO *bp, unsigned char **pp, long length, int offset, - int depth, int indent, int dump, char *treecoords, - struct GRSTasn1TagList taglist[], int maxtag, int *lasttag) - { - int sibling = 0; - char sibtreecoords[512]; - - unsigned char *p,*ep,*tot,*op,*opp; - long len; - int tag,xclass,ret=0; - int nl,hl,j,r; - ASN1_OBJECT *o=NULL; - ASN1_OCTET_STRING *os=NULL; - int dump_indent; - - - dump_indent = 6; /* Because we know BIO_dump_indent() */ - p= *pp; - tot=p+length; - op=p-1; - while ((p < tot) && (op < p)) - { - op=p; - j=ASN1_get_object(&p,&len,&tag,&xclass,length); - - if (j & 0x80) - { - if ((bp != NULL) && - (BIO_write(bp,"Error in encoding\n",18) <= 0)) - goto end; - ret=0; - goto end; - } - hl=(p-op); - length-=hl; - - ++sibling; - sprintf(sibtreecoords, "%s-%d", treecoords, sibling); - - GRSTasn1AddToTaglist(taglist, maxtag, lasttag, sibtreecoords, - (int)offset+(int)(op - *pp), - (int) hl, len, tag); - - if (bp != NULL) - { - BIO_printf(bp, " %s %ld %ld %d %d ", sibtreecoords, - (long)offset+(long)(op - *pp), hl, len, tag); - - GRSTasn1PrintPrintable(bp, p, -// &((*pp)[(long)offset+(long)(op - *pp)+hl]), - (len > 30) ? 30 : len); - - BIO_printf(bp, "\n"); - } - - - /* if j == 0x21 it is a constructed indefinite length object */ - if ((bp != NULL) && - (BIO_printf(bp,"%5ld:",(long)offset+(long)(op- *pp)) - <= 0)) goto end; - - if (j != (V_ASN1_CONSTRUCTED | 1)) - { - if ((bp != NULL) && - (BIO_printf(bp,"d=%-2d hl=%ld l=%4ld ", - depth,(long)hl,len) <= 0)) - goto end; - } - else - { - if ((bp != NULL) && - (BIO_printf(bp,"d=%-2d hl=%ld l=inf ", - depth,(long)hl) <= 0)) - goto end; - } - if ((bp != NULL) && - !asn1_print_info(bp,tag,xclass,j,(indent)?depth:0)) - goto end; - if (j & V_ASN1_CONSTRUCTED) - { - ep=p+len; - if ((bp != NULL) && - (BIO_write(bp,"\n",1) <= 0)) goto end; - if (len > length) - { - if (bp != NULL) BIO_printf(bp, - "length is greater than %ld\n",length); - ret=0; - goto end; - } - if ((j == 0x21) && (len == 0)) - { - for (;;) - { - r=GRSTasn1Parse2(bp,&p,(long)(tot-p), - offset+(p - *pp),depth+1, - indent,dump,sibtreecoords, - taglist, maxtag, lasttag); - if (r == 0) { ret=0; goto end; } - if ((r == 2) || (p >= tot)) break; - } - } - else - while (p < ep) - { - r=GRSTasn1Parse2(bp,&p,(long)len, - offset+(p - *pp),depth+1, - indent,dump,sibtreecoords, - taglist, maxtag, lasttag); - if (r == 0) { ret=0; goto end; } - } - } - else if (xclass != 0) - { - p+=len; - if ((bp != NULL) && - (BIO_write(bp,"\n",1) <= 0)) goto end; - } - else - { - nl=0; - if ( (tag == V_ASN1_PRINTABLESTRING) || - (tag == V_ASN1_T61STRING) || - (tag == V_ASN1_IA5STRING) || - (tag == V_ASN1_VISIBLESTRING) || - (tag == V_ASN1_UTCTIME) || - (tag == V_ASN1_GENERALIZEDTIME)) - { - if ((bp != NULL) && - (BIO_write(bp,":",1) <= 0)) goto end; - if ((len > 0) && (bp != NULL) && - BIO_write(bp,(char *)p,(int)len) - != (int)len) - goto end; - } - else if (tag == V_ASN1_OBJECT) - { - opp=op; - if (d2i_ASN1_OBJECT(&o,&opp,len+hl) != NULL) - { - if (bp != NULL) - { - if (BIO_write(bp,":",1) <= 0) goto end; - i2a_ASN1_OBJECT(bp,o); - } - } - else - { - if ((bp != NULL) && - (BIO_write(bp,":BAD OBJECT",11) <= 0)) - goto end; - } - } - else if (tag == V_ASN1_BOOLEAN) - { - int ii; - - opp=op; - ii=d2i_ASN1_BOOLEAN(NULL,&opp,len+hl); - if (ii < 0) - { - if ((bp != NULL) && - (BIO_write(bp,"Bad boolean\n",12))) - goto end; - } - if (bp != NULL) BIO_printf(bp,":%d",ii); - } - else if (tag == V_ASN1_BMPSTRING) - { - /* do the BMP thang */ - } - else if (tag == V_ASN1_OCTET_STRING) - { - int i; - - opp=op; - os=d2i_ASN1_OCTET_STRING(NULL,&opp,len+hl); - if (os != NULL) - { - opp=os->data; - - if (os->length > 0) - { - if ((bp != NULL) && - (BIO_write(bp,":",1) <= 0)) - goto end; - if ((bp != NULL) && - (GRSTasn1PrintPrintable(bp, - opp, - os->length) <= 0)) - goto end; - } - - M_ASN1_OCTET_STRING_free(os); - os=NULL; - } - } - else if (tag == V_ASN1_INTEGER) - { - ASN1_INTEGER *bs; - int i; - - opp=op; - bs=d2i_ASN1_INTEGER(NULL,&opp,len+hl); - if (bs != NULL) - { - if ((bp != NULL) && - (BIO_write(bp,":",1) <= 0)) goto end; - if (bs->type == V_ASN1_NEG_INTEGER) - if ((bp != NULL) && - (BIO_write(bp,"-",1) <= 0)) - goto end; - for (i=0; ilength; i++) - { - if ((bp != NULL) && - (BIO_printf(bp,"%02X", - bs->data[i]) <= 0)) - goto end; - } - if (bs->length == 0) - { - if ((bp != NULL) && - (BIO_write(bp,"00",2) <= 0)) - goto end; - } - } - else - { - if ((bp != NULL) && - (BIO_write(bp,"BAD INTEGER",11) <= 0)) - goto end; - } - M_ASN1_INTEGER_free(bs); - } - else if (tag == V_ASN1_ENUMERATED) - { - ASN1_ENUMERATED *bs; - int i; - - opp=op; - bs=d2i_ASN1_ENUMERATED(NULL,&opp,len+hl); - if (bs != NULL) - { - if ((bp != NULL) && - (BIO_write(bp,":",1) <= 0)) goto end; - if (bs->type == V_ASN1_NEG_ENUMERATED) - if ((bp != NULL) && - (BIO_write(bp,"-",1) <= 0)) - goto end; - for (i=0; ilength; i++) - { - if ((bp != NULL) && - (BIO_printf(bp,"%02X", - bs->data[i]) <= 0)) - goto end; - } - if (bs->length == 0) - { - if ((bp != NULL) && - (BIO_write(bp,"00",2) <= 0)) - goto end; - } - } - else - { - if ((bp != NULL) && - (BIO_write(bp,"BAD ENUMERATED",11) <= 0)) - goto end; - } - M_ASN1_ENUMERATED_free(bs); - } - else if (len > 0 && dump) - { - if (!nl) - { - if ((bp != NULL) && - (BIO_write(bp,"\n",1) <= 0)) - goto end; - } - if ((bp != NULL) && - (BIO_dump_indent(bp,(char *)p, - ((dump == -1 || dump > len)?len:dump), - dump_indent) <= 0)) - goto end; - nl=1; - } - - if (!nl) - { - if ((bp != NULL) && - (BIO_write(bp,"\n",1) <= 0)) goto end; - } - p+=len; - if ((tag == V_ASN1_EOC) && (xclass == 0)) - { - ret=2; /* End of sequence */ - goto end; - } - } - - length-=len; - } - ret=1; -end: - if (o != NULL) ASN1_OBJECT_free(o); - if (os != NULL) M_ASN1_OCTET_STRING_free(os); - *pp=p; - return(ret); - } - -int GRSTasn1ParseDump(BIO *bp, unsigned char *pp, long len, - struct GRSTasn1TagList taglist[], - int maxtag, int *lasttag) - { - return(GRSTasn1Parse2(bp,&pp,len,0,0,0,0,"", - taglist, maxtag, lasttag)); - } - -int GRSTasn1GetX509Name(char *x509name, int maxlength, char *coords, - char *asn1string, - struct GRSTasn1TagList taglist[], int lasttag) -{ - int i, iobj, istr, n, len = 0; - ASN1_OBJECT *obj = NULL; - unsigned char coordstmp[81], *q; - const unsigned char *shortname; - - for (i=1; ; ++i) - { - snprintf(coordstmp, sizeof(coordstmp), coords, i, 1); - iobj = GRSTasn1SearchTaglist(taglist, lasttag, coordstmp); - if (iobj < 0) break; - - snprintf(coordstmp, sizeof(coordstmp), coords, i, 2); - istr = GRSTasn1SearchTaglist(taglist, lasttag, coordstmp); - if (istr < 0) break; - - q = &asn1string[taglist[iobj].start]; - d2i_ASN1_OBJECT(&obj, &q, taglist[iobj].length + - taglist[iobj].headerlength); - - n = OBJ_obj2nid(obj); -// free obj now? - shortname = OBJ_nid2sn(n); - - if (len + 2 + strlen(shortname) + taglist[istr].length >= maxlength) - { - x509name[0] = '\0'; - return GRST_RET_FAILED; - } - - sprintf(&x509name[len], "/%s=%.*s", shortname, - taglist[istr].length, - &asn1string[taglist[istr].start+taglist[istr].headerlength]); - len += 2 + strlen(shortname) + taglist[istr].length; - } - - x509name[len] = '\0'; - - return (x509name[0] != '\0') ? GRST_RET_OK : GRST_RET_FAILED; -} diff --git a/org.gridsite.core/src/grst_err.c b/org.gridsite.core/src/grst_err.c deleted file mode 100644 index 8d1e2cb..0000000 --- a/org.gridsite.core/src/grst_err.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------- - For more information about GridSite: http://www.gridsite.org/ - --------------------------------------------------------------- -*/ - -#define _GNU_SOURCE - -#include "gridsite.h" - -void (*GRSTerrorLogFunc)(char *, int, int, char *, ...) = NULL; - diff --git a/org.gridsite.core/src/grst_gacl.c b/org.gridsite.core/src/grst_gacl.c deleted file mode 100644 index db1dbdb..0000000 --- a/org.gridsite.core/src/grst_gacl.c +++ /dev/null @@ -1,1212 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ -/*---------------------------------------------------------------* - * For more information about GridSite: http://www.gridsite.org/ * - *---------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#include - -#include -#include -#include - -#include "gridsite.h" - -/* * - * Global variables, shared by all GACL functions but private to libgacl * - * */ - -char *grst_perm_syms[] = { "none", - "read", - "exec", - "list", - "write", - "admin", - NULL }; - -GRSTgaclPerm grst_perm_vals[] = { GRST_PERM_NONE, - GRST_PERM_READ, - GRST_PERM_EXEC, - GRST_PERM_LIST, - GRST_PERM_WRITE, - GRST_PERM_ADMIN, - -1 }; - -int GRSTgaclInit(void) -{ - xmlInitParser(); - - LIBXML_TEST_VERSION - - xmlKeepBlanksDefault(0); - - return 1; -} - -/* declare these two private functions at the start */ - -GRSTgaclAcl *GRSTgaclAclParse(xmlDocPtr, xmlNodePtr, GRSTgaclAcl *); -GRSTgaclAcl *GRSTxacmlAclParse(xmlDocPtr, xmlNodePtr, GRSTgaclAcl *); - -/* * - * Functions to manipulate GRSTgaclCred structures * - * */ - -GRSTgaclCred *GRSTgaclCredNew(char *type) -/* - GRSTgaclCredNew - allocate a new GRSTgaclCred structure, and return - it's pointer or NULL on (malloc) error. -*/ -{ - GRSTgaclCred *newcred; - - if (type == NULL) return NULL; - - newcred = malloc(sizeof(GRSTgaclCred)); - if (newcred == NULL) return NULL; - - newcred->type = strdup(type); - newcred->delegation = 0; - newcred->firstname = NULL; - newcred->next = NULL; - - return newcred; -} - -int GRSTgaclCredAddValue(GRSTgaclCred *cred, char *rawname, char *rawvalue) -/* - GRSTgaclCredAddValue - add a name/value pair to a GRSTgaclCred -*/ -{ - int i; - char *name, *value; - GRSTgaclNamevalue *p; - - name = strdup(rawname); - - /* no leading or trailing space in value */ - - value = rawvalue; - while ((*value != '\0') && isspace(*value)) ++value; - - value = strdup(value); - - for (i=strlen(value) - 1; (i >= 0) && isspace(value[i]); --i) value[i]='\0'; - - if (cred->firstname == NULL) - { - cred->firstname = malloc(sizeof (GRSTgaclNamevalue)); - (cred->firstname)->name = name; - (cred->firstname)->value = value; - (cred->firstname)->next = NULL; - } - else - { - p = cred->firstname; - - while (p->next != NULL) p = (GRSTgaclNamevalue *) p->next; - - p->next = malloc(sizeof(GRSTgaclNamevalue)); - ((GRSTgaclNamevalue *) p->next)->name = name; - ((GRSTgaclNamevalue *) p->next)->value = value; - ((GRSTgaclNamevalue *) p->next)->next = NULL; - } - - return 1; -} - -static int GRSTgaclNamevalueFree(GRSTgaclNamevalue *p) -{ - if (p == NULL) return 1; - - if (p->next != NULL) - GRSTgaclNamevalueFree((GRSTgaclNamevalue *) p->next); - if (p->name != NULL) free(p->name); - if (p->value != NULL) free(p->value); - free(p); - - return 1; -} - -int GRSTgaclCredFree(GRSTgaclCred *cred) -/* - GRSTgaclCredFree - free memory structures of a GRSTgaclCred, - returning 1 always! -*/ -{ - if (cred == NULL) return 1; - - GRSTgaclNamevalueFree(cred->firstname); - if (cred->type != NULL) free(cred->type); - free(cred); - - return 1; -} - -static int GRSTgaclCredsFree(GRSTgaclCred *firstcred) -/* - GRSTgaclCredsFree - free a cred and all the creds in its *next chain -*/ -{ - if (firstcred == NULL) return 0; - - if (firstcred->next != NULL) GRSTgaclCredsFree(firstcred->next); - - return GRSTgaclCredFree(firstcred); -} - -static int GRSTgaclCredInsert(GRSTgaclCred *firstcred, GRSTgaclCred *newcred) -/* - GRSTgaclCredInsert - insert a cred in the *next chain of firstcred - - FOR THE MOMENT THIS JUST APPENDS! -*/ -{ - if (firstcred == NULL) return 0; - - if (firstcred->next == NULL) - { - firstcred->next = newcred; - return 1; - } - - return GRSTgaclCredInsert(firstcred->next, newcred); -} - -int GRSTgaclEntryAddCred(GRSTgaclEntry *entry, GRSTgaclCred *cred) -/* - GRSTaddCred - add a new credential to an existing entry, returning 1 - on success or 0 on error -*/ -{ - if (entry == NULL) return 0; - - if (entry->firstcred == NULL) - { - entry->firstcred = cred; - return 1; - } - else return GRSTgaclCredInsert(entry->firstcred, cred); -} - -static int GRSTgaclCredRemoveCred(GRSTgaclCred *firstcred, GRSTgaclCred *oldcred) -/* - (Private) - - GRSTgaclCredRemoveCred - remove a cred in the *next chain of firstcred - and relink the chain -*/ -{ - if (firstcred == NULL) return 0; - -// yeah, I know -} - -int GRSTgaclEntryDelCred(GRSTgaclEntry *entry, GRSTgaclCred *cred) -/* - GRSTgaclEntryDelCred - remove a new cred from an entry, returning 1 - on success (or absense) or 0 on error. -*/ -{ - if (entry == NULL) return 0; - - return GRSTgaclCredRemoveCred(entry->firstcred, cred); -} - -int GRSTgaclCredPrint(GRSTgaclCred *cred, FILE *fp) -/* - GRSTgaclCredPrint - print a credential and any name-value pairs is contains -*/ -{ - char *q; - GRSTgaclNamevalue *p; - - if (cred->firstname != NULL) - { - fprintf(fp, "<%s>\n", cred->type); - - p = cred->firstname; - - do { - fprintf(fp, "<%s>", p->name); - - for (q=p->value; *q != '\0'; ++q) - if (*q == '<') fputs("<", fp); - else if (*q == '>') fputs(">", fp); - else if (*q == '&') fputs("&" , fp); - else if (*q == '\'') fputs("'", fp); - else if (*q == '"') fputs(""", fp); - else fputc(*q, fp); - - fprintf(fp, "\n", p->name); - - p = (GRSTgaclNamevalue *) p->next; - - } while (p != NULL); - - fprintf(fp, "\n", cred->type); - } - else fprintf(fp, "<%s/>\n", cred->type); - - return 1; -} - -/* * - * Functions to manipulate GRSTgaclEntry structures * - * */ - -GRSTgaclEntry *GRSTgaclEntryNew(void) -/* - GRSTgaclEntryNew - allocate space for a new entry, returning its pointer - or NULL on failure. -*/ -{ - GRSTgaclEntry *newentry; - - newentry = (GRSTgaclEntry *) malloc(sizeof(GRSTgaclEntry)); - if (newentry == NULL) return NULL; - - newentry->firstcred = NULL; - newentry->allowed = 0; - newentry->denied = 0; - newentry->next = NULL; - - return newentry; -} - -int GRSTgaclEntryFree(GRSTgaclEntry *entry) -/* - GRSTgaclEntryFree - free up space used by an entry (always returns 1) -*/ -{ - int i; - - if (entry == NULL) return 1; - - GRSTgaclCredsFree(entry->firstcred); - - free(entry); - - return 1; -} - -static int GRSTgaclEntriesFree(GRSTgaclEntry *entry) -/* - GRSTgaclEntriesFree - free up entry and all entries linked to in its *next - chain -*/ -{ - if (entry == NULL) return 0; - - if (entry->next != NULL) GRSTgaclEntriesFree(entry->next); - - return GRSTgaclEntryFree(entry); -} - -static int GRSTgaclEntryInsert(GRSTgaclEntry *firstentry, GRSTgaclEntry *newentry) -/* - GRSTgaclEntryInsert - insert an entry in the *next chain of firstentry - - FOR THE MOMENT THIS JUST APPENDS -*/ -{ - if (firstentry == NULL) return 0; - - if (firstentry->next == NULL) - { - firstentry->next = newentry; - return 1; - } - - return GRSTgaclEntryInsert(firstentry->next, newentry); -} - -int GRSTgaclAclAddEntry(GRSTgaclAcl *acl, GRSTgaclEntry *entry) -/* - GRSTgaclAclAddEntry - add a new entry to an existing acl, returning 1 - on success or 0 on error -*/ -{ - if (acl == NULL) return 0; - - if (acl->firstentry == NULL) - { - acl->firstentry = entry; - return 1; - } - else return GRSTgaclEntryInsert(acl->firstentry, entry); -} - -int GRSTgaclEntryPrint(GRSTgaclEntry *entry, FILE *fp) -{ - GRSTgaclCred *cred; - GRSTgaclPerm i; - - fputs("\n", fp); - - for (cred = entry->firstcred; cred != NULL; cred = cred->next) - GRSTgaclCredPrint(cred, fp); - - if (entry->allowed) - { - fputs("", fp); - - for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i) - if ((entry->allowed) & i) GRSTgaclPermPrint(i, fp); - - fputs("\n", fp); - } - - - if (entry->denied) - { - fputs("", fp); - - for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i) - if (entry->denied & i) GRSTgaclPermPrint(i, fp); - - fputs("\n", fp); - } - - fputs("\n", fp); - - return 1; -} - -/* * - * Functions to manipulate GRSTgaclPerm items * - * */ - -int GRSTgaclPermPrint(GRSTgaclPerm perm, FILE *fp) -{ - GRSTgaclPerm i; - - for (i=GRST_PERM_READ; grst_perm_syms[i] != NULL; ++i) - if (perm == grst_perm_vals[i]) - { - fprintf(fp, "<%s/>", grst_perm_syms[i]); - return 1; - } - - return 0; -} - -int GRSTgaclEntryAllowPerm(GRSTgaclEntry *entry, GRSTgaclPerm perm) -{ - entry->allowed = entry->allowed | perm; - - return 1; -} - -int GRSTgaclEntryUnallowPerm(GRSTgaclEntry *entry, GRSTgaclPerm perm) -{ - entry->allowed = entry->allowed & ~perm; - - return 1; -} - -int GRSTgaclEntryDenyPerm(GRSTgaclEntry *entry, GRSTgaclPerm perm) -{ - entry->denied = entry->denied | perm; - - return 1; -} - -int GRSTgaclEntryUndenyPerm(GRSTgaclEntry *entry, GRSTgaclPerm perm) -{ - entry->denied = entry->denied & ~perm; - - return 1; -} - -char *GRSTgaclPermToChar(GRSTgaclPerm perm) -/* - GRSTgaclPermToChar - return char * or NULL corresponding to most significant - set bit of perm. -*/ -{ - char *p = NULL; - GRSTgaclPerm i; - - for (i=0; grst_perm_syms[i] != NULL; ++i) - if (perm & grst_perm_vals[i]) p = grst_perm_syms[i]; - - return p; -} - -GRSTgaclPerm GRSTgaclPermFromChar(char *s) -/* - GRSTgaclPermToChar - return access perm corresponding to symbol s[] -*/ -{ - GRSTgaclPerm i; - - for (i=0; grst_perm_syms[i] != NULL; ++i) - if (strcasecmp(grst_perm_syms[i], s) == 0) return grst_perm_vals[i]; - - return -1; -} - -/* * - * Functions to manipulate GRSTgaclAcl structures * - * */ - -GRSTgaclAcl *GRSTgaclAclNew(void) -/* - GRSTgaclAclNew - allocate a new acl and return its pointer (or NULL - on failure.) -*/ -{ - GRSTgaclAcl *newacl; - - newacl = (GRSTgaclAcl *) malloc(sizeof(GRSTgaclAcl)); - if (newacl == NULL) return NULL; - - newacl->firstentry = NULL; - - return newacl; -} - -int GRSTgaclAclFree(GRSTgaclAcl *acl) -/* - GRSTgaclAclFree - free up space used by *acl. Always returns 1. -*/ -{ - if (acl == NULL) return 1; - - GRSTgaclEntriesFree(acl->firstentry); - - return 1; -} - -int GRSTgaclAclPrint(GRSTgaclAcl *acl, FILE *fp) -{ - GRSTgaclEntry *entry; - - fputs("\n", fp); - - for (entry = acl->firstentry; entry != NULL; entry = entry->next) - GRSTgaclEntryPrint(entry, fp); - - fputs("\n", fp); - - return 1; -} - -int GRSTgaclAclSave(GRSTgaclAcl *acl, char *filename) -{ - int ret; - FILE *fp; - - fp = fopen(filename, "w"); - if (fp == NULL) return 0; - - fputs("\n", fp); - - ret = GRSTgaclAclPrint(acl, fp); - - fclose(fp); - - return ret; -} - -/* * - * Functions for loading and parsing XML using libxml * - * */ - -// need to check these for libxml memory leaks? - what needs to be freed? - -static GRSTgaclCred *GRSTgaclCredParse(xmlNodePtr cur) -/* - GRSTgaclCredParse - parse a credential stored in the libxml structure cur, - returning it as a pointer or NULL on error. -*/ -{ - xmlNodePtr cur2; - GRSTgaclCred *cred; - - cred = GRSTgaclCredNew((char *) cur->name); - - cred->firstname = NULL; - cred->next = NULL; - - for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next) - { - if (!xmlIsBlankNode(cur2)) - GRSTgaclCredAddValue(cred, (char *) cur2->name, - (char *) xmlNodeGetContent(cur2)); - } - - return cred; -} - -static GRSTgaclEntry *GRSTgaclEntryParse(xmlNodePtr cur) -/* - GRSTgaclEntryParse - parse an entry stored in the libxml structure cur, - returning it as a pointer or NULL on error. -*/ -{ - int i; - xmlNodePtr cur2; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSTgaclPerm perm; - - if (xmlStrcmp(cur->name, (const xmlChar *) "entry") != 0) return NULL; - - cur = cur->xmlChildrenNode; - - entry = GRSTgaclEntryNew(); - - while (cur != NULL) - { - if (xmlIsBlankNode(cur)) - { - cur=cur->next; - continue; - } - else if (xmlStrcmp(cur->name, (const xmlChar *) "allow") == 0) - { - for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next) - if (!xmlIsBlankNode(cur2)) - { - for (i=0; grst_perm_syms[i] != NULL; ++i) - if (xmlStrcmp(cur2->name, - (const xmlChar *) grst_perm_syms[i]) == 0) - GRSTgaclEntryAllowPerm(entry, grst_perm_vals[i]); - } - } - else if (xmlStrcmp(cur->name, (const xmlChar *) "deny") == 0) - { - for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next) - if (!xmlIsBlankNode(cur2)) - { - for (i=0; grst_perm_syms[i] != NULL; ++i) - if (xmlStrcmp(cur2->name, - (const xmlChar *) grst_perm_syms[i]) == 0) - GRSTgaclEntryDenyPerm(entry, grst_perm_vals[i]); - } - } - else if ((cred = GRSTgaclCredParse(cur)) != NULL) - { - if (!GRSTgaclEntryAddCred(entry, cred)) - { - GRSTgaclCredFree(cred); - GRSTgaclEntryFree(entry); - return NULL; - } - } - else /* I cannot parse this - give up rather than get it wrong */ - { - GRSTgaclEntryFree(entry); - return NULL; - } - - cur=cur->next; - } - - return entry; -} - -GRSTgaclAcl *GRSTgaclAclLoadFile(char *filename) -{ - xmlDocPtr doc; - xmlNodePtr cur; - GRSTgaclAcl *acl; - - GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile() starting"); - - if (filename == NULL) - { - GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile() cannot open a NULL filename"); - return NULL; - } - - doc = xmlParseFile(filename); - if (doc == NULL) - { - GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile failed to open ACL file %s", filename); - return NULL; - } - - cur = xmlDocGetRootElement(doc); - if (cur == NULL) - { - xmlFreeDoc(doc); - GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile failed to parse root of ACL file %s", filename); - return NULL; - } - - if (!xmlStrcmp(cur->name, (const xmlChar *) "Policy")) - { - GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile parsing XACML"); - acl=GRSTxacmlAclParse(doc, cur, acl); - } - else if (!xmlStrcmp(cur->name, (const xmlChar *) "gacl")) - { - GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile parsing GACL"); - acl=GRSTgaclAclParse(doc, cur, acl); - } - else /* ACL format not recognised */ - { - xmlFreeDoc(doc); - return NULL; - } - - xmlFreeDoc(doc); - return acl; -} - -GRSTgaclAcl *GRSTgaclAclParse(xmlDocPtr doc, xmlNodePtr cur, GRSTgaclAcl *acl) -{ - GRSTgaclEntry *entry; - - cur = cur->xmlChildrenNode; - - acl = GRSTgaclAclNew(); - - while (cur != NULL) - { - if (!xmlIsBlankNode(cur)) - { - entry = GRSTgaclEntryParse(cur); - if (entry == NULL) - { - GRSTgaclAclFree(acl); - - return NULL; - } - - GRSTgaclAclAddEntry(acl, entry); - } - - cur=cur->next; - } - - return acl; -} -int GRSTgaclFileIsAcl(char *pathandfile) -/* Return 1 if filename in *pathandfile starts GRST_ACL_FILE - Return 0 otherwise. */ -{ - char *filename; - - filename = rindex(pathandfile, '/'); - if (filename == NULL) filename = pathandfile; - else filename++; - - return (strncmp(filename, GRST_ACL_FILE, sizeof(GRST_ACL_FILE) - 1) == 0); -} - -char *GRSTgaclFileFindAclname(char *pathandfile) -/* Return malloc()ed ACL filename that governs the given file or directory - (for directories, the ACL file is in the directory itself), or NULL if none - can be found. */ -{ - int len; - char *path, *file, *p; - struct stat statbuf; - - len = strlen(pathandfile); - if (len == 0) return NULL; - - path = malloc(len + sizeof(GRST_ACL_FILE) + 2); - strcpy(path, pathandfile); - - if ((stat(path, &statbuf) == 0) && - S_ISDIR(statbuf.st_mode) && - (path[len-1] != '/')) - { - strcat(path, "/"); - ++len; - } - - if (path[len-1] != '/') - { - p = rindex(pathandfile, '/'); - if (p != NULL) - { - file = &p[1]; - p = rindex(path, '/'); - sprintf(p, "/%s:%s", GRST_ACL_FILE, file); - - if (stat(path, &statbuf) == 0) return path; - - *p = '\0'; /* otherwise strip off any filename */ - } - } - - while (path[0] != '\0') - { - strcat(path, "/"); - strcat(path, GRST_ACL_FILE); - - if (stat(path, &statbuf) == 0) return path; - - p = rindex(path, '/'); - *p = '\0'; /* strip off the / we added for ACL */ - - p = rindex(path, '/'); - if (p == NULL) break; /* must start without / and we there now ??? */ - - *p = '\0'; /* strip off another layer of / */ - } - - free(path); - return NULL; -} - -GRSTgaclAcl *GRSTgaclAclLoadforFile(char *pathandfile) -/* Return ACL that governs the given file or directory (for directories, - the ACL file is in the directory itself.) */ -{ - char *path; - GRSTgaclAcl *acl; - - path = GRSTgaclFileFindAclname(pathandfile); - - if (path != NULL) - { - acl = GRSTgaclAclLoadFile(path); - free(path); - return acl; - } - - return NULL; -} - -/* * - * Functions to create and query GACLuser * - * */ - -GRSTgaclUser *GRSTgaclUserNew(GRSTgaclCred *cred) -{ - GRSTgaclUser *user; - - if (cred == NULL) return NULL; - - user = malloc(sizeof(GRSTgaclUser)); - - if (user != NULL) user->firstcred = cred; - - user->dnlists = NULL; - - return user; -} - -int GRSTgaclUserFree(GRSTgaclUser *user) -{ - if (user == NULL) return 1; - - if (user->firstcred != NULL) GRSTgaclCredsFree(user->firstcred); - - if (user->dnlists != NULL) free(user->dnlists); - - free(user); - - return 1; -} - -int GRSTgaclUserAddCred(GRSTgaclUser *user, GRSTgaclCred *cred) -{ - GRSTgaclCred *crediter; - - if ((user == NULL) || (cred == NULL)) return 0; - - if (user->firstcred == NULL) - { - user->firstcred = cred; - cred->next = NULL; /* so cannot be used to add whole lists */ - return 1; - } - - crediter = user->firstcred; - - while (crediter->next != NULL) crediter = crediter->next; - - crediter->next = cred; - cred->next = NULL; /* so cannot be used to add whole lists */ - - return 1; -} - -int GRSTgaclUserHasCred(GRSTgaclUser *user, GRSTgaclCred *cred) -/* test if the user has the given credential */ -{ - GRSTgaclCred *crediter; - GRSTgaclNamevalue *usernamevalue, *crednamevalue; - - if (cred == NULL) return 0; - - if (strcmp(cred->type, "any-user") == 0) return 1; - - if (user == NULL) return 0; - - if (strcmp(cred->type, "dn-list") == 0) - { - if ((cred->firstname == NULL) || - (strcmp((cred->firstname)->name, "url") != 0) || - ((cred->firstname)->next != NULL)) return 0; - - return GRSTgaclDNlistHasUser((cred->firstname)->value, user); - } - - if (strcmp(cred->type, "dns") == 0) - { - if ((user->firstcred == NULL) || - ((user->firstcred)->firstname == NULL) || - (cred->firstname == NULL) || - (strcmp((cred->firstname)->name, "hostname") != 0) || - ((cred->firstname)->next != NULL)) return 0; - - for (crediter=user->firstcred; - crediter != NULL; - crediter = crediter->next) - if (strcmp(crediter->type, "dns") == 0) - { - if ((crediter->firstname == NULL) || - (strcmp((crediter->firstname)->name, "hostname") != 0)) return 0; - - return (fnmatch((cred->firstname)->value, - (crediter->firstname)->value, FNM_CASEFOLD) == 0); - } - - - return 0; - } - - if (strcmp(cred->type, "auth-user") == 0) - { - if ((user->firstcred == NULL) || - ((user->firstcred)->firstname == NULL)) return 0; - - for (crediter=user->firstcred; - crediter != NULL; - crediter = crediter->next) - if (strcmp(crediter->type, "person") == 0) return 1; - - return 0; - } - - for (crediter=user->firstcred; crediter != NULL; crediter = crediter->next) - { - if (strcmp(crediter->type, cred->type) != 0) continue; - - if ((crediter->firstname == NULL) && - (cred->firstname == NULL)) return 1; - - if ((crediter->firstname == NULL) || - (cred->firstname == NULL)) continue; - - usernamevalue = crediter->firstname; - crednamevalue = cred->firstname; - - for (;;) - { - if (strcmp(usernamevalue->name,crednamevalue->name) != 0) break; - - if (strcmp(cred->type, "person") == 0) - { - if (GRSTx509NameCmp(usernamevalue->value, - crednamevalue->value) != 0) break; - } - else if (strcmp(cred->type, "level") == 0) - { - if (atoi(usernamevalue->value) - < atoi(crednamevalue->value)) break; - } - else if (strcmp(usernamevalue->value, - crednamevalue->value) != 0) break; - - /* ok if cred list runs out before user's cred list */ - if (crednamevalue->next == NULL) return 1; - - /* but not ok if more names to match which user doesn't have */ - if (usernamevalue->next == NULL) break; - - crednamevalue = (GRSTgaclNamevalue *) crednamevalue->next; - usernamevalue = (GRSTgaclNamevalue *) usernamevalue->next; - } - } - - return 0; -} - -GRSTgaclCred *GRSTgaclUserFindCredtype(GRSTgaclUser *user, char *type) -/* find the first credential of a given type for this user */ -{ - GRSTgaclCred *cred; - - if (user == NULL) return NULL; - - cred = user->firstcred; - - while (cred != NULL) - { - if (strcmp(cred->type, type) == 0) return cred; - - cred = cred->next; - } - - return NULL; -} - -int GRSTgaclUserSetDNlists(GRSTgaclUser *user, char *dnlists) -{ - if ((user == NULL) || (dnlists == NULL)) return 0; - - if (user->dnlists != NULL) free(user->dnlists); - - user->dnlists = strdup(dnlists); - - return 1; -} - -/* * - * Functions to test for access perm of an individual * - * */ - -static char *recurse4file(char *dir, char *file, int recurse_level) -/* try to find file[] in dir[]. try subdirs if not found. - return full path to first found version or NULL on failure */ -{ - char *fullfilename, *fulldirname; - struct stat statbuf; - DIR *dirDIR; - struct dirent *file_ent; - - /* try to find in current directory */ - - asprintf(&fullfilename, "%s/%s", dir, file); - if (stat(fullfilename, &statbuf) == 0) return fullfilename; - free(fullfilename); - - /* maybe search in subdirectories */ - - if (recurse_level >= GRST_RECURS_LIMIT) return NULL; - - dirDIR = opendir(dir); - - if (dirDIR == NULL) return NULL; - - while ((file_ent = readdir(dirDIR)) != NULL) - { - if (file_ent->d_name[0] == '.') continue; - - asprintf(&fulldirname, "%s/%s", dir, file_ent->d_name); - - if ((stat(fulldirname, &statbuf) == 0) && - S_ISDIR(statbuf.st_mode) && - ((fullfilename = recurse4file(fulldirname, file, - recurse_level + 1)) != NULL)) - { - closedir(dirDIR); - return fullfilename; - } - - free(fulldirname); - } - - closedir(dirDIR); - - return NULL; -} - -int GRSTgaclDNlistHasUser(char *listurl, GRSTgaclUser *user) -{ - char *dn_lists_dirs, *dn_list_ptr, *enclisturl, *filename, *dirname, - line[512], *p; - FILE *fp; - GRSTgaclCred *cred; - - if ((listurl == NULL) || (user == NULL)) return 0; - - enclisturl = GRSThttpUrlEncode(listurl); - - if (user->dnlists != NULL) p = user->dnlists; - else p = getenv("GRST_DN_LISTS"); - - if (p == NULL) p = GRST_DN_LISTS; - dn_lists_dirs = strdup(p); /* we need to keep this for free() later! */ - dn_list_ptr = dn_lists_dirs; /* copy, for naughty function strsep() */ - - while ((dirname = strsep(&dn_list_ptr, ":")) != NULL) - { - filename = recurse4file(dirname, enclisturl, 0); - if (filename == NULL) continue; - - fp = fopen(filename, "r"); - free(filename); - - if (fp == NULL) continue; - - while (fgets(line, sizeof(line), fp) != NULL) - { - p = index(line, '\n'); - if (p != NULL) *p = '\0'; - - cred = user->firstcred; - - while (cred != NULL) - { - if ((strcmp(cred->type, "person") == 0) && - (cred->firstname != NULL) && - (strcmp("dn", (cred->firstname)->name) == 0) && - (GRSTx509NameCmp(line, (cred->firstname)->value) == 0)) - { - fclose(fp); - free(dn_lists_dirs); - free(enclisturl); - return 1; - } - - cred = cred->next; - } - } - - fclose(fp); - } - - free(dn_lists_dirs); - free(enclisturl); - - return 0; -} - -GRSTgaclPerm GRSTgaclAclTestUser(GRSTgaclAcl *acl, GRSTgaclUser *user) -/* - GACLgaclAclTestUser - return bit fields depending on access perms user has - for given acl. All zero for no access. If *user is - NULL, matching to "any-user" will still work. -*/ -{ - int flag, onlyanyuser; - GRSTgaclPerm allowperms = 0, denyperms = 0, allowed; - GRSTgaclEntry *entry; - GRSTgaclCred *cred, *usercred; - - if (acl == NULL) return 0; - - for (entry = acl->firstentry; entry != NULL; entry = entry->next) - { - flag = 1; /* begin by assuming this entry applies to us */ - onlyanyuser = 1; /* begin by assuming just */ - - /* now go through creds, checking they all do apply to us */ - - for (cred = entry->firstcred; cred != NULL; cred = cred->next) - if (!GRSTgaclUserHasCred(user, cred)) flag = 0; - else if (strcmp(cred->type, "any-user") != 0) onlyanyuser = 0; - - if (!flag) continue; /* flag false if a subtest failed */ - - /* does apply to us, so we remember this entry's perms */ - - /* we dont allow Write or Admin on the basis of any-user alone */ - - allowed = entry->allowed; - - if (onlyanyuser) - allowed = entry->allowed & ~GRST_PERM_WRITE & ~GRST_PERM_ADMIN; - else allowed = entry->allowed; - - allowperms = allowperms | allowed; - denyperms = denyperms | entry->denied; - } - - return (allowperms & (~ denyperms)); - /* for each perm type, any deny we saw kills any allow */ -} - -GRSTgaclPerm GRSTgaclAclTestexclUser(GRSTgaclAcl *acl, GRSTgaclUser *user) -/* - GRSTgaclAclTestexclUser - - return bit fields depending on ALLOW perms OTHER users - have for given acl. All zero if they have no access. - (used for testing if a user has exclusive access) -*/ -{ - int flag; - GRSTgaclPerm perm = 0; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - - if (acl == NULL) return 0; - - for (entry = acl->firstentry; entry != NULL; entry = entry->next) - { - flag = 0; /* flag will be set if cred implies other users */ - - for (cred = entry->firstcred; cred != NULL; cred = cred->next) - { - if (strcmp(cred->type, "person") != 0) - /* if we ever add support for other person-specific credentials, - they must also be recognised here */ - { - flag = 1; - break; - } - - if (!GRSTgaclUserHasCred(user, cred)) - /* if user doesnt have this person credential, assume - it refers to a different individual */ - { - flag = 1; - break; - } - } - - if (flag) perm = perm | entry->allowed; - } - - return perm; -} - -/* - Wrapper functions for gridsite-gacl.h support of legacy API -*/ - -GRSTgaclEntry *GACLparseEntry(xmlNodePtr cur) -{ - return GRSTgaclEntryParse(cur); -} diff --git a/org.gridsite.core/src/grst_htcp.c b/org.gridsite.core/src/grst_htcp.c deleted file mode 100644 index ec9672a..0000000 --- a/org.gridsite.core/src/grst_htcp.c +++ /dev/null @@ -1,311 +0,0 @@ -/* - Copyright (c) 2002-5, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef VERSION -#define VERSION "x.x.x" -#endif - -#define _GNU_SOURCE -#include - -#include -#include -#include -#include -#include - -#include "gridsite.h" - -int GRSThtcpNOPrequestMake(char **request, int *request_length, - unsigned int trans_id) -/* - Make a complete HTCP NOP request and return a pointer to malloc'd - memory pointing to it. -*/ -{ - *request_length = - asprintf(request,"%c%c" /* place holder for total length */ - "%c%c" /* HTCP version 0.0 */ - "%c%c" /* DATA length place holder */ - "%c%c" /* OPCODE,RESPONSE,RESERVED,F1,RR */ - "%c%c%c%c" /* TRANS-ID placeholder */ - "%c%c", /* AUTH (LENGTH=2 means no AUTH) */ - 0, 0, - 0, 0, - 0, 0, - GRSThtcpNOPop * 16, 2, - 0, 0, 0, 0, - 0, 2); - - if (*request_length < 0) return GRST_RET_FAILED; - - (*request)[0] = *request_length / 256; - (*request)[1] = *request_length % 256; - - (*request)[4] = (*request_length - 6) / 256; - (*request)[5] = (*request_length - 6) % 256; - - memcpy(&((*request)[8]), &trans_id, 4); - - return GRST_RET_OK; -} - -int GRSThtcpNOPresponseMake(char **message, int *message_length, - unsigned int trans_id) -/* - Make a complete HTCP NOP response for a found file and return a pointer - to malloc'd memory pointing to it. -*/ -{ - *message_length = - asprintf(message, - "%c%c" /* place holder for total length */ - "%c%c" /* HTCP version 0.0 */ - "%c%c" /* DATA length place holder */ - "%c%c" /* OPCODE,RESPONSE,RESERVED,F1,RR */ - "%c%c%c%c" /* TRANS-ID place holder */ - "%c%c", /* AUTH (LENGTH=2 means no AUTH) */ - 0, 0, - 0, 0, - 0, 0, - GRSThtcpNOPop * 16, 1, /* RR=1, MO=0, RESPONSE=0 (ie found) */ - 0, 0, 0, 0, - 0, 2); - - if (*message_length < 0) return GRST_RET_FAILED; - - (*message)[0] = *message_length / 256; - (*message)[1] = *message_length % 256; - - (*message)[4] = (*message_length - 6) / 256; - (*message)[5] = (*message_length - 6) % 256; - - memcpy(&((*message)[8]), &trans_id, 4); - - return GRST_RET_OK; -} - -int GRSThtcpTSTrequestMake(char **request, int *request_length, - unsigned int trans_id, - char *method, char *uri, char *req_hdrs) -/* - Make a complete HTCP TST request and return a pointer to malloc'd - memory pointing to it. -*/ -{ - if ((method == NULL) || (uri == NULL) || (req_hdrs == NULL)) - return GRST_RET_FAILED; - - *request_length = - asprintf(request,"%c%c" /* place holder for total length */ - "%c%c" /* HTCP version 0.0 */ - "%c%c" /* DATA length place holder */ - "%c%c" /* OPCODE,RESPONSE,RESERVED,F1,RR */ - "%c%c%c%c" /* TRANS-ID placeholder */ - "%c%c%s" /* OP-DATA: METHOD */ - "%c%c%s" /* OP-DATA: URI */ - "%c%c%s" /* OP-DATA: VERSION */ - "%c%c%s" /* OP-DATA: REQ-HDRS */ - "%c%c", /* AUTH (LENGTH=2 means no AUTH) */ - 0, 0, - 0, 0, - 0, 0, - GRSThtcpTSTop * 16, 2, - 0, 0, 0, 0, - strlen(method) / 256, strlen(method) % 256, method, - strlen(uri) / 256, strlen(uri) % 256, uri, - 0, 8, "HTTP/1.1", - strlen(req_hdrs)/256, strlen(req_hdrs) % 256, req_hdrs, - 0, 2); - - if (*request_length < 0) return GRST_RET_FAILED; - - (*request)[0] = *request_length / 256; - (*request)[1] = *request_length % 256; - - (*request)[4] = (*request_length - 6) / 256; - (*request)[5] = (*request_length - 6) % 256; - - memcpy(&((*request)[8]), &trans_id, 4); - - return GRST_RET_OK; -} - -int GRSThtcpTSTresponseMake(char **message, int *message_length, - unsigned int trans_id, - char *resp_hdrs, char *entity_hdrs, - char *cache_hdrs) -/* - Make a complete HTCP TST response for a found file and return a pointer - to malloc'd memory pointing to it. -*/ -{ - if ((resp_hdrs != NULL) && (entity_hdrs != NULL) && (cache_hdrs != NULL)) - /* found file response */ - *message_length = - asprintf(message, - "%c%c" /* place holder for total length */ - "%c%c" /* HTCP version 0.0 */ - "%c%c" /* DATA length place holder */ - "%c%c" /* OPCODE,RESPONSE,RESERVED,F1,RR */ - "%c%c%c%c" /* TRANS-ID place holder */ - "%c%c%s" /* OP-DATA: RESP-HDRS */ - "%c%c%s" /* OP-DATA: ENTITY-HDRS */ - "%c%c%s" /* OP-DATA: CACHE-HDRS */ - "%c%c", /* AUTH (LENGTH=2 means no AUTH) */ - 0, 0, - 0, 0, - 0, 0, - GRSThtcpTSTop * 16, 1, /* RR=1, MO=0, RESPONSE=0 (ie found) */ - 0, 0, 0, 0, - strlen(resp_hdrs) / 256, strlen(resp_hdrs) % 256, resp_hdrs, - strlen(entity_hdrs) / 256, strlen(entity_hdrs) % 256, entity_hdrs, - strlen(cache_hdrs) / 256, strlen(cache_hdrs) % 256, cache_hdrs, - 0, 2); - else if (cache_hdrs != NULL) - /* not found file response, just cache_hdrs given */ - *message_length = - asprintf(message, - "%c%c" /* place holder for total length */ - "%c%c" /* HTCP version 0.0 */ - "%c%c" /* DATA length place holder */ - "%c%c" /* OPCODE,RESPONSE,RESERVED,F1,RR */ - "%c%c%c%c" /* TRANS-ID */ - "%c%c%s" /* OP-DATA: CACHE-HDRS */ - "%c%c", /* AUTH (LENGTH=2 means no AUTH) */ - 0, 0, - 0, 0, - 0, 0, - GRSThtcpTSTop * 16 + 1, 1, /* RR=1, MO=0, RESPONSE=1 (missing) */ - 0, 0, 0, 0, - strlen(cache_hdrs) / 256, strlen(cache_hdrs) % 256, cache_hdrs, - 0, 2); - else return GRST_RET_FAILED; - - if (*message_length < 0) return GRST_RET_FAILED; - - (*message)[0] = *message_length / 256; - (*message)[1] = *message_length % 256; - - (*message)[4] = (*message_length - 6) / 256; - (*message)[5] = (*message_length - 6) % 256; - - memcpy(&((*message)[8]), &trans_id, 4); - - return GRST_RET_OK; -} - -int GRSThtcpMessageParse(GRSThtcpMessage *parsed, char *raw, int length) -{ - GRSThtcpCountstr *s; - - bzero(parsed, sizeof(GRSThtcpMessage)); - - if (length < (void *) &(parsed->method) - - (void *) &(parsed->total_length_msb) + 2) - return GRST_RET_FAILED; - - memcpy(parsed, raw, (void *) &(parsed->method) - - (void *) &(parsed->total_length_msb)); - - if (parsed->opcode == GRSThtcpNOPop) return GRST_RET_OK; - - if ((parsed->opcode == GRSThtcpTSTop) && (parsed->rr == 0)) - { - /* a TST request */ - - /* point to start of data/auth in raw */ - s = (GRSThtcpCountstr *) &(((GRSThtcpMessage *) raw)->method); - - /* METHOD string */ - - if ((void *) s + 2 + GRSThtcpCountstrLen(s) > (void *) raw + length) - return GRST_RET_FAILED; - parsed->method = s; - s = (GRSThtcpCountstr *) ((void *) s + 2 + GRSThtcpCountstrLen(s)); - - /* URI string */ - - if ((void *) s + 2 + GRSThtcpCountstrLen(s) > (void *) raw + length) - return GRST_RET_FAILED; - parsed->uri = s; - s = (GRSThtcpCountstr *) ((void *) s + 2 + GRSThtcpCountstrLen(s)); - - /* VERSION string */ - - if ((void *) s + 2 + GRSThtcpCountstrLen(s) > (void *) raw + length) - return GRST_RET_FAILED; - parsed->version = s; - s = (GRSThtcpCountstr *) ((void *) s + 2 + GRSThtcpCountstrLen(s)); - - /* REQ-HDRS string */ - - if ((void *) s + 2 + GRSThtcpCountstrLen(s) > (void *) raw + length) - return GRST_RET_FAILED; - parsed->req_hdrs = s; - s = (GRSThtcpCountstr *) ((void *) s + 2 + GRSThtcpCountstrLen(s)); - - return GRST_RET_OK; - } - - if ((parsed->opcode == GRSThtcpTSTop) && (parsed->rr == 1)) - { - /* a TST response */ - - /* point to start of data/auth in raw */ - s = (GRSThtcpCountstr *) &(((GRSThtcpMessage *) raw)->method); - - /* RESP-HDRS string */ - - if ((void *) s + 2 + GRSThtcpCountstrLen(s) > (void *) raw + length) - return GRST_RET_FAILED; - parsed->resp_hdrs = s; - s = (GRSThtcpCountstr *) ((void *) s + 2 + GRSThtcpCountstrLen(s)); - - /* ENTITY-HDRS string */ - - if ((void *) s + 2 + GRSThtcpCountstrLen(s) > (void *) raw + length) - return GRST_RET_FAILED; - parsed->entity_hdrs = s; - s = (GRSThtcpCountstr *) ((void *) s + 2 + GRSThtcpCountstrLen(s)); - - /* CACHE-HDRS string */ - - if ((void *) s + 2 + GRSThtcpCountstrLen(s) > (void *) raw + length) - return GRST_RET_FAILED; - parsed->cache_hdrs = s; - s = (GRSThtcpCountstr *) ((void *) s + 2 + GRSThtcpCountstrLen(s)); - - return GRST_RET_OK; - } - - return GRST_RET_FAILED; -} diff --git a/org.gridsite.core/src/grst_http.c b/org.gridsite.core/src/grst_http.c deleted file mode 100644 index c933ca0..0000000 --- a/org.gridsite.core/src/grst_http.c +++ /dev/null @@ -1,443 +0,0 @@ -/* - Copyright (c) 2002-3, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef VERSION -#define VERSION "x.x.x" -#endif - -#define _GNU_SOURCE -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gridsite.h" - -void GRSThttpBodyInit(GRSThttpBody *thisbody) -{ - thisbody->size = 0; /* simple, but we don't expose internals to callers */ -} - -void GRSThttpPrintf(GRSThttpBody *thisbody, char *fmt, ...) -/* append printf() style format and arguments to *thisbody. - This requires vasprintf from glibc!! */ -{ - char *p; - size_t size; - va_list args; - - va_start(args, fmt); - size = vasprintf(&p, fmt, args); - va_end(args); - - if (size == 0) free(p); /* don't need to bother in this case */ - else if (size > 0) - { - if (thisbody->size == 0) /* need to initialise */ - { - thisbody->first = (GRSThttpCharsList *)malloc(sizeof(GRSThttpCharsList)); - thisbody->first->text = p; - thisbody->first->next = NULL; - - thisbody->last = thisbody->first; - thisbody->size = size; - } - else - { - thisbody->last->next = (GRSThttpCharsList *) - malloc(sizeof(GRSThttpCharsList)); - ((GRSThttpCharsList *) thisbody->last->next)->text = p; - ((GRSThttpCharsList *) thisbody->last->next)->next = NULL; - - thisbody->last = thisbody->last->next; - thisbody->size = thisbody->size + size; - } - } -} - -int GRSThttpCopy(GRSThttpBody *thisbody, char *file) -/* - copy a whole file, named file[], into the body output buffer, returning - 1 if file was found and copied ok, or 0 otherwise. -*/ -{ - int fd, len; - char c, *p; - struct stat statbuf; - - fd = open(file, O_RDONLY); - - if (fd == -1) return 0; - - if (fstat(fd, &statbuf) != 0) - { - close(fd); - return 0; - } - - p = malloc(statbuf.st_size + 1); - - if (p == NULL) - { - close(fd); - return 0; - } - - len = read(fd, p, statbuf.st_size); - p[len] = '\0'; - - close(fd); - - if (thisbody->size == 0) /* need to initialise */ - { - thisbody->first = (GRSThttpCharsList *) malloc(sizeof(GRSThttpCharsList)); - thisbody->first->text = p; - thisbody->first->next = NULL; - - thisbody->last = thisbody->first; - thisbody->size = len; - } - else - { - thisbody->last->next=(GRSThttpCharsList *)malloc(sizeof(GRSThttpCharsList)); - ((GRSThttpCharsList *) thisbody->last->next)->text = p; - ((GRSThttpCharsList *) thisbody->last->next)->next = NULL; - - thisbody->last = thisbody->last->next; - thisbody->size = thisbody->size + len; - } - - return 1; -} - -void GRSThttpWriteOut(GRSThttpBody *thisbody) -/* output Content-Length header, blank line then whole of the body to - standard output */ -{ - GRSThttpCharsList *p; - - printf("Content-Length: %d\n\n", thisbody->size); - - p = thisbody->first; - - while (p != NULL) - { - fputs(p->text, stdout); - - p = p->next; - } -} - -int GRSThttpPrintHeaderFooter(GRSThttpBody *bp, char *file, char *headfootname) -/* - try to print Header or Footer appropriate for absolute path file[], - returning 1 rather than 0 if found. -*/ -{ - int found = 0; - char *pathfile, *p; - struct stat statbuf; - - pathfile = malloc(strlen(file) + strlen(headfootname) + 2); - strcpy(pathfile, file); - - if ((pathfile[strlen(pathfile) - 1] != '/') && - (stat(pathfile, &statbuf) == 0) && - S_ISDIR(statbuf.st_mode)) strcat(pathfile, "/"); - - for (;;) - { - p = rindex(pathfile, '/'); - if (p == NULL) break; - p[1] = '\0'; - strcat(p, headfootname); - - if (stat(pathfile, &statbuf) == 0) - { - found = GRSThttpCopy(bp, pathfile); - break; - } - - p[0] = '\0'; - } - - free(pathfile); - return found; -} - -char *GRSThttpGetCGI(char *name) -/* - Return a malloc()ed copy of CGI form parameter identified by name[], - either received by QUERY_STRING (via GET) or on stdin (via POST). - Caller must free() the returned string itself. If name[] is not found, - an empty NUL-terminated malloc()ed string is returned. name[] has any - URL-encoding reversed. -*/ -{ - char *p, *namepattern, *valuestart, *returnvalue, *querystring; - int c, i, j, n, contentlength = 0; - static char *cgiposted = NULL; - size_t size_needed; - - if (cgiposted == NULL) /* have to initialise cgiposted */ - { - p = getenv("CONTENT_LENGTH"); - if (p != NULL) sscanf(p, "%d", &contentlength); - - querystring = getenv("REDIRECT_QUERY_STRING"); - if (querystring == NULL) querystring = getenv("QUERY_STRING"); - - if (querystring == NULL) cgiposted = malloc(contentlength + 3); - else cgiposted = malloc(contentlength + strlen(querystring) + 4); - - cgiposted[0] = '&'; - - for (i = 1; i <= contentlength; ++i) - { - c = getchar(); - if (c == EOF) break; - cgiposted[i] = c; - } - - cgiposted[i] = '&'; - cgiposted[i+1] = '\0'; - - if (querystring != NULL) - { - strcat(cgiposted, querystring); - strcat(cgiposted, "&"); - } - } - - namepattern = malloc(strlen(name) + 3); - sprintf(namepattern, "&%s=", name); - - p = strstr(cgiposted, namepattern); - free(namepattern); - if (p == NULL) return strdup(""); - - valuestart = &p[strlen(name) + 2]; - - for (n=0; valuestart[n] != '&'; ++n) ; - - returnvalue = malloc(n + 1); - - j=0; - - for (i=0; i < n; ++i) - { - if ((i < n - 2) && (valuestart[i] == '%')) /* url encoded as %HH */ - { - returnvalue[j] = 0; - - if (isdigit(valuestart[i+1])) - returnvalue[j] += 16 * (valuestart[i+1] - '0'); - else if (isalpha(valuestart[i+1])) - returnvalue[j] += 16 * (10 + tolower(valuestart[i+1]) - 'a'); - - if (isdigit(valuestart[i+2])) - returnvalue[j] += valuestart[i+2] - '0'; - else if (isalpha(valuestart[i+2])) - returnvalue[j] += 10 + tolower(valuestart[i+2]) - 'a'; - - i = i + 2; - } - else if (valuestart[i] == '+') returnvalue[j] = ' '; - else returnvalue[j] = valuestart[i]; - - if (returnvalue[j] == '\r') continue; /* CR/LF -> LF */ - ++j; - } - - returnvalue[j] = '\0'; - - return returnvalue; -} - -/* * - * Utility functions * - * */ - -char *GRSThttpUrlDecode(char *in) -{ - int i, j, n; - char *out; - - n = strlen(in); - out = malloc(n + 1); - - j=0; - - for (i=0; i < n; ++i) - { - if ((i < n - 2) && (in[i] == '%')) /* url encoded as %HH */ - { - out[j] = 0; - - if (isdigit(in[i+1])) - out[j] += 16 * (in[i+1] - '0'); - else if (isalpha(in[i+1])) - out[j] += 16 * (10 + tolower(in[i+1]) - 'a'); - - if (isdigit(in[i+2])) - out[j] += in[i+2] - '0'; - else if (isalpha(in[i+2])) - out[j] += 10 + tolower(in[i+2]) - 'a'; - - i = i + 2; - } - else if (in[i] == '+') out[j] = ' '; - else out[j] = in[i]; - - ++j; - } - - out[j] = '\0'; - - return out; -} - -char *GRSThttpUrlEncode(char *in) -/* Return a pointer to a malloc'd string holding a URL-encoded (RFC 1738) - version of *in. Only A-Z a-z 0-9 . _ - are passed through unmodified. - (DN's processed by GRSThttpUrlEncode can be used as valid Unix filenames, - assuming they do not exceed restrictions on filename length.) */ -{ - char *out, *p, *q; - - out = malloc(3*strlen(in) + 1); - - p = in; - q = out; - - while (*p != '\0') - { - if (isalnum(*p) || (*p == '.') || (*p == '_') || (*p == '-')) - { - *q = *p; - ++q; - } - else - { - sprintf(q, "%%%2X", *p); - q = &q[3]; - } - - ++p; - } - - *q = '\0'; - return out; -} - -char *GRSThttpUrlMildencode(char *in) -/* Return a pointer to a malloc'd string holding a partially URL-encoded - version of *in. "Partially" means that A-Z a-z 0-9 . = - _ @ and / - are passed through unmodified. (DN's processed by GRSThttpUrlMildencode() - can be used as valid Unix paths+filenames if you are prepared to - create or simulate the resulting /X=xyz directories.) */ -{ - char *out, *p, *q; - - out = malloc(3*strlen(in) + 1); - - p = in; - q = out; - - while (*p != '\0') - { - if (isalnum(*p) || (*p == '.') || (*p == '=') || (*p == '-') - || (*p == '/') || (*p == '@') || (*p == '_')) - { - *q = *p; - ++q; - } - else if (*p == ' ') - { - *q = '+'; - ++q; - } - else - { - sprintf(q, "%%%2X", *p); - q = &q[3]; - } - - ++p; - } - - *q = '\0'; - return out; -} - -/// Return a one-time passcode string, for use with GridHTTP -/** - * Returns - * - * String is timestamp+SHA1_HASH(timestamp+":"+method+":"+URL) - * Timestamps and hashes are in lowercase hexadecimal. Timestamps are - * seconds since 00:00:00 on January 1, 1970 UTC. - */ - -/* -char *GRSThttpMakeOneTimePasscode(time_t timestamp, char *method, char *url) -{ - int len, i; - char *stringtohash, hashedstring[EVP_MAX_MD_SIZE], *returnstring; - const EVP_MD *m; - EVP_MD_CTX ctx; - - m = EVP_sha1(); - if (m == NULL) return NULL; - - asprintf(&stringtohash, "%08x:%s:%s", timestamp, method, url); - - EVP_DigestInit(&ctx, m); - EVP_DigestUpdate(&ctx, stringtohash, strlen(stringtohash)); - EVP_DigestFinal(&ctx, hashedstring, &len); - - returnstring = malloc(9 + len * 2); - - sprintf(returnstring, "%08x", timestamp); - - for (i=0; - - return returnstring; -} -*/ diff --git a/org.gridsite.core/src/grst_x509.c b/org.gridsite.core/src/grst_x509.c deleted file mode 100644 index c93564e..0000000 --- a/org.gridsite.core/src/grst_x509.c +++ /dev/null @@ -1,1854 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------- - For more information about GridSite: http://www.gridsite.org/ - --------------------------------------------------------------- -*/ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "gridsite.h" - -#define GRST_KEYSIZE 512 -#define GRST_PROXYCACHE "/../proxycache/" -#define GRST_MAX_CHAIN_LEN 9 - -/// Compare X509 Distinguished Name strings -int GRSTx509NameCmp(char *a, char *b) -/** - * This function attempts to do with string representations what - * would ideally be done with OIDs/values. In particular, we equate - * "/Email=" == "/emailAddress=" to deal with this important change - * between OpenSSL 0.9.6 and 0.9.7. - * Other than that, it is currently the same as ordinary strcasecmp(3) - * (for consistency with EDG/LCG/EGEE gridmapdir case insensitivity.) - */ -{ - int ret; - char *aa, *bb, *p; - - aa = strdup(a); - while ((p = strstr(aa, "/emailAddress=")) != NULL) - { - memmove(&p[6], &p[13], strlen(&p[13]) + 1); - p[1] = 'E'; - } - - bb = strdup(b); - while ((p = strstr(bb, "/emailAddress=")) != NULL) - { - memmove(&p[6], &p[13], strlen(&p[13]) + 1); - p[1] = 'E'; - } - - ret = strcasecmp(aa, bb); - - free(aa); - free(bb); - - return ret; -} - - -/// Check critical extensions -/** - * Returning GRST_RET_OK if all of extensions are known to us or - * OpenSSL; GRST_REF_FAILED otherwise. - * - * Since this function relies on functionality (X509_supported_extension) - * introduced in 0.9.7, then we do nothing and report an error - * (GRST_RET_FAILED) if one of the associated defines - * (X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION) is absent. - */ - -int GRSTx509KnownCriticalExts(X509 *cert) -{ - int i; - char s[80]; - X509_EXTENSION *ex; - -#ifdef X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION - for (i = 0; i < X509_get_ext_count(cert); ++i) - { - ex = X509_get_ext(cert, i); - - if (X509_EXTENSION_get_critical(ex) && - !X509_supported_extension(ex)) - { - OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ex), 1); - - if (strcmp(s, GRST_PROXYCERTINFO_OID) != 0) return GRST_RET_FAILED; - } - } - - return GRST_RET_OK; -#else - return GRST_RET_FAILED; -#endif -} - -/// Check if certificate can be used as a CA to sign standard X509 certs -/* - * Return GRST_RET_OK if true; GRST_RET_FAILED if not. - */ - -int GRSTx509IsCA(X509 *cert) -{ - int idret, purpose_id; - - purpose_id = X509_PURPOSE_get_by_sname("sslclient"); - - /* final argument to X509_check_purpose() is whether to check for CAness */ - - if (X509_check_purpose(cert, purpose_id + X509_PURPOSE_MIN, 1)) - return GRST_RET_OK; - else return GRST_RET_FAILED; -} - -int GRSTx509ChainFree(GRSTx509Chain *chain) -{ - GRSTx509Cert *grst_cert; - - if (chain == NULL) return GRST_RET_OK; - -// delete the various stuff in the chain members.... - - return GRST_RET_OK; -} - -/// Check certificate chain for GSI proxy acceptability. -/** - * Returns GRST_RET_OK if valid; OpenSSL X509 errors otherwise. - * - * The GridSite version handles old and new style Globus proxies, and - * proxies derived from user certificates issued with "X509v3 Basic - * Constraints: CA:FALSE" (eg UK e-Science CA) - * - * TODO: we do not yet check ProxyCertInfo and ProxyCertPolicy extensions - * (although via GRSTx509KnownCriticalExts() we can accept them.) - */ - -int GRSTx509ChainLoadCheck(GRSTx509Chain **chain, - STACK_OF(X509) *certstack, X509 *lastcert, - char *capath) -{ - X509 *cert; /* Points to the current cert in the loop */ - int depth = 0; /* Depth of cert chain */ - int chain_errors = 0; /* records previous errors */ - int first_non_ca; - size_t len,len2; /* Lengths of issuer and cert DN */ - int IsCA; /* Holds whether cert is allowed to sign */ - int prevIsCA; /* Holds whether previous cert in chain is - allowed to sign */ - int prevIsLimited; /* previous cert was proxy and limited */ - int i,j; /* Iteration variables */ - char *cert_DN; /* Pointer to current-certificate-in-chain's - DN */ - char *issuer_DN; /* Pointer to - issuer-of-current-cert-in-chain's DN */ - char *proxy_part_DN; /* Pointer to end part of current-cert-in-chain - maybe eg "/CN=proxy" */ - time_t now; - GRSTx509Cert *grst_cert, *new_grst_cert; - - GRSTerrorLog(GRST_LOG_DEBUG, "GRSTx509ChainLoadCheck() starts"); -printf("GRSTx509ChainLoadCheck() starts"); - - time(&now); - - first_non_ca = 0; /* set to something predictable if things fail */ - - /* Set necessary preliminary values */ - IsCA = TRUE; /* =prevIsCA - start from a CA */ - prevIsLimited = 0; - - - /* Get the client cert chain */ - if (certstack != NULL) - depth = sk_X509_num(certstack); /* How deep is that chain? */ - -printf("depth=%d\n", depth); - - if ((depth == 0) && (lastcert == NULL)) - { - *chain = NULL; - return GRST_RET_FAILED; - } - - *chain = malloc(sizeof(GRSTx509Chain)); - bzero(*chain, sizeof(GRSTx509Chain)); - - /* Check the client chain */ - for (i = depth - 1; i >= (lastcert == NULL) ? 0 : -1; --i) - /* loop through client-presented chain starting at CA end */ - { - prevIsCA=IsCA; - - new_grst_cert = malloc(sizeof(GRSTx509Cert)); - bzero(new_grst_cert, sizeof(GRSTx509Cert)); - new_grst_cert->errors = chain_errors; - - if (i == depth - 1) (*chain)->firstcert = new_grst_cert; - else grst_cert->next = new_grst_cert; - - /* Check for X509 certificate and point to it with 'cert' */ - if (i < 0) cert = lastcert; - else cert = sk_X509_value(certstack, i); - - if (cert != NULL) - { - /* we check times and record if invalid */ - - if (now < - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0)) - new_grst_cert->errors |= GRST_CERT_BAD_TIME; - - if (now > - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0)) - new_grst_cert->errors |= GRST_CERT_BAD_TIME; - - /* If any forebear certificate is not allowed to sign we must - assume all decendents are proxies and cannot sign either */ - if (prevIsCA) - { - /* always treat the first cert (from the CA files) as a CA */ - if (i == depth - 1) IsCA = TRUE; - /* check if this cert is valid CA for signing certs */ - else IsCA = (GRSTx509IsCA(cert) == GRST_RET_OK); - - if (!IsCA) first_non_ca = i; - } - else - { - IsCA = FALSE; - /* Force proxy check next iteration. Important because I can - sign any CA I create! */ - } - - cert_DN = X509_NAME_oneline(X509_get_subject_name(cert),NULL,0); - issuer_DN = X509_NAME_oneline(X509_get_issuer_name(cert),NULL,0); - len = strlen(cert_DN); - len2 = strlen(issuer_DN); - - if (!prevIsCA) - { - /* issuer didn't have CA status, so this is (at best) a proxy: - check for bad proxy extension*/ - - if (prevIsLimited) /* we reject proxies of limited proxies! */ - { - new_grst_cert->errors |= GRST_CERT_BAD_CHAIN; - chain_errors |= GRST_CERT_BAD_CHAIN; - } - - /* User not allowed to sign shortened DN */ - if (len2 > len) - { - new_grst_cert->errors |= GRST_CERT_BAD_CHAIN; - chain_errors |= GRST_CERT_BAD_CHAIN; - } - - /* Proxy subject must begin with issuer. */ - if (strncmp(cert_DN, issuer_DN, len2) != 0) - { - new_grst_cert->errors |= GRST_CERT_BAD_CHAIN; - chain_errors |= GRST_CERT_BAD_CHAIN; - } - - /* Set pointer to end of base DN in cert_DN */ - proxy_part_DN = &cert_DN[len2]; - - /* First attempt at support for Old and New style GSI - proxies: /CN=anything is ok for now */ - if (strncmp(proxy_part_DN, "/CN=", 4) != 0) - { - new_grst_cert->errors |= GRST_CERT_BAD_CHAIN; - chain_errors |= GRST_CERT_BAD_CHAIN; - } - - if (strncmp(proxy_part_DN, "/CN=limited proxy", 17) == 0) - prevIsLimited = 1; /* ready for next cert ... */ - } - } - } - - - return GRST_RET_OK; /* this is also GRST_RET_OK, of course - by choice */ -} - -/// Check certificate chain for GSI proxy acceptability. -/** - * Returns X509_V_OK/GRST_RET_OK if valid; OpenSSL X509 errors otherwise. - * - * Inspired by GSIcheck written by Mike Jones, SVE, Manchester Computing, - * The University of Manchester. - * - * The GridSite version handles old and new style Globus proxies, and - * proxies derived from user certificates issued with "X509v3 Basic - * Constraints: CA:FALSE" (eg UK e-Science CA) - * - * We do not check chain links between certs here: this is done by - * GRST_check_issued/X509_check_issued in mod_ssl's ssl_engine_init.c - * - * TODO: we do not yet check ProxyCertInfo and ProxyCertPolicy extensions - * (although via GRSTx509KnownCriticalExts() we can accept them.) - */ - -int GRSTx509CheckChain(int *first_non_ca, X509_STORE_CTX *ctx) -{ - STACK_OF(X509) *certstack; /* Points to the client's cert chain */ - X509 *cert; /* Points to the client's cert */ - int depth; /* Depth of cert chain */ - size_t len,len2; /* Lengths of issuer and cert DN */ - int IsCA; /* Holds whether cert is allowed to sign */ - int prevIsCA; /* Holds whether previous cert in chain is - allowed to sign */ - int prevIsLimited; /* previous cert was proxy and limited */ - int i,j; /* Iteration variables */ - char *cert_DN; /* Pointer to current-certificate-in-chain's - DN */ - char *issuer_DN; /* Pointer to - issuer-of-current-cert-in-chain's DN */ - char *proxy_part_DN; /* Pointer to end part of current-cert-in-chain - maybe eg "/CN=proxy" */ - time_t now; - - time(&now); - - *first_non_ca = 0; /* set to something predictable if things fail */ - - /* Check for context */ - if (!ctx) return X509_V_ERR_INVALID_CA; - /* Can't GSI-verify if there is no context. Here and throughout this - function we report all errors as X509_V_ERR_INVALID_CA. */ - - /* Set necessary preliminary values */ - IsCA = TRUE; /* =prevIsCA - start from a CA */ - prevIsLimited = 0; - - /* Get the client cert chain */ - certstack = X509_STORE_CTX_get_chain(ctx); /* Get the client's chain */ - depth = sk_X509_num(certstack); /* How deep is that chain? */ - - /* Check the client chain */ - for (i=depth-1; i >= 0; --i) - /* loop through client-presented chain starting at CA end */ - { - prevIsCA=IsCA; - - /* Check for X509 certificate and point to it with 'cert' */ - if (cert = sk_X509_value(certstack, i)) - { - /* we check times and reject immediately if invalid */ - - if (now < - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0)) - return X509_V_ERR_INVALID_CA; - - if (now > - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0)) - return X509_V_ERR_INVALID_CA; - - /* If any forebear certificate is not allowed to sign we must - assume all decendents are proxies and cannot sign either */ - if (prevIsCA) - { - /* always treat the first cert (from the CA files) as a CA */ - if (i == depth-1) IsCA = TRUE; - /* check if this cert is valid CA for signing certs */ - else IsCA = (GRSTx509IsCA(cert) == GRST_RET_OK); - - if (!IsCA) *first_non_ca = i; - } - else - { - IsCA = FALSE; - /* Force proxy check next iteration. Important because I can - sign any CA I create! */ - } - - cert_DN = X509_NAME_oneline(X509_get_subject_name(cert),NULL,0); - issuer_DN = X509_NAME_oneline(X509_get_issuer_name(cert),NULL,0); - len = strlen(cert_DN); - len2 = strlen(issuer_DN); - - /* issuer didn't have CA status, so this is (at best) a proxy: - check for bad proxy extension*/ - - if (!prevIsCA) - { - if (prevIsLimited) /* we reject proxies of limited proxies! */ - return X509_V_ERR_INVALID_CA; - - /* User not allowed to sign shortened DN */ - if (len2 > len) return X509_V_ERR_INVALID_CA; - - /* Proxy subject must begin with issuer. */ - if (strncmp(cert_DN, issuer_DN, len2) != 0) - return X509_V_ERR_INVALID_CA; - - /* Set pointer to end of base DN in cert_DN */ - proxy_part_DN = &cert_DN[len2]; - - /* First attempt at support for Old and New style GSI - proxies: /CN=anything is ok for now */ - if (strncmp(proxy_part_DN, "/CN=", 4) != 0) - return X509_V_ERR_INVALID_CA; - - if ((strncmp(proxy_part_DN, "/CN=limited proxy", 17) == 0) && - (i > 0)) prevIsLimited = 1; /* ready for next cert ... */ - } - } - } - - /* Check cert whose private key is being used by client. If previous in - chain is not allowed to be a CA then need to check this final cert for - valid proxy-icity too */ - if (!prevIsCA) - { - if (prevIsLimited) return X509_V_ERR_INVALID_CA; - /* we do not accept proxies signed by limited proxies */ - - if (cert = sk_X509_value(certstack, 0)) - { - /* Load DN & length of DN and either its issuer or the - first-bad-issuer-in-chain */ - cert_DN = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0); - issuer_DN = X509_NAME_oneline(X509_get_issuer_name(cert), NULL, 0); - len = strlen(cert_DN); - len2 = strlen(issuer_DN); - - /* issuer didn't have CA status, check for bad proxy extension */ - - if (len2 > len) return X509_V_ERR_INVALID_CA; - /* User not allowed to sign shortened DN */ - - if (strncmp(cert_DN, issuer_DN, len2) != 0) - return X509_V_ERR_INVALID_CA; - /* Proxy subject must begin with issuer. */ - - proxy_part_DN = &cert_DN[len2]; - /* Set pointer to end of DN base in cert_DN */ - - /* Remander of subject must be either "/CN=proxy" or - "/CN=limited proxy" (or /CN=XYZ for New style GSI) */ - - /* First attempt at support for Old and New style GSI - proxies: /CN=anything is ok for now. */ - if (strncmp(proxy_part_DN, "/CN=", 4) != 0) - return X509_V_ERR_INVALID_CA; - } - } - - return X509_V_OK; /* this is also GRST_RET_OK, of course - by choice */ -} - -/// Example VerifyCallback routine - -/** - * - */ - -int GRSTx509VerifyCallback (int ok, X509_STORE_CTX *ctx) -{ - int errnum = X509_STORE_CTX_get_error(ctx); - int errdepth = X509_STORE_CTX_get_error_depth(ctx); - int first_non_ca; - -#ifndef X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION -#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 -#endif - - if (errnum == X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION) - { - if (GRSTx509KnownCriticalExts(X509_STORE_CTX_get_current_cert(ctx)) - == GRST_RET_OK) - { - ok = TRUE; - errnum = X509_V_OK; - X509_STORE_CTX_set_error(ctx, errnum); - } - } - else if ((errdepth == 0) && - (errnum == X509_V_OK) && - (GRSTx509CheckChain(&first_non_ca, ctx) != X509_V_OK)) ok = FALSE; - - - return ok; - -// check this - -// if (ok) return GRST_RET_OK; -// else return GRST_RET_FAILED; -} - -/// Check the signature of the VOMS attributes -/* - * Returns GRST_RET_OK if signature is ok, other values if not. - */ - -static int GRSTx509VerifyVomsSig(time_t *time1_time, time_t *time2_time, - unsigned char *asn1string, - struct GRSTasn1TagList taglist[], - int lasttag, - char *vomsdir, int acnumber) -{ -#define GRST_ASN1_COORDS_VOMS_DN "-1-1-%d-1-3-1-1-1-%%d-1-%%d" -#define GRST_ASN1_COORDS_VOMS_INFO "-1-1-%d-1" -#define GRST_ASN1_COORDS_VOMS_SIG "-1-1-%d-3" - int ret, isig, iinfo; - char *certpath, acvomsdn[200], dn_coords[200], - info_coords[200], sig_coords[200]; - unsigned char *q; - DIR *vomsDIR; - struct dirent *vomsdirent; - X509 *cert; - EVP_PKEY *prvkey; - FILE *fp; - EVP_MD_CTX ctx; - time_t voms_service_time1, voms_service_time2; - - if ((vomsdir == NULL) || (vomsdir[0] == '\0')) return GRST_RET_FAILED; - - snprintf(dn_coords, sizeof(dn_coords), - GRST_ASN1_COORDS_VOMS_DN, acnumber); - - if (GRSTasn1GetX509Name(acvomsdn, sizeof(acvomsdn), dn_coords, - asn1string, taglist, lasttag) != GRST_RET_OK) return GRST_RET_FAILED; - - snprintf(info_coords, sizeof(info_coords), - GRST_ASN1_COORDS_VOMS_INFO, acnumber); - iinfo = GRSTasn1SearchTaglist(taglist, lasttag, info_coords); - - snprintf(sig_coords, sizeof(sig_coords), - GRST_ASN1_COORDS_VOMS_SIG, acnumber); - isig = GRSTasn1SearchTaglist(taglist, lasttag, sig_coords); - - if ((iinfo < 0) || (isig < 0)) return GRST_RET_FAILED; - - vomsDIR = opendir(vomsdir); - if (vomsDIR == NULL) return GRST_RET_FAILED; - - while ((vomsdirent = readdir(vomsDIR)) != NULL) - { - asprintf(&certpath, "%s/%s", vomsdir, vomsdirent->d_name); - fp = fopen(certpath, "r"); - free(certpath); - if (fp == NULL) continue; - - cert = PEM_read_X509(fp, NULL, NULL, NULL); - fclose(fp); - if (cert == NULL) continue; - - if (GRSTx509NameCmp(acvomsdn, - X509_NAME_oneline(X509_get_subject_name(cert),NULL,0)) != 0) - { - X509_free(cert); - continue; - } - - prvkey = X509_extract_key(cert); - if (prvkey == NULL) - { - X509_free(cert); - continue; - } - - OpenSSL_add_all_digests(); -#if OPENSSL_VERSION_NUMBER >= 0x0090701fL - EVP_MD_CTX_init(&ctx); - EVP_VerifyInit_ex(&ctx, EVP_md5(), NULL); -#else - EVP_VerifyInit(&ctx, EVP_md5()); -#endif - - EVP_VerifyUpdate(&ctx, - &asn1string[taglist[iinfo].start+ - 0*taglist[iinfo].headerlength], - taglist[iinfo].length+taglist[iinfo].headerlength); - - ret = EVP_VerifyFinal(&ctx, - &asn1string[taglist[isig].start+ - taglist[isig].headerlength]+1, - taglist[isig].length - 1, - prvkey); - -#if OPENSSL_VERSION_NUMBER >= 0x0090701fL - EVP_MD_CTX_cleanup(&ctx); -#endif - EVP_PKEY_free(prvkey); - - if (ret != 1) /* signature doesnt match, look for more */ - { - continue; - X509_free(cert); - } - - voms_service_time1 = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0); - if (voms_service_time1 > *time1_time) - *time1_time = voms_service_time1; - - voms_service_time2 = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0); - if (voms_service_time2 < *time1_time) - *time2_time = voms_service_time2; - - X509_free(cert); - closedir(vomsDIR); - return GRST_RET_OK ; /* verified */ - } - - closedir(vomsDIR); - return GRST_RET_FAILED; -} - -/// Get the VOMS attributes in the given extension -/* - * Puts any VOMS credentials found into the Compact Creds string array - * starting at *creds. Always returns GRST_RET_OK - even for invalid - * credentials, which are just ignored. - */ - -int GRSTx509ParseVomsExt(int *lastcred, int maxcreds, size_t credlen, - char *creds, time_t time1_time, time_t time2_time, - X509_EXTENSION *ex, char *ucuserdn, char *vomsdir) -{ -#define MAXTAG 500 -#define GRST_ASN1_COORDS_FQAN "-1-1-%d-1-7-1-2-1-2-%d" -#define GRST_ASN1_COORDS_USER_DN "-1-1-%d-1-2-1-1-1-1-%%d-1-%%d" -#define GRST_ASN1_COORDS_TIME1 "-1-1-%d-1-6-1" -#define GRST_ASN1_COORDS_TIME2 "-1-1-%d-1-6-2" - ASN1_OCTET_STRING *asn1data; - char *asn1string, acuserdn[200], acvomsdn[200], - dn_coords[200], fqan_coords[200], time1_coords[200], - time2_coords[200]; - long asn1length; - int lasttag=-1, itag, i, acnumber = 1; - struct GRSTasn1TagList taglist[MAXTAG+1]; - time_t actime1, actime2, time_now; - - asn1data = X509_EXTENSION_get_data(ex); - asn1string = ASN1_STRING_data(asn1data); - asn1length = ASN1_STRING_length(asn1data); - - GRSTasn1ParseDump(NULL, asn1string, asn1length, taglist, MAXTAG, &lasttag); - - for (acnumber = 1; ; ++acnumber) /* go through ACs one by one */ - { - snprintf(dn_coords, sizeof(dn_coords), GRST_ASN1_COORDS_USER_DN, acnumber); - if (GRSTasn1GetX509Name(acuserdn, sizeof(acuserdn), dn_coords, - asn1string, taglist, lasttag) != GRST_RET_OK) break; - - if (GRSTx509NameCmp(ucuserdn, acuserdn) != 0) continue; - - if (GRSTx509VerifyVomsSig(&time1_time, &time2_time, - asn1string, taglist, lasttag, vomsdir, acnumber) - != GRST_RET_OK) continue; - - snprintf(time1_coords, sizeof(time1_coords), GRST_ASN1_COORDS_TIME1, acnumber); - itag = GRSTasn1SearchTaglist(taglist, lasttag, time1_coords); - actime1 = GRSTasn1TimeToTimeT(&asn1string[taglist[itag].start+ - taglist[itag].headerlength], - taglist[itag].length); - if (actime1 > time1_time) time1_time = actime1; - - snprintf(time2_coords, sizeof(time2_coords), GRST_ASN1_COORDS_TIME2, acnumber); - itag = GRSTasn1SearchTaglist(taglist, lasttag, time2_coords); - actime2 = GRSTasn1TimeToTimeT(&asn1string[taglist[itag].start+ - taglist[itag].headerlength], - taglist[itag].length); - if (actime2 < time2_time) time2_time = actime2; - - time(&time_now); - if ((time1_time > time_now + 300) || (time2_time < time_now)) - continue; /* expiration isnt invalidity ...? */ - - for (i=1; ; ++i) - { - snprintf(fqan_coords, sizeof(fqan_coords), GRST_ASN1_COORDS_FQAN, acnumber, i); - itag = GRSTasn1SearchTaglist(taglist, lasttag, fqan_coords); - - if (itag > -1) - { - if (*lastcred < maxcreds - 1) - { - ++(*lastcred); - snprintf(&creds[*lastcred * (credlen + 1)], credlen+1, - "VOMS %010lu %010lu 0 %.*s", - time1_time, time2_time, - taglist[itag].length, - &asn1string[taglist[itag].start+ - taglist[itag].headerlength]); - } - } - else break; - } - } - - return GRST_RET_OK; -} - -/// Get the VOMS attributes in the extensions to the given cert stack -/* - * Puts any VOMS credentials found into the Compact Creds string array - * starting at *creds. Always returns GRST_RET_OK. - */ - -int GRSTx509GetVomsCreds(int *lastcred, int maxcreds, size_t credlen, - char *creds, X509 *usercert, STACK_OF(X509) *certstack, - char *vomsdir) -{ - int i, j; - char s[80]; - unsigned char *ucuser; - X509_EXTENSION *ex; - ASN1_STRING *asn1str; - X509 *cert; - time_t time1_time = 0, time2_time = 0, uctime1_time, uctime2_time; - - uctime1_time = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(usercert)),0); - uctime2_time = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(usercert)),0); - ucuser = - X509_NAME_oneline(X509_get_subject_name(usercert), NULL, 0); - - for (j=sk_X509_num(certstack)-1; j >= 0; --j) - { - cert = sk_X509_value(certstack, j); - - time1_time = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0); - uctime1_time = (time1_time > uctime1_time) ? time1_time:uctime1_time; - - time2_time = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0); - uctime2_time = (time2_time < uctime2_time) ? time2_time:uctime2_time; - - for (i=0; i < X509_get_ext_count(cert); ++i) - { - ex = X509_get_ext(cert, i); - OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ex), 1); - - if (strcmp(s, GRST_VOMS_OID) == 0) /* a VOMS extension */ - { - GRSTx509ParseVomsExt(lastcred, maxcreds, credlen, creds, - uctime1_time, uctime2_time, - ex, ucuser, vomsdir); - } - } - } - - return GRST_RET_OK; -} - -/// Turn a Compact Cred line into a GRSTgaclCred object -/** - * Returns pointer to created GRSTgaclCred or NULL or failure. - */ - -GRSTgaclCred *GRSTx509CompactToCred(char *grst_cred) -{ - int delegation; - char *p; - time_t now, notbefore, notafter; - GRSTgaclCred *cred = NULL; - - time(&now); - - if (grst_cred == NULL) return NULL; /* just in case */ - - if (strncmp(grst_cred, "X509USER ", 9) == 0) - { - if ((sscanf(grst_cred, "X509USER %lu %lu %d", - ¬before, ¬after, &delegation) == 3) - && (now >= notbefore) - && (now <= notafter) - && (p = index(grst_cred, ' ')) - && (p = index(++p, ' ')) - && (p = index(++p, ' ')) - && (p = index(++p, ' '))) - { - cred = GRSTgaclCredNew("person"); - GRSTgaclCredSetDelegation(cred, delegation); - GRSTgaclCredAddValue(cred, "dn", &p[1]); - } - - return cred; - } - - if (strncmp(grst_cred, "VOMS ", 5) == 0) - { - if ((sscanf(grst_cred, "VOMS %lu %lu %d", - ¬before, ¬after, &delegation) == 3) - && (now >= notbefore) - && (now <= notafter) - && (p = index(grst_cred, ' ')) - && (p = index(++p, ' ')) - && (p = index(++p, ' ')) - && (p = index(++p, ' '))) - { - /* include /VO/group/subgroup/Role=role/Capability=cap */ - - if (p[1] != '/') return NULL; /* must begin with / */ - - cred = GRSTgaclCredNew("voms"); - GRSTgaclCredSetDelegation(cred, delegation); - GRSTgaclCredAddValue(cred, "fqan", &p[1]); - } - - return cred; - } - - return NULL; /* dont recognise this credential type */ -} - -/// Get the credentials in an X509 cert/GSI proxy, including any VOMS -/** - * Credentials are placed in Compact Creds string array at *creds. - * - * Function returns GRST_RET_OK on success, or GRST_RET_FAILED if - * some inconsistency found in certificate. - */ - -int GRSTx509CompactCreds(int *lastcred, int maxcreds, size_t credlen, - char *creds, STACK_OF(X509) *certstack, char *vomsdir, - X509 *peercert) -{ - int i, j, delegation = 0; - char credtemp[credlen+1]; - X509 *cert, *usercert = NULL, *gsiproxycert = NULL; - - *lastcred = -1; - - for (i = sk_X509_num(certstack) - 1; i >= 0; --i) - { - cert = sk_X509_value(certstack, i); - - if (usercert != NULL) - { /* found a (GSI proxy) cert after the user cert */ - gsiproxycert = cert; - ++delegation; - } - - if ((usercert == NULL) && - (i < sk_X509_num(certstack) - 1) && - (GRSTx509IsCA(cert) != GRST_RET_OK)) usercert = cert; - /* found the 1st non-CA cert */ - } - - if (peercert != NULL) - { - if (usercert != NULL) /* found a (GSI proxy) cert after user cert */ - { - gsiproxycert = peercert; - ++delegation; - } - - if ((usercert == NULL) && - (GRSTx509IsCA(peercert) != GRST_RET_OK)) usercert = peercert; - /* found the 1st non-CA cert */ - } - - if ((usercert == NULL) /* if no usercert ("EEC"), we're not interested */ - || - (snprintf(credtemp, credlen+1, "X509USER %010lu %010lu %d %s", - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(usercert)),0), - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(usercert)),0), - delegation, - X509_NAME_oneline(X509_get_subject_name(usercert), NULL, 0)) >= credlen+1) - || - (*lastcred >= maxcreds-1)) - { - *lastcred = -1; /* just in case the caller looks at it */ - return GRST_RET_FAILED; /* tell caller that things didn't work out */ - } - - ++(*lastcred); - strcpy(&creds[*lastcred * (credlen + 1)], credtemp); - - if ((gsiproxycert != NULL) - && - (snprintf(credtemp, credlen+1, "GSIPROXY %010lu %010lu %d %s", - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(gsiproxycert)),0), - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(gsiproxycert)),0), - delegation, - X509_NAME_oneline(X509_get_subject_name(gsiproxycert), NULL, 0)) < credlen+1) - && - (*lastcred < maxcreds-1)) - { - ++(*lastcred); - strcpy(&creds[*lastcred * (credlen + 1)], credtemp); - - GRSTx509GetVomsCreds(lastcred, maxcreds, credlen, creds, - usercert, certstack, vomsdir); - - } - - return GRST_RET_OK; -} - -/// Find proxy file name of the current user -/** - * Return a string with the proxy file name or NULL if not present. - * This function does not check if the proxy has expired. - */ - -char *GRSTx509FindProxyFileName(void) -{ - char *p; - - p = getenv("X509_USER_PROXY"); - - if (p != NULL) return strdup(p); - - p = malloc(sizeof("/tmp/x509up_uXYYYXXXYYY")); - - sprintf(p, "/tmp/x509up_u%d", getuid()); - - return p; -} - -static void mpcerror(FILE *debugfp, char *msg) -{ - if (debugfp != NULL) - { - fputs(msg, debugfp); - ERR_print_errors_fp(debugfp); - } -} - -/// Make a GSI Proxy chain from a request, certificate and private key -/** - * The proxy chain is returned in *proxychain. If debugfp is non-NULL, - * errors are output to that file pointer. The proxy will expired in - * the given number of minutes starting from the current time. - */ - -int GRSTx509MakeProxyCert(char **proxychain, FILE *debugfp, - char *reqtxt, char *cert, char *key, int minutes) -{ - char *ptr, *certchain; - int i, subjAltName_pos, ncerts; - long serial = 2796, ptrlen; - EVP_PKEY *pkey, *CApkey; - const EVP_MD *digest; - X509 *certs[GRST_MAX_CHAIN_LEN]; - X509_REQ *req; - X509_NAME *name, *CAsubject, *newsubject; - X509_NAME_ENTRY *ent; - X509V3_CTX ctx; - X509_EXTENSION *subjAltName; - STACK_OF (X509_EXTENSION) * req_exts; - FILE *fp; - BIO *reqmem, *certmem; - time_t notAfter; - - /* read in the request */ - reqmem = BIO_new(BIO_s_mem()); - BIO_puts(reqmem, reqtxt); - - if (!(req = PEM_read_bio_X509_REQ(reqmem, NULL, NULL, NULL))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error reading request from BIO memory\n"); - BIO_free(reqmem); - return GRST_RET_FAILED; - } - - BIO_free(reqmem); - - /* verify signature on the request */ - if (!(pkey = X509_REQ_get_pubkey (req))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error getting public key from request\n"); - return GRST_RET_FAILED; - } - - if (X509_REQ_verify(req, pkey) != 1) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error verifying signature on certificate\n"); - return GRST_RET_FAILED; - } - - /* read in the signing certificate */ - if (!(fp = fopen(cert, "r"))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error opening signing certificate file\n"); - return GRST_RET_FAILED; - } - - for (ncerts = 1; ncerts < GRST_MAX_CHAIN_LEN; ++ncerts) - if (!(certs[ncerts] = PEM_read_X509(fp, NULL, NULL, NULL))) break; - - if (ncerts == 1) /* zeroth cert with be new proxy cert */ - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error reading signing certificate file\n"); - return GRST_RET_FAILED; - } - - fclose(fp); - - CAsubject = X509_get_subject_name(certs[1]); - - /* read in the CA private key */ - if (!(fp = fopen(key, "r"))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error reading signing private key file\n"); - return GRST_RET_FAILED; - } - - if (!(CApkey = PEM_read_PrivateKey (fp, NULL, NULL, NULL))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error reading signing private key in file\n"); - return GRST_RET_FAILED; - } - - fclose(fp); - - /* get subject name */ - if (!(name = X509_REQ_get_subject_name (req))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error getting subject name from request\n"); - return GRST_RET_FAILED; - } - - /* create new certificate */ - if (!(certs[0] = X509_new ())) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error creating X509 object\n"); - return GRST_RET_FAILED; - } - - /* set version number for the certificate (X509v3) and the serial number - need 3 = v4 for GSI proxy?? */ - if (X509_set_version (certs[0], 3L) != 1) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error setting certificate version\n"); - return GRST_RET_FAILED; - } - - ASN1_INTEGER_set (X509_get_serialNumber (certs[0]), serial++); - - if (!(name = X509_get_subject_name(certs[1]))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error getting subject name from CA certificate\n"); - return GRST_RET_FAILED; - } - - if (X509_set_issuer_name (certs[0], name) != 1) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error setting issuer name of certificate\n"); - return GRST_RET_FAILED; - } - - /* set issuer and subject name of the cert from the req and the CA */ - ent = X509_NAME_ENTRY_create_by_NID(NULL, OBJ_txt2nid("commonName"), - MBSTRING_ASC, "proxy", -1); - - newsubject = X509_NAME_dup(CAsubject); - - X509_NAME_add_entry(newsubject, ent, -1, 0); - - if (X509_set_subject_name(certs[0], newsubject) != 1) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error setting subject name of certificate\n"); - return GRST_RET_FAILED; - } - - /* set public key in the certificate */ - if (X509_set_pubkey(certs[0], pkey) != 1) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error setting public key of the certificate\n"); - return GRST_RET_FAILED; - } - - /* set duration for the certificate */ - if (!(X509_gmtime_adj (X509_get_notBefore(certs[0]), 0))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error setting beginning time of the certificate\n"); - return GRST_RET_FAILED; - } - - if (!(X509_gmtime_adj (X509_get_notAfter(certs[0]), 60 * minutes))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error setting ending time of the certificate\n"); - return GRST_RET_FAILED; - } - - /* go through chain making sure this proxy is not longer lived */ - - notAfter = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(certs[0])), 0); - - for (i=1; i < ncerts; ++i) - if (notAfter > - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(certs[i])), - 0)) - { - notAfter = - GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(certs[i])), - 0); - - ASN1_UTCTIME_set(X509_get_notAfter(certs[0]), notAfter); - } - - /* sign the certificate with the signing private key */ - if (EVP_PKEY_type (CApkey->type) == EVP_PKEY_RSA) - digest = EVP_md5(); - else - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error checking signing private key for a valid digest\n"); - return GRST_RET_FAILED; - } - - if (!(X509_sign (certs[0], CApkey, digest))) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error signing certificate\n"); - return GRST_RET_FAILED; - } - - /* store the completed certificate chain */ - - certchain = strdup(""); - - for (i=0; i < ncerts; ++i) - { - certmem = BIO_new(BIO_s_mem()); - - if (PEM_write_bio_X509(certmem, certs[i]) != 1) - { - mpcerror(debugfp, - "GRSTx509MakeProxyCert(): error writing certificate to memory BIO\n"); - return GRST_RET_FAILED; - } - - ptrlen = BIO_get_mem_data(certmem, &ptr); - - certchain = realloc(certchain, strlen(certchain) + ptrlen + 1); - - strncat(certchain, ptr, ptrlen); - - BIO_free(certmem); - } - - *proxychain = certchain; - - return GRST_RET_OK; -} - -/// Find a proxy file in the proxy cache -/** - * Returns the full path and file name of proxy file associated - * with given delegation ID and user DN. - */ - -char *GRSTx509CachedProxyFind(char *proxydir, char *delegation_id, - char *user_dn) -/* - Return a pointer to a malloc'd string with the full path of the - proxy file corresponding to the given delegation_id, or NULL - if not found. -*/ -{ - char *user_dn_enc, *proxyfile; - struct stat statbuf; - - user_dn_enc = GRSThttpUrlEncode(user_dn); - - asprintf(&proxyfile, "%s/%s/%s/userproxy.pem", - proxydir, user_dn_enc, delegation_id); - - free(user_dn_enc); - - if ((stat(proxyfile, &statbuf) != 0) || !S_ISREG(statbuf.st_mode)) - { - free(proxyfile); - return NULL; - } - - return proxyfile; -} - -/// Find a temporary proxy private key file in the proxy cache -/** - * Returns the full path and file name of the private key file associated - * with given delegation ID and user DN. - */ - -char *GRSTx509CachedProxyKeyFind(char *proxydir, char *delegation_id, - char *user_dn) -/* - Return a pointer to a malloc'd string with the full path of the - private proxy key corresponding to the given delegation_id, or NULL - if not found. -*/ -{ - char *user_dn_enc, *prvkeyfile; - struct stat statbuf; - - user_dn_enc = GRSThttpUrlEncode(user_dn); - - asprintf(&prvkeyfile, "%s/cache/%s/%s/userkey.pem", - proxydir, user_dn_enc, delegation_id); - - free(user_dn_enc); - - if ((stat(prvkeyfile, &statbuf) != 0) || !S_ISREG(statbuf.st_mode)) - { - free(prvkeyfile); - return NULL; - } - - return prvkeyfile; -} - -static void mkdir_printf(mode_t mode, char *fmt, ...) -{ - int ret; - char *path; - va_list ap; - - va_start(ap, fmt); - vasprintf(&path, fmt, ap); - va_end(ap); - - ret = mkdir(path, mode); - - free(path); -} - -/// Create a X.509 request for a GSI proxy and its private key -/** - * Returns GRST_RET_OK on success, non-zero otherwise. Request string - * and private key are PEM encoded strings - */ - -int GRSTx509CreateProxyRequest(char **reqtxt, char **keytxt, char *ocspurl) -{ - int i; - char *ptr; - size_t ptrlen; - RSA *keypair; - X509_NAME *subject; - X509_NAME_ENTRY *ent; - EVP_PKEY *pkey; - X509_REQ *certreq; - BIO *reqmem, *keymem; - const EVP_MD *digest; - struct stat statbuf; - - /* create key pair and put it in a PEM string */ - - if ((keypair = RSA_generate_key(GRST_KEYSIZE, 65537, NULL, NULL)) == NULL) - return 1; - - keymem = BIO_new(BIO_s_mem()); - if (!PEM_write_bio_RSAPrivateKey(keymem, keypair, NULL, NULL, 0, NULL, NULL)) - { - BIO_free(keymem); - return 3; - } - - ptrlen = BIO_get_mem_data(keymem, &ptr); - - *keytxt = malloc(ptrlen + 1); - memcpy(*keytxt, ptr, ptrlen); - (*keytxt)[ptrlen] = '\0'; - - BIO_free(keymem); - - /* now create the certificate request */ - - certreq = X509_REQ_new(); - - OpenSSL_add_all_algorithms(); - - pkey = EVP_PKEY_new(); - EVP_PKEY_assign_RSA(pkey, keypair); - - X509_REQ_set_pubkey(certreq, pkey); - - subject = X509_NAME_new(); - ent = X509_NAME_ENTRY_create_by_NID(NULL, OBJ_txt2nid("organizationName"), - MBSTRING_ASC, "Dummy", -1); - X509_NAME_add_entry (subject, ent, -1, 0); - X509_REQ_set_subject_name (certreq, subject); - - digest = EVP_md5(); - X509_REQ_sign(certreq, pkey, digest); - - reqmem = BIO_new(BIO_s_mem()); - PEM_write_bio_X509_REQ(reqmem, certreq); - ptrlen = BIO_get_mem_data(reqmem, &ptr); - - *reqtxt = malloc(ptrlen + 1); - memcpy(*reqtxt, ptr, ptrlen); - (*reqtxt)[ptrlen] = '\0'; - - BIO_free(reqmem); - - X509_REQ_free(certreq); - - return 0; -} - -/// Make and store a X.509 request for a GSI proxy -/** - * Returns GRST_RET_OK on success, non-zero otherwise. Request string - * is PEM encoded, and the key is stored in the temporary cache under - * proxydir - */ - -int GRSTx509MakeProxyRequest(char **reqtxt, char *proxydir, - char *delegation_id, char *user_dn) -{ - int i; - char *docroot, *prvkeyfile, *ptr, *user_dn_enc; - size_t ptrlen; - FILE *fp; - RSA *keypair; - X509_NAME *subject; - X509_NAME_ENTRY *ent; - EVP_PKEY *pkey; - X509_REQ *certreq; - BIO *reqmem; - const EVP_MD *digest; - struct stat statbuf; - - if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED; - - user_dn_enc = GRSThttpUrlEncode(user_dn); - - /* create directories if necessary */ - - mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR, - "%s/cache", proxydir); - mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR, - "%s/cache/%s", proxydir, user_dn_enc); - mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR, - "%s/cache/%s/%s", proxydir, user_dn_enc, delegation_id); - - /* make the new proxy private key */ - - asprintf(&prvkeyfile, "%s/cache/%s/%s/userkey.pem", - proxydir, user_dn_enc, delegation_id); - - if (prvkeyfile == NULL) - { - free(user_dn_enc); - return GRST_RET_FAILED; - } - - if ((keypair = RSA_generate_key(GRST_KEYSIZE, 65537, NULL, NULL)) == NULL) - return 1; - - if ((fp = fopen(prvkeyfile, "w")) == NULL) return 2; - - chmod(prvkeyfile, S_IRUSR | S_IWUSR); - free(prvkeyfile); - free(user_dn_enc); - - if (!PEM_write_RSAPrivateKey(fp, keypair, NULL, NULL, 0, NULL, NULL)) - return 3; - - if (fclose(fp) != 0) return 4; - - /* now create the certificate request */ - - certreq = X509_REQ_new(); - if (certreq == NULL) return 5; - - OpenSSL_add_all_algorithms(); - - pkey = EVP_PKEY_new(); - EVP_PKEY_assign_RSA(pkey, keypair); - - X509_REQ_set_pubkey(certreq, pkey); - - subject = X509_NAME_new(); - ent = X509_NAME_ENTRY_create_by_NID(NULL, OBJ_txt2nid("organizationName"), - MBSTRING_ASC, "Dummy", -1); - X509_NAME_add_entry (subject, ent, -1, 0); - X509_REQ_set_subject_name (certreq, subject); - - digest = EVP_md5(); - X509_REQ_sign(certreq, pkey, digest); - - reqmem = BIO_new(BIO_s_mem()); - PEM_write_bio_X509_REQ(reqmem, certreq); - ptrlen = BIO_get_mem_data(reqmem, &ptr); - - *reqtxt = malloc(ptrlen + 1); - memcpy(*reqtxt, ptr, ptrlen); - (*reqtxt)[ptrlen] = '\0'; - - BIO_free(reqmem); - - X509_REQ_free(certreq); - - return 0; -} - -/// Destroy stored GSI proxy files -/** - * Returns GRST_RET_OK on success, non-zero otherwise. - * (Including GRST_RET_NO_SUCH_FILE if the private key or cert chain - * were not found.) - */ - -int GRSTx509ProxyDestroy(char *proxydir, char *delegation_id, char *user_dn) -{ - int ret = GRST_RET_OK; - char *docroot, *filename, *user_dn_enc; - - if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED; - - user_dn_enc = GRSThttpUrlEncode(user_dn); - - /* proxy file */ - - asprintf(&filename, "%s/%s/%s/userproxy.pem", - proxydir, user_dn_enc, delegation_id); - - if (filename == NULL) - { - free(user_dn_enc); - return GRST_RET_FAILED; - } - - if (unlink(filename) != 0) ret = GRST_RET_NO_SUCH_FILE; - free(filename); - - /* voms file */ - - asprintf(&filename, "%s/%s/%s/voms.attributes", - proxydir, user_dn_enc, delegation_id); - - if (filename == NULL) - { - free(user_dn_enc); - return GRST_RET_FAILED; - } - - unlink(filename); - free(filename); - - return ret; -} - -/// Get start and finish validity times of stored GSI proxy file -/** - * Returns GRST_RET_OK on success, non-zero otherwise. - * (Including GRST_RET_NO_SUCH_FILE if the cert chain was not found.) - */ - -int GRSTx509ProxyGetTimes(char *proxydir, char *delegation_id, char *user_dn, - time_t *start, time_t *finish) -{ - char *docroot, *filename, *user_dn_enc; - FILE *fp; - X509 *cert; - - if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED; - - user_dn_enc = GRSThttpUrlEncode(user_dn); - - asprintf(&filename, "%s/%s/%s/userproxy.pem", - proxydir, user_dn_enc, delegation_id); - - free(user_dn_enc); - - if (filename == NULL) return GRST_RET_FAILED; - - fp = fopen(filename, "r"); - free(filename); - - if (fp == NULL) return GRST_RET_NO_SUCH_FILE; - - cert = PEM_read_X509(fp, NULL, NULL, NULL); /* first cert is X.509 PC */ - - fclose(fp); - - *start = GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0); - *finish = GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0); - - X509_free(cert); - - return GRST_RET_OK; -} - -/// Create a stack of X509 certificate from a PEM-encoded string -/** - * Creates a dynamically allocated stack of X509 certificate objects - * by walking through the PEM-encoded X509 certificates. - * - * Returns GRST_RET_OK on success, non-zero otherwise. - * - */ - -int GRSTx509StringToChain(STACK_OF(X509) **certstack, char *certstring) -{ - STACK_OF(X509_INFO) *sk=NULL; - BIO *certbio; - X509_INFO *xi; - - *certstack = sk_X509_new_null(); - if (*certstack == NULL) return GRST_RET_FAILED; - - certbio = BIO_new_mem_buf(certstring, -1); - - if (!(sk=PEM_X509_INFO_read_bio(certbio, NULL, NULL, NULL))) - { - BIO_free(certbio); - sk_X509_INFO_free(sk); - sk_X509_free(*certstack); - return GRST_RET_FAILED; - } - - while (sk_X509_INFO_num(sk)) - { - xi=sk_X509_INFO_shift(sk); - if (xi->x509 != NULL) - { - sk_X509_push(*certstack, xi->x509); - xi->x509=NULL; - } - X509_INFO_free(xi); - } - - if (!sk_X509_num(*certstack)) - { - BIO_free(certbio); - sk_X509_INFO_free(sk); - sk_X509_free(*certstack); - return GRST_RET_FAILED; - } - - BIO_free(certbio); - sk_X509_INFO_free(sk); - - return GRST_RET_OK; -} - -/// Returns a Delegation ID based on hash of GRST_CRED_0, ... -/** - * Returns a malloc'd string with Delegation ID made by SHA1-hashing the - * values of the compact credentials exported by mod_gridsite - */ - -char *GRSTx509MakeDelegationID(void) -{ - unsigned char hash_delegation_id[EVP_MAX_MD_SIZE]; - int size_needed = 0, i, delegation_id_len; - char cred_name[14], *cred_value, *delegation_id; - const EVP_MD *m; - EVP_MD_CTX ctx; - - OpenSSL_add_all_digests(); - - m = EVP_sha1(); - if (m == NULL) return NULL; - - EVP_DigestInit(&ctx, m); - - for (i=0; i <= 999; ++i) - { - snprintf(cred_name, sizeof(cred_name), "GRST_CRED_%d", i); - if ((cred_value = getenv(cred_name)) == NULL) break; - - EVP_DigestUpdate(&ctx, cred_value, strlen(cred_value)); - } - - EVP_DigestFinal(&ctx, hash_delegation_id, &delegation_id_len); - - delegation_id = malloc(17); - - for (i=0; i <=7; ++i) - sprintf(&delegation_id[i*2], "%02x", hash_delegation_id[i]); - - delegation_id[16] = '\0'; - - return delegation_id; -} - -#if 0 -/// Return the short file name for the given delegation_id and user_dn -/** - * Returns a malloc'd string with the short file name (no paths) that - * derived from the hashed delegation_id and user_dn - * - * File name is SHA1_HASH(DelegationID)+"-"+SHA1_HASH(DN) where DN - * is DER encoded version of user_dn with any trailing CN=proxy removed - * Hashes are the most significant 8 bytes, in lowercase hexadecimal. - */ - -char *GRSTx509MakeProxyFileName(char *delegation_id, - STACK_OF(X509) *certstack) -{ - int i, depth, prevIsCA = 1, IsCA, hash_name_len, delegation_id_len, - der_name_len; - unsigned char *der_name, *buf, hash_name[EVP_MAX_MD_SIZE], - hash_delegation_id[EVP_MAX_MD_SIZE], - filename[34]; - X509_NAME *subject_name; - X509 *cert; - const EVP_MD *m; - EVP_MD_CTX ctx; - - depth = sk_X509_num(certstack); - - for (i=depth-1; i >= 0; --i) - /* loop through the proxy chain starting at CA end */ - { - if (cert = sk_X509_value(certstack, i)) - { - IsCA = (GRSTx509IsCA(cert) == GRST_RET_OK); - - if (prevIsCA && !IsCA) /* the full certificate of the user */ - { - break; - } - } - } - - if (i < 0) return NULL; /* not found: something wrong with the chain */ - - if ((subject_name = X509_get_subject_name(cert)) == NULL) return NULL; - - der_name_len = i2d_X509_NAME(X509_get_subject_name(cert), NULL); - if (der_name_len == 0) return NULL; - - buf = OPENSSL_malloc(der_name_len); - der_name = buf; - - - if (!i2d_X509_NAME(X509_get_subject_name(cert), &der_name)) - { - OPENSSL_free(der_name); - return NULL; - } - - OpenSSL_add_all_digests(); - - m = EVP_sha1(); - if (m == NULL) - { - OPENSSL_free(der_name); - return NULL; - } - - - EVP_DigestInit(&ctx, m); - EVP_DigestUpdate(&ctx, delegation_id, strlen(delegation_id)); - EVP_DigestFinal(&ctx, hash_delegation_id, &delegation_id_len); - - /* lots of nasty hard coded numbers: - "8bytes/16chars delegation ID" + "-" + "8bytes/16chars DN" */ - - for (i=0; i <=7; ++i) - sprintf(&filename[i*2], "%02x", hash_delegation_id[i]); - - filename[16] = '-'; - - EVP_DigestInit(&ctx, m); - EVP_DigestUpdate(&ctx, buf, der_name_len); - EVP_DigestFinal(&ctx, hash_name, &hash_name_len); - - for (i=0; i <=7; ++i) - sprintf(&filename[17 + i*2], "%02x", hash_name[i]); - - return strdup(filename); -} -#endif - -/// Store a GSI proxy chain in the proxy cache, along with the private key -/** - * Returns GRST_RET_OK on success, non-zero otherwise. The existing - * private key with the same delegation ID and user DN is moved out of - * the temporary cache. - */ - -int GRSTx509CacheProxy(char *proxydir, char *delegation_id, - char *user_dn, char *proxychain) -{ - int c, len = 0, i, ret; - char *user_dn_enc, *p, *ptr, *prvkeyfile, *proxyfile; - STACK_OF(X509) *certstack; - BIO *certmem; - X509 *cert; - long ptrlen; - FILE *ifp, *ofp; - - if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED; - - /* find the existing private key file */ - - prvkeyfile = GRSTx509CachedProxyKeyFind(proxydir, delegation_id, user_dn); - - if (prvkeyfile == NULL) - { - return GRST_RET_FAILED; - } - - /* open it ready for later */ - - if ((ifp = fopen(prvkeyfile, "r")) == NULL) - { - free(prvkeyfile); - return GRST_RET_FAILED; - } - - /* get the X509 stack */ - - if (GRSTx509StringToChain(&certstack, proxychain) != GRST_RET_OK) - { - fclose(ifp); - free(prvkeyfile); - return GRST_RET_FAILED; - } - - /* create directories if necessary, and set proxy filename */ - - user_dn_enc = GRSThttpUrlEncode(user_dn); - - mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR, - "%s/%s", proxydir, user_dn_enc); - mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR, - "%s/%s/%s", proxydir, user_dn_enc, delegation_id); - - asprintf(&proxyfile, "%s/%s/%s/userproxy.pem", - proxydir, user_dn_enc, delegation_id); - - free(user_dn_enc); - - /* set up to write proxy file */ - - ofp = fopen(proxyfile, "w"); - chmod(proxyfile, S_IRUSR | S_IWUSR); - free(proxyfile); - - if (ofp == NULL) - { - fclose(ifp); - free(prvkeyfile); - return GRST_RET_FAILED; - } - - /* write out the most recent proxy by itself */ - - if (cert = sk_X509_value(certstack, 0)) - { - certmem = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(certmem, cert) == 1) - { - ptrlen = BIO_get_mem_data(certmem, &ptr); - fwrite(ptr, 1, ptrlen, ofp); - } - - BIO_free(certmem); - } - - /* insert proxy private key, read from private key file */ - - while ((c = fgetc(ifp)) != EOF) fputc(c, ofp); - unlink(prvkeyfile); - free(prvkeyfile); - - for (i=1; i <= sk_X509_num(certstack) - 1; ++i) - /* loop through the proxy chain starting at 2nd most recent proxy */ - { - if (cert = sk_X509_value(certstack, i)) - { - certmem = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(certmem, cert) == 1) - { - ptrlen = BIO_get_mem_data(certmem, &ptr); - fwrite(ptr, 1, ptrlen, ofp); - } - - BIO_free(certmem); - } - } - - sk_X509_free(certstack); - - if (fclose(ifp) != 0) return GRST_RET_FAILED; - if (fclose(ofp) != 0) return GRST_RET_FAILED; - - return GRST_RET_OK; -} diff --git a/org.gridsite.core/src/grst_xacml.c b/org.gridsite.core/src/grst_xacml.c deleted file mode 100644 index c4c88ee..0000000 --- a/org.gridsite.core/src/grst_xacml.c +++ /dev/null @@ -1,576 +0,0 @@ -/* - Andrew McNab and Shiv Kaushal, University of Manchester. - Copyright (c) 2002-3. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ -/*------------------------------------------------------------------------* - * For more information about GridSite: http://www.gridpp.ac.uk/gridsite/ * - *------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#include - -#include -#include -#include - -#include "gridsite.h" - -//#define XACML_DEBUG - -#ifdef XACML_DEBUG - #define XACML_DEBUG_FILE "/tmp/grstxacmldebug.out" -#endif - - -/* * - * Global variables, shared by all GACL functions by private to libgacl * - * */ - -extern char *grst_perm_syms[]; -extern GRSTgaclPerm grst_perm_vals[]; - - -FILE* debugfile; - -GRSTgaclAcl *GRSTgaclAclParse(xmlDocPtr, xmlNodePtr, GRSTgaclAcl *); -GRSTgaclAcl *GRSTxacmlAclParse(xmlDocPtr, xmlNodePtr, GRSTgaclAcl *); - -/* * - * Functions to read in XACML 1.1 compliant format ACL * - * Functions based on method for opening GACL format * - * */ - -// need to check these for libxml memory leaks? - what needs to be freed? - - -static GRSTgaclCred *GRSTxacmlCredParse(xmlNodePtr cur) -/* - GRSTxacmlCredParse - parse a credential stored in the libxml structure cur, - returning it as a pointer or NULL on error. -*/ -{ - xmlNodePtr attr_val; - xmlNodePtr attr_des; - GRSTgaclCred *cred; - - // cur points to or , loop done outside this function. - - if ( (xmlStrcmp(cur->name, (const xmlChar *) "AnySubject") == 0)) cred = GRSTgaclCredNew("any-user"); - - else{ - - attr_val=cur->xmlChildrenNode->xmlChildrenNode; - attr_des=attr_val->next; - - cred = GRSTgaclCredNew((char *) xmlNodeGetContent(attr_des->properties->children)); - - cred->firstname = NULL; - cred->next = NULL; - - //Assumed that there is only one name/value pair per credential - GRSTgaclCredAddValue(cred, (char *) xmlNodeGetContent(attr_des->properties->next->children), - (char *) xmlNodeGetContent(attr_val)); - } - - return cred; -} - -static GRSTgaclEntry *GRSTxacmlEntryParse(xmlNodePtr cur) -/* - GRSTxacmlEntryParse - parse an entry stored in the libxml structure cur, - returning it as a pointer or NULL on error. Also checks to see if the following - tag refers to the same by checking the of both -*/ -{ - int i, check=0; - xmlDocPtr doc=cur->doc; - xmlNodePtr cur2; - xmlNodePtr rule_root=cur; - GRSTgaclEntry *entry; - GRSTgaclCred *cred; - GRSTgaclPerm perm; - - - // Next line not needed as function only called if tag found - // if (xmlStrcmp(cur->name, (const xmlChar *) "Rule") != 0) return NULL; - // cur and rule_root point to the tag - - cur = cur->xmlChildrenNode->xmlChildrenNode; - // cur should now be pointing at tag -#ifdef XACML_DEBUG - fprintf (debugfile, "Starting to Parse Entry\n"); -#endif - entry = GRSTgaclEntryNew(); - - while (cur!=NULL){ - - if (xmlStrcmp(cur->name, (const xmlChar *) "Subjects") == 0){ -#ifdef XACML_DEBUG - fprintf (debugfile, "Starting to Parse Credentials\n"); -#endif - if (check==0){ - // cur still pointing at tag make cur2 point to and loop over them. - cur2=cur->xmlChildrenNode; - while (cur2!=NULL){ - if ( ((cred = GRSTxacmlCredParse(cur2)) != NULL) && (!GRSTgaclEntryAddCred(entry, cred))){ - GRSTgaclCredFree(cred); - GRSTgaclEntryFree(entry); - return NULL; - } - cur2=cur2->next; - } - } - } - - else if (xmlStrcmp(cur->name, (const xmlChar *) "Actions") == 0){ -#ifdef XACML_DEBUG - fprintf (debugfile, "Starting to Parse Permissions\n"); -#endif - if (xmlStrcmp(xmlNodeGetContent(rule_root->properties->next->children), (const xmlChar *) "Permit") == 0 ){ -#ifdef XACML_DEBUG - fprintf (debugfile, "\tPermit-ed actions: "); -#endif - for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next) //cur2-> - for (i=0; grst_perm_syms[i] != NULL; ++i) - if (xmlStrcmp(xmlNodeGetContent(cur2->xmlChildrenNode->xmlChildrenNode), (const xmlChar *) grst_perm_syms[i]) == 0) - { -#ifdef XACML_DEBUG - fprintf (debugfile, "%s ", grst_perm_syms[i]); -#endif - GRSTgaclEntryAllowPerm(entry, grst_perm_vals[i]); - } - } - - if (xmlStrcmp(xmlNodeGetContent(rule_root->properties->next->children), (const xmlChar *) "Deny") == 0 ) { -#ifdef XACML_DEBUG - fprintf (debugfile, "\tDeny-ed actions: "); -#endif - for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next) //cur2-> - for (i=0; grst_perm_syms[i] != NULL; ++i) - if (xmlStrcmp(xmlNodeGetContent(cur2->xmlChildrenNode->xmlChildrenNode), (const xmlChar *) grst_perm_syms[i]) == 0) - { - -#ifdef XACML_DEBUG - fprintf (debugfile, "%s ", grst_perm_syms[i]); -#endif - GRSTgaclEntryDenyPerm(entry, grst_perm_vals[i]); - } - } - - } - else{ // I cannot parse this - give up rather than get it wrong -#ifdef XACML_DEBUG - fprintf (debugfile, "OOOPSIE\n"); -#endif - GRSTgaclEntryFree(entry); - return NULL; - } - - cur=cur->next; - - // Check if next Rule should be included when end of current rule reached - // If RuleId are from the same entry (eg Entry1A and Entry1D) - // make cur point to the next Rule's tag - if (cur==NULL) - if (check==0) - if (rule_root->next!=NULL) - if ( strncmp(xmlNodeGetContent(rule_root->properties->children), // RuleId of this Rule - xmlNodeGetContent(rule_root->next->properties->children), // RuleId of next Rule - 6) == 0){ -#ifdef XACML_DEBUG - fprintf (debugfile, "End of perms and creds, next is %s \n", xmlNodeGetContent(rule_root->next->properties->children)); -#endif - rule_root=rule_root->next; - cur=rule_root->xmlChildrenNode->xmlChildrenNode; -#ifdef XACML_DEBUG - fprintf (debugfile, "skipped to <%s> tag of next Rule\n", cur->name); -#endif - check++; - } - } - - return entry; -} - -GRSTgaclAcl *GRSTxacmlAclLoadFile(char *filename) -{ - xmlDocPtr doc; - xmlNodePtr cur; - GRSTgaclAcl *acl; - - doc = xmlParseFile(filename); - if (doc == NULL) return NULL; - - cur = xmlDocGetRootElement(doc); - if (cur == NULL) return NULL; - - if (!xmlStrcmp(cur->name, (const xmlChar *) "Policy")) { acl=GRSTxacmlAclParse(doc, cur, acl);} - else if (!xmlStrcmp(cur->name, (const xmlChar *) "gacl")) {acl=GRSTgaclAclParse(doc, cur, acl);} - else /* ACL format not recognised */ - { - xmlFreeDoc(doc); - free(cur); - return NULL; - } - - xmlFreeDoc(doc); - return acl; -} - -GRSTgaclAcl *GRSTxacmlAclParse(xmlDocPtr doc, xmlNodePtr cur, GRSTgaclAcl *acl) -{ - GRSTgaclEntry *entry; - - #ifdef XACML_DEBUG - debugfile=fopen(XACML_DEBUG_FILE, "w"); - fprintf (debugfile, "ACL loaded..\n"); - fprintf (debugfile, "Parsing XACML\n"); - #endif - - // Have an XACML policy file. - // Skip tag and set cur to first tag - cur = cur->xmlChildrenNode->next; - - acl = GRSTgaclAclNew(); - - while (cur != NULL){ - - if ( !xmlStrcmp(cur->name, (const xmlChar *)"Rule") ) - { // IF statement not needed? - #ifdef XACML_DEBUG - fprintf (debugfile, "Rule %s found\n", xmlNodeGetContent(cur->properties->children) ); - fprintf (debugfile, "Parsing Entry for this rule\n"); - #endif - entry = GRSTxacmlEntryParse(cur); - - if (entry == NULL) - { - GRSTgaclAclFree(acl); - return NULL; - } - else GRSTgaclAclAddEntry(acl, entry); - - #ifdef XACML_DEBUG - fprintf (debugfile, "Entry read in\n\n"); - #endif - } - - // If the current and next Rules are part of the same entry then advance two Rules - // If not then advance 1 - if (cur->next != NULL) - { - if ( strncmp(xmlNodeGetContent(cur->properties->children), // RuleId of this Rule - xmlNodeGetContent(cur->next->properties->children), // RuleId of next Rule - 6) == 0) - { - #ifdef XACML_DEBUG - fprintf (debugfile, "skipping next rule %s, should have been caught previously\n\n", xmlNodeGetContent(cur->next->properties->children) ); - #endif - cur=cur->next; - } // Check first 6 characters i.e. Entry1**/ - } - - cur=cur->next; - - } - - #ifdef XACML_DEBUG - fprintf (debugfile, "Finished loading ACL - Fanfare!\n"); - fclose(debugfile); - #endif - - return acl; -} - - -int GRSTxacmlFileIsAcl(char *pathandfile) -/* Return 1 if filename in *pathandfile starts GRST_ACL_FILE - Return 0 otherwise. */ -{ - char *filename; - - filename = rindex(pathandfile, '/'); - if (filename == NULL) filename = pathandfile; - else filename++; - - return (strncmp(filename, GRST_ACL_FILE, sizeof(GRST_ACL_FILE) - 1) == 0); -} - -char *GRSTxacmlFileFindAclname(char *pathandfile) -/* Return malloc()ed ACL filename that governs the given file or directory - (for directories, the ACL file is in the directory itself), or NULL if none - can be found. */ -{ - char *path, *p; - struct stat statbuf; - - path = malloc(strlen(pathandfile) + sizeof(GRST_ACL_FILE) + 1); - strcpy(path, pathandfile); - - if (stat(path, &statbuf) == 0) - { - if (!S_ISDIR(statbuf.st_mode)) /* can strip this / off straightaway */ - { - p = rindex(path, '/'); - if (p != NULL) *p = '\0'; - } - } - - while (path[0] != '\0') - { - strcat(path, "/"); - strcat(path, GRST_ACL_FILE); - - if (stat(path, &statbuf) == 0) return path; - - p = rindex(path, '/'); - *p = '\0'; /* strip off the / we added for ACL */ - - p = rindex(path, '/'); - if (p == NULL) break; /* must start without / and we there now ??? */ - - *p = '\0'; /* strip off another layer of / */ - } - - free(path); - return NULL; -} - -GRSTgaclAcl *GRSTxacmlAclLoadforFile(char *pathandfile) -/* Return ACL that governs the given file or directory (for directories, - the ACL file is in the directory itself.) */ -{ - char *path; - GRSTgaclAcl *acl; - - path = GRSTxacmlFileFindAclname(pathandfile); - - if (path != NULL) - { - acl = GRSTxacmlAclLoadFile(path); - free(path); - return acl; - } - - return NULL; -} - - - -/* * - * Functions to save ACL in XACML 1.1 compliant format * - * Functions based on method for saving to GACL format * - * */ - - -int GRSTxacmlCredPrint(GRSTgaclCred *cred, FILE *fp) -/* - GRSTxacmlCredPrint - print a credential and any name-value pairs is contains in XACML form -*/ -{ - char *q; - GRSTgaclNamevalue *p; - - if (cred->firstname != NULL) - { - - p = cred->firstname; - - do { - - fputs("\t\t\t\t\n", fp); - fputs("\t\t\t\t\t\n", fp); - fputs("\t\t\t\t\t\t", fp); - for (q=p->value; *q != '\0'; ++q) - if (*q == '<') fputs("<", fp); - else if (*q == '>') fputs(">", fp); - else if (*q == '&') fputs("&" , fp); - else if (*q == '\'') fputs("'", fp); - else if (*q == '"') fputs(""", fp); - else fputc(*q, fp); - - - fputs("\n", fp); - - fputs("\t\t\t\t\t\ttype); - fputs("\t\t\t\t\t\t\tDataType=", fp); - fprintf(fp, "\"%s\"/>\n", p->name); - fputs("\t\t\t\t\t\n", fp); - fputs("\t\t\t\t\n", fp); - p = (GRSTgaclNamevalue *) p->next; - } while (p != NULL); - - } - else fputs("\t\t\t\t\n", fp); - - return 1; -} - - -int GRSTxacmlEntryPrint(GRSTgaclEntry *entry, FILE *fp, int rule_number) -{ - GRSTgaclCred *cred; - GRSTgaclPerm i; - - if (entry->allowed){ - - fprintf(fp, "\t\n", rule_number); - fputs("\t\t\n", fp); - fputs("\t\t\t\n", fp); - - for (cred = entry->firstcred; cred != NULL; cred = cred->next) - GRSTxacmlCredPrint(cred, fp); - - fputs("\t\t\t\n", fp); - fputs("\t\t\t\n", fp); - - for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i) - if ((entry->allowed) & i) GRSTxacmlPermPrint(i, fp); - - fputs("\t\t\t\n", fp); - fputs("\t\t\n", fp); - fputs("\t\n", fp); - } - - if (entry->denied){ - - fprintf(fp, "\t\n", rule_number); - fputs("\t\t\n", fp); - fputs("\t\t\t\n", fp); - - for (cred = entry->firstcred; cred != NULL; cred = cred->next) - GRSTxacmlCredPrint(cred, fp); - - fputs("\t\t\t\n", fp); - fputs("\t\t\t\n", fp); - - for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i) - if (entry->denied & i) GRSTxacmlPermPrint(i, fp); - - fputs("\t\t\t\n", fp); - fputs("\t\t\n", fp); - fputs("\t\n", fp); - } - return 1; -} - - -int GRSTxacmlPermPrint(GRSTgaclPerm perm, FILE *fp) -{ - GRSTgaclPerm i; - - for (i=GRST_PERM_READ; grst_perm_syms[i] != NULL; ++i) - if (perm == grst_perm_vals[i]) - { - - fputs("\t\t\t\t\n", fp); - fputs("\t\t\t\t\t\n", fp); - fputs("\t\t\t\t\t\t", fp); - fprintf(fp, "%s", grst_perm_syms[i]); - fputs("\n", fp); - fputs("\t\t\t\t\t\t\n", fp); - fputs("\t\t\t\t\t\n", fp); - fputs("\t\t\t\t\n",fp); - - return 1; - } - - return 0; -} - -int GRSTxacmlAclPrint(GRSTgaclAcl *acl, FILE *fp, char* dir_uri) -{ - GRSTgaclEntry *entry; - int rule_number=1; - - fputs("\n\n", fp); - - fputs("\t\n\t\t\n\t\t\t\n", fp); - fputs("\t\t\t\t\n", fp); - fputs("\t\t\t\t\t", fp); - fprintf(fp, "%s", dir_uri); - fputs("\n", fp); - fputs("\t\t\t\t\t\n", fp); - - fputs("\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t", fp); - fputs("\n\t\t\n\t\t\t\n\t\t\n\t\n\n", fp); - - for (entry = acl->firstentry; entry != NULL; entry = entry->next){ - - GRSTxacmlEntryPrint(entry, fp, rule_number); - rule_number++; - } - - fputs("\n", fp); - - return 1; -} - -int GRSTxacmlAclSave(GRSTgaclAcl *acl, char *filename, char* dir_uri) -{ - int ret; - FILE *fp; - - fp = fopen(filename, "w"); - if (fp == NULL) return 0; - - fprintf(fp,"\n"); - - ret = GRSTxacmlAclPrint(acl, fp, dir_uri); - - fclose(fp); - - return ret; -} - - - - diff --git a/org.gridsite.core/src/gsexec.c b/org.gridsite.core/src/gsexec.c deleted file mode 100644 index 4278c77..0000000 --- a/org.gridsite.core/src/gsexec.c +++ /dev/null @@ -1,1104 +0,0 @@ -/* Copyright 1999-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * suexec.c -- "Wrapper" support program for suEXEC behaviour for Apache - * - *********************************************************************** - * - * NOTE! : DO NOT edit this code!!! Unless you know what you are doing, - * editing this code might open up your system in unexpected - * ways to would-be crackers. Every precaution has been taken - * to make this code as safe as possible; alter it at your own - * risk. - * - *********************************************************************** - * - * - */ - -#include "apr.h" -#include "apr_file_io.h" -#include "ap_config.h" -#include "gsexec.h" - -#include -#include -#include -#include -#include -#if APR_HAVE_UNISTD_H -#include -#endif - -#include -#include -#include - -#ifdef HAVE_PWD_H -#include -#endif - -#ifdef HAVE_GRP_H -#include -#endif - -/* - *********************************************************************** - * There is no initgroups() in QNX, so I believe this is safe :-) - * Use cc -osuexec -3 -O -mf -DQNX suexec.c to compile. - * - * May 17, 1997. - * Igor N. Kovalenko -- infoh mail.wplus.net - *********************************************************************** - */ - -#if defined(NEED_INITGROUPS) -int initgroups(const char *name, gid_t basegid) -{ - /* QNX and MPE do not appear to support supplementary groups. */ - return 0; -} -#endif - -#if defined(SUNOS4) -extern char *sys_errlist[]; -#define strerror(x) sys_errlist[(x)] -#endif - -#if defined(PATH_MAX) -#define AP_MAXPATH PATH_MAX -#elif defined(MAXPATHLEN) -#define AP_MAXPATH MAXPATHLEN -#else -#define AP_MAXPATH 8192 -#endif - -#define AP_ENVBUF 256 - -extern char **environ; -static FILE *log = NULL; - -char *safe_env_lst[] = -{ - /* variable name starts with */ - "HTTP_", - "SSL_", - "GRST_", - - /* variable name is */ - "AUTH_TYPE=", - "CONTENT_LENGTH=", - "CONTENT_TYPE=", - "DATE_GMT=", - "DATE_LOCAL=", - "DOCUMENT_NAME=", - "DOCUMENT_PATH_INFO=", - "DOCUMENT_ROOT=", - "DOCUMENT_URI=", - "GATEWAY_INTERFACE=", - "HTTPS=", - "LAST_MODIFIED=", - "PATH_INFO=", - "PATH_TRANSLATED=", - "QUERY_STRING=", - "QUERY_STRING_UNESCAPED=", - "REMOTE_ADDR=", - "REMOTE_HOST=", - "REMOTE_IDENT=", - "REMOTE_PORT=", - "REMOTE_USER=", - "REDIRECT_HANDLER=", - "REDIRECT_QUERY_STRING=", - "REDIRECT_REMOTE_USER=", - "REDIRECT_STATUS=", - "REDIRECT_URL=", - "REQUEST_METHOD=", - "REQUEST_URI=", - "SCRIPT_FILENAME=", - "SCRIPT_NAME=", - "SCRIPT_URI=", - "SCRIPT_URL=", - "SERVER_ADMIN=", - "SERVER_NAME=", - "SERVER_ADDR=", - "SERVER_PORT=", - "SERVER_PROTOCOL=", - "SERVER_SIGNATURE=", - "SERVER_SOFTWARE=", - "UNIQUE_ID=", - "USER_NAME=", - "TZ=", - NULL -}; - - -static void err_output(int is_error, const char *fmt, va_list ap) -{ -#ifdef AP_LOG_EXEC - time_t timevar; - struct tm *lt; - - if (!log) { - if ((log = fopen(AP_LOG_EXEC, "a")) == NULL) { - fprintf(stderr, "suexec failure: could not open log file\n"); - perror("fopen"); - exit(1); - } - } - - if (is_error) { - fprintf(stderr, "suexec policy violation: see suexec log for more " - "details\n"); - } - - time(&timevar); - lt = localtime(&timevar); - - fprintf(log, "[%d-%.2d-%.2d %.2d:%.2d:%.2d]: ", - lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, - lt->tm_hour, lt->tm_min, lt->tm_sec); - - vfprintf(log, fmt, ap); - - fflush(log); -#endif /* AP_LOG_EXEC */ - return; -} - -static void log_err(const char *fmt,...) -{ -#ifdef AP_LOG_EXEC - va_list ap; - - va_start(ap, fmt); - err_output(1, fmt, ap); /* 1 == is_error */ - va_end(ap); -#endif /* AP_LOG_EXEC */ - return; -} - -static void log_no_err(const char *fmt,...) -{ -#ifdef AP_LOG_EXEC - va_list ap; - - va_start(ap, fmt); - err_output(0, fmt, ap); /* 0 == !is_error */ - va_end(ap); -#endif /* AP_LOG_EXEC */ - return; -} - -static void clean_env(void) -{ - char pathbuf[512]; - char **cleanenv; - char **ep; - int cidx = 0; - int idx; - - /* While cleaning the environment, the environment should be clean. - * (e.g. malloc() may get the name of a file for writing debugging info. - * Bad news if MALLOC_DEBUG_FILE is set to /etc/passwd. Sprintf() may be - * susceptible to bad locale settings....) - * (from PR 2790) - */ - char **envp = environ; - char *empty_ptr = NULL; - - environ = &empty_ptr; /* VERY safe environment */ - - if ((cleanenv = (char **) calloc(AP_ENVBUF, sizeof(char *))) == NULL) { - log_err("failed to malloc memory for environment\n"); - exit(120); - } - - sprintf(pathbuf, "PATH=%s", AP_SAFE_PATH); - cleanenv[cidx] = strdup(pathbuf); - cidx++; - - for (ep = envp; *ep && cidx < AP_ENVBUF-1; ep++) { - for (idx = 0; safe_env_lst[idx]; idx++) { - if (!strncmp(*ep, safe_env_lst[idx], - strlen(safe_env_lst[idx]))) { - cleanenv[cidx] = *ep; - cidx++; - break; - } - } - } - - cleanenv[cidx] = NULL; - - environ = cleanenv; -} - -/* Pool account functions */ - - -#include -#include -#include -#include -#include -#include -#include - -/****************************************************************************** -Function: mapdir_otherlink -Description: - find another link in map directory to the same inode as firstlink - and change the modification time of firstlink to now (so that we - always know when this pair was last used) - -Parameters: - firstlink, the filename of the link we already know - -Returns: - a pointer to the other link's filename (without path) or NULL if none - found (this is malloc'd and will need freeing) - -******************************************************************************/ -static char *mapdir_otherlink(char *mapdir, char *firstlink) -{ - int ret; - char *firstlinkpath, *otherlinkdup, *otherlinkpath; - struct dirent *mapdirentry; - DIR *mapdirstream; - struct stat statbuf; - ino_t firstinode; - - firstlinkpath = malloc(strlen(mapdir) + 2 + strlen(firstlink)); - sprintf(firstlinkpath, "%s/%s", mapdir, firstlink); - ret = stat(firstlinkpath, &statbuf); - free(firstlinkpath); - if (ret != 0) return NULL; - if (statbuf.st_nlink != 2) return NULL; - - firstinode = statbuf.st_ino; /* save for comparisons */ - - mapdirstream = opendir(mapdir); - - if (mapdirstream != NULL) - { - while ((mapdirentry = readdir(mapdirstream)) != NULL) - { - if (strcmp(mapdirentry->d_name, firstlink) == 0) continue; - - otherlinkpath = malloc(strlen(mapdir) + 2 + - strlen(mapdirentry->d_name)); - sprintf(otherlinkpath, "%s/%s", mapdir, - mapdirentry->d_name); - - ret = stat(otherlinkpath, &statbuf); - if ((ret == 0) && (statbuf.st_ino == firstinode)) - { - utime(otherlinkpath, (struct utimbuf *) NULL); - free(otherlinkpath); - otherlinkdup = strdup(mapdirentry->d_name); - closedir(mapdirstream); - return otherlinkdup; - } - else free(otherlinkpath); - } - - closedir(mapdirstream); - } - - return NULL; -} - -/****************************************************************************** -Function: mapdir_urlencode -Description: - Convert string to URL encoded and return pointer to the encoded - version, obtained through malloc. Calling routine must free - this. Here "URL encoded" means anything other than an isalnum() - goes to %HH where HH is its ascii value in hex; also A-Z => a-z - This name is suitable for filenames since no / or spaces. - -Parameters: - rawstring, the string to be converted - -Returns: - a pointer to the encoded string or NULL if the malloc failed - -******************************************************************************/ -static char *mapdir_urlencode(char *rawstring) -{ - int encodedchar = 0, rawchar = 0; - char * encodedstring; - - encodedstring = (char *) malloc(3 * strlen(rawstring) + 1); - - if (encodedstring == NULL) return (char *) NULL; - - while (rawstring[rawchar] != '\0') - { - if (isalnum(rawstring[rawchar])) - { - encodedstring[encodedchar] = tolower(rawstring[rawchar]); - ++rawchar; - ++encodedchar; - } - else - { - sprintf(&encodedstring[encodedchar], "%%%02x", - rawstring[rawchar]); - ++rawchar; - encodedchar = encodedchar + 3; - } - } - - encodedstring[encodedchar] = '\0'; - - return encodedstring; -} - -/****************************************************************************** -Function: mapdir_newlease -Description: - Search for an unleased local username to give to the X.509 DN or - directory key corresponding to encodedfilename, and then lease it. - -Parameters: - encodedfilename, URL-encoded X.509 DN or directory key to associate - with an unlease pool username - -Returns: - no return value -******************************************************************************/ - -void mapdir_newlease(char *mapdir, char *encodedkey) -{ - int ret; - char *userfilename, *encodedfilename; - struct dirent *mapdirentry; - DIR *mapdirstream; - struct stat statbuf; - - encodedfilename = malloc(strlen(mapdir) + (size_t) 2 + - strlen(encodedkey)); - sprintf(encodedfilename, "%s/%s", mapdir, encodedkey); - - mapdirstream = opendir(mapdir); - - while ((mapdirentry = readdir(mapdirstream)) != NULL) - { - /* we dont want any files that dont look like acceptable usernames */ - if ((*(mapdirentry->d_name) == '%') || - (strcmp(mapdirentry->d_name, "root") == 0)) continue; - else if (*(mapdirentry->d_name) == '.') continue; - else if (index(mapdirentry->d_name, '~') != NULL) continue; - - userfilename = malloc(strlen(mapdir) + (size_t) 2 + - strlen(mapdirentry->d_name)); - sprintf(userfilename, "%s/%s", mapdir, mapdirentry->d_name); - stat(userfilename, &statbuf); - - if (statbuf.st_nlink == 1) /* this one isnt leased yet */ - { - ret = link(userfilename, encodedfilename); - free(userfilename); - if (ret != 0) - { - /* link failed: this is probably because a VERY lucky - other process has obtained a lease for encodedfilename - while we were faffing around */ - closedir(mapdirstream); - free(encodedfilename); - return; - } - - stat(encodedfilename, &statbuf); - if (statbuf.st_nlink > 2) - { - /* two keys have grabbed the same username: back off */ - unlink(encodedfilename); - continue; - } - - closedir(mapdirstream); - free(encodedfilename); - return; /* link worked ok, so return */ - } - else free(userfilename); /* already in use, try next one */ - } - - closedir(mapdirstream); - free(encodedfilename); - return; /* no unleased names left: give up */ -} - -/****************************************************************************** -Based on gridmapdir_userid: - -Function: gridmapdir_userid -Description: - This is equivalent to globus_gss_assist_gridmap but for the dynamic - user ids in the gridmapdir: maps a globusID to a local unix user id, - either one already leased, or calls gridmapdir_newlease() to obtain - a new lease. This is called by globus_gss_assist_gridmap if the - local user id in the static gridmap file begins . (for a dynamic id) - -Parameters: - globusidp, globus client name who requested authentication - usernameprefix, prefix of the local usernames which would - be acceptable (or "\0" ) - *userid returned userid name for local system. - -Returns: - - 0 on success - !=0 on failure - -******************************************************************************/ - - - -int GRSTexecGetMapping(char **target_uname, char **target_gname, - char *mapdir, char *key) -{ - char *encodedkey; - struct passwd *pw = NULL; - - if (key[0] != '/') return 1; /* must be a proper X.509 DN or path */ - - encodedkey = mapdir_urlencode(key); - *target_uname = mapdir_otherlink(mapdir, encodedkey); - - if (*target_uname == NULL) /* maybe no lease yet */ - { - mapdir_newlease(mapdir, encodedkey); - /* try making a lease */ - - *target_uname = mapdir_otherlink(mapdir, encodedkey); - /* check if there is a now a lease - possibly made by someone else */ - - if (*target_uname == NULL) - { - free(encodedkey); - return 1; /* still no good */ - } - } - - free(encodedkey); - - /* - * Get the group name of target user. - (Contributed by Gerben Venekamp venekamp@nikhef.nl ) - */ - - if ((pw = getpwnam(*target_uname)) != NULL) - { - struct group grp = { NULL, NULL, -1, NULL }; - struct group *tst = NULL; - char tmp_buf[100]; - - /* - * NOTE: Do not use the getgrgid() function call! Calling this function - * will overwrite the contents of the internal buffer associated with - * this call. Hence, further down the execution path we will run into - * a wall, head first; simply because the guid has changed to that of - * the targer uid. The only solution out of the situation is avoiding - * the function call and manage the needed buffers ourselves. - */ - - switch (getgrgid_r(pw->pw_gid, &grp, tmp_buf, sizeof(tmp_buf), &tst)) - { - case 0: /* no error */ - *target_gname = strdup(grp.gr_name); - break; - case ERANGE: - log_err("The buffer for holding strings is too small " - "(%d byte now)\n", sizeof(tmp_buf)); - break; - default: - log_err("Could not get group name for user (%s)\n", - *target_uname); - } - - /* Test if all was well. */ - - if (target_gname == NULL) - { - exit(102); - } - } - else - { - log_err("Could not get info for the target user (%s)\n",*target_uname); - exit(102); - } - - log_no_err("target group name determined (%s -> %s)\n", - *target_uname, *target_gname); - - return 0; -} - -void internal_server_error(void) -{ - /* use this when its probably an httpd.conf configuration error */ - - puts("Status: 500 Internal Server Error\n" - "Content-Type: text/html\n\n" - "500 Internal Server Error\n" - "

Internal Server Error

"); -} - -void forbidden_error(void) -{ - /* use this when unix file permissions/ownerships are probably wrong */ - - puts("Status: 403 Forbidden\n" - "Content-Type: text/html\n\n" - "403 Forbidden\n" - "

Forbidden

"); -} - -int main(int argc, char *argv[]) -{ - int userdir = 0; /* ~userdir flag */ - uid_t uid; /* user information */ - gid_t gid; /* target group placeholder */ - uid_t httpd_uid; /* uid for AP_HTTPD_USER */ - gid_t httpd_gid; /* uid for AP_HTTPD_GROUP */ - char *mapping_type; /* suexec / X509DN / directory */ - char *grst_cred_0; /* GRST_CRED_0 */ - char *map_x509dn; /* DN to use as pool acct. key */ - char *map_directory; /* directory as pool acct. key */ - - char *diskmode_env; /* GRST_DISK_MODE as a string */ - apr_fileperms_t diskmode_apr; /* GRST_DISK_MODE as Apache perms */ - mode_t diskmode_t; /* GRST_DISK_MODE as mode_t */ - - char *target_uname; /* target user name */ - char *target_gname; /* target group name */ - char *target_homedir; /* target home directory */ - char *actual_uname; /* actual user name */ - char *actual_gname; /* actual group name */ - char *prog; /* name of this program */ - char *cmd; /* command to be executed */ - char cwd[AP_MAXPATH]; /* current working directory */ - char dwd[AP_MAXPATH]; /* docroot working directory */ - struct passwd *pw; /* password entry holder */ - struct group *gr; /* group entry holder */ - struct stat dir_info; /* directory info holder */ - struct stat prg_info; /* program info holder */ - - /* - * Start with a "clean" environment - */ - clean_env(); - - prog = argv[0]; - /* - * Check existence/validity of the UID of the user - * running this program. Error out if invalid. - */ - uid = getuid(); - if ((pw = getpwuid(uid)) == NULL) { - log_err("crit: invalid uid: (%ld)\n", uid); - internal_server_error(); - exit(102); - } - /* - * Check existence/validity of the GID of the user - * running this program. Error out if invalid. - */ - gid = getgid(); - if ((gr = getgrgid(gid)) == NULL) { - log_err("crit: invalid gid: (%ld)\n", gid); - internal_server_error(); - exit(102); - } - /* - * See if this is a 'how were you compiled' request, and - * comply if so. - */ - if ((argc > 1) - && (! strcmp(argv[1], "-V")) - && ((uid == 0) -#ifdef _OSD_POSIX - /* User name comparisons are case insensitive on BS2000/OSD */ - || (! strcasecmp(AP_HTTPD_USER, pw->pw_name))) -#else /* _OSD_POSIX */ - || (! strcmp(AP_HTTPD_USER, pw->pw_name))) -#endif /* _OSD_POSIX */ - ) { -#ifdef AP_DOC_ROOT - fprintf(stderr, " -D AP_DOC_ROOT=\"%s\"\n", AP_DOC_ROOT); -#endif -#ifdef AP_GID_MIN - fprintf(stderr, " -D AP_GID_MIN=%d\n", AP_GID_MIN); -#endif -#ifdef AP_HTTPD_USER - fprintf(stderr, " -D AP_HTTPD_USER=\"%s\"\n", AP_HTTPD_USER); -#endif -#ifdef AP_LOG_EXEC - fprintf(stderr, " -D AP_LOG_EXEC=\"%s\"\n", AP_LOG_EXEC); -#endif -#ifdef AP_SAFE_PATH - fprintf(stderr, " -D AP_SAFE_PATH=\"%s\"\n", AP_SAFE_PATH); -#endif -#ifdef AP_SUEXEC_UMASK - fprintf(stderr, " -D AP_SUEXEC_UMASK=%03o\n", AP_SUEXEC_UMASK); -#endif -#ifdef AP_UID_MIN - fprintf(stderr, " -D AP_UID_MIN=%d\n", AP_UID_MIN); -#endif -#ifdef AP_USERDIR_SUFFIX - fprintf(stderr, " -D AP_USERDIR_SUFFIX=\"%s\"\n", AP_USERDIR_SUFFIX); -#endif - exit(0); - } - /* - * If there are a proper number of arguments, set - * all of them to variables. Otherwise, error out. - */ - if (argc < 4) { - log_err("too few arguments\n"); - internal_server_error(); - exit(101); - } - - mapping_type = getenv("GRST_EXEC_METHOD"); - if ((mapping_type == NULL) || - (mapping_type[0] == '\0') || - (strcasecmp(mapping_type, "suexec") == 0)) - { - target_uname = argv[1]; - target_gname = argv[2]; - mapping_type = NULL; - } - else if (strcasecmp(mapping_type, "X509DN") == 0) - { - if ((grst_cred_0 = getenv("GRST_CRED_0")) == NULL) - map_x509dn = getenv("SSL_CLIENT_S_DN"); - else map_x509dn = index(grst_cred_0, '/'); - - if ((map_x509dn == NULL) || (map_x509dn[0] == '\0')) - { - log_err("No GRST_CRED_0/SSL_CLIENT_S_DN despite X509DN mapping\n"); - forbidden_error(); - exit(151); - } - - if (GRSTexecGetMapping(&target_uname, &target_gname, - GRST_EXECMAPDIR, map_x509dn) - != 0) - { - log_err("GRSTexecGetMapping() failed mapping \"%s\"\n", - map_x509dn); - forbidden_error(); - exit(152); - } - } - else if (strcasecmp(mapping_type, "directory") == 0) - { - map_directory = getenv("GRST_EXEC_DIRECTORY"); - if (map_directory == NULL) - { - log_err("No GRST_EXEC_DIRECTORY despite directory mapping\n"); - internal_server_error(); - exit(153); - } - - if (GRSTexecGetMapping(&target_uname, &target_gname, - GRST_EXECMAPDIR, map_directory) - != 0) - { - log_err("GRSTexecGetMapping() failed mapping \"%s\"\n", - map_directory); - internal_server_error(); - exit(154); - } - } - else - { - log_err("mapping type \"%s\" not recognised\n", mapping_type); - internal_server_error(); - exit(155); - } - - cmd = argv[3]; - - /* - * Check to see if the user running this program - * is the user allowed to do so as defined in - * suexec.h. If not the allowed user, error out. - */ -#ifdef _OSD_POSIX - /* User name comparisons are case insensitive on BS2000/OSD */ - if (strcasecmp(AP_HTTPD_USER, pw->pw_name)) { - log_err("user mismatch (%s instead of %s)\n", pw->pw_name, AP_HTTPD_USER); - internal_server_error(); - exit(103); - } - /* User name comparisons are case insensitive on BS2000/OSD */ - if (strcasecmp(AP_HTTPD_GROUP, gr->gr_name)) { - log_err("group mismatch (%s instead of %s)\n", gr->gr_name, AP_HTTPD_GROUP); - internal_server_error(); - exit(103); - } -#else /*_OSD_POSIX*/ - if (strcmp(AP_HTTPD_USER, pw->pw_name)) { - log_err("user mismatch (%s instead of %s)\n", pw->pw_name, AP_HTTPD_USER); - internal_server_error(); - exit(103); - } - if (strcmp(AP_HTTPD_GROUP, gr->gr_name)) { - log_err("group mismatch (%s instead of %s)\n", gr->gr_name, AP_HTTPD_GROUP); - internal_server_error(); - exit(103); - } -#endif /*_OSD_POSIX*/ - - /* Since they match (via name) save these for later */ - - httpd_uid = uid; - httpd_gid = gid; - - /* - * Check for a leading '/' (absolute path) in the command to be executed, - * or attempts to back up out of the current directory, - * to protect against attacks. If any are - * found, error out. Naughty naughty crackers. - */ - if ((cmd[0] == '/') || (!strncmp(cmd, "../", 3)) - || (strstr(cmd, "/../") != NULL)) { - log_err("invalid command (%s)\n", cmd); - internal_server_error(); - exit(104); - } - - /* - * Check to see if this is a ~userdir request. If - * so, set the flag, and remove the '~' from the - * target username. - */ - if (!strncmp("~", target_uname, 1)) { - target_uname++; - userdir = 1; - } - - /* - * Error out if the target username is invalid. - */ - if (strspn(target_uname, "1234567890") != strlen(target_uname)) { - if ((pw = getpwnam(target_uname)) == NULL) { - log_err("invalid target user name: (%s)\n", target_uname); - internal_server_error(); - exit(105); - } - } - else { - if ((pw = getpwuid(atoi(target_uname))) == NULL) { - log_err("invalid target user id: (%s)\n", target_uname); - internal_server_error(); - exit(121); - } - } - - /* - * Error out if the target group name is invalid. - */ - if (strspn(target_gname, "1234567890") != strlen(target_gname)) { - if ((gr = getgrnam(target_gname)) == NULL) { - log_err("invalid target group name: (%s)\n", target_gname); - internal_server_error(); - exit(106); - } - gid = gr->gr_gid; - actual_gname = strdup(gr->gr_name); - } - else { - gid = atoi(target_gname); - actual_gname = strdup(target_gname); - } - -#ifdef _OSD_POSIX - /* - * Initialize BS2000 user environment - */ - { - pid_t pid; - int status; - - switch (pid = ufork(target_uname)) { - case -1: /* Error */ - log_err("failed to setup bs2000 environment for user %s: %s\n", - target_uname, strerror(errno)); - internal_server_error(); - exit(150); - case 0: /* Child */ - break; - default: /* Father */ - while (pid != waitpid(pid, &status, 0)) - ; - /* @@@ FIXME: should we deal with STOP signals as well? */ - if (WIFSIGNALED(status)) { - kill (getpid(), WTERMSIG(status)); - } - internal_server_error(); - exit(WEXITSTATUS(status)); - } - } -#endif /*_OSD_POSIX*/ - - /* - * Save these for later since initgroups will hose the struct - */ - uid = pw->pw_uid; - actual_uname = strdup(pw->pw_name); - target_homedir = strdup(pw->pw_dir); - - /* - * Log the transaction here to be sure we have an open log - * before we setuid(). - */ - log_no_err("uid: (%s/%s) gid: (%s/%s) cmd: %s\n", - target_uname, actual_uname, - target_gname, actual_gname, - cmd); - - /* - * Error out if attempt is made to execute as root or as - * a UID less than AP_UID_MIN. Tsk tsk. - */ - if ((uid == 0) || (uid < AP_UID_MIN)) { - log_err("cannot run as forbidden uid (%d/%s)\n", uid, cmd); - internal_server_error(); - exit(107); - } - - /* - * Error out if attempt is made to execute as root group - * or as a GID less than AP_GID_MIN. Tsk tsk. - */ - if ((gid == 0) || (gid < AP_GID_MIN)) { - log_err("cannot run as forbidden gid (%d/%s)\n", gid, cmd); - internal_server_error(); - exit(108); - } - - /* - * Change UID/GID here so that the following tests work over NFS. - * - * Initialize the group access list for the target user, - * and setgid() to the target group. If unsuccessful, error out. - */ - if (((setgid(gid)) != 0) || (initgroups(actual_uname, gid) != 0)) { - log_err("failed to setgid (%ld: %s)\n", gid, cmd); - internal_server_error(); - exit(109); - } - - /* - * setuid() to the target user. Error out on fail. - */ - if ((setuid(uid)) != 0) { - log_err("failed to setuid (%ld: %s)\n", uid, cmd); - internal_server_error(); - exit(110); - } - - /* - * Get the current working directory, as well as the proper - * document root (dependant upon whether or not it is a - * ~userdir request). Error out if we cannot get either one, - * or if the current working directory is not in the docroot. - * Use chdir()s and getcwd()s to avoid problems with symlinked - * directories. Yuck. - */ - if (getcwd(cwd, AP_MAXPATH) == NULL) { - log_err("cannot get current working directory\n"); - internal_server_error(); - exit(111); - } - -#if 0 - if (userdir) { - if (((chdir(target_homedir)) != 0) || - ((chdir(AP_USERDIR_SUFFIX)) != 0) || - ((getcwd(dwd, AP_MAXPATH)) == NULL) || - ((chdir(cwd)) != 0)) { - log_err("cannot get docroot information (%s)\n", target_homedir); - internal_server_error(); - exit(112); - } - } - else { - if (((chdir(AP_DOC_ROOT)) != 0) || - ((getcwd(dwd, AP_MAXPATH)) == NULL) || - ((chdir(cwd)) != 0)) { - log_err("cannot get docroot information (%s)\n", AP_DOC_ROOT); - internal_server_error(); - exit(113); - } - } - - if ((strncmp(cwd, dwd, strlen(dwd))) != 0) { - log_err("command not in docroot (%s/%s)\n", cwd, cmd); - internal_server_error(); - exit(114); - } -#endif - - /* - * Stat the cwd and verify it is a directory, or error out. - */ - if (((lstat(cwd, &dir_info)) != 0) || !(S_ISDIR(dir_info.st_mode))) { - log_err("cannot stat directory: (%s)\n", cwd); - internal_server_error(); - exit(115); - } - - /* - * Error out if cwd is writable by others. - */ - if ((dir_info.st_mode & S_IWOTH) || (dir_info.st_mode & S_IWGRP)) { - log_err("directory is writable by others: (%s)\n", cwd); - forbidden_error(); - exit(116); - } - - /* - * Error out if we cannot stat the program. - */ - if (((lstat(cmd, &prg_info)) != 0) || (S_ISLNK(prg_info.st_mode))) { - log_err("cannot stat program: (%s)\n", cmd); - forbidden_error(); - exit(117); - } - - /* - * Error out if the program is writable by others. - */ - if (prg_info.st_mode & S_IWOTH) { - log_err("file is writable by others: (%s/%s)\n", cwd, cmd); - forbidden_error(); - exit(118); - } - - /* - * Error out if the file is setuid or setgid. - */ - if ((prg_info.st_mode & S_ISUID) || (prg_info.st_mode & S_ISGID)) { - log_err("file is either setuid or setgid: (%s/%s)\n", cwd, cmd); - forbidden_error(); - exit(119); - } - - /* - * Error out if the target name/group is different from - * the name/group of the cwd or the program AND the name/group - * of the cwd and program are not the AP_HTTPD_USER/AP_HTTPD_GROUP - * AND the name/group of the cwd and program are not root - */ - if (((uid != dir_info.st_uid) && (httpd_uid != dir_info.st_uid) - && (0 != dir_info.st_uid)) || - ((gid != dir_info.st_gid) && (httpd_gid != dir_info.st_gid) - && (0 != dir_info.st_gid)) || - ((uid != prg_info.st_uid) && (httpd_uid != prg_info.st_uid) - && (0 != prg_info.st_uid)) || - ((gid != prg_info.st_gid) && (httpd_gid != prg_info.st_gid) - && (0 != prg_info.st_gid))) - { - log_err("target (%ld/%ld) or %s (%ld/%ld) or root (0/0) uid/gid " - "mismatch with directory (%ld/%ld) or program (%ld/%ld)\n", - uid, gid, AP_HTTPD_USER, httpd_uid, httpd_gid, - dir_info.st_uid, dir_info.st_gid, - prg_info.st_uid, prg_info.st_gid); - forbidden_error(); - exit(120); - } - /* - * Error out if the program is not executable for the user. - * Otherwise, she won't find any error in the logs except for - * "[error] Premature end of script headers: ..." - */ - if (!(prg_info.st_mode & S_IXUSR)) { - log_err("file has no execute permission: (%s/%s)\n", cwd, cmd); - forbidden_error(); - exit(121); - } - - diskmode_env = getenv("GRST_DISK_MODE"); - if (diskmode_env != NULL) - { - diskmode_apr = 0; - sscanf(diskmode_env, "%i", &diskmode_apr); - - diskmode_t = S_IRUSR | S_IWUSR; - - if (diskmode_apr & APR_GREAD ) diskmode_t |= S_IRGRP; - if (diskmode_apr & APR_GWRITE) diskmode_t |= S_IWGRP; - if (diskmode_apr & APR_WREAD ) diskmode_t |= S_IROTH; - - diskmode_t &= (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); - -// log_err("diskmode_env=%s diskmode_apr=%x diskmode_t=%o ~diskmode_t=%o\n", diskmode_env, diskmode_apr, diskmode_t, ~diskmode_t); - - umask(~diskmode_t); - } -#ifdef AP_SUEXEC_UMASK - else umask(AP_SUEXEC_UMASK); -#else - else umask(~(S_IRUSR | S_IWUSR)); -#endif /* AP_SUEXEC_UMASK */ - - /* - * Be sure to close the log file so the CGI can't - * mess with it. If the exec fails, it will be reopened - * automatically when log_err is called. Note that the log - * might not actually be open if AP_LOG_EXEC isn't defined. - * However, the "log" cell isn't ifdef'd so let's be defensive - * and assume someone might have done something with it - * outside an ifdef'd AP_LOG_EXEC block. - */ - if (log != NULL) { - fclose(log); - log = NULL; - } - - /* - * Execute the command, replacing our image with its own. - */ -#ifdef NEED_HASHBANG_EMUL - /* We need the #! emulation when we want to execute scripts */ - { - extern char **environ; - - ap_execve(cmd, &argv[3], environ); - } -#else /*NEED_HASHBANG_EMUL*/ - execv(cmd, &argv[3]); -#endif /*NEED_HASHBANG_EMUL*/ - - /* - * (I can't help myself...sorry.) - * - * Uh oh. Still here. Where's the kaboom? There was supposed to be an - * EARTH-shattering kaboom! - * - * Oh well, log the failure and error out. - */ - log_err("(%d)%s: exec failed (%s)\n", errno, strerror(errno), cmd); - internal_server_error(); - exit(255); -} diff --git a/org.gridsite.core/src/gsexec.h b/org.gridsite.core/src/gsexec.h deleted file mode 100644 index b777421..0000000 --- a/org.gridsite.core/src/gsexec.h +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright 1999-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * suexec.h -- user-definable variables for the suexec wrapper code. - * (See README.configure on how to customize these variables.) - */ - - -#ifndef _SUEXEC_H -#define _SUEXEC_H - -/* - * Include ap_config_layout so we can work out where the default htdocsdir - * and logsdir are. - */ -#include "ap_config_layout.h" - -/* - * HTTPD_USER -- Define as the username under which Apache normally - * runs. This is the only user allowed to execute - * this program. - */ -#ifndef AP_HTTPD_USER -#define AP_HTTPD_USER "apache" -#endif - -/* - * HTTPD_GROUP -- Define as the group under which Apache normally - * runs. This is the only user allowed to execute - * this program. - */ -#ifndef AP_HTTPD_GROUP -#define AP_HTTPD_GROUP "apache" -#endif - -/* - * UID_MIN -- Define this as the lowest UID allowed to be a target user - * for suEXEC. For most systems, 500 or 100 is common, but - * 99 will include user nobody on RedHat Linux systems. - */ -#ifdef AP_UID_MIN -#undef AP_UID_MIN -#endif -#define AP_UID_MIN 99 - -/* - * GID_MIN -- Define this as the lowest GID allowed to be a target group - * for suEXEC. For most systems, 100 is common, but 99 will - * include group nobody on RedHat Linux systems. - */ -#ifdef AP_GID_MIN -#undef AP_GID_MIN -#endif -#define AP_GID_MIN 99 - -/* - * USERDIR_SUFFIX -- Define to be the subdirectory under users' - * home directories where suEXEC access should - * be allowed. All executables under this directory - * will be executable by suEXEC as the user so - * they should be "safe" programs. If you are - * using a "simple" UserDir directive (ie. one - * without a "*" in it) this should be set to - * the same value. suEXEC will not work properly - * in cases where the UserDir directive points to - * a location that is not the same as the user's - * home directory as referenced in the passwd file. - * - * If you have VirtualHosts with a different - * UserDir for each, you will need to define them to - * all reside in one parent directory; then name that - * parent directory here. IF THIS IS NOT DEFINED - * PROPERLY, ~USERDIR CGI REQUESTS WILL NOT WORK! - * See the suEXEC documentation for more detailed - * information. - */ -#ifndef AP_USERDIR_SUFFIX -#define AP_USERDIR_SUFFIX "public_html" -#endif - -/* - * LOG_EXEC -- Define this as a filename if you want all suEXEC - * transactions and errors logged for auditing and - * debugging purposes. - */ -#ifndef AP_LOG_EXEC -#define AP_LOG_EXEC DEFAULT_EXP_LOGFILEDIR "/suexec_log" /* Need me? */ -#endif - -/* - * DOC_ROOT -- Define as the DocumentRoot set for Apache. This - * will be the only hierarchy (aside from UserDirs) - * that can be used for suEXEC behavior. - */ -#ifndef AP_DOC_ROOT -#define AP_DOC_ROOT DEFAULT_EXP_HTDOCSDIR -#endif - -/* - * SAFE_PATH -- Define a safe PATH environment to pass to CGI executables. - * - */ -#ifndef AP_SAFE_PATH -#define AP_SAFE_PATH "/usr/local/bin:/usr/bin:/bin" -#endif - -/* - * GRST_EXECMAPDIR -- Location of the gridmapdir-style directory of lock files - * - */ -#define GRST_EXECMAPDIR "/var/www/execmapdir" - -#endif /* _SUEXEC_H */ diff --git a/org.gridsite.core/src/htcp.c b/org.gridsite.core/src/htcp.c deleted file mode 100644 index b682d17..0000000 --- a/org.gridsite.core/src/htcp.c +++ /dev/null @@ -1,2032 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/*---------------------------------------------------------------* - * For more about GridSite: http://www.gridsite.org/ * - *---------------------------------------------------------------*/ - -#ifndef VERSION -#define VERSION "0.0.0" -#endif - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gridsite.h" - -/* deal with older versions of libcurl and curl.h */ - -#ifndef CURLOPT_WRITEDATA -#define CURLOPT_WRITEDATA CURLOPT_FILE -#endif - -#ifndef CURLOPT_READDATA -#define CURLOPT_READDATA CURLOPT_FILE -#endif - -#ifndef CURLE_HTTP_RETURNED_ERROR -#define CURLE_HTTP_RETURNED_ERROR CURLE_HTTP_NOT_FOUND -#endif - -#define HTCP_GET 1 -#define HTCP_PUT 2 -#define HTCP_DELETE 3 -#define HTCP_LIST 4 -#define HTCP_LONGLIST 5 -#define HTCP_MKDIR 6 -#define HTCP_MOVE 7 -#define HTCP_PING 8 -#define HTCP_FIND 9 -#define HTCP_RMTCP 10 - -#define HTCP_SITECAST_GROUPS 32 - -#define HTCP_HOST_CONF "/etc/htcp.conf" -#define HTCP_USER_CONF ".htcp.conf" - -struct grst_stream_data { char *source; - char *destination; - int ishttps; - int method; - FILE *fp; - char *cert; - char *key; - char *capath; - char *useragent; - char *errorbuf; - int noverify; - int anonymous; - int gridhttp; - int verbose; - int timeout; - char *groups; - int sitecast; - char *domain; } ; - -struct grst_index_blob { char *text; - size_t used; - size_t allocated; } ; - -struct grst_dir_list { char *filename; - size_t length; - int length_set; - time_t modified; - int modified_set; } ; - -struct grst_header_data { int retcode; - char *location; - char *gridhttppasscode; - size_t length; - int length_set; - time_t modified; - int modified_set; - struct grst_stream_data *common_data; } ; - -struct grst_sitecast_group { unsigned char quad1; unsigned char quad2; - unsigned char quad3; unsigned char quad4; - int port; int timewait; int ttl; }; - -size_t headers_callback(void *ptr, size_t size, size_t nmemb, void *p) -/* Find the values of the return code, Content-Length, Last-Modified - and Location headers */ -{ - float f; - char *s, *q; - size_t realsize; - struct tm modified_tm; - struct grst_header_data *header_data; - - header_data = (struct grst_header_data *) p; - realsize = size * nmemb; - s = malloc(realsize + 1); - memcpy(s, ptr, realsize); - s[realsize] = '\0'; - - if (sscanf(s, "Content-Length: %d", &(header_data->length)) == 1) - header_data->length_set = 1; - else if (sscanf(s, "HTTP/%f %d ", &f, &(header_data->retcode)) == 2) ; - else if (strncmp(s, "Location: ", 10) == 0) - { - header_data->location = strdup(&s[10]); - - for (q=header_data->location; *q != '\0'; ++q) - if ((*q == '\r') || (*q == '\n')) *q = '\0'; - - if (header_data->common_data->verbose > 0) - fprintf(stderr, "Received Location: %s\n", header_data->location); - } - else if (strncmp(s, "Set-Cookie: GRIDHTTP_PASSCODE=", 29) == 0) - { - header_data->gridhttppasscode = strdup(&s[12]); - q = index(header_data->gridhttppasscode, ';'); - if (q != NULL) *q = '\0'; - - if (header_data->common_data->verbose > 0) - fprintf(stderr, "Received GridHTTP Auth Cookie: %s\n", - header_data->gridhttppasscode); - } - else if (strncmp(s, "Last-Modified: ", 15) == 0) - { - /* follow RFC 2616: first try RFC 822 (kosher), then RFC 850 and - asctime() formats too. Must be GMT whatever the format. */ - - if (strptime(&s[15], "%a, %d %b %Y %T GMT", &modified_tm) != NULL) - { - header_data->modified = mktime(&modified_tm); - header_data->modified_set = 1; - } - else if (strptime(&s[15], "%a, %d-%b-%y %T GMT", &modified_tm) != NULL) - { - header_data->modified = mktime(&modified_tm); - header_data->modified_set = 1; - } - else if (strptime(&s[15], "%a %b %d %T %Y", &modified_tm) != NULL) - { - header_data->modified = mktime(&modified_tm); - header_data->modified_set = 1; - } - } - - free(s); - return realsize; -} - -int set_std_opts(CURL *easyhandle, struct grst_stream_data *common_data) -{ - struct stat statbuf; - - curl_easy_setopt(easyhandle, CURLOPT_FOLLOWLOCATION, 0); - - if ((common_data->cert != NULL) && (common_data->key != NULL)) - { - curl_easy_setopt(easyhandle, CURLOPT_SSLENGINE, NULL); - curl_easy_setopt(easyhandle, CURLOPT_SSLCERTTYPE, "PEM"); - curl_easy_setopt(easyhandle, CURLOPT_SSLCERT, common_data->cert); - curl_easy_setopt(easyhandle, CURLOPT_SSLKEY, common_data->key); - } - else - { - curl_easy_setopt(easyhandle, CURLOPT_SSLENGINE, "RSA"); - curl_easy_setopt(easyhandle, CURLOPT_SSLCERTTYPE, "ENG"); - } - - if (common_data->capath != NULL) - { -#if (LIBCURL_VERSION_NUM >= 0x070908) - if ((stat(common_data->capath, &statbuf) == 0) && - S_ISDIR(statbuf.st_mode)) - curl_easy_setopt(easyhandle, CURLOPT_CAPATH, common_data->capath); - else -#endif - curl_easy_setopt(easyhandle, CURLOPT_CAINFO, common_data->capath); - } - - if (common_data->noverify) - { - curl_easy_setopt(easyhandle, CURLOPT_SSL_VERIFYPEER, 0); - curl_easy_setopt(easyhandle, CURLOPT_SSL_VERIFYHOST, 0); - } - else - { - curl_easy_setopt(easyhandle, CURLOPT_SSL_VERIFYPEER, 2); - curl_easy_setopt(easyhandle, CURLOPT_SSL_VERIFYHOST, 2); - } - - return 1; -} - -int do_rmtcp(char *sources[], char *destination, - struct grst_stream_data *common_data) -{ - CURL *easyhandle; - char *p, *thisdestination; - int isrc, anyerror = 0, thiserror, isdirdest; - struct grst_header_data header_data; - struct curl_slist *gh_header_slist=NULL, *nogh_header_slist=NULL; - char remoteserver[255]; - - easyhandle = curl_easy_init(); - if( !easyhandle ) - { - fprintf(stderr, "Cannot initialize CURL handle while preparing to copy file.\n"); - exit(-1); - } - - common_data->gridhttp = 1; // for debug purpose - if (common_data->gridhttp) - { - asprintf(&p, "Upgrade: GridHTTP/1.0"); - gh_header_slist = curl_slist_append(gh_header_slist, p); - free(p); - - nogh_header_slist = curl_slist_append(nogh_header_slist, "Upgrade:"); - } - - // common_data->verbose = 1; //for debug purpose - curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent); - if (common_data->verbose > 1) - curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1); - - curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, headers_callback); - curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, &header_data); - - set_std_opts(easyhandle, common_data); - - curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf); - - if (destination[strlen(destination) - 1] != '/') - { - isdirdest = 0; - thisdestination = destination; - } - else isdirdest = 1; - - for (isrc=0; sources[isrc] != NULL; ++isrc) - { - if (isdirdest) - { - p = rindex(sources[isrc], '/'); - if (p == NULL) p = sources[isrc]; - else p++; - - asprintf(&thisdestination, "%s%s", destination, p); - } - - if( strncmp(sources[isrc], "https://", 8) == 0 ){ - if (common_data->verbose > 0) - fprintf(stderr, "%s -> %s\n", sources[isrc], thisdestination); - - curl_easy_setopt(easyhandle, CURLOPT_URL, sources[isrc]); - - if ((common_data->gridhttp) && - (strncmp(sources[isrc], "https://", 8) == 0)) - { - if (common_data->verbose > 0) - fprintf(stderr, "Add Upgrade: GridHTTP/1.0\n"); - curl_easy_setopt(easyhandle,CURLOPT_HTTPHEADER,gh_header_slist); - } - else - curl_easy_setopt(easyhandle,CURLOPT_HTTPHEADER,nogh_header_slist); - - header_data.retcode = 0; - header_data.location = NULL; - header_data.gridhttppasscode = NULL; - header_data.common_data = common_data; - thiserror = curl_easy_perform(easyhandle); - - } - - asprintf(&p, "Destination: %s", thisdestination); - nogh_header_slist=NULL; - nogh_header_slist = curl_slist_append(nogh_header_slist,p); - // fprintf(stdout, "complete destination file: %s\n", p); - free(p); - - // send request to destination server, - // to ask it to download file from source server - strcpy( remoteserver, destination); - while( (p=strrchr(remoteserver, '/')) !=NULL) - { - if( *(p-1) == '/' )break; - else *p = '\0'; - } - - common_data->source = sources[isrc]; - common_data->destination = remoteserver; - set_std_opts(easyhandle, common_data); - // send copy request to copy server (destination) - asprintf(&p, "COPY %s", sources[isrc]); - curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, p);//"COPY");//gh_header_slist); - curl_easy_setopt(easyhandle, CURLOPT_URL, remoteserver); - curl_easy_setopt(easyhandle, CURLOPT_COOKIE, header_data.gridhttppasscode); - - curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent); - curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, nogh_header_slist); - - curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf); - thiserror = curl_easy_perform(easyhandle); - free(p); - } - - curl_easy_cleanup(easyhandle); - - return anyerror; - -} - -int do_copies(char *sources[], char *destination, - struct grst_stream_data *common_data) -{ - char *p, *thisdestination; - int isrc, anyerror = 0, thiserror, isdirdest; - CURL *easyhandle; - struct stat statbuf; - struct grst_header_data header_data; - struct curl_slist *gh_header_slist = NULL, *nogh_header_slist = NULL; - - easyhandle = curl_easy_init(); - - if (common_data->gridhttp) - { - asprintf(&p, "Upgrade: GridHTTP/1.0"); - gh_header_slist = curl_slist_append(gh_header_slist, p); - free(p); - - nogh_header_slist = curl_slist_append(nogh_header_slist, "Upgrade:"); - } - - curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent); - if (common_data->verbose > 1) - curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1); - - curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, headers_callback); - curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, &header_data); - - set_std_opts(easyhandle, common_data); - - curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf); - - if (destination[strlen(destination) - 1] != '/') - { - isdirdest = 0; - thisdestination = destination; - } - else isdirdest = 1; - - for (isrc=0; sources[isrc] != NULL; ++isrc) - { - if (isdirdest) - { - p = rindex(sources[isrc], '/'); - if (p == NULL) p = sources[isrc]; - else p++; - - asprintf(&thisdestination, "%s%s", destination, p); - } - - if (common_data->verbose > 0) - fprintf(stderr, "Copy %s -> %s\n", sources[isrc], thisdestination); - - if (common_data->method == HTCP_GET) - { - common_data->fp = fopen(thisdestination, "w"); - if (common_data->fp == NULL) - { - fprintf(stderr,"... failed to open destination source file %s\n", - thisdestination); - anyerror = 99; - if (isdirdest) free(thisdestination); - continue; - } - - curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, common_data->fp); - curl_easy_setopt(easyhandle, CURLOPT_URL, sources[isrc]); - - if ((common_data->gridhttp) && - (strncmp(sources[isrc], "https://", 8) == 0)) - { - if (common_data->verbose > 0) - fprintf(stderr, "Add Upgrade: GridHTTP/1.0\n"); - - curl_easy_setopt(easyhandle,CURLOPT_HTTPHEADER,gh_header_slist); - } - else - curl_easy_setopt(easyhandle,CURLOPT_HTTPHEADER,nogh_header_slist); - } - else if (common_data->method == HTCP_PUT) - { - if (stat(sources[isrc], &statbuf) != 0) - { - fprintf(stderr, "... source file %s not found\n", sources[isrc]); - anyerror = 99; - if (isdirdest) free(thisdestination); - continue; - } - - common_data->fp = fopen(sources[isrc], "r"); - if (common_data->fp == NULL) - { - fprintf(stderr, "... failed to open source file %s\n", - sources[isrc]); - anyerror = 99; - if (isdirdest) free(thisdestination); - continue; - } - - curl_easy_setopt(easyhandle, CURLOPT_READDATA, common_data->fp); - curl_easy_setopt(easyhandle, CURLOPT_URL, thisdestination); - curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE, statbuf.st_size); - curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, 1); - - if ((common_data->gridhttp) && - (strncmp(thisdestination, "https://", 8) == 0)) - curl_easy_setopt(easyhandle,CURLOPT_HTTPHEADER,gh_header_slist); - else - curl_easy_setopt(easyhandle,CURLOPT_HTTPHEADER,nogh_header_slist); - } - - header_data.retcode = 0; - header_data.location = NULL; - header_data.gridhttppasscode = NULL; - header_data.common_data = common_data; - thiserror = curl_easy_perform(easyhandle); - - fclose(common_data->fp); - - if ((common_data->gridhttp) && - (thiserror == 0) && - (header_data.retcode == 302) && - (header_data.location != NULL) && - (strncmp(header_data.location, "http://", 7) == 0) && - (header_data.gridhttppasscode != NULL)) - { - if (common_data->verbose > 0) - fprintf(stderr, "... Found (%d)\nGridHTTP redirect to %s\n", - header_data.retcode, header_data.location); - - /* try again with new URL and all the previous CURL options */ - - if (common_data->method == HTCP_GET) - { - common_data->fp = fopen(thisdestination, "w"); - if (common_data->fp == NULL) - { - fprintf(stderr, "... failed to open destination source " - "file %s\n", thisdestination); - anyerror = 99; - if (isdirdest) free(thisdestination); - continue; - } - } - else if (common_data->method == HTCP_PUT) - { - common_data->fp = fopen(sources[isrc], "r"); - if (common_data->fp == NULL) - { - fprintf(stderr, "... failed to open source file %s\n", - sources[isrc]); - anyerror = 99; - if (isdirdest) free(thisdestination); - continue; - } - } - - header_data.retcode = 0; - curl_easy_setopt(easyhandle, CURLOPT_URL, header_data.location); - curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, nogh_header_slist); - curl_easy_setopt(easyhandle, CURLOPT_COOKIE, - header_data.gridhttppasscode); - thiserror = curl_easy_perform(easyhandle); - - fclose(common_data->fp); - } - - if ((thiserror != 0) || - (header_data.retcode >= 300)) - { - fprintf(stderr, "... curl error: %s (%d), HTTP error: %d\n", - common_data->errorbuf, thiserror, header_data.retcode); - - if (thiserror != 0) anyerror = thiserror; - else anyerror = header_data.retcode; - } - else if (common_data->verbose > 0) - fprintf(stderr, "... OK (%d)\n", header_data.retcode); - - if (isdirdest) free(thisdestination); - } - - curl_easy_cleanup(easyhandle); - - return anyerror; -} - -int do_deletes(char *sources[], struct grst_stream_data *common_data) -{ - int isrc, anyerror = 0, thiserror; - CURL *easyhandle; - struct grst_header_data header_data; - - header_data.common_data = common_data; - - easyhandle = curl_easy_init(); - - curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent); - if (common_data->verbose > 1) - curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1); - - curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, headers_callback); - curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, &header_data); - - curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf); - curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "DELETE"); - curl_easy_setopt(easyhandle, CURLOPT_NOBODY, 1); - - set_std_opts(easyhandle, common_data); - - for (isrc=0; sources[isrc] != NULL; ++isrc) - { - if (common_data->verbose > 0) - fprintf(stderr, "Deleting %s\n", sources[isrc]); - - curl_easy_setopt(easyhandle, CURLOPT_URL, sources[isrc]); - - header_data.retcode = 0; - thiserror = curl_easy_perform(easyhandle); - - if ((thiserror != 0) || - (header_data.retcode >= 300)) - { - fprintf(stderr, "... curl error: %s (%d), HTTP error: %d\n", - common_data->errorbuf, thiserror, header_data.retcode); - - if (thiserror != 0) anyerror = thiserror; - else anyerror = header_data.retcode; - } - else if (common_data->verbose > 0) - fprintf(stderr, "... OK (%d)\n", header_data.retcode); - } - - curl_easy_cleanup(easyhandle); - - return anyerror; -} - -int do_move(char *source, char *destination, - struct grst_stream_data *common_data) -{ - int anyerror = 0, thiserror; - char *destination_header; - CURL *easyhandle; - struct grst_header_data header_data; - struct curl_slist *header_slist = NULL; - - easyhandle = curl_easy_init(); - - header_data.common_data = common_data; - - easyhandle = curl_easy_init(); - - asprintf(&destination_header, "Destination: %s", destination); - header_slist = curl_slist_append(header_slist, destination_header); - curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, header_slist); - - curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent); - if (common_data->verbose > 1) - curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1); - - curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, headers_callback); - curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, &header_data); - - curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf); - curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MOVE"); - curl_easy_setopt(easyhandle, CURLOPT_NOBODY, 1); - - set_std_opts(easyhandle, common_data); - - if (common_data->verbose > 0) - fprintf(stderr, "Moving %s to %s\n", source, destination); - - curl_easy_setopt(easyhandle, CURLOPT_URL, source); - - header_data.retcode = 0; - thiserror = curl_easy_perform(easyhandle); - - if ((thiserror != 0) || - (header_data.retcode >= 300)) - { - fprintf(stderr, "... curl error: %s (%d), HTTP error: %d\n", - common_data->errorbuf, thiserror, header_data.retcode); - - if (thiserror != 0) anyerror = thiserror; - else anyerror = header_data.retcode; - } - else if (common_data->verbose > 0) - fprintf(stderr, "... OK (%d)\n", header_data.retcode); - - curl_easy_cleanup(easyhandle); - - return anyerror; -} - -int do_mkdirs(char *sources[], struct grst_stream_data *common_data) -{ - int isrc, anyerror = 0, thiserror; - CURL *easyhandle; - struct grst_header_data header_data; - - header_data.common_data = common_data; - - easyhandle = curl_easy_init(); - - curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent); - if (common_data->verbose > 1) - curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1); - - curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, headers_callback); - curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, &header_data); - - curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf); - curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "PUT"); - curl_easy_setopt(easyhandle, CURLOPT_NOBODY, 1); - - set_std_opts(easyhandle, common_data); - - for (isrc=0; sources[isrc] != NULL; ++isrc) - { - if (common_data->verbose > 0) - fprintf(stderr, "Make directory %s\n", sources[isrc]); - - curl_easy_setopt(easyhandle, CURLOPT_URL, sources[isrc]); - - header_data.retcode = 0; - thiserror = curl_easy_perform(easyhandle); - - if ((thiserror != 0) || - (header_data.retcode >= 300)) - { - fprintf(stderr, "... curl error: %s (%d), HTTP error: %d\n", - common_data->errorbuf, thiserror, header_data.retcode); - - if (thiserror != 0) anyerror = thiserror; - else anyerror = header_data.retcode; - } - else if (common_data->verbose > 0) - fprintf(stderr, "... OK (%d)\n", header_data.retcode); - } - - curl_easy_cleanup(easyhandle); - - return anyerror; -} - -int do_ping(struct grst_stream_data *common_data_ptr) -{ - int request_length, response_length, i, ret, s, igroup; - struct sockaddr_in srv, from; - socklen_t fromlen; -#define MAXBUF 8192 - char *request, response[MAXBUF], *p; - GRSThtcpMessage msg; - struct timeval start_timeval, wait_timeval, response_timeval; - struct grst_sitecast_group sitecast_groups[HTCP_SITECAST_GROUPS]; - fd_set readsckts; - - /* parse common_data_ptr->groups */ - - p = common_data_ptr->groups; - igroup = -1; - - for (igroup=-1; igroup+1 < HTCP_SITECAST_GROUPS; ++igroup) - { - sitecast_groups[igroup+1].port = GRST_HTCP_PORT; - sitecast_groups[igroup+1].timewait = 1; - sitecast_groups[igroup+1].ttl = 1; - - ret = sscanf(p, "%d.%d.%d.%d:%d:%d:%d", - &(sitecast_groups[igroup+1].quad1), - &(sitecast_groups[igroup+1].quad2), - &(sitecast_groups[igroup+1].quad3), - &(sitecast_groups[igroup+1].quad4), - &(sitecast_groups[igroup+1].port), - &(sitecast_groups[igroup+1].ttl), - &(sitecast_groups[igroup+1].timewait)); - - if (ret == 0) break; /* end of list ? */ - - if (ret < 5) - { - fprintf(stderr, "Failed to parse multicast group " - "parameter %s\n", p); - return CURLE_FAILED_INIT; - } - - ++igroup; - - if ((p = index(p, ',')) == NULL) break; - ++p; - } - - if (igroup == -1) - { - fprintf(stderr, "Failed to parse multicast group parameter %s\n", p); - return CURLE_FAILED_INIT; - } - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - fprintf(stderr, "Failed to open UDP socket\n"); - return CURLE_FAILED_INIT; - } - - /* loop through multicast groups and send off the NOP pings */ - - gettimeofday(&start_timeval, NULL); - - for (i=0; i <= igroup; ++i) - { - bzero(&srv, sizeof(srv)); - srv.sin_family = AF_INET; - srv.sin_port = htons(sitecast_groups[i].port); - srv.sin_addr.s_addr = htonl(sitecast_groups[i].quad1*0x1000000 - + sitecast_groups[i].quad2*0x10000 - + sitecast_groups[i].quad3*0x100 - + sitecast_groups[i].quad4); - - GRSThtcpNOPrequestMake(&request, &request_length, - (int) (start_timeval.tv_usec + i)); - - sendto(s, request, request_length, 0, (struct sockaddr *) &srv, - sizeof(srv)); - free(request); - - if (common_data_ptr->verbose > 0) - fprintf(stderr, "UDP/HTCP NOP ping to %d:%d:%d:%d %d\n", - sitecast_groups[i].quad1, - sitecast_groups[i].quad2, - sitecast_groups[i].quad3, - sitecast_groups[i].quad4, - sitecast_groups[i].port); - } - - /* reusing wait_timeval is a Linux-specific feature of select() */ - wait_timeval.tv_sec = common_data_ptr->timeout - ? common_data_ptr->timeout : 60; - wait_timeval.tv_usec = 0; - - while ((wait_timeval.tv_sec > 0) || (wait_timeval.tv_usec > 0)) - { - FD_ZERO(&readsckts); - FD_SET(s, &readsckts); - - ret = select(s + 1, &readsckts, NULL, NULL, &wait_timeval); - gettimeofday(&response_timeval, NULL); - - if (ret > 0) - { - response_length = recvfrom(s, response, MAXBUF, - 0, &from, &fromlen); - - if (common_data_ptr->verbose > 0) - fprintf(stderr, "UDP mesg from %s:%d\n", - inet_ntoa(from.sin_addr), ntohs(from.sin_port)); - - if ((GRSThtcpMessageParse(&msg, response, response_length) - == GRST_RET_OK) && - (msg.opcode == GRSThtcpNOPop) && (msg.rr == 1) && - (msg.trans_id >= (int) start_timeval.tv_usec) && - (msg.trans_id <= (int) (start_timeval.tv_usec + igroup))) - { - printf("%s:%d %.3fms\n", - inet_ntoa(from.sin_addr), - ntohs(from.sin_port), - (((long) 1000000 * response_timeval.tv_sec) + - ((long) response_timeval.tv_usec) - - ((long) 1000000 * start_timeval.tv_sec) - - ((long) start_timeval.tv_usec)) / 1000.0); - } - } - } - - return GRST_RET_OK; -} - -int do_finds(char *sources[], - struct grst_stream_data *common_data_ptr, int num) -{ - int isrc; - - int request_length, response_length, i, ret, s, igroup; - struct sockaddr_in srv, from; - socklen_t fromlen; -#define MAXBUF 8192 - char *request, response[MAXBUF], *p; - GRSThtcpMessage msg; - struct timeval start_timeval, wait_timeval; - struct grst_sitecast_group sitecast_groups[HTCP_SITECAST_GROUPS]; - fd_set readsckts; - - /* parse common_data_ptr->groups */ - - if (common_data_ptr->groups == NULL) - { - fprintf(stderr, "No multicast groups given\n"); - return CURLE_FAILED_INIT; - } - - p = common_data_ptr->groups; - igroup = -1; - - for (igroup=-1; igroup+1 < HTCP_SITECAST_GROUPS;) - { - sitecast_groups[igroup+1].port = GRST_HTCP_PORT; - sitecast_groups[igroup+1].timewait = 1; - sitecast_groups[igroup+1].ttl = 1; - - ret = sscanf(p, "%d.%d.%d.%d:%d:%d:%d", - &(sitecast_groups[igroup+1].quad1), - &(sitecast_groups[igroup+1].quad2), - &(sitecast_groups[igroup+1].quad3), - &(sitecast_groups[igroup+1].quad4), - &(sitecast_groups[igroup+1].port), - &(sitecast_groups[igroup+1].ttl), - &(sitecast_groups[igroup+1].timewait)); - - if (ret == 0) break; /* end of list ? */ - - if (ret < 5) - { - fprintf(stderr, "Failed to parse multicast group " - "parameter %s\n", p); - return CURLE_FAILED_INIT; - } - - ++igroup; - - if ((p = index(p, ',')) == NULL) break; - ++p; - } - - if (igroup == -1) - { - fprintf(stderr, "Failed to parse multicast group parameter %s\n", p); - return CURLE_FAILED_INIT; - } - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - fprintf(stderr, "Failed to open UDP socket\n"); - return CURLE_FAILED_INIT; - } - - /* loop through multicast groups since we need to take each - ones timewait into account */ - - gettimeofday(&start_timeval, NULL); - - for (i=0; i <= igroup; ++i) - { - if (common_data_ptr->verbose) - fprintf(stderr, "Querying multicast group %d.%d.%d.%d:%d:%d:%d\n", - sitecast_groups[i].quad1, sitecast_groups[i].quad2, - sitecast_groups[i].quad3, sitecast_groups[i].quad4, - sitecast_groups[i].port, sitecast_groups[i].ttl, - sitecast_groups[i].timewait); - - bzero(&srv, sizeof(srv)); - srv.sin_family = AF_INET; - srv.sin_port = htons(sitecast_groups[i].port); - srv.sin_addr.s_addr = htonl(sitecast_groups[i].quad1*0x1000000 - + sitecast_groups[i].quad2*0x10000 - + sitecast_groups[i].quad3*0x100 - + sitecast_groups[i].quad4); - - /* send off queries, one for each source file */ - - for (isrc=0; sources[isrc] != NULL; ++isrc) - { - GRSThtcpTSTrequestMake(&request, &request_length, - (int) (start_timeval.tv_usec + isrc), - "GET", sources[isrc], ""); - - sendto(s, request, request_length, 0, - (struct sockaddr *) &srv, sizeof(srv)); - - free(request); - } - - /* reusing wait_timeval is a Linux-specific feature of select() */ - wait_timeval.tv_usec = 0; - wait_timeval.tv_sec = sitecast_groups[i].timewait; - - while ((wait_timeval.tv_sec > 0) || (wait_timeval.tv_usec > 0)) - { - FD_ZERO(&readsckts); - FD_SET(s, &readsckts); - - ret = select(s + 1, &readsckts, NULL, NULL, &wait_timeval); - - if (ret > 0) - { - response_length = recvfrom(s, response, MAXBUF, - 0, &from, &fromlen); - - if ((GRSThtcpMessageParse(&msg, response, response_length) - == GRST_RET_OK) && - (msg.opcode == GRSThtcpTSTop) && (msg.rr == 1) && - (msg.trans_id >= (int) start_timeval.tv_usec) && - (msg.trans_id < (int) (start_timeval.tv_usec + num)) && - (msg.resp_hdrs != NULL) && - (GRSThtcpCountstrLen(msg.resp_hdrs) > 12)) - { - if (num > 1) printf("%s -> %.*s\n", - sources[msg.trans_id - (int) start_timeval.tv_usec], - GRSThtcpCountstrLen(msg.resp_hdrs) - 12, - &(msg.resp_hdrs->text[10])); - else printf("%.*s\n", - GRSThtcpCountstrLen(msg.resp_hdrs) - 12, - &(msg.resp_hdrs->text[10])); - } - } - } - - } - - return GRST_RET_OK; -} - -int translate_sitecast_url(char **source_ptr, - struct grst_stream_data *common_data_ptr) -{ - int request_length, response_length, i, ret, s, igroup; - struct sockaddr_in srv, from; - socklen_t fromlen; -#define MAXBUF 8192 - char *request, response[MAXBUF], *p; - GRSThtcpMessage msg; - struct timeval start_timeval, wait_timeval; - struct grst_sitecast_group sitecast_groups[HTCP_SITECAST_GROUPS]; - fd_set readsckts; - - /* parse common_data_ptr->groups */ - - if (common_data_ptr->groups == NULL) - { - fprintf(stderr, "No multicast groups given\n"); - return CURLE_FAILED_INIT; - } - - p = common_data_ptr->groups; - igroup = -1; - - for (igroup=-1; igroup+1 < HTCP_SITECAST_GROUPS;) - { - sitecast_groups[igroup+1].port = GRST_HTCP_PORT; - sitecast_groups[igroup+1].timewait = 1; - sitecast_groups[igroup+1].ttl = 1; - - ret = sscanf(p, "%d.%d.%d.%d:%d:%d:%d", - &(sitecast_groups[igroup+1].quad1), - &(sitecast_groups[igroup+1].quad2), - &(sitecast_groups[igroup+1].quad3), - &(sitecast_groups[igroup+1].quad4), - &(sitecast_groups[igroup+1].port), - &(sitecast_groups[igroup+1].ttl), - &(sitecast_groups[igroup+1].timewait)); - - if (ret == 0) break; /* end of list ? */ - - if (ret < 5) - { - fprintf(stderr, "Failed to parse multicast group " - "parameter %s\n", p); - return CURLE_FAILED_INIT; - } - - ++igroup; - - if ((p = index(p, ',')) == NULL) break; - ++p; - } - - if (igroup == -1) - { - fprintf(stderr, "Failed to parse multicast group parameter %s\n", p); - return CURLE_FAILED_INIT; - } - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - fprintf(stderr, "Failed to open UDP socket\n"); - return CURLE_FAILED_INIT; - } - - /* loop through multicast groups since we need to take each - ones timewait into account */ - - gettimeofday(&start_timeval, NULL); - - for (i=0; i <= igroup; ++i) - { - if (common_data_ptr->verbose) - fprintf(stderr, "Querying multicast group %d.%d.%d.%d:%d:%d:%d\n", - sitecast_groups[i].quad1, sitecast_groups[i].quad2, - sitecast_groups[i].quad3, sitecast_groups[i].quad4, - sitecast_groups[i].port, sitecast_groups[i].ttl, - sitecast_groups[i].timewait); - - bzero(&srv, sizeof(srv)); - srv.sin_family = AF_INET; - srv.sin_port = htons(sitecast_groups[i].port); - srv.sin_addr.s_addr = htonl(sitecast_groups[i].quad1*0x1000000 - + sitecast_groups[i].quad2*0x10000 - + sitecast_groups[i].quad3*0x100 - + sitecast_groups[i].quad4); - - /* send off queries, one for each source file */ - - GRSThtcpTSTrequestMake(&request, &request_length, - (int) (start_timeval.tv_usec), - "GET", *source_ptr, ""); - - sendto(s, request, request_length, 0, - (struct sockaddr *) &srv, sizeof(srv)); - - free(request); - - /* reusing wait_timeval is a Linux-specific feature of select() */ - wait_timeval.tv_usec = 0; - wait_timeval.tv_sec = sitecast_groups[i].timewait; - - while ((wait_timeval.tv_sec > 0) || (wait_timeval.tv_usec > 0)) - { - FD_ZERO(&readsckts); - FD_SET(s, &readsckts); - - ret = select(s + 1, &readsckts, NULL, NULL, &wait_timeval); - - if (ret > 0) - { - response_length = recvfrom(s, response, MAXBUF, - 0, &from, &fromlen); - - if ((GRSThtcpMessageParse(&msg, response, response_length) - == GRST_RET_OK) && - (msg.opcode == GRSThtcpTSTop) && (msg.rr == 1) && - (msg.trans_id == (int) start_timeval.tv_usec) && - (msg.resp_hdrs != NULL) && - (GRSThtcpCountstrLen(msg.resp_hdrs) > 12)) - { - /* found one */ - - if (common_data_ptr->verbose > 0) - fprintf(stderr, "Sitecast %s -> %.*s\n", - *source_ptr, - GRSThtcpCountstrLen(msg.resp_hdrs) - 12, - &(msg.resp_hdrs->text[10])); - - free(*source_ptr); - - asprintf(source_ptr, "%.*s", - GRSThtcpCountstrLen(msg.resp_hdrs) - 12, - &(msg.resp_hdrs->text[10])); - - return GRST_RET_OK; - } - } - } - - } - - return GRST_RET_OK; -} - -size_t rawindex_callback(void *ptr, size_t size, size_t nmemb, void *data) -{ - if ( ((struct grst_index_blob *) data)->used + size * nmemb >= - ((struct grst_index_blob *) data)->allocated ) - { - ((struct grst_index_blob *) data)->allocated = - ((struct grst_index_blob *) data)->used + size * nmemb + 4096; - - ((struct grst_index_blob *) data)->text = - realloc( ((struct grst_index_blob *) data)->text, - ((struct grst_index_blob *) data)->allocated ); - } - - memcpy( &( ((struct grst_index_blob *) - data)->text[((struct grst_index_blob *) data)->used] ), - ptr, size * nmemb); - - ((struct grst_index_blob *) data)->used += size * nmemb; - - return size * nmemb; -} - -char *canonicalise(char *link, char *source) -{ - int i, j, srclen; - char *s; - - srclen = strlen(source); - - if ((strncmp(link, "https://", 8) == 0) || - (strncmp(link, "http://", 7) == 0)) - { - if (strncmp(link, source, srclen) != 0) return NULL; /* other site */ - - if (link[srclen] == '\0') return NULL; /* we dont self-link! */ - - for (i=0; link[srclen + i] != '\0'; ++i) - if (link[srclen + i] == '/') - { - if (link[srclen + i + 1] != '\0') return NULL; /* no subdirs */ - else return strdup(&link[srclen]); /* resolves to this dir */ - } - } - else if (link[0] != '/') /* relative link - need to check for subsubdirs */ - { - for (i=0; link[i] != '\0'; ++i) - if ((link[i] == '/') && (link[i+1] != '\0')) return NULL; - - s = strdup(link); - - for (i=0; s[i] != '\0'; ++i) - if (s[i] == '#') - { - s[i] = '\0'; - break; - } - - return s; - } - - /* absolute link on this server, starting / */ - - for (i=8; source[i] != '\0'; ++i) if (source[i] == '/') break; - - if (strncmp(link, &source[i], srclen - i) != 0) return NULL; - - for (j = srclen - i; link[j] != '\0'; ++j) - if ((link[j] == '/') && (link[j+1] != '\0')) return NULL; - - s = strdup(&link[srclen - i]); - - for (i=0; s[i] != '\0'; ++i) - if (s[i] == '#') - { - s[i] = '\0'; - break; - } - - if (s[0] == '\0') /* on second thoughts... */ - { - free(s); - return NULL; - } - - return s; -} - -int grst_dir_list_cmp(const void *a, const void *b) -{ - return strcmp( ((struct grst_dir_list *) a)->filename, - ((struct grst_dir_list *) b)->filename); -} - -struct grst_dir_list *index_to_dir_list(char *text, char *source) -{ - int taglevel = 0, wordnew = 1, i, namestart, used = 0, - allocated = 256; - char *p, *s; - struct grst_dir_list *list; - - list = (struct grst_dir_list *) - malloc(allocated * sizeof(struct grst_dir_list)); - - list[0].filename = NULL; - list[0].length = 0; - list[0].length_set = 0; - list[0].modified = 0; - list[0].modified_set = 0; - - for (p=text; *p != '\0'; ++p) - { - if (*p == '<') - { - ++taglevel; - - if ((taglevel == 1) && (list[used].filename != NULL)) - { - ++used; - if (used >= allocated) - { - allocated += 256; - list = (struct grst_dir_list *) - realloc((void *) list, - allocated * sizeof(struct grst_dir_list)); - } - - list[used].filename = NULL; - list[used].length = 0; - list[used].length_set = 0; - list[used].modified = 0; - list[used].modified_set = 0; - } - - wordnew = 1; - continue; - } - - if (*p == '>') - { - --taglevel; - wordnew = 1; - continue; - } - - if (isspace(*p)) - { - wordnew = 1; - continue; - } - - if ((wordnew) && (taglevel == 1)) - { - if (((*p == 'h') || (*p == 'H')) && - (strncasecmp(p, "href=", 5) == 0)) - { - if (p[5] == '"') { namestart = 6; - for (i=namestart; (p[i] != '\0') && - (p[i] != '"' ) && - (p[i] != '\n') && - (p[i] != '\t') && - (p[i] != '>' ) ; ++i) ; } - else { namestart = 5; - for (i=namestart; (p[i] != '\0') && - (p[i] != '"' ) && - (p[i] != ' ' ) && - (p[i] != '\n') && - (p[i] != '\t') && - (p[i] != ')' ) && - (p[i] != '>' ) ; ++i) ; } - if (i > namestart) - { - s = malloc(1 + i - namestart); - memcpy(s, &p[namestart], i - namestart); - s[i - namestart] = '\0'; - - list[used].filename = canonicalise(s, source); - free(s); - } - - p = &p[i-1]; /* -1 since continue results in ++i */ - continue; - } - - if (((*p == 'c') || (*p == 'C')) && - (strncasecmp(p, "content-length=", 15) == 0)) - { - list[used].length = 0; - list[used].length_set = 1; - - if (p[15] == '"') list[used].length = atoi(&p[16]); - else list[used].length = atoi(&p[15]); - - p = &p[15]; - continue; - } - - if (((*p == 'l') || (*p == 'L')) && - (strncasecmp(p, "last-modified=", 14) == 0)) - { - list[used].modified = 0; - list[used].modified_set = 1; - - if (p[14] == '"') list[used].modified = atoi(&p[15]); - else list[used].modified = atoi(&p[14]); - - p = &p[14]; - continue; - } - } - - wordnew = 0; - } - - qsort((void *) list, used, sizeof(struct grst_dir_list), grst_dir_list_cmp); - - return list; -} - -int do_listings(char *sources[], struct grst_stream_data *common_data, - int islonglist) -{ - int isrc, anyerror = 0, thiserror, i, isdir, ilast; - CURL *easyhandle; - const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - char *s; - struct grst_index_blob rawindex; - struct grst_dir_list *list; - struct grst_header_data header_data; - struct tm modified_tm; - time_t now; - - time(&now); - - header_data.common_data = common_data; - - easyhandle = curl_easy_init(); - - curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent); - if (common_data->verbose > 1) - curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1); - - curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, &header_data); - curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, headers_callback); - - curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf); - - set_std_opts(easyhandle, common_data); - - for (isrc=0; sources[isrc] != NULL; ++isrc) - { - if (common_data->verbose > 0) - fprintf(stderr, "Listing %s\n", sources[isrc]); - - if (sources[1] != NULL) printf("\n%s:\n", sources[isrc]); - - curl_easy_setopt(easyhandle, CURLOPT_URL, sources[isrc]); - - if (sources[isrc][strlen(sources[isrc])-1] == '/') - { - isdir = 1; - curl_easy_setopt(easyhandle,CURLOPT_WRITEFUNCTION,rawindex_callback); - curl_easy_setopt(easyhandle,CURLOPT_WRITEDATA,(void *) &rawindex); - curl_easy_setopt(easyhandle,CURLOPT_NOBODY,0); - rawindex.text = NULL; - rawindex.used = 0; - rawindex.allocated = 0; - } - else - { - isdir = 0; - curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, NULL); - curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, NULL); - curl_easy_setopt(easyhandle, CURLOPT_NOBODY, 1); - } - - header_data.gridhttppasscode = NULL; - header_data.length_set = 0; - header_data.modified_set = 0; - header_data.retcode = 0; - thiserror = curl_easy_perform(easyhandle); - - if ((thiserror != 0) || - (header_data.retcode >= 300)) - { - fprintf(stderr, "... curl error: %s (%d), HTTP error: %d\n", - common_data->errorbuf, thiserror, header_data.retcode); - - if (thiserror != 0) anyerror = thiserror; - else anyerror = header_data.retcode; - } - else if (isdir) - { - if (common_data->verbose > 0) - fprintf(stderr, "... OK (%d)\n", header_data.retcode); - - rawindex.text[rawindex.used] = '\0'; - - list = index_to_dir_list(rawindex.text, sources[isrc]); - ilast = -1; - - for (i=0; list[i].filename != NULL; ++i) - { - if (list[i].filename[0] == '.') continue; - - if (strncmp(list[i].filename, "mailto:", 7) == 0) continue; - - if ((ilast >= 0) && - (strcmp(list[i].filename, list[ilast].filename) == 0)) - continue; - ilast=i; - - if (islonglist) - { - if (!list[i].length_set || !list[i].modified_set) - { - curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, - NULL); - curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, NULL); - curl_easy_setopt(easyhandle, CURLOPT_NOBODY, 1); - - asprintf(&s, "%s%s", sources[isrc], list[i].filename); - curl_easy_setopt(easyhandle, CURLOPT_URL, s); - - header_data.gridhttppasscode = NULL; - header_data.length_set = 0; - header_data.modified_set = 0; - header_data.retcode = 0; - thiserror = curl_easy_perform(easyhandle); - free(s); - - if ((thiserror == 0) && - (header_data.retcode >= 200) && - (header_data.retcode <= 299)) - { - if (header_data.length_set) - { - list[i].length_set = 1; - list[i].length = header_data.length; - } - - if (header_data.modified_set) - { - list[i].modified_set = 1; - list[i].modified = header_data.modified; - } - } - } - - if (list[i].length_set) printf("%10ld ", list[i].length); - else fputs(" ? ", stdout); - - if (list[i].modified_set) - { - localtime_r(&(list[i].modified), &modified_tm); - - if (list[i].modified < now - 15552000) - printf("%s %2d %4d ", - months[modified_tm.tm_mon], - modified_tm.tm_mday, - modified_tm.tm_year + 1900); - else printf("%s %2d %02d:%02d ", - months[modified_tm.tm_mon], - modified_tm.tm_mday, - modified_tm.tm_hour, - modified_tm.tm_min); - } - else fputs(" ? ? ? ", stdout); - } - - puts(list[i].filename); - } - } - else - { - if (islonglist) - { - printf("%10ld ", header_data.length); - - localtime_r(&(header_data.modified), &modified_tm); - - if (header_data.modified < now - 15552000) - printf("%s %2d %4d ", - months[modified_tm.tm_mon], - modified_tm.tm_mday, - modified_tm.tm_year + 1900); - else printf("%s %2d %02d:%02d ", - months[modified_tm.tm_mon], - modified_tm.tm_mday, - modified_tm.tm_hour, - modified_tm.tm_min); - } - - puts(sources[isrc]); - } - } - - curl_easy_cleanup(easyhandle); - - return anyerror; -} - -#if (LIBCURL_VERSION_NUM < 0x070908) -char *make_tmp_ca_roots(char *dir) -/* libcurl before 7.9.8 doesnt support CURLOPT_CAPATH and the directory, - so we make a temporary file with the concatenated CA root certs: that - is, all the files in that directory which end in .0 */ -{ - int ofd, ifd, c; - size_t size; - char tmp_ca_roots[] = "/tmp/.ca-roots-XXXXXX", buffer[4096], *s; - DIR *rootsDIR; - struct dirent *root_ent; - - if ((rootsDIR = opendir(dir)) == NULL) return NULL; - - if ((ofd = mkstemp(tmp_ca_roots)) == -1) - { - closedir(rootsDIR); - return NULL; - } - - while ((root_ent = readdir(rootsDIR)) != NULL) - { - if ((root_ent->d_name[0] != '.') && - (strlen(root_ent->d_name) > 2) && - (strncmp(&(root_ent->d_name[strlen(root_ent->d_name)-2]), - ".0", 2) == 0)) - { - asprintf(&s, "%s/%s", dir, root_ent->d_name); - ifd = open(s, O_RDONLY); - free(s); - - if (ifd != -1) - { - while ((size = read(ifd, buffer, sizeof(buffer))) > 0) - write(ofd, buffer, size); - close(ifd); - } - } - } - - closedir(rootsDIR); - - if (close(ofd) == 0) return strdup(tmp_ca_roots); - - unlink(tmp_ca_roots); /* try to clean up */ - - return NULL; -} -#endif - -void printsyntax(char *argv0) -{ - char *p; - - p = rindex(argv0, '/'); - if (p != NULL) ++p; - else p = argv0; - - fprintf(stderr, "%s [options] Source-URL[s] [Destination URL]\n" - "%s is one of a set of clients to fetch files or directory listings\n" -"from remote servers using HTTP or HTTPS, or to put or delete files or\n" -"directories onto remote servers using HTTPS. htcp is similar to scp(1)\n" -"but uses HTTP/HTTPS rather than ssh as its transfer protocol.\n" -"See the htcp(1) or http://www.gridsite.org/ for details.\n" -"(Version: %s)\n", p, p, VERSION); -} - -struct option long_options[] = { {"verbose", 0, 0, 'v'}, - {"cert", 1, 0, 0}, - {"key", 1, 0, 0}, - {"capath", 1, 0, 0}, - {"delete", 0, 0, 0}, - {"list", 0, 0, 0}, - {"long-list", 0, 0, 0}, - {"mkdir", 0, 0, 0}, - {"no-verify", 0, 0, 0}, - {"anon", 0, 0, 0}, - {"grid-http", 0, 0, 0}, - {"move", 0, 0, 0}, - {"ping", 0, 0, 0}, - {"groups", 1, 0, 0}, - {"timeout", 1, 0, 0}, - {"sitecast", 0, 0, 0}, - {"domain", 1, 0, 0}, - {"find", 0, 0, 0}, - {"rmtcp", 0, 0, 0}, - {"conf", 1, 0, 0}, - {0, 0, 0, 0} }; - -int update_common_data(struct grst_stream_data *, int, char *); - -void parse_conf(struct grst_stream_data *common_data_ptr, char *conf_file) -{ - int option_index; - char line[1001], *p; - FILE *fp; - - fp = fopen(conf_file, "r"); - if (fp == NULL) - { - if (common_data_ptr->verbose) - fprintf(stderr, "Failed to open configuration file %s\n", conf_file); - return; - } - - if (common_data_ptr->verbose) - fprintf(stderr, "Opened configuration file %s\n", conf_file); - - while (fgets(line, sizeof(line), fp) != NULL) - { - if ((p = index(line, '\n')) != NULL) *p = '\0'; - - for (option_index=0; - long_options[option_index].name != NULL; ++option_index) - { - if (long_options[option_index].has_arg && - (strncmp(line, long_options[option_index].name, - strlen(long_options[option_index].name)) == 0) && - (line[strlen(long_options[option_index].name)] == '=')) - { - update_common_data(common_data_ptr, option_index, - strdup(&line[strlen(long_options[option_index].name) + 1])); - break; - } - - if (!long_options[option_index].has_arg && - (strcmp(line, long_options[option_index].name) == 0)) - { - update_common_data(common_data_ptr, option_index, ""); - break; - } - } - } - - fclose(fp); -} - -int update_common_data(struct grst_stream_data *common_data_ptr, - int option_index, char *optarg) -{ - if (option_index == 1) common_data_ptr->cert = optarg; - else if (option_index == 2) common_data_ptr->key = optarg; - else if (option_index == 3) common_data_ptr->capath = optarg; - else if (option_index == 4) common_data_ptr->method = HTCP_DELETE; - else if (option_index == 5) common_data_ptr->method = HTCP_LIST; - else if (option_index == 6) common_data_ptr->method = HTCP_LONGLIST; - else if (option_index == 7) common_data_ptr->method = HTCP_MKDIR; - else if (option_index == 8) common_data_ptr->noverify = 1; - else if (option_index == 9) common_data_ptr->anonymous = 1; - else if (option_index ==10) common_data_ptr->gridhttp = 1; - else if (option_index ==11) common_data_ptr->method = HTCP_MOVE; - else if (option_index ==12) common_data_ptr->method = HTCP_PING; - else if (option_index ==13) common_data_ptr->groups = optarg; - else if (option_index ==14) common_data_ptr->timeout = atoi(optarg); - else if (option_index ==15) common_data_ptr->sitecast = 1; - else if (option_index ==16) { common_data_ptr->sitecast = 1; - common_data_ptr->domain = optarg; } - else if (option_index ==17) common_data_ptr->method = HTCP_FIND; - else if (option_index ==18) { printf("OK\n");common_data_ptr->method = HTCP_RMTCP;} - /* option_index == 19 is used by the --conf command line-only option */ - else return GRST_RET_FAILED; - - return GRST_RET_OK; -} - -int main(int argc, char *argv[]) -{ - char **sources, *destination = NULL, *executable, *p, *htcp_conf; - int c, i, option_index, anyerror; - struct stat statbuf; - struct grst_stream_data common_data; - struct passwd *userpasswd; - -#if (LIBCURL_VERSION_NUM < 0x070908) - char *tmp_ca_roots = NULL; -#endif - - if (argc == 1) - { - printsyntax(argv[0]); - return 0; - } - - common_data.cert = NULL; - common_data.key = NULL; - common_data.capath = NULL; - common_data.method = 0; - common_data.errorbuf = malloc(CURL_ERROR_SIZE); - asprintf(&(common_data.useragent), - "htcp/%s (http://www.gridsite.org/)", VERSION); - common_data.verbose = 0; - common_data.noverify = 0; - common_data.anonymous = 0; - common_data.gridhttp = 0; - - common_data.groups = NULL; - common_data.timeout = 0; - common_data.sitecast = 0; - common_data.domain = NULL; - - if ((argc > 1) && ((strcmp(argv[1], "--verbose") == 0) || - (strcmp(argv[1], "-v") == 0))) common_data.verbose = 1; - - /* examine any configuration files */ - - parse_conf(&common_data, HTCP_HOST_CONF); - - userpasswd = getpwuid(geteuid()); - asprintf(&htcp_conf, "%s/%s", userpasswd->pw_dir, HTCP_USER_CONF); - parse_conf(&common_data, htcp_conf); - free(htcp_conf); - - htcp_conf = getenv("HTCP_CONF"); - if (htcp_conf != NULL) parse_conf(&common_data, htcp_conf); - - common_data.verbose = 0; - - while (1) - { - option_index = 0; - - c = getopt_long(argc, argv, "v", long_options, &option_index); - - if (c == -1) break; - else if (c == 0) - { - if (option_index == 19) parse_conf(&common_data, optarg); - else update_common_data(&common_data, option_index, optarg); - } - else if (c == 'v') ++(common_data.verbose); - } - - if (common_data.verbose > 0) - { - p = rindex(argv[0], '/'); - if (p != NULL) ++p; - else p = argv[0]; - fprintf(stderr, "%s version %s\n", p, VERSION); - } - - if (common_data.anonymous) /* prevent any use of user certs */ - { - common_data.cert = NULL; - common_data.key = NULL; - } - else if ((common_data.cert == NULL) && (common_data.key != NULL)) - common_data.cert = common_data.key; - else if ((common_data.cert != NULL) && (common_data.key == NULL)) - common_data.key = common_data.cert; - else if ((common_data.cert == NULL) && (common_data.key == NULL)) - { - common_data.cert = getenv("X509_USER_PROXY"); - if (common_data.cert != NULL) common_data.key = common_data.cert; - else - { - asprintf(&(common_data.cert), "/tmp/x509up_u%d", geteuid()); - - /* one fine day, we will check the proxy file for expiry too ... */ - - if (stat(common_data.cert, &statbuf) == 0) - common_data.key = common_data.cert; - else - { - common_data.cert = getenv("X509_USER_CERT"); - common_data.key = getenv("X509_USER_KEY"); - - if ((common_data.cert == NULL) && - (userpasswd != NULL) && - (userpasswd->pw_dir != NULL)) - asprintf(&(common_data.cert), "%s/.globus/usercert.pem", - userpasswd->pw_dir); - - if ((common_data.key == NULL) && - (userpasswd != NULL) && - (userpasswd->pw_dir != NULL)) - asprintf(&(common_data.key), "%s/.globus/userkey.pem", - userpasswd->pw_dir); - } - } - } - - if (common_data.capath == NULL) common_data.capath = getenv("X509_CERT_DIR"); - - if (common_data.capath == NULL) - common_data.capath = "/etc/grid-security/certificates"; - -#if (LIBCURL_VERSION_NUM < 0x070908) - /* libcurl before 7.9.8 doesnt support CURLOPT_CAPATH and the directory */ - - if ((common_data.capath != NULL) && - (stat(common_data.capath, &statbuf) == 0) && S_ISDIR(statbuf.st_mode)) - { - tmp_ca_roots = make_tmp_ca_roots(common_data.capath); - common_data.capath = tmp_ca_roots; - } -#endif - - executable = rindex(argv[0], '/'); - if (executable != NULL) executable++; - else executable = argv[0]; - - if (common_data.method == 0) /* command-line options override exec name */ - { - if (strcmp(executable,"htls")==0) common_data.method=HTCP_LIST; - else if (strcmp(executable,"htll")==0) common_data.method=HTCP_LONGLIST; - else if (strcmp(executable,"htrm")==0) common_data.method=HTCP_DELETE; - else if (strcmp(executable,"htmkdir")==0) common_data.method=HTCP_MKDIR; - else if (strcmp(executable,"htmv")==0) common_data.method=HTCP_MOVE; - else if (strcmp(executable,"htping")==0) common_data.method=HTCP_PING; - else if (strcmp(executable,"htfind")==0) common_data.method=HTCP_FIND; - else if (strcmp(executable,"htrmtcp")==0) common_data.method=HTCP_RMTCP; - } - - if (common_data.method == HTCP_PING) - { - if (common_data.groups != NULL) return do_ping(&common_data); - - fprintf(stderr, "Must specify at least one multicast group\n\n"); - printsyntax(argv[0]); - return CURLE_FAILED_INIT; - } - - if ((common_data.method == HTCP_DELETE) || - (common_data.method == HTCP_LIST) || - (common_data.method == HTCP_FIND) || - (common_data.method == HTCP_MKDIR) || - (common_data.method == HTCP_LONGLIST)) - { - if (optind >= argc) - { - fprintf(stderr, "Must give at least 1 non-option argument\n\n"); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - sources = (char **) malloc(sizeof(char *) * (1 + argc - optind)); - for (i=0; i < argc - optind; ++i) - { - sources[i] = argv[optind + i]; - - if ((common_data.method == HTCP_MKDIR) && - (sources[i][strlen(sources[i])-1] != '/')) - { - fprintf(stderr, "Argument \"%s\" is not a " - "directory URL (no trailing /)\n\n", sources[i]); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - } - - sources[i] = NULL; - - if (common_data.method == HTCP_DELETE) - anyerror = do_deletes(sources, &common_data); - else if (common_data.method == HTCP_MKDIR) - anyerror = do_mkdirs(sources, &common_data); - else if (common_data.method == HTCP_FIND) - anyerror = do_finds(sources, &common_data, argc - optind); - else if (common_data.method == HTCP_LONGLIST) - anyerror = do_listings(sources, &common_data, 1); - else anyerror = do_listings(sources, &common_data, 0); - - if (anyerror > 99) anyerror = CURLE_HTTP_RETURNED_ERROR; - - return anyerror; - } - - if (common_data.method == HTCP_MOVE) - { - if (optind >= argc - 1) - { - fputs("Must give exactly 2 non-option arguments\n\n", stderr); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - anyerror = do_move(argv[optind], argv[optind + 1], &common_data); - - if (anyerror > 99) anyerror = CURLE_HTTP_RETURNED_ERROR; - - return anyerror; - } - - if (optind >= argc - 1) - { - fputs("Must give at least 2 non-option arguments\n\n", stderr); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - sources = (char **) malloc(sizeof(char *) * (argc - optind)); - - for (i=0; i < (argc - optind - 1); ++i) - { - if (strncmp(argv[optind + i], "file:", 5) == 0) - sources[i] = strdup(&argv[optind + i][5]); - else sources[i] = strdup(argv[optind + i]); - - if (sources[i][0] == '\0') - { - fprintf(stderr, "Source argument %d is empty\n\n", i + 1); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - } - - sources[i] = NULL; - - if (strncmp(argv[optind+i], "file:", 5) == 0) - { - if ((argv[optind+i][strlen(argv[optind+i]) - 1] != '/') && - (stat(&argv[optind + i][5], &statbuf) == 0) && - S_ISDIR(statbuf.st_mode)) - asprintf(&destination, "%s/", &argv[optind + i][5]); - else destination = strdup(&argv[optind + i][5]); - } - else if ((strncmp(argv[optind+i], "http://", 7) != 0) && - (strncmp(argv[optind+i], "https://", 8) != 0)) - { - if ((argv[optind+i][strlen(argv[optind+i]) - 1] != '/') && - (stat(argv[optind+i], &statbuf) == 0) && - S_ISDIR(statbuf.st_mode)) - asprintf(&destination, "%s/", argv[optind+i]); - else destination = strdup(argv[optind+i]); - } - else destination = strdup(argv[optind+i]); - - if (destination[0] == '\0') - { - fputs("Destination argument is empty\n\n", stderr); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - if ((argc - optind > 2) && (destination[strlen(destination)-1] != '/')) - { - fputs("For multiple sources, destination " - "must be a directory (end in /)\n\n", stderr); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - // remote file copy - if ( common_data.method == HTCP_RMTCP ) - { - anyerror = do_rmtcp(sources, destination, &common_data); - fprintf(stdout, "The file has been moved!\n"); - // printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - if ((strncmp(destination, "http://", 7) == 0) || - (strncmp(destination, "https://", 8) == 0)) - common_data.method = HTCP_PUT; - else common_data.method = HTCP_GET; - - for (i=0; sources[i] != NULL; ++i) - { - if ((common_data.method == HTCP_PUT) && - ((strncmp(sources[i], "http://", 7) == 0) || - (strncmp(sources[i], "https://", 8) == 0))) - { - fputs("Cannot have both source and destination remote\n\n",stderr); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - if (common_data.method == HTCP_GET) - { - if ((strncmp(sources[i], "http://", 7) != 0) && - (strncmp(sources[i], "https://", 8) != 0)) - { - fputs("Cannot have both source and " - "destination local (for now)\n\n",stderr); - printsyntax(argv[0]); - return CURLE_URL_MALFORMAT; - } - - if ((common_data.sitecast) && - ((common_data.domain == NULL) || - - ((strncmp(sources[i], "http://", 7) == 0) && - (strncmp(&sources[i][7], common_data.domain, - strlen(common_data.domain)) == 0) && - ((sources[i][7+strlen(common_data.domain)] == ':') || - (sources[i][7+strlen(common_data.domain)] == '/'))) || - - ((strncmp(sources[i], "https://", 8) == 0) && - (strncmp(&sources[i][8], common_data.domain, - strlen(common_data.domain)) == 0) && - ((sources[i][8+strlen(common_data.domain)] == ':') || - (sources[i][8+strlen(common_data.domain)] == '/'))))) - { - translate_sitecast_url(&sources[i], &common_data); - } - } - } - - anyerror = do_copies(sources, destination, &common_data); - if (anyerror > 99) anyerror = CURLE_HTTP_RETURNED_ERROR; - - return anyerror; -} diff --git a/org.gridsite.core/src/htproxyput.c b/org.gridsite.core/src/htproxyput.c deleted file mode 100644 index b6dd179..0000000 --- a/org.gridsite.core/src/htproxyput.c +++ /dev/null @@ -1,606 +0,0 @@ -/* - Copyright (c) 2002-6, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - -Build with: - -gcc -lcurl -lssl -lcrypto -o grst-proxy-put grst-proxy-put.c libgridsite.a - -http://www.gridpp.ac.uk/authz/gridsite/ - -*/ - -#ifndef VERSION -#define VERSION "0.0.0" -#endif - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include - -#include - -#include - -#include "DelegationSoapBinding.nsmap" - -#define HTPROXY_PUT 0 -#define HTPROXY_RENEW 1 -#define HTPROXY_DESTROY 2 -#define HTPROXY_TIME 3 -#define HTPROXY_UNIXTIME 4 -#define HTPROXY_MAKE 5 -#define HTPROXY_INFO 6 - -void printsyntax(char *argv0) -{ - char *p; - - p = rindex(argv0, '/'); - if (p != NULL) ++p; - else p = argv0; - - fprintf(stderr, "%s [options] URL\n" - "(Version: %s)\n", p, VERSION); -} - -void htproxy_logfunc(char *file, int line, int level, char *fmt, ...) -{ - char *mesg; - va_list ap; - - va_start(ap, fmt); - vasprintf(&mesg, fmt, ap); - va_end(ap); - - fprintf(stderr, "%s(%d) %s\n", file, line, mesg); - - free(mesg); -} - -int main(int argc, char *argv[]) -{ - char *delegation_id = "", *reqtxt, *certtxt, *valid = NULL, - *cert = NULL, *key = NULL, *capath = NULL, *keycert, timestr[81], - *executable, *keytxt, *proxychain, *ptr; - struct ns__putProxyResponse *unused; - struct tm *finish_tm; - int option_index, c, noverify = 0, i, ret, - method = HTPROXY_PUT, verbose = 0, fd, minutes; - struct soap soap_get, soap_put; - struct ns__getProxyReqResponse getProxyReqResponse; - struct ns__getNewProxyReqResponse getNewProxyReqResponse; - struct ns__renewProxyReqResponse renewProxyReqResponse; - struct ns__destroyResponse destroyResponse; - struct ns__getTerminationTimeResponse getTerminationTimeResponse; - FILE *ifp, *ofp; - STACK_OF(X509) *x509_certstack; - X509 *x509_cert; - BIO *certmem; - GRSTx509Chain *grst_chain = NULL; - GRSTx509Cert *grst_cert = NULL; - long ptrlen; - struct stat statbuf; - struct passwd *userpasswd; - struct option long_options[] = { {"verbose", 0, 0, 'v'}, - {"cert", 1, 0, 0}, - {"key", 1, 0, 0}, - {"capath", 1, 0, 0}, - {"destroy", 0, 0, 0}, - {"time", 0, 0, 0}, - {"no-verify", 0, 0, 0}, - {"valid", 1, 0, 0}, - {"delegation-id",1, 0, 0}, - {"put", 0, 0, 0}, - {"renew", 0, 0, 0}, - {"unixtime", 0, 0, 0}, - {"make", 0, 0, 0}, - {"info", 0, 0, 0}, - {0, 0, 0, 0} }; - - if (argc == 1) - { - printsyntax(argv[0]); - return 0; - } - - while (1) - { - option_index = 0; - - c = getopt_long(argc, argv, "v", long_options, &option_index); - - if (c == -1) break; - else if (c == 0) - { - if (option_index == 1) cert = optarg; - else if (option_index == 2) key = optarg; - else if (option_index == 3) capath = optarg; - else if (option_index == 4) method = HTPROXY_DESTROY; - else if (option_index == 5) method = HTPROXY_TIME; - else if (option_index == 6) noverify = 1; - else if (option_index == 7) valid = optarg; - else if (option_index == 8) delegation_id = optarg; - else if (option_index == 9) method = HTPROXY_PUT; - else if (option_index == 10) method = HTPROXY_RENEW; - else if (option_index == 11) method = HTPROXY_UNIXTIME; - else if (option_index == 12) method = HTPROXY_MAKE; - else if (option_index == 13) method = HTPROXY_INFO; - } - else if (c == 'v') - { - GRSTerrorLogFunc = htproxy_logfunc; - ++verbose; - } - } - - executable = rindex(argv[0], '/'); - if (executable != NULL) executable++; - else executable = argv[0]; - - if (strcmp(executable, "htproxydestroy") == 0) method = HTPROXY_DESTROY; - else if (strcmp(executable, "htproxyrenew") == 0) method = HTPROXY_RENEW; - else if (strcmp(executable, "htproxytime") == 0) method = HTPROXY_TIME; - else if (strcmp(executable, "htproxyunixtime") == 0) - method = HTPROXY_UNIXTIME; - else if (strcmp(executable, "htproxymake") == 0) method = HTPROXY_MAKE; - else if (strcmp(executable, "htproxyinfo") == 0) method = HTPROXY_INFO; - - if ((method != HTPROXY_MAKE) && - (method != HTPROXY_INFO) && (optind + 1 != argc)) - { - fprintf(stderr, "Must specify a delegation service URL!\n"); - return 1; - } - - if ((method == HTPROXY_RENEW) && (delegation_id[0] == '\0')) - { - fprintf(stderr, "Must give a Delegation ID when renewing\n"); - return 1; - } - - if (valid == NULL) minutes = 60 * 12; - else minutes = atoi(valid); - - if (verbose) fprintf(stderr, "Proxy valid for %d minutes\n", minutes); - - ERR_load_crypto_strings (); - OpenSSL_add_all_algorithms(); - - if ((cert == NULL) && (key != NULL)) cert = key; - else if ((cert != NULL) && (key == NULL)) key = cert; - else if ((cert == NULL) && (key == NULL)) - { - if (method != HTPROXY_MAKE) cert = getenv("X509_USER_PROXY"); - - if (cert != NULL) key = cert; - else - { - if (method != HTPROXY_MAKE) - asprintf(&(cert), "/tmp/x509up_u%d", geteuid()); - - /* one fine day, we will check the proxy file for - expiry too to avoid suprises when we try to use it ... */ - - if (stat(cert, &statbuf) == 0) key = cert; - else if (method != HTPROXY_INFO) - { - cert = getenv("X509_USER_CERT"); - key = getenv("X509_USER_KEY"); - - userpasswd = getpwuid(geteuid()); - - if ((cert == NULL) && - (userpasswd != NULL) && - (userpasswd->pw_dir != NULL)) - asprintf(&(cert), "%s/.globus/usercert.pem", - userpasswd->pw_dir); - - if ((key == NULL) && - (userpasswd != NULL) && - (userpasswd->pw_dir != NULL)) - asprintf(&(key), "%s/.globus/userkey.pem", - userpasswd->pw_dir); - - } - } - } - - if (capath == NULL) capath = getenv("X509_CERT_DIR"); - if (capath == NULL) capath = "/etc/grid-security/certificates"; - - if (verbose) fprintf(stderr, "key=%s\ncert=%s\ncapath=%s\n", - key, cert, capath); - - if ((key != NULL) && (cert != NULL) && - (strcmp(key, cert) != 0)) /* we have to concatenate for gSOAP */ - { - keycert = strdup("/tmp/.XXXXXX"); - - fd = mkstemp(keycert); - ofp = fdopen(fd, "w"); - - ifp = fopen(key, "r"); - while ((c = fgetc(ifp)) != EOF) fputc(c, ofp); - fclose(ifp); - - ifp = fopen(cert, "r"); - while ((c = fgetc(ifp)) != EOF) fputc(c, ofp); - fclose(ifp); - - fclose(ofp); - - if (verbose) fprintf(stderr, "Created %s key/cert file\n", keycert); - } - else keycert = key; - - if ((method == HTPROXY_PUT) || (method == HTPROXY_RENEW)) - { - if (verbose) - { - fprintf(stderr, "Using SOAP delegation protocol\n"); - fprintf(stderr, "Delegation-ID: %s\n", delegation_id); - } - - soap_init(&soap_get); - - if (soap_ssl_client_context(&soap_get, - SOAP_SSL_DEFAULT, - keycert, - "", - NULL, - capath, - NULL)) - { - soap_print_fault(&soap_get, stderr); - return 1; - } - - if ((method == HTPROXY_RENEW) && (delegation_id[0] != '\0')) - { - if (verbose) fprintf(stderr, "Send renewProxyReq to service\n"); - - soap_call_ns__renewProxyReq(&soap_get, - argv[optind], /* HTTPS url of service */ - "http://www.gridsite.org/namespaces/delegation-1", - delegation_id, - &renewProxyReqResponse); - - if (soap_get.error) - { - soap_print_fault(&soap_get, stderr); - return 1; - } - - reqtxt = renewProxyReqResponse._renewProxyReqReturn; - } - else - { - if (verbose) fprintf(stderr, "Send getNewProxyReq to service\n"); - - soap_call_ns__getNewProxyReq(&soap_get, - argv[optind], /* HTTPS url of service */ - "http://www.gridsite.org/namespaces/delegation-1", - &getNewProxyReqResponse); - - if (soap_get.error) - { - soap_print_fault(&soap_get, stderr); - return 1; - } - - reqtxt = getNewProxyReqResponse.getNewProxyReqReturn->proxyRequest; - delegation_id = - getNewProxyReqResponse.getNewProxyReqReturn->delegationID; - } - - if (verbose) fprintf(stderr, "reqtxt:\n%s", reqtxt); - - if (GRSTx509MakeProxyCert(&certtxt, stderr, reqtxt, cert, key, minutes) - != GRST_RET_OK) - { - return 1; - } - - soap_init(&soap_put); - - if (verbose) fprintf(stderr, "Send putProxy to service:\n%s\n", certtxt); - - if (soap_ssl_client_context(&soap_put, - SOAP_SSL_DEFAULT, - keycert, - "", - NULL, - capath, - NULL)) - { - soap_print_fault(&soap_put, stderr); - return 1; - } - - soap_call_ns__putProxy(&soap_put, argv[optind], - "http://www.gridsite.org/namespaces/delegation-1", - delegation_id, - certtxt, unused); - if (soap_put.error) - { - soap_print_fault(&soap_put, stderr); - return 1; - } - - puts(delegation_id); - - return 0; - } - else if (method == HTPROXY_DESTROY) - { - if (verbose) - { - fprintf(stderr, "Using SOAP proxy destroy protocol\n"); - fprintf(stderr, "Delegation-ID: %s\n", delegation_id); - } - - soap_init(&soap_put); - - if (verbose) fprintf(stderr, "Send destroy to service:\n"); - - if (soap_ssl_client_context(&soap_put, - SOAP_SSL_DEFAULT, - keycert, - "", - NULL, - capath, - NULL)) - { - soap_print_fault(&soap_put, stderr); - return 1; - } - - soap_call_ns__destroy(&soap_put, argv[optind], - "http://www.gridsite.org/namespaces/delegation-1", - delegation_id, - &destroyResponse); - if (soap_put.error) - { - soap_print_fault(&soap_put, stderr); - return 1; - } - - return 0; - } - else if ((method == HTPROXY_TIME) || (method == HTPROXY_UNIXTIME)) - { - if (verbose) - { - fprintf(stderr, "Using SOAP proxy get expiration time protocol\n"); - fprintf(stderr, "Delegation-ID: %s\n", delegation_id); - } - - soap_init(&soap_put); - - if (verbose) fprintf(stderr, "Send get time to service:\n"); - - if (soap_ssl_client_context(&soap_put, - SOAP_SSL_DEFAULT, - keycert, - "", - NULL, - capath, - NULL)) - { - soap_print_fault(&soap_put, stderr); - return 1; - } - - soap_call_ns__getTerminationTime(&soap_put, argv[optind], - "http://www.gridsite.org/namespaces/delegation-1", - delegation_id, - &getTerminationTimeResponse); - if (soap_put.error) - { - soap_print_fault(&soap_put, stderr); - return 1; - } - - - if (method == HTPROXY_UNIXTIME) - printf("%ld\n", getTerminationTimeResponse._getTerminationTimeReturn); - else - { - finish_tm = - localtime(&(getTerminationTimeResponse._getTerminationTimeReturn)); - - strftime(timestr, sizeof(timestr), - "%a %b %e %H:%M:%S %Z %Y\n", finish_tm); - - fputs(timestr, stdout); - } - - return 0; - } - else if (method == HTPROXY_MAKE) - { - if (GRSTx509CreateProxyRequest(&reqtxt, &keytxt, NULL) != GRST_RET_OK) - { - fprintf(stderr, "Failed to create internal proxy cert request\n"); - return 1; - } - - if (GRSTx509MakeProxyCert(&proxychain, NULL, reqtxt, cert, key, minutes) - != GRST_RET_OK) - { - fprintf(stderr, "Failed to sign internal proxy cert request\n"); - return 2; - } - - if (GRSTx509StringToChain(&x509_certstack, proxychain) != GRST_RET_OK) - { - fprintf(stderr, "Failed to convert internal proxy chain\n"); - return 3; - } - - if (x509_cert = sk_X509_value(x509_certstack, 0)) - { - certmem = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(certmem, x509_cert) == 1) - { - ptrlen = BIO_get_mem_data(certmem, &ptr); - fwrite(ptr, 1, ptrlen, stdout); - } - - BIO_free(certmem); - } - - fputs(keytxt, stdout); - - for (i=1; i <= sk_X509_num(x509_certstack) - 1; ++i) - /* loop through the proxy chain starting at 2nd most recent proxy */ - { - if (x509_cert = sk_X509_value(x509_certstack, i)) - { - certmem = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(certmem, x509_cert) == 1) - { - ptrlen = BIO_get_mem_data(certmem, &ptr); - fwrite(ptr, 1, ptrlen, stdout); - } - - BIO_free(certmem); - } - } - - sk_X509_free(x509_certstack); - - return 0; - } - else if (method == HTPROXY_INFO) - { - if (cert != NULL) - { - if (verbose) fprintf(stderr, "Getting proxy info from %s\n", cert); - - ifp = fopen(cert, "r"); - if (ifp == NULL) - { - fprintf(stderr, "Failed to open proxy file\n"); - return 2; - } - } - else - { - if (verbose) fprintf(stderr, "Getting proxy info from stdin\n"); - ifp = stdin; - } - - ptrlen = 4096; - ptr = malloc(ptrlen); - i = 0; - - while ((c = fgetc(ifp)) != EOF) - { - ptr[i] = c; - ++i; - - if (i >= ptrlen) - { - ptrlen += 4096; - ptr = realloc(ptr, ptrlen); - } - } - - ptr[i] = '\0'; - if (cert != NULL) fclose(ifp); - - if ((GRSTx509StringToChain(&x509_certstack, ptr) != GRST_RET_OK) || - (x509_certstack == NULL)) - { - fprintf(stderr, "Failed to parse proxy file for certificate chain\n"); - free(ptr); - return 2; - } - -// fprintf(stderr, "%s\n", ptr); - - free(ptr); - - if (verbose) fprintf(stderr, "Parsing certificate chain\n"); - - ret = GRSTx509ChainLoadCheck(&grst_chain, x509_certstack, NULL, capath); - - if ((ret != GRST_RET_OK) || - (grst_chain == NULL) || (grst_chain->firstcert == NULL)) - { - fprintf(stderr, "Failed parsing certificate chain\n"); - return 3; - } - - grst_cert = grst_chain->firstcert; - -// printf("%lu\n", grst_cert); -// printf("%lu\n", grst_cert->type); -// printf("%lu\n", grst_cert->dn); -// printf("%lu\n", grst_cert->next); - -// printf("before for\n"); - for (i=0; - grst_cert != NULL; - grst_cert = grst_cert->next) - { -// printf("inside for %i\n", grst_cert == NULL); - - printf("%d %d %s\n", i, grst_cert->type, grst_cert->dn); - printf("%lu\n", grst_cert->next); - - grst_cert = grst_cert->next; - ++i; - } - - - GRSTx509ChainFree(grst_chain); - } - /* weirdness */ -} - diff --git a/org.gridsite.core/src/make-gridsite-spec b/org.gridsite.core/src/make-gridsite-spec deleted file mode 100755 index 11aed3b..0000000 --- a/org.gridsite.core/src/make-gridsite-spec +++ /dev/null @@ -1,297 +0,0 @@ -#!/bin/sh - -# test to see if fuse-devel (or fuse.h and libfuse) is installed -# -cat <fuse-test.c -#include -int main() { struct fuse_context ctx; -return fuse_main(0, (char **) 0, (struct fuse_operations *) 0); } -EOF -make fuse-test -if [ $? = 0 ] ; then have_fuse=1 ; fi - -# test to see if gsoap-devel (or stdsoap2.h and libgsoapssl) is installed -# -cat <gsoap-test.c -#include -#ifdef SOAP_BEGIN -main() { return; } -#endif -EOF -make GSOAPDIR=$GSOAPDIR gsoap-test -if [ $? = 0 ] ; then have_gsoap=1 ; fi - -cat <gridsite.spec -# -# Autogenerated by make-gridsite-spec -# -# You should modify make-gridsite-spec and rebuild RPM with make rpm -# rather than editing this spec file -# -Name: gridsite -Version: ${PATCH_VERSION:-1.x.x} -# This next piece of .spec/sed magic puts the build OS version in the release -Release: 1%(sed 's/^\([A-Z]\)[^ ]* \([A-Z]\)[^0-9]*\([0-9][^ ]*\).*/\1\2\3/g' /etc/redhat-release | sed 's/[^A-Z,a-z,0-9]//g') -Summary: GridSite -License: Modified BSD -Group: System Environment/Daemons -Source: %{name}-%{version}.src.tar.gz -Prefix: ${MYPREFIX:-/usr} -URL: http://www.gridsite.org/ -Vendor: GridPP -Requires: libxml2 -#Buildrequires: libxml2-devel,curl-ssl-devel,httpd-devel -Packager: Andrew McNab - -%description -GridSite adds GSI, VOMS and GACL support to Apache 2.0 (mod_gridsite), -a library for manipulating these technologies (libgridsite), and CGI -programs for interactive management of HTTP(S) servers (gridsite-admin.cgi) - -See http://www.gridsite.org/ for details. - -%package shared -Group: Development/Libraries -Summary: GridSite shared library and core documentation - -%description shared -GridSite shared library and core documentation - -See http://www.gridsite.org/ for details. - -%package devel -Group: Development/Libraries -Summary: GridSite .a libraries and .h headers - -%description devel -GridSite development libraries - -See http://www.gridsite.org/ for details. - -%package apache -Group: System Environment/Daemons -Summary: GridSite mod_gridsite module for Apache httpd -Requires: gridsite-shared - -%description apache -GridSite Apache module and CGI binaries - -See http://www.gridsite.org/ for details. - -%package commands -Group: Applications/Internet -Summary: HTTP(S) read/write client and other GridSite commands -Requires: curl, gridsite-shared - -%description commands -htcp is a client to fetch files or directory listings from remote -servers using HTTP or HTTPS, or to put or delete files or directories -onto remote servers using HTTPS. htcp is similar to scp(1), but uses -HTTP/HTTPS rather than ssh as its transfer protocol. - -See http://www.gridsite.org/ for details. - -%package gsexec -Group: Applications/Internet -Summary: gsexec binary for the Apache HTTP server - -%description gsexec -This package includes the /usr/sbin/gsexec binary which can be installed -to allow the Apache HTTP server to run CGI programs (and any programs -executed by SSI pages) as a user other than the 'apache' user. gsexec -is a drop-in replacement for suexec, with extended functionality for use -with GridSite and Grid Security credentials. - -See http://www.gridsite.org/ for details. - -%prep - -%setup - -%build -cd src -make prefix=\$RPM_BUILD_ROOT/%{prefix} \ - GSOAPDIR=\$GSOAPDIR OPENSSL_FLAGS=\$OPENSSL_FLAGS \ - OPENSSL_LIBS=\$OPENSSL_LIBS FLAVOR_EXT=\$FLAVOR_EXT - -EOF - -if [ $have_fuse ] ; then -cat <>gridsite.spec -make prefix=\$RPM_BUILD_ROOT/%{prefix} \ - GSOAPDIR=\$GSOAPDIR OPENSSL_FLAGS=\$OPENSSL_FLAGS \ - OPENSSL_LIBS=\$OPENSSL_LIBS FLAVOR_EXT=\$FLAVOR_EXT \ - slashgrid - -EOF -fi - -if [ $have_gsoap ] ; then -cat <>gridsite.spec -make prefix=\$RPM_BUILD_ROOT/%{prefix} \ - GSOAPDIR=\$GSOAPDIR OPENSSL_FLAGS=\$OPENSSL_FLAGS \ - OPENSSL_LIBS=\$OPENSSL_LIBS FLAVOR_EXT=\$FLAVOR_EXT \ - gridsite-delegation.cgi htproxyput - -EOF -fi - -cat <>gridsite.spec - -%install -cd src -make install prefix=\$RPM_BUILD_ROOT/%{prefix} \ -GSOAPDIR=\$GSOAPDIR OPENSSL_FLAGS=\$OPENSSL_FLAGS \ -OPENSSL_LIBS=\$OPENSSL_LIBS FLAVOR_EXT=\$FLAVOR_EXT -EOF - -if [ $have_fuse ] ; then - -cat <>gridsite.spec - -mkdir -p \$RPM_BUILD_ROOT/etc/rc.d/init.d -make install-slashgrid prefix=\$RPM_BUILD_ROOT/%{prefix} \ - GSOAPDIR=\$GSOAPDIR OPENSSL_FLAGS=\$OPENSSL_FLAGS \ - OPENSSL_LIBS=\$OPENSSL_LIBS FLAVOR_EXT=\$FLAVOR_EXT -EOF -fi - -if [ $have_gsoap ] ; then - -cat <>gridsite.spec - -make install-ws prefix=\$RPM_BUILD_ROOT/%{prefix} \ - GSOAPDIR=$GSOAPDIR OPENSSL_FLAGS=\$OPENSSL_FLAGS \ - OPENSSL_LIBS=\$OPENSSL_LIBS FLAVOR_EXT=\$FLAVOR_EXT -EOF -fi - -cat <>gridsite.spec - -%post shared -if [ "\$UID" = "0" ] ; then - /sbin/ldconfig -fi - -%postun -if [ "\$UID" = "0" ] ; then - /sbin/ldconfig -fi - -%files shared -%attr(-, root, root) %{prefix}/lib/libgridsite.so.%{version} -%attr(-, root, root) %{prefix}/lib/libgridsite.so -%attr(-, root, root) %{prefix}/lib/libgridsite_globus.so.%{version} -%attr(-, root, root) %{prefix}/lib/libgridsite_globus.so -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x} - -%files devel -%attr(-, root, root) %{prefix}/include/gridsite.h -%attr(-, root, root) %{prefix}/include/gridsite-gacl.h -%attr(-, root, root) %{prefix}/lib/libgridsite.a -%attr(-, root, root) %{prefix}/lib/libgridsite_globus.a - -%files apache -%attr(-, root, root) %{prefix}/share/man/man8/mod_gridsite.8.gz -%attr(-, root, root) %{prefix}/lib/httpd/modules/mod_gridsite.so -%attr(-, root, root) %{prefix}/sbin/real-gridsite-admin.cgi -%attr(-, root, root) %{prefix}/sbin/gridsite-copy.cgi - -%files commands -%attr(-, root, root) %{prefix}/bin/htcp -%attr(-, root, root) %{prefix}/bin/htls -%attr(-, root, root) %{prefix}/bin/htll -%attr(-, root, root) %{prefix}/bin/htrm -%attr(-, root, root) %{prefix}/bin/htmkdir -%attr(-, root, root) %{prefix}/bin/htmv -%attr(-, root, root) %{prefix}/bin/htping -%attr(-, root, root) %{prefix}/bin/htfind -%attr(-, root, root) %{prefix}/bin/urlencode -%attr(-, root, root) %{prefix}/bin/findproxyfile -%attr(-, root, root) %{prefix}/share/man/man1/htcp.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htrm.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htls.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htll.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htmkdir.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htmv.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htping.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htfind.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/urlencode.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/findproxyfile.1.gz - -%files gsexec -%attr(4510, root, apache) %{prefix}/sbin/gsexec -%attr(-, root, root) %{prefix}/share/man/man8/gsexec.8.gz -EOF - -if [ $have_fuse ] ; then - -cat <>gridsite.spec -%package slashgrid -Group: Applications/Internet -Summary: slashgrid daemon -Requires: curl,fuse,fuse-libs - -%description slashgrid -SlashGrid daemon - -%post slashgrid -mkdir -p /grid - -%preun slashgrid -/sbin/service slashgrid stop ; : - -%files slashgrid -%attr(0744, root, root) %{prefix}/sbin/slashgrid -%attr(0744, root, root) /etc/rc.d/init.d/slashgrid -%attr(0700, root, root) /var/spool/slashgrid -EOF - -fi - -if [ $have_gsoap ] ; then - -cat <>gridsite.spec -%package services -Group: Applications/Internet -Summary: GridSite WS gridsite-delegation.cgi - -%description services -GridSite WS delegation service, gridsite-delegation.cgi - -%files services -%attr(-, root, root) %{prefix}/sbin/gridsite-delegation.cgi -%attr(-, root, root) %{prefix}/share/man/man8/gridsite-delegation.8.gz -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/delegation-1.1.0.wsdl -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/gridsite-delegation.8 - -%package service-clients -Group: Applications/Internet -Summary: GridSite WS htproxyput -Requires: curl, gridsite-shared - -%description service-clients -GridSite WS delegation client, htproxyput - -See http://www.gridsite.org/ for details. - -%files service-clients -%attr(-, root, root) %{prefix}/bin/htproxyput -%attr(-, root, root) %{prefix}/bin/htproxydestroy -%attr(-, root, root) %{prefix}/bin/htproxytime -%attr(-, root, root) %{prefix}/bin/htproxyunixtime -%attr(-, root, root) %{prefix}/bin/htproxyrenew -%attr(-, root, root) %{prefix}/share/man/man1/htproxyput.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htproxydestroy.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htproxytime.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htproxyunixtime.1.gz -%attr(-, root, root) %{prefix}/share/man/man1/htproxyrenew.1.gz -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/htproxyput.1 -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/htproxydestroy.1 -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/htproxytime.1 -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/htproxyunixtime.1 -%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/htproxyrenew.1 -EOF - -fi - diff --git a/org.gridsite.core/src/mod_gridsite.c b/org.gridsite.core/src/mod_gridsite.c deleted file mode 100644 index 1927a0a..0000000 --- a/org.gridsite.core/src/mod_gridsite.c +++ /dev/null @@ -1,3432 +0,0 @@ -/* - Copyright (c) 2003-6, Andrew McNab, Shiv Kaushal, Joseph Dada, - and Yibiao Li, University of Manchester. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - - This program includes code from dav_parse_range() from Apache mod_dav.c, - and associated code contributed by David O Callaghan - - Copyright 2000-2005 The Apache Software Foundation or its licensors, as - applicable. - - Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*------------------------------------------------------------------* - * This program is part of GridSite: http://www.gridsite.org/ * - *------------------------------------------------------------------*/ - -#ifndef VERSION -#define VERSION "x.x.x" -#endif - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "mod_ssl-private.h" - -#include "gridsite.h" - -#ifndef UNSET -#define UNSET -1 -#endif - -#define GRST_SESSIONS_DIR "/var/www/sessions" - -module AP_MODULE_DECLARE_DATA gridsite_module; - -#define GRST_SITECAST_GROUPS 32 - -struct sitecast_group - { int socket; int quad1; int quad2; int quad3; int quad4; int port; }; - -#define GRST_SITECAST_ALIASES 32 - -struct sitecast_alias - { const char *sitecast_url; const char *scheme; int port; - const char *local_path; const char *local_hostname; }; - -/* Globals, defined by main server directives in httpd.conf - These are assigned default values in create_gridsite_srv_config() */ - -int gridhttpport = 0; /* set by create_gridsite_srv_config, used as flag */ -char *sessionsdir = NULL; -char *sitecastdnlists = NULL; -char *ocspmodes = NULL; -struct sitecast_group sitecastgroups[GRST_SITECAST_GROUPS+1]; -struct sitecast_alias sitecastaliases[GRST_SITECAST_ALIASES]; - -typedef struct -{ - int auth; - int envs; - int format; - int indexes; - char *indexheader; - int gridsitelink; - char *adminfile; - char *adminuri; - char *helpuri; - char *dnlists; - char *dnlistsuri; - char *adminlist; - int gsiproxylimit; - char *unzip; - char *methods; - char *editable; - char *headfile; - char *footfile; - int gridhttp; - char *aclformat; - char *execmethod; - char *delegationuri; - ap_unix_identity_t execugid; - apr_fileperms_t diskmode; -} mod_gridsite_dir_cfg; /* per-directory config choices */ - - -/* - * parse_content_range() is loosely - * based on modules/dav/main/mod_dav.c from Apache - */ - -int parse_content_range(request_rec *r, apr_off_t *range_start, - apr_off_t *range_end, apr_off_t *range_length) -{ -// this all needs verifying to be ok for large (>2GB, >4GB) files - - const char *range_c; - char *range; - char *dash; - char *slash; - - range_c = apr_table_get(r->headers_in, "content-range"); - if (range_c == NULL) return 0; - - range = apr_pstrdup(r->pool, range_c); - - if ((strncasecmp(range, "bytes ", 6) != 0) || - ((dash = ap_strchr(range, '-')) == NULL) || - ((slash = ap_strchr(range, '/')) == NULL)) - { - return 0; /* malformed header. ignore it (per S14.16 of RFC2616) */ - } - - *dash = *slash = '\0'; - - // Check for GridSite-specific Content-Range: bytes *-*/LENGTH form - - if ((range[6] == '*') && (dash[1] == '*')) - { - if (slash[1] == '*') return 0; /* invalid truncation length */ - - *range_length = apr_atoi64(&slash[1]); - *range_start = 0; - *range_end = 0; - - return 1; /* a valid (truncation) length */ - } - - *range_length = 0; - *range_start = apr_atoi64(&range[6]); - *range_end = apr_atoi64(&dash[1]); - - if ((*range_end < *range_start) || - ((slash[1] != '*') && (apr_atoi64(&slash[1]) <= *range_end))) - return 0; /* ignore invalid ranges */ - - /* we now have a valid range */ - return 1; -} - -char *make_admin_footer(request_rec *r, mod_gridsite_dir_cfg *conf, - int isdirectory) -/* - make string holding last modified text and admin links -*/ -{ - char *out, *https, *p, *dn = NULL, *file = NULL, *permstr = NULL, - *temp, modified[99], *dir_uri, *grst_cred_0 = NULL; - GRSTgaclPerm perm = GRST_PERM_NONE; - struct tm mtime_tm; - time_t mtime_time; - - https = (char *) apr_table_get(r->subprocess_env, "HTTPS"); - - dir_uri = apr_pstrdup(r->pool, r->uri); - p = rindex(dir_uri, '/'); - - if (p == NULL) return ""; - - file = apr_pstrdup(r->pool, &p[1]); - p[1] = '\0'; - /* dir_uri always gets both a leading and a trailing slash */ - - out = apr_pstrdup(r->pool, "

\n"); - - if (!isdirectory) - { - mtime_time = apr_time_sec(r->finfo.mtime); - - localtime_r(&mtime_time, &mtime_tm); - strftime(modified, sizeof(modified), - "%a %e %B %Y", &mtime_tm); - temp = apr_psprintf(r->pool,"


Last modified %s\n", modified); - out = apr_pstrcat(r->pool, out, temp, NULL); - - if ((conf->adminuri != NULL) && - (conf->adminuri[0] != '\0') && - (conf->adminfile != NULL) && - (conf->adminfile[0] != '\0') && - (strncmp(file, GRST_HIST_PREFIX, sizeof(GRST_HIST_PREFIX)-1) != 0)) - { - temp = apr_psprintf(r->pool, - ". " - "View page history\n", - conf->adminfile, file); - out = apr_pstrcat(r->pool, out, temp, NULL); - } - - out = apr_pstrcat(r->pool, out, "", NULL); - } - - out = apr_pstrcat(r->pool, out, "
", NULL); - - if (r->connection->notes != NULL) - grst_cred_0 = (char *) - apr_table_get(r->connection->notes, "GRST_CRED_0"); - - if ((grst_cred_0 != NULL) && - (strncmp(grst_cred_0, "X509USER ", sizeof("X509USER")) == 0)) - { - p = index(grst_cred_0, ' '); - if (p != NULL) - { - p = index(++p, ' '); - if (p != NULL) - { - p = index(++p, ' '); - if (p != NULL) - { - p = index(++p, ' '); - if (p != NULL) dn = p; - } - } - } - } - - if (dn != NULL) - { - temp = apr_psprintf(r->pool, "You are %s
\n", dn); - out = apr_pstrcat(r->pool, out, temp, NULL); - - if (r->notes != NULL) - permstr = (char *) apr_table_get(r->notes, "GRST_PERM"); - - if ((permstr != NULL) && - (conf->adminuri != NULL) && - (conf->adminuri[0] != '\0') && - (conf->adminfile != NULL) && - (conf->adminfile[0] != '\0')) - { - sscanf(permstr, "%d", &perm); - - if (!isdirectory && - GRSTgaclPermHasWrite(perm) && - (strncmp(file, GRST_HIST_PREFIX, - sizeof(GRST_HIST_PREFIX) - 1) != 0)) - { - temp = apr_psprintf(r->pool, - "" - "Edit page .\n", conf->adminfile, file); - out = apr_pstrcat(r->pool, out, temp, NULL); - } - - if (GRSTgaclPermHasList(perm) || GRSTgaclPermHasWrite(perm)) - { - temp = apr_psprintf(r->pool, - "Manage directory .\n", - dir_uri, conf->adminfile); - - out = apr_pstrcat(r->pool, out, temp, NULL); - } - } - } - - if ((https != NULL) && (strcasecmp(https, "on") == 0)) - temp = apr_psprintf(r->pool, - "Switch to HTTP \n", - r->server->server_hostname, r->unparsed_uri); - else temp = apr_psprintf(r->pool, - "Switch to HTTPS \n", - r->server->server_hostname, r->unparsed_uri); - - out = apr_pstrcat(r->pool, out, temp, NULL); - - if ((conf->helpuri != NULL) && (conf->helpuri[0] != '\0')) - { - temp = apr_psprintf(r->pool, - ". Website Help\n", conf->helpuri); - out = apr_pstrcat(r->pool, out, temp, NULL); - } - - if ((!isdirectory) && - (conf->adminuri != NULL) && - (conf->adminuri[0] != '\0') && - (conf->adminfile != NULL) && - (conf->adminfile[0] != '\0')) - { - temp = apr_psprintf(r->pool, ". " - "Print View\n", conf->adminfile, file); - out = apr_pstrcat(r->pool, out, temp, NULL); - } - - if (conf->gridsitelink) - { - temp = apr_psprintf(r->pool, - ". Built with " - "GridSite %s\n", VERSION); - out = apr_pstrcat(r->pool, out, temp, NULL); - } - - out = apr_pstrcat(r->pool, out, "\n
\n", NULL); - - return out; -} - -void delegation_header(request_rec *r, mod_gridsite_dir_cfg *conf){ - - apr_table_add(r->headers_out, - apr_pstrdup(r->pool, "Proxy-Delegation-Service"), - apr_psprintf(r->pool,"https://%s%s", r->hostname, conf->delegationuri)); - return; - -} - -int html_format(request_rec *r, mod_gridsite_dir_cfg *conf) -/* - try to do GridSite formatting of .html files (NOT .shtml etc) -*/ -{ - int i, fd, errstatus; - char *buf, *p, *file, *s, *head_formatted, *header_formatted, - *body_formatted, *admin_formatted, *footer_formatted; - size_t length; - struct stat statbuf; - apr_file_t *fp; - - if (r->finfo.filetype == APR_NOFILE) return HTTP_NOT_FOUND; - - if (apr_file_open(&fp, r->filename, APR_READ, 0, r->pool) != 0) - return HTTP_INTERNAL_SERVER_ERROR; - - - /* Put in Delegation service header if required */ - if (conf->delegationuri) delegation_header(r, conf); - - file = rindex(r->uri, '/'); - if (file != NULL) ++file; /* file points to name without path */ - - buf = apr_palloc(r->pool, (size_t)(r->finfo.size + 1)); - length = r->finfo.size; - apr_file_read(fp, buf, &length); - buf[r->finfo.size] = '\0'; - apr_file_close(fp); - - /* **** try to find a header file in this or parent directories **** */ - - /* first make a buffer big enough to hold path names we want to try */ - fd = -1; - s = apr_palloc(r->pool, - strlen(r->filename) + strlen(conf->headfile) + 1); - strcpy(s, r->filename); - - for (;;) - { - p = rindex(s, '/'); - if (p == NULL) break; /* failed to find one */ - p[1] = '\0'; - strcat(p, conf->headfile); - - fd = open(s, O_RDONLY); - if (fd != -1) break; /* found one */ - - *p = '\0'; - } - - if (fd == -1) /* not found, so set up not to output one */ - { - head_formatted = apr_pstrdup(r->pool, ""); - header_formatted = apr_pstrdup(r->pool, ""); - body_formatted = buf; - } - else /* found a header file, so set up head and body to surround it */ - { - fstat(fd, &statbuf); - header_formatted = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, header_formatted, statbuf.st_size); - header_formatted[statbuf.st_size] = '\0'; - close(fd); - - p = strstr(buf, "pool, ""); - body_formatted = buf; - } - else - { - *p = '\0'; - head_formatted = buf; - ++p; - - while ((*p != '>') && (*p != '\0')) ++p; - - if (*p == '\0') - { - body_formatted = p; - } - else - { - *p = '\0'; - ++p; - body_formatted = p; - } - } - } - - /* **** remove closing tag from body **** */ - - p = strstr(body_formatted, "pool, - strlen(r->filename) + strlen(conf->footfile) + 1); - strcpy(s, r->filename); - - for (;;) - { - p = rindex(s, '/'); - if (p == NULL) break; /* failed to find one */ - - p[1] = '\0'; - strcat(p, conf->footfile); - - fd = open(s, O_RDONLY); - if (fd != -1) break; /* found one */ - - *p = '\0'; - } - - if (fd == -1) /* failed to find a footer, so set up empty default */ - { - footer_formatted = apr_pstrdup(r->pool, ""); - } - else /* found a footer, so set up to use it */ - { - fstat(fd, &statbuf); - footer_formatted = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, footer_formatted, statbuf.st_size); - footer_formatted[statbuf.st_size] = '\0'; - close(fd); - } - - /* **** can now calculate the Content-Length and output headers **** */ - - length = strlen(head_formatted) + strlen(header_formatted) + - strlen(body_formatted) + strlen(admin_formatted) + - strlen(footer_formatted); - - ap_set_content_length(r, length); - ap_set_content_type(r, "text/html"); - - /* ** output the HTTP body (HTML Head+Body) ** */ - - ap_rputs(head_formatted, r); - ap_rputs(header_formatted, r); - ap_rputs(body_formatted, r); - ap_rputs(admin_formatted, r); - ap_rputs(footer_formatted, r); - - return OK; -} - -int html_dir_list(request_rec *r, mod_gridsite_dir_cfg *conf) -/* - output HTML directory listing, with level of formatting controlled - by GridSiteHtmlFormat/conf->format -*/ -{ - int i, fd, n, nn; - char *buf, *p, *s, *head_formatted, *header_formatted, - *body_formatted, *admin_formatted, *footer_formatted, *temp, - modified[99], *d_namepath, *indexheaderpath, *indexheadertext; - size_t length; - struct stat statbuf; - struct tm mtime_tm; - struct dirent **namelist; - - if (r->finfo.filetype == APR_NOFILE) return HTTP_NOT_FOUND; - - /* Put in Delegation service header if required */ - if (conf->delegationuri) delegation_header(r, conf); - - head_formatted = apr_psprintf(r->pool, - "Directory listing %s\n", r->uri); - - if (conf->format) - { - /* **** try to find a header file in this or parent directories **** */ - - /* first make a buffer big enough to hold path names we want to try */ - fd = -1; - s = apr_palloc(r->pool, - strlen(r->filename) + strlen(conf->headfile) + 1); - strcpy(s, r->filename); - - for (;;) - { - p = rindex(s, '/'); - if (p == NULL) break; /* failed to find one */ - p[1] = '\0'; - strcat(p, conf->headfile); - - fd = open(s, O_RDONLY); - if (fd != -1) break; /* found one */ - - *p = '\0'; - } - - if (fd == -1) /* not found, so set up to output sensible default */ - { - header_formatted = apr_pstrdup(r->pool, ""); - } - else /* found a header file, so set up head and body to surround it */ - { - fstat(fd, &statbuf); - header_formatted = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, header_formatted, statbuf.st_size); - header_formatted[statbuf.st_size] = '\0'; - close(fd); - } - } - else header_formatted = apr_pstrdup(r->pool, ""); - - body_formatted = apr_psprintf(r->pool, - "

Directory listing %s

\n", r->uri); - - if (conf->indexheader != NULL) - { - indexheaderpath = apr_psprintf(r->pool, "%s/%s", r->filename, - conf->indexheader); - fd = open(indexheaderpath, O_RDONLY); - if (fd != -1) - { - fstat(fd, &statbuf); - indexheadertext = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, indexheadertext, statbuf.st_size); - indexheadertext[statbuf.st_size] = '\0'; - close(fd); - - body_formatted = apr_pstrcat(r->pool, body_formatted, - indexheadertext, NULL); - } - } - - body_formatted = apr_pstrcat(r->pool, body_formatted, "

\n", NULL); - - if (r->unparsed_uri[1] != '\0') - body_formatted = apr_pstrcat(r->pool, body_formatted, - "\n", - NULL); - - nn = scandir(r->filename, &namelist, 0, versionsort); - for (n=0; n < nn; ++n) - { - if ((namelist[n]->d_name[0] != '.') && - ((conf->indexheader == NULL) || - (strcmp(conf->indexheader, namelist[n]->d_name) != 0))) - { - d_namepath = apr_psprintf(r->pool, "%s/%s", r->filename, - namelist[n]->d_name); - stat(d_namepath, &statbuf); - - localtime_r(&(statbuf.st_mtime), &mtime_tm); - strftime(modified, sizeof(modified), - "", - &mtime_tm); - - if (S_ISDIR(statbuf.st_mode)) - temp = apr_psprintf(r->pool, - "" - "%s\n", - namelist[n]->d_name, statbuf.st_size, statbuf.st_mtime, - namelist[n]->d_name, - statbuf.st_size, modified); - else temp = apr_psprintf(r->pool, - "" - "%s\n", - namelist[n]->d_name, statbuf.st_size, statbuf.st_mtime, - namelist[n]->d_name, - statbuf.st_size, modified); - - body_formatted = apr_pstrcat(r->pool,body_formatted,temp,NULL); - } - - free(namelist[n]); - } - - free(namelist); - - body_formatted = apr_pstrcat(r->pool, body_formatted, "
[Parent directory]
%R%e %b %y
" - "%s/%ld
" - "%s%ld
\n", NULL); - - if (conf->format) - { - /* **** set up dynamic part of footer to go at end of body **** */ - - admin_formatted = make_admin_footer(r, conf, TRUE); - - /* **** try to find a footer file in this or parent directories **** */ - - /* first make a buffer big enough to hold path names we want to try */ - fd = -1; - s = apr_palloc(r->pool, - strlen(r->filename) + strlen(conf->footfile) + 1); - strcpy(s, r->filename); - - for (;;) - { - p = rindex(s, '/'); - if (p == NULL) break; /* failed to find one */ - - p[1] = '\0'; - strcat(p, conf->footfile); - - fd = open(s, O_RDONLY); - if (fd != -1) break; /* found one */ - - *p = '\0'; - } - - if (fd == -1) /* failed to find a footer, so use standard default */ - { - footer_formatted = apr_pstrdup(r->pool, ""); - } - else /* found a footer, so set up to use it */ - { - fstat(fd, &statbuf); - footer_formatted = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, footer_formatted, statbuf.st_size); - footer_formatted[statbuf.st_size] = '\0'; - close(fd); - } - } - else - { - admin_formatted = apr_pstrdup(r->pool, ""); - footer_formatted = apr_pstrdup(r->pool, ""); - } - - /* **** can now calculate the Content-Length and output headers **** */ - - length = strlen(head_formatted) + strlen(header_formatted) + - strlen(body_formatted) + strlen(admin_formatted) + - strlen(footer_formatted); - - ap_set_content_length(r, length); - ap_set_content_type(r, "text/html"); - - /* ** output the HTTP body (HTML Head+Body) ** */ - - ap_rputs(head_formatted, r); - ap_rputs(header_formatted, r); - ap_rputs(body_formatted, r); - ap_rputs(admin_formatted, r); - ap_rputs(footer_formatted, r); - - return OK; -} - -int http_gridhttp(request_rec *r, mod_gridsite_dir_cfg *conf) -{ - int i; - char *httpurl, *filetemplate, *cookievalue, *envname_i, - *grst_cred_i, expires_str[APR_RFC822_DATE_LEN]; - apr_uint64_t gridauthcookie; - apr_table_t *env; - apr_time_t expires_time; - apr_file_t *fp; - - /* create random cookie and gridauthcookie file */ - - if (apr_generate_random_bytes((char *) &gridauthcookie, - sizeof(gridauthcookie)) - != APR_SUCCESS) return HTTP_INTERNAL_SERVER_ERROR; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Generated GridHTTP passcode %016llx", gridauthcookie); - - filetemplate = apr_psprintf(r->pool, "%s/passcode-%016llxXXXXXX", - ap_server_root_relative(r->pool, - sessionsdir), - gridauthcookie); - - if (apr_file_mktemp(&fp, - filetemplate, - APR_CREATE | APR_WRITE | APR_EXCL, - r->pool) - != APR_SUCCESS) return HTTP_INTERNAL_SERVER_ERROR; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Created passcode file %s", filetemplate); - - expires_time = apr_time_now() + apr_time_from_sec(300); - /* passcode cookies are valid for only 5 mins! */ - - apr_file_printf(fp, - "expires=%lu\ndomain=%s\npath=%s\nonetime=yes\nmethod=%s\n", - (time_t) apr_time_sec(expires_time), - r->hostname, r->uri, r->method); - /* above variables are evaluated in order and method= MUST be last! */ - - for (i=0; ; ++i) - { - envname_i = apr_psprintf(r->pool, "GRST_CRED_%d", i); - if (grst_cred_i = (char *) - apr_table_get(r->connection->notes, envname_i)) - { - apr_file_printf(fp, "%s=%s\n", envname_i, grst_cred_i); - } - else break; /* GRST_CRED_i are numbered consecutively */ - } - - if (apr_file_close(fp) != APR_SUCCESS) - { - apr_file_remove(filetemplate, r->pool); /* try to clean up */ - return HTTP_INTERNAL_SERVER_ERROR; - } - - /* send redirection header back to client */ - - cookievalue = rindex(filetemplate, '-'); - if (cookievalue != NULL) ++cookievalue; - else cookievalue = filetemplate; - - apr_rfc822_date(expires_str, expires_time); - - apr_table_add(r->headers_out, - apr_pstrdup(r->pool, "Set-Cookie"), - apr_psprintf(r->pool, - "GRIDHTTP_PASSCODE=%s; " - "expires=%s; " - "domain=%s; " - "path=%s", - cookievalue, expires_str, r->hostname, r->uri)); - - if (gridhttpport != DEFAULT_HTTP_PORT) - httpurl = apr_psprintf(r->pool, "http://%s:%d%s", r->hostname, - gridhttpport, ap_escape_uri(r->pool, r->uri)); - else httpurl = apr_pstrcat(r->pool, "http://", r->hostname, - ap_escape_uri(r->pool, r->uri), NULL); - - apr_table_setn(r->headers_out, apr_pstrdup(r->pool, "Location"), httpurl); - - r->status = HTTP_MOVED_TEMPORARILY; - return OK; -} - -int http_put_method(request_rec *r, mod_gridsite_dir_cfg *conf) -{ - char buf[2048], *filename, *dirname, *basename; - const char *p; - size_t block_length, length_sent; - int retcode, stat_ret; - apr_file_t *fp; - struct stat statbuf; - int has_range = 0, is_done = 0; - apr_off_t range_start, range_end, range_length, length_to_send, length = 0; - - /* *** check if directory creation: PUT /.../ *** */ - - if ((r->unparsed_uri != NULL) && - (r->unparsed_uri[0] != '\0') && - (r->unparsed_uri[strlen(r->unparsed_uri) - 1] == '/')) - { - if (apr_dir_make(r->filename, - conf->diskmode - | APR_UEXECUTE | APR_GEXECUTE | APR_WEXECUTE, - r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR; - - /* we force the permissions, rather than accept any existing ones */ - - apr_file_perms_set(r->filename, conf->diskmode - | APR_UEXECUTE | APR_GEXECUTE | APR_WEXECUTE); - - ap_set_content_length(r, 0); - ap_set_content_type(r, "text/html"); - return OK; - } - - /* *** otherwise assume trying to create a regular file *** */ - - stat_ret = stat(r->filename, &statbuf); - - /* find if a range is specified */ - - has_range = parse_content_range(r, &range_start, &range_end, &range_length); - - if (has_range) - { - if ((range_start == 0) && (range_end == 0)) /* truncate? */ - { - if (stat_ret != 0) return HTTP_NOT_FOUND; - - if (truncate(r->filename, range_length) != 0) - return HTTP_INTERNAL_SERVER_ERROR; - else return OK; - } - - filename = r->filename; - - if (apr_file_open(&fp, filename, APR_WRITE | APR_CREATE | APR_BUFFERED, - conf->diskmode, r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR; - } - else /* use temporary file if not a partial transfer */ - { - dirname = apr_pstrdup(r->pool, r->filename); - basename = rindex(dirname, '/'); - if (basename == NULL) return HTTP_INTERNAL_SERVER_ERROR; - - *basename = '\0'; - ++basename; - - filename = apr_psprintf(r->pool, - "%s/.grsttmp-%s-XXXXXX", dirname, basename); - - if (apr_file_mktemp(&fp, filename, - APR_CREATE | APR_WRITE | APR_BUFFERED | APR_EXCL, r->pool) - != APR_SUCCESS) return HTTP_INTERNAL_SERVER_ERROR; -/* - p = apr_table_get(r->headers_in, "Content-Length"); - if (p != NULL) - { - length = (apr_off_t) atol(p); - if (length > 16384) - { - if (apr_file_seek(fp, APR_SET, &length) == 0) - { - block_length = 1; - apr_file_write(fp, "0", &block_length); - } - - apr_file_seek(fp, APR_SET, 0); - } - } -*/ - } - - /* we force the permissions, rather than accept any existing ones */ - - apr_file_perms_set(filename, conf->diskmode); - - if (has_range) - { - if (apr_file_seek(fp, APR_SET, &range_start) != 0) - { - retcode = HTTP_INTERNAL_SERVER_ERROR; - return retcode; - } - - length_to_send = range_end - range_start + 1; - } - - retcode = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK); - if (retcode == OK) - { - if (has_range) length_sent = 0; - - if (ap_should_client_block(r)) - while ((block_length = ap_get_client_block(r, buf, sizeof(buf))) > 0) - { - if (has_range && (length_sent + block_length > length_to_send)) - { - block_length = length_to_send - length_sent; - is_done = 1; - } - - if (apr_file_write(fp, buf, &block_length) != 0) - { - retcode = HTTP_INTERNAL_SERVER_ERROR; - break; - } - - if (has_range) - { - if (is_done) break; - else length_sent += block_length; - } - } - ap_set_content_length(r, 0); - ap_set_content_type(r, "text/html"); - } - - if ((apr_file_close(fp) != 0) || (retcode == HTTP_INTERNAL_SERVER_ERROR)) - { - if (strcmp(filename, r->filename) != 0) remove(filename); - return HTTP_INTERNAL_SERVER_ERROR; - } - - if ((strcmp(filename, r->filename) != 0) && - (apr_file_rename(filename, r->filename, r->pool) != 0)) - return HTTP_FORBIDDEN; /* best guess as to the problem ... */ - - if ((retcode == OK) && (stat_ret != 0)) - { - retcode = HTTP_CREATED; - ap_custom_response(r, HTTP_CREATED, ""); - } - - return retcode; -} - -int http_delete_method(request_rec *r, mod_gridsite_dir_cfg *conf) -{ - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Try remove(%s)", r->filename); - - if (remove(r->filename) != 0) return HTTP_FORBIDDEN; - - ap_set_content_length(r, 0); - ap_set_content_type(r, "text/html"); - - return OK; -} - -int http_move_method(request_rec *r, mod_gridsite_dir_cfg *conf) -{ - char *destination_translated = NULL; - - if (r->notes != NULL) destination_translated = - (char *) apr_table_get(r->notes, "GRST_DESTINATION_TRANSLATED"); - - if (destination_translated == NULL) return HTTP_BAD_REQUEST; - - if (strcmp(r->filename, destination_translated) == 0) - return HTTP_FORBIDDEN; - - if (apr_file_rename(r->filename, destination_translated, r->pool) != 0) - return HTTP_FORBIDDEN; - - ap_set_content_length(r, 0); - ap_set_content_type(r, "text/html"); - - return OK; -} - -static int mod_gridsite_dir_handler(request_rec *r, mod_gridsite_dir_cfg *conf) -/* - handler switch for directories -*/ -{ - /* *** is this a write method? only possible if GridSiteAuth on *** */ - - if (conf->auth) - { - if ((r->method_number == M_PUT) && - (conf->methods != NULL) && - (strstr(conf->methods, " PUT " ) != NULL)) - return http_put_method(r, conf); - - if ((r->method_number == M_DELETE) && - (conf->methods != NULL) && - (strstr(conf->methods, " DELETE ") != NULL)) - return http_delete_method(r, conf); - } - - /* *** directory listing? *** */ - if ((r->method_number == M_GET) && (conf->indexes)) - return html_dir_list(r, conf); /* directory listing */ - - return DECLINED; /* *** nothing to see here, move along *** */ -} - -static int mod_gridsite_nondir_handler(request_rec *r, mod_gridsite_dir_cfg *conf) -/* - one big handler switch for everything other than directories, since we - might be responding to MIME * / * for local PUT, MOVE, COPY and DELETE, - and GET inside ghost directories. -*/ -{ - char *upgradeheader, *upgradespaced, *p; - const char *https_env; - - /* *** is this a write method or GridHTTP HTTPS->HTTP redirection? - only possible if GridSiteAuth on *** */ - - if (conf->auth) - { - if ((conf->gridhttp) && - ((r->method_number == M_GET) || - ((r->method_number == M_PUT) && - (strstr(conf->methods, " PUT ") != NULL))) && - ((upgradeheader = (char *) apr_table_get(r->headers_in, - "Upgrade")) != NULL) && - ((https_env=apr_table_get(r->subprocess_env,"HTTPS")) != NULL) && - (strcasecmp(https_env, "on") == 0)) - { - upgradespaced = apr_psprintf(r->pool, " %s ", upgradeheader); - - for (p=upgradespaced; *p != '\0'; ++p) - if ((*p == ',') || (*p == '\t')) *p = ' '; - -// TODO: what if we're pointing at a CGI or some dynamic content??? - - if (strstr(upgradespaced, " GridHTTP/1.0 ") != NULL) - return http_gridhttp(r, conf); - } - - if ((r->method_number == M_PUT) && - (conf->methods != NULL) && - (strstr(conf->methods, " PUT " ) != NULL)) - return http_put_method(r, conf); - - if ((r->method_number == M_DELETE) && - (conf->methods != NULL) && - (strstr(conf->methods, " DELETE ") != NULL)) - return http_delete_method(r, conf); - - if ((r->method_number == M_MOVE) && - (conf->methods != NULL) && - (strstr(conf->methods, " MOVE ") != NULL)) - return http_move_method(r, conf); - } - - /* *** check if a special ghost admin CGI *** */ - - if (conf->adminfile && conf->adminuri && - (strlen(r->filename) > strlen(conf->adminfile) + 1) && - (strcmp(&(r->filename[strlen(r->filename) - strlen(conf->adminfile)]), - conf->adminfile) == 0) && - (r->filename[strlen(r->filename)-strlen(conf->adminfile)-1] == '/') && - ((r->method_number == M_POST) || - (r->method_number == M_GET))) - { - ap_internal_redirect(conf->adminuri, r); - return OK; - } - - /* *** finally look for .html files that we should format *** */ - - if ((conf->format) && /* conf->format set by GridSiteHtmlFormat on */ - (strlen(r->filename) > 5) && - (strcmp(&(r->filename[strlen(r->filename)-5]), ".html") == 0) && - (r->method_number == M_GET)) return html_format(r, conf); - - return DECLINED; /* *** nothing to see here, move along *** */ -} - -static void recurse4dirlist(char *dirname, time_t *dirs_time, - char *fulluri, int fullurilen, - char *encfulluri, int enclen, - apr_pool_t *pool, char **body, - int recurse_level) -/* try to find DN Lists in dir[] and its subdirs that match the fulluri[] - prefix. add blobs of HTML to body as they are found. */ -{ - char *unencname, modified[99], *oneline, *d_namepath; - DIR *oneDIR; - struct dirent *onedirent; - struct tm mtime_tm; - size_t length; - struct stat statbuf; - - if ((stat(dirname, &statbuf) != 0) || - (!S_ISDIR(statbuf.st_mode)) || - ((oneDIR = opendir(dirname)) == NULL)) return; - - if (statbuf.st_mtime > *dirs_time) *dirs_time = statbuf.st_mtime; - - while ((onedirent = readdir(oneDIR)) != NULL) - { - if (onedirent->d_name[0] == '.') continue; - - d_namepath = apr_psprintf(pool, "%s/%s", dirname, onedirent->d_name); - if (stat(d_namepath, &statbuf) != 0) continue; - - if (S_ISDIR(statbuf.st_mode) && (recurse_level < GRST_RECURS_LIMIT)) - recurse4dirlist(d_namepath, dirs_time, fulluri, - fullurilen, encfulluri, enclen, - pool, body, recurse_level + 1); - else if ((strncmp(onedirent->d_name, encfulluri, enclen) == 0) && - (onedirent->d_name[strlen(onedirent->d_name) - 1] != '~')) - { - unencname = GRSThttpUrlDecode(onedirent->d_name); - - if (strncmp(unencname, fulluri, fullurilen) == 0) - { - - if (statbuf.st_mtime > *dirs_time) - *dirs_time = statbuf.st_mtime; - - localtime_r(&(statbuf.st_mtime), &mtime_tm); - strftime(modified, sizeof(modified), - "%R%e %b %y", - &mtime_tm); - - oneline = apr_psprintf(pool, - "" - "%s" - "%ld%s\n", - &unencname[fullurilen], statbuf.st_size, - statbuf.st_mtime, unencname, - statbuf.st_size, modified); - - *body = apr_pstrcat(pool, *body, oneline, NULL); - } - - free(unencname); /* libgridsite doesnt use pools */ - } - } - - closedir(oneDIR); -} - -static int mod_gridsite_dnlistsuri_dir_handler(request_rec *r, - mod_gridsite_dir_cfg *conf) -/* - virtual DN-list file lister: make all DN lists on the dn-lists - path of this server appear to be in the dn-lists directory itself - (ie where they appear in the DN lists path doesnt matter, as long - as their name matches) -*/ -{ - int enclen, fullurilen, fd; - char *fulluri, *encfulluri, *dn_list_ptr, *dirname, *unencname, - *body, *oneline, *p, *s, - *head_formatted, *header_formatted, *footer_formatted, - *permstr = NULL; - struct stat statbuf; - size_t length; - time_t dirs_time = 0; - GRSTgaclPerm perm = GRST_PERM_NONE; - - if (r->notes != NULL) - permstr = (char *) apr_table_get(r->notes, "GRST_PERM"); - - if (permstr != NULL) sscanf(permstr, "%d", &perm); - - fulluri = apr_psprintf(r->pool, "https://%s%s", - ap_get_server_name(r), conf->dnlistsuri); - fullurilen = strlen(fulluri); - - encfulluri = GRSThttpUrlEncode(fulluri); - enclen = strlen(encfulluri); - - if (conf->dnlists != NULL) p = conf->dnlists; - else p = getenv("GRST_DN_LISTS"); - - if (p == NULL) p = GRST_DN_LISTS; - dn_list_ptr = apr_pstrdup(r->pool, p); - - head_formatted = apr_psprintf(r->pool, - "Directory listing %s\n", r->uri); - - if (conf->format) - { - /* **** try to find a header file in this or parent directories **** */ - - /* first make a buffer big enough to hold path names we want to try */ - fd = -1; - s = malloc(strlen(r->filename) + strlen(conf->headfile) + 1); - strcpy(s, r->filename); - - for (;;) - { - p = rindex(s, '/'); - if (p == NULL) break; /* failed to find one */ - p[1] = '\0'; - strcat(p, conf->headfile); - - fd = open(s, O_RDONLY); - if (fd != -1) break; /* found one */ - - *p = '\0'; - } - - free(s); - - if (fd == -1) /* not found, so set up to output sensible default */ - { - header_formatted = apr_pstrdup(r->pool, ""); - } - else /* found a header file, so set up head and body to surround it */ - { - fstat(fd, &statbuf); - header_formatted = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, header_formatted, statbuf.st_size); - header_formatted[statbuf.st_size] = '\0'; - close(fd); - } - } - else header_formatted = apr_pstrdup(r->pool, ""); - - body = apr_psprintf(r->pool, - "

Directory listing %s

\n", r->uri); - - if ((r->uri)[1] != '\0') - body = apr_pstrcat(r->pool, body, - "\n", - NULL); - - while ((dirname = strsep(&dn_list_ptr, ":")) != NULL) - recurse4dirlist(dirname, &dirs_time, fulluri, fullurilen, - encfulluri, enclen, r->pool, &body, 0); - - if ((stat(r->filename, &statbuf) == 0) && - S_ISDIR(statbuf.st_mode) && - GRSTgaclPermHasWrite(perm)) - { - oneline = apr_psprintf(r->pool, - "\n" - "" - "\n", - r->uri, conf->adminfile); - - body = apr_pstrcat(r->pool, body, oneline, NULL); - } - - body = apr_pstrcat(r->pool, body, "
[Parent directory]
\n", NULL); - - free(encfulluri); /* libgridsite doesnt use pools */ - - if (conf->format) - { - /* **** try to find a footer file in this or parent directories **** */ - - /* first make a buffer big enough to hold path names we want to try */ - fd = -1; - s = malloc(strlen(r->filename) + strlen(conf->footfile)); - strcpy(s, r->filename); - - for (;;) - { - p = rindex(s, '/'); - if (p == NULL) break; /* failed to find one */ - - p[1] = '\0'; - strcat(p, conf->footfile); - - fd = open(s, O_RDONLY); - if (fd != -1) break; /* found one */ - - *p = '\0'; - } - - free(s); - - if (fd == -1) /* failed to find a footer, so use standard default */ - { - footer_formatted = apr_pstrdup(r->pool, ""); - } - else /* found a footer, so set up to use it */ - { - fstat(fd, &statbuf); - footer_formatted = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, footer_formatted, statbuf.st_size); - footer_formatted[statbuf.st_size] = '\0'; - close(fd); - } - } - else footer_formatted = apr_pstrdup(r->pool, ""); - - /* **** can now calculate the Content-Length and output headers **** */ - - length = strlen(head_formatted) + strlen(header_formatted) + - strlen(body) + strlen(footer_formatted); - - ap_set_content_length(r, length); - r->mtime = apr_time_from_sec(dirs_time); - ap_set_last_modified(r); - ap_set_content_type(r, "text/html"); - - /* ** output the HTTP body (HTML Head+Body) ** */ - ap_rputs(head_formatted, r); - ap_rputs(header_formatted, r); - ap_rputs(body, r); - ap_rputs(footer_formatted, r); - - return OK; -} - -static char *recurse4file(char *dir, char *file, apr_pool_t *pool, - int recurse_level) -/* try to find file[] in dir[]. try subdirs if not found. - return full path to first found version or NULL on failure */ -{ - char *fullfilename, *fulldirname; - struct stat statbuf; - DIR *dirDIR; - struct dirent *file_ent; - - /* try to find in current directory */ - - fullfilename = apr_psprintf(pool, "%s/%s", dir, file); - - if (stat(fullfilename, &statbuf) == 0) return fullfilename; - - /* maybe search in subdirectories */ - - if (recurse_level >= GRST_RECURS_LIMIT) return NULL; - - dirDIR = opendir(dir); - - if (dirDIR == NULL) return NULL; - - while ((file_ent = readdir(dirDIR)) != NULL) - { - if (file_ent->d_name[0] == '.') continue; - - fulldirname = apr_psprintf(pool, "%s/%s", dir, file_ent->d_name); - if ((stat(fulldirname, &statbuf) == 0) && - S_ISDIR(statbuf.st_mode) && - ((fullfilename = recurse4file(fulldirname, file, - pool, recurse_level + 1)) != NULL)) - { - closedir(dirDIR); - return fullfilename; - } - } - - closedir(dirDIR); - - return NULL; -} - -static int mod_gridsite_dnlistsuri_handler(request_rec *r, - mod_gridsite_dir_cfg *conf) -/* - virtual DN-list file generator -*/ -{ - int fd; - char *fulluri, *encfulluri, *dn_list_ptr, *filename, *dirname, *p, - *buf; - struct stat statbuf; - - /* *** check if a special ghost admin CGI *** */ - - if (conf->adminfile && conf->adminuri && - (strlen(r->filename) > strlen(conf->adminfile) + 1) && - (strcmp(&(r->filename[strlen(r->filename) - strlen(conf->adminfile)]), - conf->adminfile) == 0) && - (r->filename[strlen(r->filename)-strlen(conf->adminfile)-1] == '/') && - ((r->method_number == M_POST) || - (r->method_number == M_GET))) - { - ap_internal_redirect(conf->adminuri, r); - return OK; - } - - fulluri = apr_psprintf(r->pool, "https://%s%s", - ap_get_server_name(r), r->uri); - - encfulluri = GRSThttpUrlEncode(fulluri); - - if (conf->dnlists != NULL) p = conf->dnlists; - else p = getenv("GRST_DN_LISTS"); - - if (p == NULL) p = GRST_DN_LISTS; - dn_list_ptr = apr_pstrdup(r->pool, p); - - while ((dirname = strsep(&dn_list_ptr, ":")) != NULL) - { - filename = recurse4file(dirname, encfulluri, r->pool, 0); - - if (filename == NULL) continue; - - fd = open(filename, O_RDONLY); - - if (fd == -1) continue; - - fstat(fd, &statbuf); - ap_set_content_length(r, (apr_off_t) statbuf.st_size); - r->mtime = apr_time_from_sec(statbuf.st_mtime); - ap_set_content_type(r, "text/plain"); - ap_set_last_modified(r); - - buf = apr_palloc(r->pool, statbuf.st_size + 1); - read(fd, buf, statbuf.st_size); - buf[statbuf.st_size] = '\0'; - - ap_rputs(buf, r); - - close(fd); - - return OK; - } - - return HTTP_NOT_FOUND; -} - -static void *create_gridsite_srv_config(apr_pool_t *p, server_rec *s) -{ - int i; - - /* only run once (in base server) */ - if (!(s->is_virtual) && (gridhttpport == 0)) - { - gridhttpport = GRST_HTTP_PORT; - - sessionsdir = apr_pstrdup(p, GRST_SESSIONS_DIR); - /* GridSiteSessionsDir dir-path */ - - sitecastdnlists = NULL; - - sitecastgroups[0].quad1 = 0; - sitecastgroups[0].quad2 = 0; - sitecastgroups[0].quad3 = 0; - sitecastgroups[0].quad4 = 0; - sitecastgroups[0].port = GRST_HTCP_PORT; - /* GridSiteCastUniPort udp-port */ - - for (i=1; i <= GRST_SITECAST_GROUPS; ++i) - { - sitecastgroups[i].port = 0; /* GridSiteCastGroup mcast-list */ - } - - for (i=1; i <= GRST_SITECAST_ALIASES; ++i) - { - sitecastaliases[i].sitecast_url = NULL; - sitecastaliases[i].port = 0; - sitecastaliases[i].scheme = NULL; - sitecastaliases[i].local_path = NULL; - sitecastaliases[i].local_hostname = NULL; - } /* GridSiteCastAlias url path */ - } - - return NULL; -} - -static void *create_gridsite_dir_config(apr_pool_t *p, char *path) -{ - mod_gridsite_dir_cfg *conf = apr_palloc(p, sizeof(*conf)); - - if (path == NULL) /* set up document root defaults */ - { - conf->auth = 0; /* GridSiteAuth on/off */ - conf->envs = 1; /* GridSiteEnvs on/off */ - conf->format = 0; /* GridSiteHtmlFormat on/off */ - conf->indexes = 0; /* GridSiteIndexes on/off */ - conf->indexheader = NULL; /* GridSiteIndexHeader File-value */ - conf->gridsitelink = 1; /* GridSiteLink on/off */ - conf->adminfile = apr_pstrdup(p, GRST_ADMIN_FILE); - /* GridSiteAdminFile File-value */ - conf->adminuri = NULL; /* GridSiteAdminURI URI-value */ - conf->helpuri = NULL; /* GridSiteHelpURI URI-value */ - conf->dnlists = NULL; /* GridSiteDNlists Search-path */ - conf->dnlistsuri = NULL; /* GridSiteDNlistsURI URI-value */ - conf->adminlist = NULL; /* GridSiteAdminList URI-value */ - conf->gsiproxylimit = 1; /* GridSiteGSIProxyLimit number */ - conf->unzip = NULL; /* GridSiteUnzip file-path */ - - conf->methods = apr_pstrdup(p, " GET "); - /* GridSiteMethods methods */ - - conf->editable = apr_pstrdup(p, " txt shtml html htm css js php jsp "); - /* GridSiteEditable types */ - - conf->headfile = apr_pstrdup(p, GRST_HEADFILE); - conf->footfile = apr_pstrdup(p, GRST_FOOTFILE); - /* GridSiteHeadFile and GridSiteFootFile file name */ - - conf->gridhttp = 0; /* GridSiteGridHTTP on/off */ - conf->aclformat = apr_pstrdup(p, "GACL"); - /* GridSiteACLFormat gacl/xacml */ - conf->delegationuri = NULL; /* GridSiteDelegationURI URI-value */ - conf->execmethod = NULL; - /* GridSiteExecMethod nosetuid/suexec/X509DN/directory */ - - conf->execugid.uid = 0; /* GridSiteUserGroup User Group */ - conf->execugid.gid = 0; /* ditto */ - conf->execugid.userdir = 0; /* ditto */ - - conf->diskmode = APR_UREAD | APR_UWRITE; - /* GridSiteDiskMode group-mode world-mode - GroupNone | GroupRead | GroupWrite WorldNone | WorldRead */ - } - else - { - conf->auth = UNSET; /* GridSiteAuth on/off */ - conf->envs = UNSET; /* GridSiteEnvs on/off */ - conf->format = UNSET; /* GridSiteHtmlFormat on/off */ - conf->indexes = UNSET; /* GridSiteIndexes on/off */ - conf->indexheader = NULL; /* GridSiteIndexHeader File-value */ - conf->gridsitelink = UNSET; /* GridSiteLink on/off */ - conf->adminfile = NULL; /* GridSiteAdminFile File-value */ - conf->adminuri = NULL; /* GridSiteAdminURI URI-value */ - conf->helpuri = NULL; /* GridSiteHelpURI URI-value */ - conf->dnlists = NULL; /* GridSiteDNlists Search-path */ - conf->dnlistsuri = NULL; /* GridSiteDNlistsURI URI-value */ - conf->adminlist = NULL; /* GridSiteAdminList URI-value */ - conf->gsiproxylimit = UNSET; /* GridSiteGSIProxyLimit number */ - conf->unzip = NULL; /* GridSiteUnzip file-path */ - conf->methods = NULL; /* GridSiteMethods methods */ - conf->editable = NULL; /* GridSiteEditable types */ - conf->headfile = NULL; /* GridSiteHeadFile file name */ - conf->footfile = NULL; /* GridSiteFootFile file name */ - conf->gridhttp = UNSET; /* GridSiteGridHTTP on/off */ - conf->aclformat = NULL; /* GridSiteACLFormat gacl/xacml */ - conf->delegationuri = NULL; /* GridSiteDelegationURI URI-value */ - conf->execmethod = NULL; /* GridSiteExecMethod */ - conf->execugid.uid = UNSET; /* GridSiteUserGroup User Group */ - conf->execugid.gid = UNSET; /* ditto */ - conf->execugid.userdir = UNSET; /* ditto */ - conf->diskmode = UNSET; /* GridSiteDiskMode group world */ - } - - return conf; -} - -static void *merge_gridsite_dir_config(apr_pool_t *p, void *vserver, - void *vdirect) -/* merge directory with server-wide directory configs */ -{ - mod_gridsite_dir_cfg *conf, *server, *direct; - - server = (mod_gridsite_dir_cfg *) vserver; - direct = (mod_gridsite_dir_cfg *) vdirect; - conf = apr_palloc(p, sizeof(*conf)); - - if (direct->auth != UNSET) conf->auth = direct->auth; - else conf->auth = server->auth; - - if (direct->envs != UNSET) conf->envs = direct->envs; - else conf->envs = server->envs; - - if (direct->format != UNSET) conf->format = direct->format; - else conf->format = server->format; - - if (direct->indexes != UNSET) conf->indexes = direct->indexes; - else conf->indexes = server->indexes; - - if (direct->gridsitelink != UNSET) conf->gridsitelink=direct->gridsitelink; - else conf->gridsitelink=server->gridsitelink; - - if (direct->indexheader != NULL) conf->indexheader = direct->indexheader; - else conf->indexheader = server->indexheader; - - if (direct->adminfile != NULL) conf->adminfile = direct->adminfile; - else conf->adminfile = server->adminfile; - - if (direct->adminuri != NULL) conf->adminuri = direct->adminuri; - else conf->adminuri = server->adminuri; - - if (direct->helpuri != NULL) conf->helpuri = direct->helpuri; - else conf->helpuri = server->helpuri; - - if (direct->dnlists != NULL) conf->dnlists = direct->dnlists; - else conf->dnlists = server->dnlists; - - if (direct->dnlistsuri != NULL) conf->dnlistsuri = direct->dnlistsuri; - else conf->dnlistsuri = server->dnlistsuri; - - if (direct->adminlist != NULL) conf->adminlist = direct->adminlist; - else conf->adminlist = server->adminlist; - - if (direct->gsiproxylimit != UNSET) - conf->gsiproxylimit = direct->gsiproxylimit; - else conf->gsiproxylimit = server->gsiproxylimit; - - if (direct->unzip != NULL) conf->unzip = direct->unzip; - else conf->unzip = server->unzip; - - if (direct->methods != NULL) conf->methods = direct->methods; - else conf->methods = server->methods; - - if (direct->editable != NULL) conf->editable = direct->editable; - else conf->editable = server->editable; - - if (direct->headfile != NULL) conf->headfile = direct->headfile; - else conf->headfile = server->headfile; - - if (direct->footfile != NULL) conf->footfile = direct->footfile; - else conf->footfile = server->footfile; - - if (direct->gridhttp != UNSET) conf->gridhttp = direct->gridhttp; - else conf->gridhttp = server->gridhttp; - - if (direct->aclformat != NULL) conf->aclformat = direct->aclformat; - else conf->aclformat = server->aclformat; - - if (direct->delegationuri != NULL) conf->delegationuri = direct->delegationuri; - else conf->delegationuri = server->delegationuri; - - if (direct->execmethod != NULL) conf->execmethod = direct->execmethod; - else conf->execmethod = server->execmethod; - - if (direct->execugid.uid != UNSET) - { conf->execugid.uid = direct->execugid.uid; - conf->execugid.gid = direct->execugid.gid; - conf->execugid.userdir = direct->execugid.userdir; } - else - { conf->execugid.uid = server->execugid.uid; - conf->execugid.gid = server->execugid.gid; - conf->execugid.userdir = server->execugid.userdir; } - - if (direct->diskmode != UNSET) conf->diskmode = direct->diskmode; - else conf->diskmode = server->diskmode; - - return conf; -} - -static const char *mod_gridsite_take1_cmds(cmd_parms *a, void *cfg, - const char *parm) -{ - int n, i; - char *p; - - if (strcasecmp(a->cmd->name, "GridSiteSessionsDir") == 0) - { - if (a->server->is_virtual) - return "GridSiteSessionsDir cannot be used inside a virtual server"; - - sessionsdir = apr_pstrdup(a->pool, parm); - } -/* GridSiteOnetimesDir is deprecated in favour of GridSiteSessionsDir */ - else if (strcasecmp(a->cmd->name, "GridSiteOnetimesDir") == 0) - { - if (a->server->is_virtual) - return "GridSiteOnetimesDir cannot be used inside a virtual server"; - - sessionsdir = apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteGridHTTPport") == 0) - { - gridhttpport = atoi(parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteCastDNlists") == 0) - { - if (a->server->is_virtual) - return "GridSiteDNlists cannot be used inside a virtual server"; - - sitecastdnlists = apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteCastUniPort") == 0) - { - if (a->server->is_virtual) - return "GridSiteCastUniPort cannot be used inside a virtual server"; - - if (sscanf(parm, "%d", &(sitecastgroups[0].port)) != 1) - return "Failed parsing GridSiteCastUniPort numeric value"; - } - else if (strcasecmp(a->cmd->name, "GridSiteCastGroup") == 0) - { - if (a->server->is_virtual) - return "GridSiteCastGroup cannot be used inside a virtual server"; - - for (i=1; i <= GRST_SITECAST_GROUPS; ++i) - { - if (sitecastgroups[i].port == 0) /* a free slot */ - { - sitecastgroups[i].port = GRST_HTCP_PORT; - - if (sscanf(parm, "%d.%d.%d.%d:%d", - &(sitecastgroups[i].quad1), - &(sitecastgroups[i].quad2), - &(sitecastgroups[i].quad3), - &(sitecastgroups[i].quad4), - &(sitecastgroups[i].port)) < 4) - return "Failed parsing GridSiteCastGroup nnn.nnn.nnn.nnn[:port]"; - - break; - } - } - - if (i > GRST_SITECAST_GROUPS) - return "Maximum GridSiteCastGroup groups reached"; - } - else if (strcasecmp(a->cmd->name, "GridSiteAdminFile") == 0) - { - if (index(parm, '/') != NULL) - return "/ not permitted in GridSiteAdminFile"; - - ((mod_gridsite_dir_cfg *) cfg)->adminfile = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteAdminURI") == 0) - { - if (*parm != '/') return "GridSiteAdminURI must begin with /"; - - ((mod_gridsite_dir_cfg *) cfg)->adminuri = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteHelpURI") == 0) - { - if (*parm != '/') return "GridSiteHelpURI must begin with /"; - - ((mod_gridsite_dir_cfg *) cfg)->helpuri = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteDNlists") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->dnlists = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteDNlistsURI") == 0) - { - if (*parm != '/') return "GridSiteDNlistsURI must begin with /"; - - if ((*parm != '\0') && (parm[strlen(parm) - 1] == '/')) - ((mod_gridsite_dir_cfg *) cfg)->dnlistsuri = - apr_pstrdup(a->pool, parm); - else - ((mod_gridsite_dir_cfg *) cfg)->dnlistsuri = - apr_pstrcat(a->pool, parm, "/", NULL); - } - else if (strcasecmp(a->cmd->name, "GridSiteAdminList") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->adminlist = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteGSIProxyLimit") == 0) - { - n = -1; - - if ((sscanf(parm, "%d", &n) == 1) && (n >= 0)) - ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit = n; - else return "GridSiteGSIProxyLimit must be a number >= 0"; - } - else if (strcasecmp(a->cmd->name, "GridSiteUnzip") == 0) - { - if (*parm != '/') return "GridSiteUnzip must begin with /"; - - ((mod_gridsite_dir_cfg *) cfg)->unzip = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteMethods") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->methods = - apr_psprintf(a->pool, " %s ", parm); - - for (p = ((mod_gridsite_dir_cfg *) cfg)->methods; - *p != '\0'; - ++p) if (*p == '\t') *p = ' '; - } - else if (strcasecmp(a->cmd->name, "GridSiteOCSP") == 0) - { - ocspmodes = apr_psprintf(a->pool, " %s ", parm); - - for (p = ocspmodes; *p != '\0'; ++p) - if (*p == '\t') *p = ' '; - else *p = tolower(*p); - } - else if (strcasecmp(a->cmd->name, "GridSiteEditable") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->editable = - apr_psprintf(a->pool, " %s ", parm); - - for (p = ((mod_gridsite_dir_cfg *) cfg)->editable; - *p != '\0'; - ++p) if (*p == '\t') *p = ' '; - } - else if (strcasecmp(a->cmd->name, "GridSiteHeadFile") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->headfile = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteFootFile") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->footfile = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteIndexHeader") == 0) - { - if (index(parm, '/') != NULL) - return "/ not permitted in GridSiteIndexHeader"; - - ((mod_gridsite_dir_cfg *) cfg)->indexheader = - apr_pstrdup(a->pool, parm); - } - else if (strcasecmp(a->cmd->name, "GridSiteACLFormat") == 0) - { - if ((strcasecmp(parm,"GACL") != 0) && - (strcasecmp(parm,"XACML") != 0)) - return "GridsiteACLFormat must be either GACL or XACML"; - - ((mod_gridsite_dir_cfg *) cfg)->aclformat = apr_pstrdup(a->pool, parm); - } - - else if (strcasecmp(a->cmd->name, "GridSiteDelegationURI") == 0) - { - if (*parm != '/') return "GridSiteDelegationURI must begin with /"; - - if (*parm != '\0') - ((mod_gridsite_dir_cfg *) cfg)->delegationuri = - apr_pstrdup(a->pool, parm); - - } - else if (strcasecmp(a->cmd->name, "GridSiteExecMethod") == 0) - { - if (strcasecmp(parm, "nosetuid") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->execmethod = NULL; - return NULL; - } - - if ((strcasecmp(parm, "suexec") != 0) && - (strcasecmp(parm, "X509DN") != 0) && - (strcasecmp(parm, "directory") != 0)) - return "GridsiteExecMethod must be nosetuid, suexec, X509DN or directory"; - - ((mod_gridsite_dir_cfg *) cfg)->execmethod = apr_pstrdup(a->pool, parm); - } - - return NULL; -} - -static const char *mod_gridsite_take2_cmds(cmd_parms *a, void *cfg, - const char *parm1, const char *parm2) -{ - int i; - char *p, *q; - - if (strcasecmp(a->cmd->name, "GridSiteUserGroup") == 0) - { - if (!(unixd_config.suexec_enabled)) - return "Using GridSiteUserGroup will " - "require rebuilding Apache with suexec support!"; - - /* NB ap_uname2id/ap_gname2id are NOT thread safe - but OK - as long as not used in .htaccess, just at server start time */ - - ((mod_gridsite_dir_cfg *) cfg)->execugid.uid = ap_uname2id(parm1); - ((mod_gridsite_dir_cfg *) cfg)->execugid.gid = ap_gname2id(parm2); - ((mod_gridsite_dir_cfg *) cfg)->execugid.userdir = 0; - } - else if (strcasecmp(a->cmd->name, "GridSiteDiskMode") == 0) - { - if ((strcasecmp(parm1, "GroupNone" ) != 0) && - (strcasecmp(parm1, "GroupRead" ) != 0) && - (strcasecmp(parm1, "GroupWrite") != 0)) - return "First parameter of GridSiteDiskMode must be " - "GroupNone, GroupRead or GroupWrite!"; - - if ((strcasecmp(parm2, "WorldNone" ) != 0) && - (strcasecmp(parm2, "WorldRead" ) != 0)) - return "Second parameter of GridSiteDiskMode must be " - "WorldNone or WorldRead!"; - - ((mod_gridsite_dir_cfg *) cfg)->diskmode = - APR_UREAD | APR_UWRITE - | ( APR_GREAD * (strcasecmp(parm1, "GroupRead") == 0)) - | ((APR_GREAD | APR_GWRITE) * (strcasecmp(parm1, "GroupWrite") == 0)) - | ((APR_GREAD | APR_WREAD) * (strcasecmp(parm2, "WorldRead") == 0)); - } - else if (strcasecmp(a->cmd->name, "GridSiteCastAlias") == 0) - { - for (i=0; i < GRST_SITECAST_ALIASES; ++i) /* look for free slot */ - { - if (sitecastaliases[i].sitecast_url == NULL) - { - sitecastaliases[i].scheme = apr_pstrdup(a->pool, parm1); - - if (((p = index(sitecastaliases[i].scheme, ':')) == NULL) - || (p[1] != '/') || (p[2] != '/')) - return "GridSiteCastAlias URL must begin with scheme (http/https/gsiftp/...) and ://"; - - *p = '\0'; - ++p; - while (*p == '/') ++p; - - if ((q = index(p, '/')) == NULL) - return "GridSiteCastAlias URL must be of form scheme://domain:port/dirs"; - - *q = '\0'; - - p = index(p, ':'); - if (p == NULL) - { - return "GridSiteCastAlias URL must include the port number"; - } - - if (sscanf(p, ":%d", &(sitecastaliases[i].port)) != 1) - return "Unable to parse numeric port number in GridSiteCastAlias"; - - sitecastaliases[i].sitecast_url = apr_pstrdup(a->pool, parm1); - sitecastaliases[i].local_path = apr_pstrdup(a->pool, parm2); - sitecastaliases[i].local_hostname = apr_pstrdup(a->pool, - a->server->server_hostname); - - break; - } - } - } - - return NULL; -} - -static const char *mod_gridsite_flag_cmds(cmd_parms *a, void *cfg, - int flag) -{ - if (strcasecmp(a->cmd->name, "GridSiteAuth") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->auth = flag; - } - else if (strcasecmp(a->cmd->name, "GridSiteEnvs") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->envs = flag; - } - else if (strcasecmp(a->cmd->name, "GridSiteHtmlFormat") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->format = flag; - } - else if (strcasecmp(a->cmd->name, "GridSiteIndexes") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->indexes = flag; - } - else if (strcasecmp(a->cmd->name, "GridSiteLink") == 0) - { - ((mod_gridsite_dir_cfg *) cfg)->gridsitelink = flag; - } - else if (strcasecmp(a->cmd->name, "GridSiteGridHTTP") == 0) - { -// TODO: return error if try this on non-HTTPS virtual server - - ((mod_gridsite_dir_cfg *) cfg)->gridhttp = flag; - } - - return NULL; -} - -static const command_rec mod_gridsite_cmds[] = -{ -// TODO: need to check and document valid contexts for each command! - - AP_INIT_FLAG("GridSiteAuth", mod_gridsite_flag_cmds, - NULL, OR_FILEINFO, "on or off"), - AP_INIT_FLAG("GridSiteEnvs", mod_gridsite_flag_cmds, - NULL, OR_FILEINFO, "on or off"), - AP_INIT_FLAG("GridSiteHtmlFormat", mod_gridsite_flag_cmds, - NULL, OR_FILEINFO, "on or off"), - AP_INIT_FLAG("GridSiteIndexes", mod_gridsite_flag_cmds, - NULL, OR_FILEINFO, "on or off"), - AP_INIT_FLAG("GridSiteLink", mod_gridsite_flag_cmds, - NULL, OR_FILEINFO, "on or off"), - - AP_INIT_TAKE1("GridSiteAdminFile", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "Ghost per-directory admin CGI"), - AP_INIT_TAKE1("GridSiteAdminURI", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "URI of real gridsite-admin.cgi"), - AP_INIT_TAKE1("GridSiteHelpURI", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "URI of Website Help pages"), - AP_INIT_TAKE1("GridSiteDNlists", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "DN Lists directories search path"), - AP_INIT_TAKE1("GridSiteDNlistsURI", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "URI of published DN lists"), - AP_INIT_TAKE1("GridSiteAdminList", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "URI of admin DN List"), - AP_INIT_TAKE1("GridSiteGSIProxyLimit", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "Max level of GSI proxy validity"), - AP_INIT_TAKE1("GridSiteUnzip", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "Absolute path to unzip command"), - - AP_INIT_RAW_ARGS("GridSiteMethods", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "permitted HTTP methods"), - AP_INIT_RAW_ARGS("GridSiteOCSP", mod_gridsite_take1_cmds, - NULL, RSRC_CONF, "Set OCSP lookups"), - AP_INIT_RAW_ARGS("GridSiteEditable", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "editable file extensions"), - AP_INIT_TAKE1("GridSiteHeadFile", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "filename of HTML header"), - AP_INIT_TAKE1("GridSiteFootFile", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "filename of HTML footer"), - AP_INIT_TAKE1("GridSiteIndexHeader", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "filename of directory header"), - - AP_INIT_FLAG("GridSiteGridHTTP", mod_gridsite_flag_cmds, - NULL, OR_FILEINFO, "on or off"), - AP_INIT_TAKE1("GridSiteGridHTTPport", mod_gridsite_take1_cmds, - NULL, RSRC_CONF, "GridHTTP port"), - AP_INIT_TAKE1("GridSiteSessionsDir", mod_gridsite_take1_cmds, - NULL, RSRC_CONF, "directory with GridHTTP passcodes and SSL session creds"), -/* GridSiteOnetimesDir is deprecated in favour of GridSiteSessionsDir */ - AP_INIT_TAKE1("GridSiteOnetimesDir", mod_gridsite_take1_cmds, - NULL, RSRC_CONF, "directory with GridHTTP passcodes"), - - AP_INIT_TAKE1("GridSiteCastDNlists", mod_gridsite_take1_cmds, - NULL, RSRC_CONF, "DN Lists directories search path for SiteCast"), - AP_INIT_TAKE1("GridSiteCastUniPort", mod_gridsite_take1_cmds, - NULL, RSRC_CONF, "UDP port for unicast/replies"), - AP_INIT_TAKE1("GridSiteCastGroup", mod_gridsite_take1_cmds, - NULL, RSRC_CONF, "multicast group[:port] to listen for HTCP on"), - AP_INIT_TAKE2("GridSiteCastAlias", mod_gridsite_take2_cmds, - NULL, RSRC_CONF, "URL and local path mapping"), - - AP_INIT_TAKE1("GridSiteACLFormat", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "format to save access control lists in"), - - AP_INIT_TAKE1("GridSiteDelegationURI", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "URI of the delegation service CGI"), - - AP_INIT_TAKE1("GridSiteExecMethod", mod_gridsite_take1_cmds, - NULL, OR_FILEINFO, "execution strategy used by gsexec"), - - AP_INIT_TAKE2("GridSiteUserGroup", mod_gridsite_take2_cmds, - NULL, OR_FILEINFO, - "user and group of gsexec processes in suexec mode"), - - AP_INIT_TAKE2("GridSiteDiskMode", mod_gridsite_take2_cmds, - NULL, OR_FILEINFO, - "group and world file modes for new files/directories"), - - {NULL} -}; - -/* Blank unset these HTTP headers, to prevent injection attacks. - This is run before mod_shib's check_user_id hook, which may - legitimately create such headers. */ - -static int mod_gridsite_check_user_id(request_rec *r) -{ - apr_table_unset(r->headers_in, "User-Distinguished-Name"); - apr_table_unset(r->headers_in, "Nist-LoA"); - apr_table_unset(r->headers_in, "VOMS-Attribute"); - - return DECLINED; /* ie carry on processing request */ -} - -static int mod_gridsite_first_fixups(request_rec *r) -{ - mod_gridsite_dir_cfg *conf; - - if (r->finfo.filetype != APR_DIR) return DECLINED; - - conf = (mod_gridsite_dir_cfg *) - ap_get_module_config(r->per_dir_config, &gridsite_module); - - /* we handle DN Lists as regular files, even if they also match - directory names */ - - if ((conf != NULL) && - (conf->dnlistsuri != NULL) && - (strncmp(r->uri, conf->dnlistsuri, strlen(conf->dnlistsuri)) == 0) && - (strcmp(r->uri, conf->dnlistsuri) != 0)) - { - r->finfo.filetype = APR_REG; - } - - return DECLINED; -} - - -int GRST_get_session_id(SSL *ssl, char *session_id, size_t len) -{ - int i; - SSL_SESSION *session; - - if (((session = SSL_get_session(ssl)) == NULL) || - (session->session_id_length == 0)) return GRST_RET_FAILED; - - if (2 * session->session_id_length + 1 > len) return GRST_RET_FAILED; - - for (i=0; i < (int) session->session_id_length; ++i) - sprintf(&(session_id[i*2]), "%02X", (unsigned char) session->session_id[i]); - - session_id[i*2] = '\0'; - - return GRST_RET_OK; -} - -int GRST_load_ssl_creds(SSL *ssl, conn_rec *conn) -{ - char session_id[(SSL_MAX_SSL_SESSION_ID_LENGTH+1)*2], *sessionfile = NULL, - line[512], *p; - apr_file_t *fp = NULL; - int i; - - if (GRST_get_session_id(ssl, session_id, sizeof(session_id)) != GRST_RET_OK) - return GRST_RET_FAILED; - - sessionfile = apr_psprintf(conn->pool, "%s/sslcreds-%s", - ap_server_root_relative(conn->pool, sessionsdir), - session_id); - - if (apr_file_open(&fp, sessionfile, APR_READ, 0, conn->pool) != APR_SUCCESS) - return GRST_RET_FAILED; - - while (apr_file_gets(line, sizeof(line), fp) == APR_SUCCESS) - { - if (sscanf(line, "GRST_CRED_%d=", &i) == 1) - { - p = index(line, '='); - - apr_table_setn(conn->notes, - apr_psprintf(conn->pool, "GRST_CRED_%d", i), - apr_pstrdup(conn->pool, &p[1])); - } - else if (sscanf(line, "GRST_OCSP_URL_%d=", &i) == 1) - { - p = index(line, '='); - - apr_table_setn(conn->notes, - apr_psprintf(conn->pool, "GRST_OCSP_URL_%d", i), - apr_pstrdup(conn->pool, &p[1])); - } - } - - apr_file_close(fp); - - /* connection notes created by GRST_save_ssl_creds() are now reloaded */ - apr_table_set(conn->notes, "GRST_save_ssl_creds", "yes"); - - return GRST_RET_OK; -} - -/* - Save result of GRSTx509CompactCreds() into connection notes, and - write out in an SSL session creds file. -*/ - -void GRST_save_ssl_creds(conn_rec *conn, - STACK_OF(X509) *certstack, X509 *peercert) -{ - int i, lastcred; - const int maxcreds = 99; - const size_t credlen = 1024; - char creds[maxcreds][credlen+1], envname[14], *tempfile = NULL, - *sessionfile, session_id[(SSL_MAX_SSL_SESSION_ID_LENGTH+1)*2]; - apr_file_t *fp = NULL; - SSL *ssl; - SSLConnRec *sslconn; - - /* check if already done */ - - if ((certstack != NULL) && (conn->notes != NULL) && - (apr_table_get(conn->notes, "GRST_save_ssl_creds") != NULL)) return; - - /* we at least need to say we've been run */ - - apr_table_set(conn->notes, "GRST_save_ssl_creds", "yes"); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server, - "set GRST_save_ssl_creds"); - - sslconn = (SSLConnRec *)ap_get_module_config(conn->conn_config,&ssl_module); - - if ((sslconn != NULL) && - ((ssl = sslconn->ssl) != NULL) && - (GRST_get_session_id(ssl,session_id,sizeof(session_id)) == GRST_RET_OK)) - { - sessionfile = apr_psprintf(conn->pool, "%s/sslcreds-%s", - ap_server_root_relative(conn->pool, sessionsdir), - session_id); - - tempfile = apr_pstrcat(conn->pool, - ap_server_root_relative(conn->pool, sessionsdir), - "/tmp-XXXXXX", NULL); - - if ((tempfile != NULL) && (tempfile[0] != '\0')) - apr_file_mktemp(&fp, tempfile, - APR_CREATE | APR_WRITE | APR_EXCL, conn->pool); - } - - if (GRSTx509CompactCreds(&lastcred, maxcreds, credlen, (char *) creds, - certstack, GRST_VOMS_DIR, peercert) == GRST_RET_OK) - { - for (i=0; i <= lastcred; ++i) - { - apr_table_setn(conn->notes, - apr_psprintf(conn->pool, "GRST_CRED_%d", i), - apr_pstrdup(conn->pool, creds[i])); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server, - "store GRST_CRED_%d=%s", i, creds[i]); - - if (fp != NULL) apr_file_printf(fp, "GRST_CRED_%d=%s\n", - i, creds[i]); - } - - /* free remaining dup'd certs? */ - } - - /* this needs to be merged into compactcreds in grst_x509? */ - - if (ocspmodes != NULL) - { - int j; - const char *ex_sn; - char s[80]; - X509 *cert; - X509_EXTENSION *ex; - - for (j=sk_X509_num(certstack)-1; j >= 0; --j) - { - cert = sk_X509_value(certstack, j); - - for (i=0; i < X509_get_ext_count(cert); ++i) - { - ex = X509_get_ext(cert, i); - - OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ex), 0); - - if (strcmp(s, "authorityInfoAccess") == 0) /* OCSP */ - { - apr_table_setn(conn->notes, "GRST_OCSP_URL", - (const char *) X509_EXTENSION_get_data(ex)); - - /* strategy is to remove what has been checked, - for this connnection */ - apr_table_set(conn->notes, "GRST_OCSP_UNCHECKED", - ocspmodes); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server, - "store GRST_OCSP_URL_%d=%s", i, X509_EXTENSION_get_data(ex)); - - if (fp != NULL) apr_file_printf(fp, "GRST_OCSP_URL_%d=%s\n", - i, X509_EXTENSION_get_data(ex)); - } - } - } - } - - /* end of bit that needs to go into grst_x509 */ - - if (fp != NULL) - { - apr_file_close(fp); - apr_file_rename(tempfile, sessionfile, conn->pool); - } -} - -static int mod_gridsite_perm_handler(request_rec *r) -/* - Do authentication/authorization here rather than in the normal module - auth functions since the results of mod_ssl are available. - - We also publish environment variables here if requested by GridSiteEnv. -*/ -{ - int retcode = DECLINED, i, n, file_is_acl = 0, - destination_is_acl = 0, proxylevel, ishttps = 0; - char *dn, *p, envname[14], *grst_cred_0 = NULL, *dir_path, - *remotehost, s[99], *grst_cred_i, *cookies, *file, *https, - *gridauthpasscode = NULL, *cookiefile, oneline[1025], *key_i, - *destination = NULL, *destination_uri = NULL, *querytmp, - *destination_prefix = NULL, *destination_translated = NULL; - char *vomsAttribute, *loa; - const char *content_type; - time_t now, notbefore, notafter; - apr_table_t *env; - apr_finfo_t cookiefile_info; - apr_file_t *fp; - request_rec *destreq; - GRSTgaclCred *cred = NULL, *cred_0 = NULL; - GRSTgaclUser *user = NULL; - GRSTgaclPerm perm = GRST_PERM_NONE, destination_perm = GRST_PERM_NONE; - GRSTgaclAcl *acl = NULL; - mod_gridsite_dir_cfg *cfg; - SSLConnRec *sslconn; - STACK_OF(X509) *certstack; - X509 *peercert; - - cfg = (mod_gridsite_dir_cfg *) - ap_get_module_config(r->per_dir_config, &gridsite_module); - - if (cfg == NULL) return DECLINED; - - if ((cfg->auth == 0) && - (cfg->envs == 0)) - return DECLINED; /* if not turned on, look invisible */ - - env = r->subprocess_env; - - /* Get the user's attributes from Shibboleth and set up user credential - based on the attributes if authentication has been carried out using - a Shibboleth Identity Provider.*/ - - /* Get DN from a Shibboleth attribute */ - if (vomsAttribute == NULL) - { - dn = (char *) apr_table_get(r->headers_in, "User-Distinguished-Name"); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "DN: %s", dn); - } -#if 0 - /* Get the NIST LoA attribute */ - loa = (char *) apr_table_get(r->headers_in, "nist-loa"); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "Nist-LoA: %d", loa); -#endif - /* Set up user credential based on the DN and LoA attributes */ - - if (dn != NULL) - { - cred = GRSTgaclCredNew("person"); - GRSTgaclCredAddValue(cred, "dn", dn); - user = GRSTgaclUserNew(cred); - cred = GRSTgaclCredNew("level"); -#if 0 - GRSTgaclCredAddValue(cred, "nist-loa", loa); -#endif - GRSTgaclCredAddValue(cred, "nist-loa", "2"); /* hardcoded for now */ - GRSTgaclUserAddCred(user, cred); - } - - vomsAttribute = (char *) apr_table_get(r->headers_in, "VOMS-Attribute"); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "VOMS-Attribute: %s", vomsAttribute); - - /* Set up user credential based on VOMS Attribute */ - if (vomsAttribute != NULL) - { - cred = GRSTgaclCredNew("voms"); - GRSTgaclCredAddValue(cred, "fqan", vomsAttribute); - if (user == NULL) user = GRSTgaclUserNew(cred); - else GRSTgaclUserAddCred(user, cred); - } - - p = (char *) apr_table_get(r->subprocess_env, "HTTPS"); - if ((p != NULL) && (strcmp(p, "on") == 0)) ishttps = 1; - - /* reload per-connection (SSL) cred variables? */ - - sslconn = (SSLConnRec *) ap_get_module_config(r->connection->conn_config, - &ssl_module); - if ((sslconn != NULL) && - (sslconn->ssl != NULL) && - (sslconn->ssl->session != NULL) && - (r->connection->notes != NULL) && - (apr_table_get(r->connection->notes, "GRST_save_ssl_creds") == NULL)) - { - if (GRST_load_ssl_creds(sslconn->ssl, r->connection) == GRST_RET_OK) - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Restored SSL session data from session cache file"); - } - - proxylevel = ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit + 1; - - if ((user == NULL) && - (r->connection->notes != NULL) && - ((grst_cred_0 = (char *) - apr_table_get(r->connection->notes, "GRST_CRED_0")) != NULL) && - (sscanf(grst_cred_0, "X509USER %*d %*d %d ", &proxylevel) == 1) && - (proxylevel <= ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit)) - { - apr_table_setn(env, "GRST_CRED_0", grst_cred_0); - - cred_0 = GRSTx509CompactToCred(grst_cred_0); - if (cred_0 != NULL) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Using identity %s from SSL/TLS", grst_cred_0); - - user = GRSTgaclUserNew(cred_0); - - /* check for VOMS GRST_CRED_i too */ - - for (i=1; ; ++i) - { - snprintf(envname, sizeof(envname), "GRST_CRED_%d", i); - if (grst_cred_i = (char *) - apr_table_get(r->connection->notes,envname)) - { - if (((mod_gridsite_dir_cfg *) cfg)->envs) - apr_table_setn(env, - apr_pstrdup(r->pool, envname), - grst_cred_i); - - if (cred = GRSTx509CompactToCred(grst_cred_i)) - GRSTgaclUserAddCred(user, cred); - } - else break; /* GRST_CRED_i are numbered consecutively */ - } - - cred = GRSTgaclCredNew("level"); - if (proxylevel == 0) GRSTgaclCredAddValue(cred, "nist-loa", "3"); - else GRSTgaclCredAddValue(cred, "nist-loa", "2"); - GRSTgaclUserAddCred(user, cred); - } - } - - if ((user != NULL) && ((mod_gridsite_dir_cfg *) cfg)->dnlists) - GRSTgaclUserSetDNlists(user, ((mod_gridsite_dir_cfg *) cfg)->dnlists); - - /* add DNS credential */ - - remotehost = (char *) ap_get_remote_host(r->connection, - r->per_dir_config, REMOTE_DOUBLE_REV, NULL); - if ((remotehost != NULL) && (*remotehost != '\0')) - { - cred = GRSTgaclCredNew("dns"); - GRSTgaclCredAddValue(cred, "hostname", remotehost); - - if (user == NULL) user = GRSTgaclUserNew(cred); - else GRSTgaclUserAddCred(user, cred); - } - - /* check for Destination: header and evaluate if present */ - - if ((destination = (char *) apr_table_get(r->headers_in, - "Destination")) != NULL) - { - destination_prefix = apr_psprintf(r->pool, "https://%s:%d/", - r->server->server_hostname, (int) r->server->port); - - if (strncmp(destination_prefix, destination, - strlen(destination_prefix)) == 0) - destination_uri = &destination[strlen(destination_prefix)-1]; - else if ((int) r->server->port == 443) - { - destination_prefix = apr_psprintf(r->pool, "https://%s/", - r->server->server_hostname); - - if (strncmp(destination_prefix, destination, - strlen(destination_prefix)) == 0) - destination_uri = &destination[strlen(destination_prefix)-1]; - } - - if (destination_uri != NULL) - { - destreq = ap_sub_req_method_uri("GET", destination_uri, r, NULL); - - if ((destreq != NULL) && (destreq->filename != NULL) - && (destreq->path_info != NULL)) - { - destination_translated = apr_pstrcat(r->pool, - destreq->filename, destreq->path_info, NULL); - - apr_table_setn(r->notes, "GRST_DESTINATION_TRANSLATED", - destination_translated); - - if (((mod_gridsite_dir_cfg *) cfg)->envs) - apr_table_setn(env, "GRST_DESTINATION_TRANSLATED", - destination_translated); - - p = rindex(destination_translated, '/'); - if ((p != NULL) && (strcmp(&p[1], GRST_ACL_FILE) == 0)) - destination_is_acl = 1; - } - } - } - - /* this checks for NULL arguments itself */ - if (GRSTgaclDNlistHasUser(((mod_gridsite_dir_cfg *) cfg)->adminlist, user)) - { - perm = GRST_PERM_ALL; - if (destination_translated != NULL) destination_perm = GRST_PERM_ALL; - } - else - { - acl = GRSTgaclAclLoadforFile(r->filename); - if (acl != NULL) perm = GRSTgaclAclTestUser(acl, user); - GRSTgaclAclFree(acl); - - if (destination_translated != NULL) - { - acl = GRSTgaclAclLoadforFile(destination_translated); - if (acl != NULL) destination_perm = GRSTgaclAclTestUser(acl, user); - GRSTgaclAclFree(acl); - - apr_table_setn(r->notes, "GRST_DESTINATION_PERM", - apr_psprintf(r->pool, "%d", destination_perm)); - - if (((mod_gridsite_dir_cfg *) cfg)->envs) - apr_table_setn(env, "GRST_DESTINATION_PERM", - apr_psprintf(r->pool, "%d", destination_perm)); - } - } - - /* first look for GRIDHTTP_PASSCODE cookie */ - - if ((p = (char *) apr_table_get(r->headers_in, "Cookie")) != NULL) - { - cookies = apr_pstrcat(r->pool, " ", p, NULL); - gridauthpasscode = strstr(cookies, " GRIDHTTP_PASSCODE="); - - if (gridauthpasscode != NULL) - { - gridauthpasscode = &gridauthpasscode[19]; - - for (p = gridauthpasscode; - (*p != '\0') && (*p != ';'); ++p) - if (!isalnum(*p)) *p = '\0'; - } - } - - /* then look for GRIDHTTP_PASSCODE in QUERY_STRING ie after ? */ - - if (gridauthpasscode == NULL) - { - if ((r->parsed_uri.query != NULL) && (r->parsed_uri.query[0] != '\0')) - { - querytmp = apr_pstrcat(r->pool,"&",r->parsed_uri.query,"&",NULL); - - gridauthpasscode = strstr(querytmp, "&GRIDHTTP_PASSCODE="); - - if (gridauthpasscode != NULL) - { - gridauthpasscode = &gridauthpasscode[19]; - - for (p = gridauthpasscode; - (*p != '\0') && (*p != '&'); ++p) - if (!isalnum(*p)) *p = '\0'; - } - } - } - - if ((gridauthpasscode != NULL) && (gridauthpasscode[0] != '\0')) - { - cookiefile = apr_psprintf(r->pool, "%s/passcode-%s", - ap_server_root_relative(r->pool, - sessionsdir), - gridauthpasscode); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Opening GridHTTP passcode file %s", cookiefile); - - if ((apr_stat(&cookiefile_info, cookiefile, - APR_FINFO_TYPE, r->pool) == APR_SUCCESS) && - (cookiefile_info.filetype == APR_REG) && - (apr_file_open(&fp, cookiefile, APR_READ, 0, r->pool) - == APR_SUCCESS)) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Reading GridHTTP passcode file %s", cookiefile); - - while (apr_file_gets(oneline, - sizeof(oneline), fp) == APR_SUCCESS) - { - p = index(oneline, '\n'); - if (p != NULL) *p = '\0'; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "%s: %s", cookiefile, oneline); - - if ((strncmp(oneline, "expires=", 8) == 0) && - (apr_time_from_sec(atoll(&oneline[8])) < - apr_time_now())) - break; - else if ((strncmp(oneline, "domain=", 7) == 0) && - (strcmp(&oneline[7], r->hostname) != 0)) - break; /* exact needed in the version */ - else if ((strncmp(oneline, "path=", 5) == 0) && - (strcmp(&oneline[5], r->uri) != 0)) - break; - else if ((strncmp(oneline, "onetime=yes", 11) == 0) - && !ishttps) - apr_file_remove(cookiefile, r->pool); - else if (strncmp(oneline, "method=PUT", 10) == 0) - perm |= GRST_PERM_WRITE; - else if (strncmp(oneline, "method=GET", 10) == 0) - perm |= GRST_PERM_READ; - } - - apr_file_close(fp); - } - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "After GACL/Onetime evaluation, GRST_PERM=%d", perm); - - /* set permission and GACL environment variables */ - - apr_table_setn(r->notes, "GRST_PERM", apr_psprintf(r->pool, "%d", perm)); - - if (((mod_gridsite_dir_cfg *) cfg)->envs) - { - apr_table_setn(env, "GRST_PERM", apr_psprintf(r->pool, "%d", perm)); - - if (((dir_path = apr_pstrdup(r->pool, r->filename)) != NULL) && - ((p = rindex(dir_path, '/')) != NULL)) - { - *p = '\0'; - apr_table_setn(env, "GRST_DIR_PATH", dir_path); - } - - if (((mod_gridsite_dir_cfg *) cfg)->helpuri != NULL) - apr_table_setn(env, "GRST_HELP_URI", - ((mod_gridsite_dir_cfg *) cfg)->helpuri); - - if (((mod_gridsite_dir_cfg *) cfg)->adminfile != NULL) - apr_table_setn(env, "GRST_ADMIN_FILE", - ((mod_gridsite_dir_cfg *) cfg)->adminfile); - - if (((mod_gridsite_dir_cfg *) cfg)->editable != NULL) - apr_table_setn(env, "GRST_EDITABLE", - ((mod_gridsite_dir_cfg *) cfg)->editable); - - if (((mod_gridsite_dir_cfg *) cfg)->headfile != NULL) - apr_table_setn(env, "GRST_HEAD_FILE", - ((mod_gridsite_dir_cfg *) cfg)->headfile); - - if (((mod_gridsite_dir_cfg *) cfg)->footfile != NULL) - apr_table_setn(env, "GRST_FOOT_FILE", - ((mod_gridsite_dir_cfg *) cfg)->footfile); - - if (((mod_gridsite_dir_cfg *) cfg)->dnlists != NULL) - apr_table_setn(env, "GRST_DN_LISTS", - ((mod_gridsite_dir_cfg *) cfg)->dnlists); - - if (((mod_gridsite_dir_cfg *) cfg)->dnlistsuri != NULL) - apr_table_setn(env, "GRST_DN_LISTS_URI", - ((mod_gridsite_dir_cfg *) cfg)->dnlistsuri); - - if (((mod_gridsite_dir_cfg *) cfg)->adminlist != NULL) - apr_table_setn(env, "GRST_ADMIN_LIST", - ((mod_gridsite_dir_cfg *) cfg)->adminlist); - - apr_table_setn(env, "GRST_GSIPROXY_LIMIT", - apr_psprintf(r->pool, "%d", - ((mod_gridsite_dir_cfg *)cfg)->gsiproxylimit)); - - if (((mod_gridsite_dir_cfg *) cfg)->unzip != NULL) - apr_table_setn(env, "GRST_UNZIP", - ((mod_gridsite_dir_cfg *) cfg)->unzip); - - if (!(((mod_gridsite_dir_cfg *) cfg)->gridsitelink)) - apr_table_setn(env, "GRST_NO_LINK", "1"); - - if (((mod_gridsite_dir_cfg *) cfg)->aclformat != NULL) - apr_table_setn(env, "GRST_ACL_FORMAT", - ((mod_gridsite_dir_cfg *) cfg)->aclformat); - - if (((mod_gridsite_dir_cfg *) cfg)->delegationuri != NULL) - apr_table_setn(env, "GRST_DELEGATION_URI", - ((mod_gridsite_dir_cfg *) cfg)->delegationuri); - - - if (((mod_gridsite_dir_cfg *) cfg)->execmethod != NULL) - { - apr_table_setn(env, "GRST_EXEC_METHOD", - ((mod_gridsite_dir_cfg *) cfg)->execmethod); - - if ((strcasecmp(((mod_gridsite_dir_cfg *) cfg)->execmethod, - "directory") == 0) && (r->filename != NULL)) - { - if ((r->content_type != NULL) && - (strcmp(r->content_type, DIR_MAGIC_TYPE) == 0)) - apr_table_setn(env, "GRST_EXEC_DIRECTORY", r->filename); - else - { - file = apr_pstrdup(r->pool, r->filename); - p = rindex(file, '/'); - if (p != NULL) - { - *p = '\0'; - apr_table_setn(env, "GRST_EXEC_DIRECTORY", file); - } - } - } - } - - apr_table_setn(env, "GRST_DISK_MODE", - apr_psprintf(r->pool, "0x%04x", - ((mod_gridsite_dir_cfg *)cfg)->diskmode)); - } - - if (((mod_gridsite_dir_cfg *) cfg)->auth) - { - /* *** Check HTTP method to decide which perm bits to check *** */ - - if ((r->filename != NULL) && - ((p = rindex(r->filename, '/')) != NULL) && - (strcmp(&p[1], GRST_ACL_FILE) == 0)) file_is_acl = 1; - - content_type = r->content_type; - if ((content_type != NULL) && - (strcmp(content_type, DIR_MAGIC_TYPE) == 0) && - (((mod_gridsite_dir_cfg *) cfg)->dnlistsuri != NULL) && - (strncmp(r->uri, - ((mod_gridsite_dir_cfg *) cfg)->dnlistsuri, - strlen(((mod_gridsite_dir_cfg *) cfg)->dnlistsuri)) == 0) && - (strlen(r->uri) > strlen(((mod_gridsite_dir_cfg *) cfg)->dnlistsuri))) - content_type = "text/html"; - - if ( GRSTgaclPermHasNone(perm) || - - /* first two M_GET conditions make the subtle distinction - between .../ that maps to .../index.html (governed by - Read perm) or to dir list (governed by List perm); - third M_GET condition deals with typeless CGI requests */ - - ((r->method_number == M_GET) && - !GRSTgaclPermHasRead(perm) && - (content_type != NULL) && - (strcmp(content_type, DIR_MAGIC_TYPE) != 0)) || - - ((r->method_number == M_GET) && - !GRSTgaclPermHasList(perm) && - (content_type != NULL) && - (strcmp(content_type, DIR_MAGIC_TYPE) == 0)) || - - ((r->method_number == M_GET) && - !GRSTgaclPermHasRead(perm) && - (content_type == NULL)) || - - ((r->method_number == M_POST) && !GRSTgaclPermHasRead(perm) ) || - - (((r->method_number == M_PUT) || - (r->method_number == M_DELETE)) && - !GRSTgaclPermHasWrite(perm) && !file_is_acl) || - - ((r->method_number == M_MOVE) && - ((!GRSTgaclPermHasWrite(perm) && !file_is_acl) || - (!GRSTgaclPermHasAdmin(perm) && file_is_acl) || - (!GRSTgaclPermHasWrite(destination_perm) - && !destination_is_acl) || - (!GRSTgaclPermHasAdmin(destination_perm) - && destination_is_acl)) ) || - - (((r->method_number == M_PUT) || - (r->method_number == M_DELETE)) && - !GRSTgaclPermHasAdmin(perm) && file_is_acl) - - ) retcode = HTTP_FORBIDDEN; - } - - return retcode; -} - -int GRST_X509_check_issued_wrapper(X509_STORE_CTX *ctx, X509 *x, X509 *issuer) -/* We change the default callback to use our wrapper and discard errors - due to GSI proxy chains (ie where users certs act as CAs) */ -{ - int ret; - ret = X509_check_issued(issuer, x); - if (ret == X509_V_OK) - return 1; - - /* Non self-signed certs without signing are ok if they passed - the other checks inside X509_check_issued. Is this enough? */ - if ((ret == X509_V_ERR_KEYUSAGE_NO_CERTSIGN) && - (X509_NAME_cmp(X509_get_subject_name(issuer), - X509_get_subject_name(x)) != 0)) return 1; - - /* If we haven't asked for issuer errors don't set ctx */ - if (!(ctx->flags & X509_V_FLAG_CB_ISSUER_CHECK)) return 0; - - ctx->error = ret; - ctx->current_cert = x; - ctx->current_issuer = issuer; - return ctx->verify_cb(0, ctx); -} - -/* Later OpenSSL versions add a second pointer ... */ -int GRST_verify_cert_wrapper(X509_STORE_CTX *ctx, void *p) - -/* Earlier ones have a single argument ... */ -// int GRST_verify_cert_wrapper(X509_STORE_CTX *ctx) - -/* Before 0.9.7 we cannot change the check_issued callback directly in - the X509_STORE, so we must insert it in another callback that gets - called early enough */ -{ - ctx->check_issued = GRST_X509_check_issued_wrapper; - - return X509_verify_cert(ctx); -} - -int GRST_callback_SSLVerify_wrapper(int ok, X509_STORE_CTX *ctx) -{ - SSL *ssl = (SSL *) X509_STORE_CTX_get_app_data(ctx); - conn_rec *conn = (conn_rec *) SSL_get_app_data(ssl); - server_rec *s = conn->base_server; - SSLConnRec *sslconn = - (SSLConnRec *) ap_get_module_config(conn->conn_config, &ssl_module); - int errnum = X509_STORE_CTX_get_error(ctx); - int errdepth = X509_STORE_CTX_get_error_depth(ctx); - int returned_ok; - int first_non_ca; - STACK_OF(X509) *certstack; - - /* - * GSI Proxy user-cert-as-CA handling: - * we skip Invalid CA errors at this stage, since we will check this - * again at errdepth=0 for the full chain using GRSTx509CheckChain - */ - if (errnum == X509_V_ERR_INVALID_CA) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Skip Invalid CA error in case a GSI Proxy"); - - sslconn->verify_error = NULL; - ok = TRUE; - errnum = X509_V_OK; - X509_STORE_CTX_set_error(ctx, errnum); - } - - /* - * New style GSI Proxy handling, with critical ProxyCertInfo - * extension: we use GRSTx509KnownCriticalExts() to check this - */ -#ifndef X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION -#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 -#endif - if (errnum == X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION) - { - if (GRSTx509KnownCriticalExts(X509_STORE_CTX_get_current_cert(ctx)) - == GRST_RET_OK) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "GRSTx509KnownCriticalExts() accepts previously " - "Unhandled Critical Extension (GSI Proxy?)"); - - sslconn->verify_error = NULL; - ok = TRUE; - errnum = X509_V_OK; - X509_STORE_CTX_set_error(ctx, errnum); - } - } - - returned_ok = ssl_callback_SSLVerify(ok, ctx); - - /* in case ssl_callback_SSLVerify changed it */ - errnum = X509_STORE_CTX_get_error(ctx); - - if ((errdepth == 0) && (errnum == X509_V_OK)) - /* - * We've now got the last certificate - the identity being used for - * this connection. At this point we check the whole chain for valid - * CAs or, failing that, GSI-proxy validity using GRSTx509CheckChain. - */ - { - errnum = GRSTx509CheckChain(&first_non_ca, ctx); - - if (errnum != X509_V_OK) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Invalid certificate chain reported by " - "GRSTx509CheckChain()"); - - sslconn->verify_error = X509_verify_cert_error_string(errnum); - ok = FALSE; - } - else - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Valid certificate" - " chain reported by GRSTx509CheckChain()"); - - /* Put result of GRSTx509CompactCreds() into connection notes */ - if ((certstack = - (STACK_OF(X509) *) X509_STORE_CTX_get_chain(ctx)) != NULL) - GRST_save_ssl_creds(conn, certstack, NULL); - } - } - - return returned_ok; -} - -void sitecast_handle_NOP_request(server_rec *main_server, - GRSThtcpMessage *htcp_mesg, int igroup, - struct sockaddr_in *client_addr_ptr) -{ - int outbuf_len; - char *outbuf; - - if (GRSThtcpNOPresponseMake(&outbuf, &outbuf_len, - htcp_mesg->trans_id) == GRST_RET_OK) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast sends NOP response from port %d to %s:%d", - sitecastgroups[0].port, inet_ntoa(client_addr_ptr->sin_addr), - ntohs(client_addr_ptr->sin_port)); - - sendto(sitecastgroups[0].socket, outbuf, outbuf_len, 0, - client_addr_ptr, sizeof(struct sockaddr_in)); - - free(outbuf); - } -} - -void sitecast_handle_TST_GET(server_rec *main_server, - GRSThtcpMessage *htcp_mesg, int igroup, - struct sockaddr_in *client_addr_ptr) -{ - int i, outbuf_len, ialias; - char *filename, *outbuf, *location, *local_uri = NULL; - struct stat statbuf; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast responder received TST GET with uri %s", - htcp_mesg->uri->text, GRSThtcpCountstrLen(htcp_mesg->uri)); - - /* find if any GridSiteCastAlias lines match */ - - for (ialias=0; ialias < GRST_SITECAST_ALIASES ; ++ialias) - { - if (sitecastaliases[ialias].sitecast_url == NULL) return; /* no match */ - - if ((strlen(sitecastaliases[ialias].sitecast_url) - <= GRSThtcpCountstrLen(htcp_mesg->uri)) && - (strncmp(sitecastaliases[ialias].sitecast_url, - htcp_mesg->uri->text, - strlen(sitecastaliases[ialias].sitecast_url))==0)) break; - } - - if (ialias == GRST_SITECAST_ALIASES) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast responder does not handle %*s requested by %s:%d", - GRSThtcpCountstrLen(htcp_mesg->uri), - htcp_mesg->uri->text, - inet_ntoa(client_addr_ptr->sin_addr), - ntohs(client_addr_ptr->sin_port)); - - return; /* no match */ - } - - /* convert URL to filename, using alias mapping */ - - asprintf(&filename, "%s%*s", - sitecastaliases[ialias].local_path, - GRSThtcpCountstrLen(htcp_mesg->uri) - - strlen(sitecastaliases[ialias].sitecast_url), - &(htcp_mesg->uri->text[strlen(sitecastaliases[ialias].sitecast_url)]) ); - - if (stat(filename, &statbuf) == 0) /* found file */ - { - asprintf(&location, "Location: %s://%s:%d/%s\r\n", - sitecastaliases[ialias].scheme, - sitecastaliases[ialias].local_hostname, - sitecastaliases[ialias].port, - &(htcp_mesg->uri->text[strlen(sitecastaliases[ialias].sitecast_url)]) ); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast finds %*s at %s, redirects with %s", - GRSThtcpCountstrLen(htcp_mesg->uri), - htcp_mesg->uri->text, filename, location); - - if (GRSThtcpTSTresponseMake(&outbuf, &outbuf_len, - htcp_mesg->trans_id, - location, "", "") == GRST_RET_OK) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast sends TST response from port %d to %s:%d", - sitecastgroups[0].port, inet_ntoa(client_addr_ptr->sin_addr), - ntohs(client_addr_ptr->sin_port)); - - sendto(sitecastgroups[0].socket, outbuf, outbuf_len, 0, - client_addr_ptr, sizeof(struct sockaddr_in)); - - free(outbuf); - } - - free(location); - } - - free(filename); -} - -void sitecast_handle_request(server_rec *main_server, - char *reqbuf, int reqbuf_len, int igroup, - struct sockaddr_in *client_addr_ptr) -{ - GRSThtcpMessage htcp_mesg; - - if (GRSThtcpMessageParse(&htcp_mesg,reqbuf,reqbuf_len) != GRST_RET_OK) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server, - "SiteCast responder rejects format of UDP message from %s:%d", - inet_ntoa(client_addr_ptr->sin_addr), - ntohs(client_addr_ptr->sin_port)); - return; - } - - if (htcp_mesg.rr != 0) /* ignore HTCP responses: we just do requests */ - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast responder ignores HTCP response from %s:%d", - inet_ntoa(client_addr_ptr->sin_addr), - ntohs(client_addr_ptr->sin_port)); - return; - } - - if (htcp_mesg.opcode == GRSThtcpNOPop) - { - sitecast_handle_NOP_request(main_server, &htcp_mesg, - igroup, client_addr_ptr); - return; - } - - if (htcp_mesg.opcode == GRSThtcpTSTop) - { - if (((GRSThtcpCountstrLen(htcp_mesg.method) == 3) && - (strncmp(htcp_mesg.method->text, "GET", 3) == 0)) || - ((GRSThtcpCountstrLen(htcp_mesg.method) == 4) && - (strncmp(htcp_mesg.method->text, "HEAD", 4) == 0))) - { - sitecast_handle_TST_GET(main_server, &htcp_mesg, - igroup, client_addr_ptr); - return; - } - - ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server, - "SiteCast responder rejects method %*s in TST message from %s:%d", - GRSThtcpCountstrLen(htcp_mesg.method), htcp_mesg.method->text, - inet_ntoa(client_addr_ptr->sin_addr), - ntohs(client_addr_ptr->sin_port)); - return; - } - - ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server, - "SiteCast does not implement HTCP op-code %d in message from %s:%d", - htcp_mesg.opcode, - inet_ntoa(client_addr_ptr->sin_addr), - ntohs(client_addr_ptr->sin_port)); -} - -void sitecast_responder(server_rec *main_server) -{ -#define GRST_SITECAST_MAXBUF 8192 - char reqbuf[GRST_SITECAST_MAXBUF], *p; - int n, reqbuf_len, i, j, igroup, - quad1, quad2, quad3, quad4, port, retval, client_addr_len; - struct sockaddr_in srv, client_addr; - struct ip_mreq mreq; - fd_set readsckts; - struct hostent *server_hostent; - - strcpy((char *) main_server->process->argv[0], "GridSiteCast UDP responder"); - - /* initialise unicast/replies socket first */ - - bzero(&srv, sizeof(srv)); - srv.sin_family = AF_INET; - srv.sin_port = htons(sitecastgroups[0].port); - - if ((server_hostent = gethostbyname(main_server->server_hostname)) == NULL) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server, - "SiteCast UDP Responder fails to look up servername %s", - main_server->server_hostname); - return; - } - - srv.sin_addr.s_addr = (u_int32_t) (server_hostent->h_addr_list[0][0]); - - if (((sitecastgroups[0].socket - = socket(AF_INET, SOCK_DGRAM, 0)) < 0) || - (bind(sitecastgroups[0].socket, - (struct sockaddr *) &srv, sizeof(srv)) < 0)) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server, - "mod_gridsite: sitecast responder fails on unicast bind (%s)", - strerror(errno)); - return; - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast UDP unicast/replies on %d.%d.%d.%d:%d", - server_hostent->h_addr_list[0][0], - server_hostent->h_addr_list[0][1], - server_hostent->h_addr_list[0][2], - server_hostent->h_addr_list[0][3], - sitecastgroups[0].port); - - /* initialise multicast listener sockets next */ - - for (i=1; (i <= GRST_SITECAST_GROUPS) && - (sitecastgroups[i].port != 0); ++i) - { - bzero(&srv, sizeof(srv)); - srv.sin_family = AF_INET; - srv.sin_port = htons(sitecastgroups[i].port); - srv.sin_addr.s_addr = htonl(sitecastgroups[i].quad1*0x1000000 - + sitecastgroups[i].quad2*0x10000 - + sitecastgroups[i].quad3*0x100 - + sitecastgroups[i].quad4); - - if (((sitecastgroups[i].socket - = socket(AF_INET, SOCK_DGRAM, 0)) < 0) || - (bind(sitecastgroups[i].socket, - (struct sockaddr *) &srv, sizeof(srv)) < 0)) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server, - "SiteCast UDP Responder fails on multicast bind (%s)", - strerror(errno)); - return; - } - - bzero(&mreq, sizeof(mreq)); - mreq.imr_multiaddr.s_addr = srv.sin_addr.s_addr; - mreq.imr_interface.s_addr = htonl(INADDR_ANY); - - if (setsockopt(sitecastgroups[i].socket, IPPROTO_IP, - IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server, - "SiteCast UDP Responder fails on setting multicast (%s)", - strerror(errno)); - return; - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast UDP Responder listening on %d.%d.%d.%d:%d", - sitecastgroups[i].quad1, sitecastgroups[i].quad2, - sitecastgroups[i].quad3, sitecastgroups[i].quad4, - sitecastgroups[i].port); - } - - for (i=0; (i < GRST_SITECAST_ALIASES) && - (sitecastaliases[i].sitecast_url != NULL) ; ++i) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast alias for %s (%s,%d) to %s (%s)", - sitecastaliases[i].sitecast_url, - sitecastaliases[i].scheme, - sitecastaliases[i].port, - sitecastaliases[i].local_path, - sitecastaliases[i].local_hostname); - } - - while (1) /* **** main listening loop **** */ - { - /* set up bitmasks for select */ - - FD_ZERO(&readsckts); - - n = 0; - for (i=0; (i <= GRST_SITECAST_GROUPS) && - (sitecastgroups[i].port != 0); ++i) /* reset bitmask */ - { - FD_SET(sitecastgroups[i].socket, &readsckts); - if (sitecastgroups[i].socket > n) n = sitecastgroups[i].socket; - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast UDP Responder waiting for requests"); - - if ((retval = select(n + 1, &readsckts, NULL, NULL, NULL)) < 1) - continue; /* < 1 on timeout or error */ - - for (igroup=0; (igroup <= GRST_SITECAST_GROUPS) && - (sitecastgroups[igroup].port != 0); ++igroup) - { - if (FD_ISSET(sitecastgroups[igroup].socket, &readsckts)) - { - client_addr_len = sizeof(client_addr); - - if ((reqbuf_len = recvfrom(sitecastgroups[igroup].socket, - reqbuf, GRST_SITECAST_MAXBUF, 0, - (struct sockaddr *) &client_addr, &client_addr_len)) >= 0) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "SiteCast receives UDP message from %s:%d " - "to %d.%d.%d.%d:%d", - inet_ntoa(client_addr.sin_addr), - ntohs(client_addr.sin_port), - sitecastgroups[igroup].quad1, - sitecastgroups[igroup].quad2, - sitecastgroups[igroup].quad3, - sitecastgroups[igroup].quad4, - sitecastgroups[igroup].port); - - sitecast_handle_request(main_server, reqbuf, - reqbuf_len, igroup, - &client_addr); - } - } - } - - } /* **** end of main listening loop **** */ -} - -static int mod_gridsite_server_post_config(apr_pool_t *pPool, - apr_pool_t *pLog, apr_pool_t *pTemp, server_rec *main_server) -{ - SSL_CTX *ctx; - SSLSrvConfigRec *sc; - server_rec *this_server; - apr_proc_t *procnew = NULL; - apr_status_t status; - char *path; - const char *userdata_key = "sitecast_init"; - - apr_pool_userdata_get((void **) &procnew, userdata_key, - main_server->process->pool); - - /* we only fork responder if one not already forked and we have at - least one GridSiteCastAlias defined. This means it is possible - to run a responder with no groups - listening on unicast only! */ - - if ((procnew == NULL) && - (sitecastaliases[0].sitecast_url != NULL)) - { - /* UDP multicast responder required but not yet started */ - - procnew = apr_pcalloc(main_server->process->pool, sizeof(*procnew)); - apr_pool_userdata_set((const void *) procnew, userdata_key, - apr_pool_cleanup_null, main_server->process->pool); - - status = apr_proc_fork(procnew, pPool); - - if (status < 0) - { - ap_log_error(APLOG_MARK, APLOG_CRIT, status, main_server, - "mod_gridsite: Failed to spawn SiteCast responder process"); - return HTTP_INTERNAL_SERVER_ERROR; - } - else if (status == APR_INCHILD) - { - ap_log_error(APLOG_MARK, APLOG_NOTICE, status, main_server, - "mod_gridsite: Spawning SiteCast responder process"); - sitecast_responder(main_server); - exit(-1); - } - - apr_pool_note_subprocess(main_server->process->pool, - procnew, APR_KILL_AFTER_TIMEOUT); - } - - /* continue with normal HTTP/HTTPS servers */ - - ap_add_version_component(pPool, - apr_psprintf(pPool, "mod_gridsite/%s", VERSION)); - - for (this_server = main_server; - this_server != NULL; - this_server = this_server->next) - { - /* we do some GridSite OpenSSL magic for HTTPS servers */ - - sc = ap_get_module_config(this_server->module_config, &ssl_module); - - if ((sc != NULL) && - (sc->enabled) && - (sc->server != NULL) && - (sc->server->ssl_ctx != NULL)) - { - ctx = sc->server->ssl_ctx; - - /* in 0.9.7 we could set the issuer-checking callback directly */ -// ctx->cert_store->check_issued = GRST_X509_check_issued_wrapper; - - /* but in case 0.9.6 we do it indirectly with another wrapper */ - SSL_CTX_set_cert_verify_callback(ctx, - GRST_verify_cert_wrapper, - (void *) NULL); - - /* whatever version, we can set the SSLVerify wrapper properly */ - SSL_CTX_set_verify(ctx, ctx->verify_mode, - GRST_callback_SSLVerify_wrapper); - - if (main_server->loglevel >= APLOG_DEBUG) - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server, - "Set mod_ssl verify callbacks to GridSite wrappers"); - } - } - - /* create sessions directory if necessary */ - - path = ap_server_root_relative(pPool, sessionsdir); - apr_dir_make_recursive(path, APR_UREAD | APR_UWRITE | APR_UEXECUTE, pPool); - chown(path, unixd_config.user_id, unixd_config.group_id); - - return OK; -} - -static void mod_gridsite_child_init(apr_pool_t *pPool, server_rec *pServer) -{ - apr_time_t cutoff_time; - apr_dir_t *dir; - char *filename; - apr_finfo_t finfo; - SSLSrvConfigRec *sc = ap_get_module_config(pServer->module_config, - &ssl_module); - GRSTgaclInit(); - - /* expire old ssl creds files */ - - if (sc != NULL) - { - cutoff_time = apr_time_now() - - apr_time_from_sec(sc->session_cache_timeout); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, pServer, - "Cutoff time for ssl creds cache: %ld", - (long) apr_time_sec(cutoff_time)); - - if (apr_dir_open(&dir, - ap_server_root_relative(pPool, sessionsdir), pPool) == APR_SUCCESS) - { - while (apr_dir_read(&finfo, - APR_FINFO_CTIME | APR_FINFO_NAME, dir) == APR_SUCCESS) - { - if ((finfo.ctime < cutoff_time) && - (strncmp(finfo.name, "sslcreds-", 9) == 0)) - { - filename = apr_pstrcat(pPool, - ap_server_root_relative(pPool, sessionsdir), - "/", finfo.name, NULL); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, pServer, - "Remove %s from ssl creds cache", filename); - - apr_file_remove(filename, pPool); - } - } - - apr_dir_close(dir); - } - } -} - -static int mod_gridsite_handler(request_rec *r) -{ - mod_gridsite_dir_cfg *conf; - - conf = (mod_gridsite_dir_cfg *) - ap_get_module_config(r->per_dir_config, &gridsite_module); - - if ((conf->dnlistsuri != NULL) && - (strncmp(r->uri, conf->dnlistsuri, strlen(conf->dnlistsuri)) == 0)) - { - if (strcmp(r->uri, conf->dnlistsuri) == 0) - return mod_gridsite_dnlistsuri_dir_handler(r, conf); - - return mod_gridsite_dnlistsuri_handler(r, conf); - } - - if (strcmp(r->handler, DIR_MAGIC_TYPE) == 0) - return mod_gridsite_dir_handler(r, conf); - - return mod_gridsite_nondir_handler(r, conf); -} - -static ap_unix_identity_t *mod_gridsite_get_suexec_id_doer(const request_rec *r) -{ - mod_gridsite_dir_cfg *conf; - - conf = (mod_gridsite_dir_cfg *) - ap_get_module_config(r->per_dir_config, &gridsite_module); - - if ((conf->execugid.uid != UNSET) && - (conf->execmethod != NULL)) - { - - /* also push GRST_EXEC_DIRECTORY into request environment here too */ - - return &(conf->execugid); - } - - return NULL; -} - -static void register_hooks(apr_pool_t *p) -{ - /* config and handler stuff */ - - ap_hook_post_config(mod_gridsite_server_post_config, NULL, NULL, - APR_HOOK_LAST); - ap_hook_child_init(mod_gridsite_child_init, NULL, NULL, APR_HOOK_MIDDLE); - - ap_hook_check_user_id(mod_gridsite_check_user_id, NULL, NULL, - APR_HOOK_REALLY_FIRST); - - ap_hook_fixups(mod_gridsite_first_fixups,NULL,NULL,APR_HOOK_FIRST); - - ap_hook_fixups(mod_gridsite_perm_handler,NULL,NULL,APR_HOOK_REALLY_LAST); - - ap_hook_handler(mod_gridsite_handler, NULL, NULL, APR_HOOK_FIRST); - - ap_hook_get_suexec_identity(mod_gridsite_get_suexec_id_doer, - NULL, NULL, APR_HOOK_MIDDLE); -} - -module AP_MODULE_DECLARE_DATA gridsite_module = -{ - STANDARD20_MODULE_STUFF, - create_gridsite_dir_config, /* dir config creater */ - merge_gridsite_dir_config, /* dir merger */ - create_gridsite_srv_config, /* create server config */ - NULL, /* merge server config */ - mod_gridsite_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/org.gridsite.core/src/mod_ssl-private.h b/org.gridsite.core/src/mod_ssl-private.h deleted file mode 100644 index 7b0b784..0000000 --- a/org.gridsite.core/src/mod_ssl-private.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - Copyright (c) 2003-4, Andrew McNab, University of Manchester - All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, are permitted provided that the following - conditions are met: - - o Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - o Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - - Portions of this code are derived from Apache mod_ssl, and are covered - by the Apache Software License: - - * Copyright 2001-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*------------------------------------------------------------------* - * This program is part of GridSite: http://www.gridsite.org/ * - *------------------------------------------------------------------*/ - - -/* - * After 2.0.49, Apache mod_ssl has most of the mod_ssl structures defined - * in ssl_private.h, which is not installed along with httpd-devel (eg in - * the FC2 RPM.) This include file provides SIMPLIFIED structures for use - * by mod_gridsite: for example, pointers to unused structures are replaced - * by void * and some of the structures are truncated when only the early - * members are used. - * - * CLEARLY, THIS WILL BREAK IF THERE ARE MAJOR CHANGES TO ssl_private.h!!! - */ - -#include - -typedef enum { - SSL_SHUTDOWN_TYPE_UNSET, - SSL_SHUTDOWN_TYPE_STANDARD, - SSL_SHUTDOWN_TYPE_UNCLEAN, - SSL_SHUTDOWN_TYPE_ACCURATE -} ssl_shutdown_type_e; - -typedef struct { - SSL *ssl; - const char *client_dn; - X509 *client_cert; - ssl_shutdown_type_e shutdown_type; - const char *verify_info; - const char *verify_error; - int verify_depth; - int is_proxy; - int disabled; - int non_ssl_request; -} SSLConnRec; - -typedef struct { - void *sc; /* pointer back to server config */ - SSL_CTX *ssl_ctx; -} modssl_ctx_t; - -typedef struct { - void *mc; - unsigned int enabled; - unsigned int proxy_enabled; - const char *vhost_id; - int vhost_id_len; - int session_cache_timeout; - modssl_ctx_t *server; - modssl_ctx_t *proxy; -} SSLSrvConfigRec; - -extern module AP_MODULE_DECLARE_DATA ssl_module; diff --git a/org.gridsite.core/src/roffit b/org.gridsite.core/src/roffit deleted file mode 100755 index d1c7263..0000000 --- a/org.gridsite.core/src/roffit +++ /dev/null @@ -1,370 +0,0 @@ -#!/usr/bin/env perl -# -# roffit: convert man page source files to HTML -# -# Read an nroff file. Output a HTML file. -# -# This is a very simple script, but I use it on very simple man pages and I've -# found no other script that makes beautiful web pages. -# -my $version = "0.3"; # (14 November 2003) -# Author: Daniel Stenberg -# Please email me improvements. -# -# You're free to do whatever you want with this script. -# -# Changes: -# -# 0.3 - Daniel Fandrich brought: -# o deal with .lp lines -# o .TH needs no section portion anymore -# o added generator meta tag in the header -# -# 0.2 - fixed the name for the SH section -# - added links from all words within \fIthis\fP or \fBthis\fP -# that has the same text as a .SH or .IP. -# - -use strict; -#use warnings; - -my $InFH = \*STDIN; -my $OutFH = \*STDOUT; -my $debugFH = \*STDERR; - -my %manpage; -my @out; - -my $indentlevel=0; # logical levels, not columns -my @p; -my $within_tp; -my $standalone=1; # by default we make stand-alone HTML pages -my $pre; -my %anchor; # hash with all anchors - -while($ARGV[0]) { - if($ARGV[0] eq "--bare") { - # don't include headers and stuff - $standalone=0; - shift @ARGV; - } - else { - printf $debugFH "unknown option: %s\n", $ARGV[0] if($ARGV[0] ne "-h"); - print $debugFH "Usage: roffit [options] < infile > outfile\n", - "Options:\n", - " --bare Do not put in HTML, HEAD, BODY tags\n"; - exit; - } -} - -sub showp { - my @p = @_; - push @out, "\n

", @p; -} - -sub defaultcss { - print $OutFH < -P.level0 { - padding-left: 2em; -} - -P.level1 { - padding-left: 4em; -} - -P.level2 { - padding-left: 6em; -} - -span.emphasis { - font-style: italic; -} - -span.bold { - font-weight: bold; -} - -span.manpage { - font-weight: bold; -} - -h2.nroffsh { - background-color: #e0e0e0; -} - -span.nroffip { - font-weight: bold; - font-size: 120%; - font-family: monospace; -} - -p.roffit { - text-align: center; - font-size: 80%; -} - -ENDOFCSS - ; -} - -sub text2name { - my ($text) = @_; - $text =~ s/^ *([^ ]*).*/$1/g; - $text =~ s/[^a-zA-Z0-9-]//g; - return $text; -} - -# scan through the file and check for sections we should convert -# to proper links -sub linkfile { - my @new; - for(@out) { - my $line=$_; - my $l; - while($line =~ s/([^<]*)<\/span>/[]/) { - my ($style, $name)=($1, $2); - - $l = text2name($name); - - #printf $debugFH "$style - $name - %s - %d\n", - #$l, $anchor{$l}; - - my $link; - if($anchor{$l}) { - $link="$name"; - } - else { - $link="$name"; - } - $line =~ s/\[\]/$link/; - } - push @new, $line; - } - return @new; -} - -sub parsefile { - - while(<$InFH>) { - my $in = $_; - my $out; - # print $debugFH "DEBUG IN: $_"; - - $in =~ s/[\r\n]//g if(!$pre); # tear off newlines - - if($in =~ /^\.([^ \n]*)(.*)/) { - # this is a line starting with a dot, that means it is special - my ($keyword, $rest) = ($1, $2); - $out = ""; - - # cut off initial spaces - $rest =~ s/^ +//g; - - if($keyword eq "\\\"") { - # this is a comment, skip this line - } - elsif($keyword =~ /^TH$/i) { - # man page header: - # curl 1 "22 Oct 2003" "Curl 7.10.8" "Curl Manual" - # NAME SECTION DATE VERSION MANUAL - if($rest =~ /([^ ]*) (\d+) \"([^\"]*)\" \"([^\"]*)\"(\"([^\"]*)\")?/) { - # strict matching only so far - $manpage{'name'} = $1; - $manpage{'section'} = $2; - $manpage{'date'} = $3; - $manpage{'version'} = $4; - $manpage{'manual'} = $6; - } - } - elsif($keyword =~ /^SH$/i) { - # Section Header - showp(@p); - @p=""; - if($pre) { - push @out, "\n"; - $pre = 0; - } - - my $name = text2name($rest); - $anchor{$name}=1; - - $rest =~ s/\"//g; # cut off quotes - $rest =~ s//>/g; - $out = "

$rest

"; - $indentlevel=0; - $within_tp=0; - } - elsif(($keyword =~ /^B$/i) || ($keyword =~ /^BI$/i)) { - # Make B and BI the same for simplicity - $rest =~ s/\"//g; # cut off quotes - $rest =~ s//>/g; - push @p, "$rest "; - } - elsif($keyword =~ /^I$/i) { - $rest =~ s/\"//g; # cut off quotes - $rest =~ s//>/g; - push @p, "$rest "; - } - elsif($keyword =~ /^RS$/i) { - # the start of another indent-level. for inlined tables - # within an "IP" - showp(@p); - @p=""; - $indentlevel++; - } - elsif($keyword =~ /^RE$/i) { - # end of the RS section - showp(@p); - @p=""; - $indentlevel--; - } - elsif($keyword =~ /^NF$/i) { - # We let nf start a
 section
-                showp(@p);
-                @p="";
-                push @out, "
\n";
-                $pre=1
-            }
-            elsif($keyword =~ /^TP$/i) {
-                # Used within an "RS" section to make a new line. The first
-                # TP as a column indicator, but we decide to do that
-                # controlling in the CSS instead.
-                $within_tp=1;
-                showp(@p);
-                @p="";                
-            }
-            elsif($keyword =~ /^IP$/i) {
-                # start of a new paragraph coming up
-                showp(@p);
-                @p="";
-
-                my $name= text2name($rest);
-                $anchor{$name}=1;
-
-                $rest =~ s/\"//g; # cut off quotes
-                $rest =~ s//>/g;
-                
-                $indentlevel-- if ($indentlevel);
-                push @p, "$rest ";
-                # make this a single-line title
-                showp(@p);
-                @p="";
-                $indentlevel++;
-                $within_tp=0;
-            }
-            elsif($keyword =~ /^ad$/i) {
-                showp(@p);
-                @p="";
-            }
-            elsif($keyword =~ /^sp$/i) {
-                showp(@p);
-                @p="";
-            }
-            elsif($keyword =~ /^lp$/i) {
-                # marks end of a paragraph
-                showp(@p);
-                @p="";
-            }
-            elsif($keyword =~ /^pp$/i) {
-                # PP ends a TP section, but some TP sections don't use it
-                $within_tp=0;
-            }
-            elsif($keyword =~ /^so$/i) {
-                # This keyword refers to a different man page, named in the
-                # $rest.
-                # We don't support this
-                push @out, "See the $rest man page.\n";
-            }
-            elsif($keyword =~ /^BR$/i) {
-                # I'm not sure what this does exactly, but this is commonly
-                # used to include pointers to other man pages. Let's assume
-                # it only does that for now.
-                # blabla (3)
-                # or "blabla (3)"
-                # or strcmp "(3), " strcasecmp "(3)"
-                # etc
-                
-                $rest =~ s/\"//g; # cut off quotes
-                my @all = split /,/, $rest;
-                for(@all) {
-                    if(/([^ ]*) *\((\d+)\)/) {
-                        # TODO: this looks like a man page, check if there's a
-                        # HTML file for it and if so make a link to it
-                    }
-
-                    push @p, "$_ ";
-                }
-            }
-            else {
-                showp(@p);
-                print $debugFH "ALERT: unknown keyword \"$keyword\"\n";
-            }
-        }
-        else {
-            # text line, decode \-stuff
-            my $txt = $in;
-
-            $txt =~ s//>/g;
-            $txt =~ s/\\&//g; # cut off \&
-            $txt =~ s/\\fI//g;
-            $txt =~ s/\\fB//g;
-            $txt =~ s/\\fP/<\/span>/g;
-            $txt =~ s/\\//g;
-
-            if($txt =~ /^[ \t\r\n]*$/) {
-                # no contents, marks end of a paragraph
-                showp(@p);
-                @p="";
-            }
-            else {
-                $txt =~ s/^ /\ \;/g;
-                push @p, "$txt ";
-            }
-            $out ="";
-        }
-
-        if($out) {
-            push @out, $out;
-   #         print $debugFH "DEBUG OUT: $out\n";
-        }
-        else {
-   #         print $debugFH "DEBUG OUT: [withheld]\n";
-        }
-    }
-    showp(@p);
-}
-
-parsefile();
-
-my @conv = linkfile();
-
-my $title=sprintf("%s man page",
-                  $manpage{'name'}?$manpage{'name'}:"secret");
-
-if($standalone) {
-    print $OutFH <
-$title
-
-MOO
-    ;
-    defaultcss();
-    print "\n";
-}
-
-print $OutFH @conv;
-print $OutFH <
- This HTML page was made with roffit.
-ROFFIT
-    ;
-
-if($standalone) {
-    print "\n";
-}
diff --git a/org.gridsite.core/src/showx509exts.c b/org.gridsite.core/src/showx509exts.c
deleted file mode 100644
index 86f0290..0000000
--- a/org.gridsite.core/src/showx509exts.c
+++ /dev/null
@@ -1,133 +0,0 @@
-
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "gridsite.h"
-
-#define MAXTAG 500
-                                 
-main()
-{
-   X509   *cert, *tmpcert;
-   STACK_OF(X509) *certstack = sk_X509_new_null();
-   FILE   *fp;
-   struct vomsdata *vd;
-   int    i, j, vomserror, i1, i2, j1, j2, lastobject;
-   X509_EXTENSION *ex;
-   ASN1_OBJECT *asnobject;
-   char s[80], *t;
-   ASN1_OCTET_STRING *asndata;
-   BIO *out;
-   unsigned char *p, *op, *tot, *p1, *p2, *q, *oq;
-   long len1, length1, len2, length2;
-   int tag,xclass,ret=0;
-   struct GRSTasn1TagList taglist[MAXTAG+1];
-   int lasttag=-1, itag;
-   
- 
-   OpenSSL_add_all_algorithms();
-   ERR_load_crypto_strings();
-//   seed_prng();
-   
-//   fp = fopen("proxy-with-voms", "r");
-   fp = fopen("/tmp/x509up_u300", "r");
-   
-   cert = PEM_read_X509(fp, NULL, NULL, NULL);
-      
-   fclose(fp);
-
-   out=BIO_new(BIO_s_file());                                                                                        
-   BIO_set_fp(out,stdout,BIO_NOCLOSE|BIO_FP_TEXT);
-        
-   for (i = 0; i < X509_get_ext_count(cert); ++i)
-      {
-        lasttag=-1;
-      
-        ex = X509_get_ext(cert, i);
-
-        OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ex), 1);        
-        printf("%d OID=%s\n", i, s);
-        
-        asnobject = X509_EXTENSION_get_object(ex);
-        asndata = X509_EXTENSION_get_data(ex);
-
-        p1 = ASN1_STRING_data(asndata);
-        p = p1;
-        length1 = ASN1_STRING_length(asndata);
-              
-        GRSTasn1ParseDump(out, p1, length1, taglist, MAXTAG, &lasttag);
-
-{
-        int n, tag, xclass;
-        unsigned char *q, buf[100];
-        const unsigned char *dn, hash[EVP_MAX_MD_SIZE];
-        ASN1_OBJECT *obj = NULL;
-        const EVP_MD *m;
-        EVP_MD_CTX ctx;
-        char creds[501][101];
-        int lastcred = -1;
-   
-        itag = GRSTasn1SearchTaglist(taglist, lasttag, 
-               "-1-1-1-1-2-1-1-1-1-1-1-1");
-               
-        X509_NAME *xname;
-        
-        q = &p[taglist[itag].start];
-        
-        d2i_ASN1_OBJECT(&obj, &q, taglist[itag].length + 
-                                  taglist[itag].headerlength);
-
-        n  = OBJ_obj2nid(obj);
-        dn = OBJ_nid2sn(n);
-                         
-//        dn = X509_NAME_oneline(xname,NULL,0);
-        
-        printf("n=%d dn=%s obj2txt=%s\n", n, dn, OBJ_obj2txt(NULL,0,obj,1));
-
-        GRSTasn1GetX509Name(buf, 99, "-1-1-1-1-2-1-1-1-1-%d-1-%d", 
-                            p1, taglist, lasttag);
-        printf("%s\n", buf);
-        GRSTasn1GetX509Name(buf, 99, "-1-1-1-1-3-1-1-1-%d-1-%d", 
-                            p1, taglist, lasttag);
-        printf("%s\n", buf);
-
-        lastcred = -1;        
-        ret = GRSTx509ParseVomsExt(&lastcred, 500, 100, creds, 0, 2000040861,
-                             ex, 
-                  "/C=UK/O=eScience/OU=Manchester/L=HEP/CN=Andrew McNab",
-                  "/etc/grid-security/vomsdir");
-                  
-                  
-        printf("GRSTx509ParseVomsExt() returns %d, %d\n", ret, lastcred);
-                  
-        for (j=0; j <= lastcred;  ++j)
-         printf("cred=%d %s\n", j, creds[j]);
-        
-/*        
-        m = EVP_md5();
-        EVP_DigestInit(&ctx, m); 
-        EVP_DigestUpdate(&ctx, delegation_id, strlen(delegation_id));
-        EVP_DigestFinal(&ctx, hash, &delegation_id_len);
- */      
-}              
-
-/*       
-        itag = GRSTasn1SearchTaglist(taglist, &lasttag,
-                                     "1-1-1-1-1-7-1-2-1-2-1");
-                                    
-        printf("tag=%d %s %d %.*s\n",
-               itag, taglist[itag].treecoords, taglist[itag].tag,
-               taglist[itag].length, 
-               &p[taglist[itag].start+taglist[itag].headerlength]);
-*/
-      }
-}
diff --git a/org.gridsite.core/src/slashgrid.c b/org.gridsite.core/src/slashgrid.c
deleted file mode 100644
index de86328..0000000
--- a/org.gridsite.core/src/slashgrid.c
+++ /dev/null
@@ -1,2475 +0,0 @@
-/*
-   Copyright (c) 2003-6, Andrew McNab,
-   University of Manchester. All rights reserved.
-
-   Redistribution and use in source and binary forms, with or
-   without modification, are permitted provided that the following
-   conditions are met:
-
-     o Redistributions of source code must retain the above
-       copyright notice, this list of conditions and the following
-       disclaimer. 
-     o Redistributions in binary form must reproduce the above
-       copyright notice, this list of conditions and the following
-       disclaimer in the documentation and/or other materials
-       provided with the distribution. 
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-   POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*------------------------------------------------------------------*
- * This program is part of GridSite: http://www.gridsite.org/       *
- *------------------------------------------------------------------*/
-
-#define _GNU_SOURCE
-#define _XOPEN_SOURCE
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include               
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include 
-
-#include "gridsite.h"
-
-#define GRST_SLASH_PIDFILE "/var/run/slashgrid.pid"
-
-#define GRST_SLASH_HEADERS "/var/spool/slashgrid/headers"
-#define GRST_SLASH_BLOCKS  "/var/spool/slashgrid/blocks"
-#define GRST_SLASH_TMP     "/var/spool/slashgrid/tmp"
-#define GRST_SLASH_DIRFILE "::DIR::"
-
-#define GRST_SLASH_HEAD   0
-#define GRST_SLASH_GET    1
-#define GRST_SLASH_PUT    2
-#define GRST_SLASH_DELETE 3
-#define GRST_SLASH_MOVE   4
-#define GRST_SLASH_TRUNC  5
-
-#define GRST_SLASH_HEADERS_EXPIRE	60
-#define GRST_SLASH_BLOCK_SIZE		4096
-#define GRST_SLASH_MAX_HANDLES		16
-
-#define GRST_SLASH_MAX_LOCATION		1024
-
-/* maximum number of SiteCast groups */
-#define GRST_SLASH_MAX_GROUPS		10
-
-#define GRST_SLASH_HTCP_PORT		777
-
-#ifndef CURLOPT_WRITEDATA
-#define CURLOPT_WRITEDATA CURLOPT_FILE
-#endif
- 
-#ifndef CURLOPT_READDATA
-#define CURLOPT_READDATA CURLOPT_FILE
-#endif
-
-#ifndef CURLE_HTTP_RETURNED_ERROR
-#define CURLE_HTTP_RETURNED_ERROR CURLE_HTTP_NOT_FOUND
-#endif
-
-struct grst_body_text { char   *text;
-                        size_t  used;
-                        size_t  allocated; } ;
-
-struct grst_read_data { const char  *buf;
-                        off_t sent; 
-                        off_t maxsent; };
-
-struct grst_dir_list { char   *filename;
-                       off_t   length;
-                       int     length_set;
-                       time_t  modified;
-                       int     modified_set; } ;
-
-struct grst_request { int     retcode;                         
-                      char    location[GRST_SLASH_MAX_LOCATION+1];
-                      size_t  length;
-                      int     length_set;
-                      time_t  modified;                           
-                      int     modified_set; 
-                      void   *readfunction;
-                      void   *readdata;
-                      void   *writefunction;
-                      void   *writedata;
-                      size_t  infilesize;
-                      char   *errorbuffer;
-                      char   *url;
-                      int     method;
-                      char   *destination;
-                      off_t   start;
-                      off_t   finish; } ;
-
-struct grst_handle { pthread_mutex_t	mutex;
-                     CURL		*curl_handle;
-                     uid_t		uid;
-                     char		*proxyfile;
-                     time_t		last_used;
-                   }  handles[GRST_SLASH_MAX_HANDLES];
- 
-int debugmode         = 0;
-int number_of_tries   = 1, sitecast_domain_len = 0;
-char *sitecast_domain = NULL, *sitecast_groups = NULL, *local_root = NULL,
-     *gridmapdir = NULL;
-uid_t local_uid = 0;
-gid_t local_gid = 0;
-
-size_t headers_callback(void *ptr, size_t size, size_t nmemb, void *p)
-/* Find the values of the return code, Content-Length, Last-Modified
-   and Location headers */
-{
-  float f;
-  char  *s, *q;
-  size_t realsize;
-  struct tm modified_tm;
-  struct grst_request *request_data = (struct grst_request *) p;
-
-  realsize = size * nmemb;
-  s = malloc(realsize + 1);
-  memcpy(s, ptr, realsize);
-  s[realsize] = '\0';
-
-  if      (sscanf(s, "Content-Length: %d", &(request_data->length)) == 1) 
-            request_data->length_set = 1;
-  else if (sscanf(s, "HTTP/%f %d ", &f, &(request_data->retcode)) == 2) ;
-  else if (strncmp(s, "Location: ", 10) == 0) 
-      {
-        strncpy(request_data->location, &s[10], GRST_SLASH_MAX_LOCATION);
-        /* the location string is 1 byte longer and zeroed before use */
-        
-        for (q=request_data->location; *q != '\0'; ++q)
-         if ((*q == '\r') || (*q == '\n')) *q = '\0';
-      }
-  else if (strncmp(s, "Last-Modified: ", 15) == 0)
-      {
-        /* follow RFC 2616: first try RFC 822 (kosher), then RFC 850 and 
-           asctime() formats too. Must be GMT whatever the format. */
-
-        if (strptime(&s[15], "%a, %d %b %Y %T GMT", &modified_tm) != NULL)
-          {
-            request_data->modified = mktime(&modified_tm);
-            request_data->modified_set = 1;
-          }
-        else if (strptime(&s[15], "%a, %d-%b-%y %T GMT", &modified_tm) != NULL)
-          {
-            request_data->modified = mktime(&modified_tm);
-            request_data->modified_set = 1;
-          }
-        else if (strptime(&s[15], "%a %b %d %T %Y", &modified_tm) != NULL)
-          {
-            request_data->modified = mktime(&modified_tm);
-            request_data->modified_set = 1;
-          }
-      }
-    
-  free(s);
-  return realsize;
-}
-
-int debug_callback(CURL *handle, curl_infotype infotype, 
-                   char *rawmesg, size_t size, void *i)
-{
-  int   n;
-  char *mesg;
-
-  if ((infotype == CURLINFO_DATA_IN) ||
-      (infotype == CURLINFO_DATA_OUT)) return 0;
-
-  mesg = malloc(size + 1);
-  
-  for (n=0; n < size; ++n)
-     {
-       if ((rawmesg[n] == '\r') && (n >= size - 2)) mesg[n] = '\0';
-       else if (((rawmesg[n] == '\r') || (rawmesg[n] == '\n')) && 
-                (infotype == CURLINFO_HEADER_IN)) mesg[n] = '<';
-       else if (((rawmesg[n] == '\r') || (rawmesg[n] == '\n')) && 
-                (infotype == CURLINFO_HEADER_OUT)) mesg[n] = '>';
-       else if ((rawmesg[n] < ' ') || (rawmesg[n] >= 127)) mesg[n] = '.';
-       else mesg[n] = rawmesg[n];
-     }
-     
-  mesg[n] = '\0';
-
-  syslog(LOG_DEBUG, "%d %s%s%s%s", 
-                    *((int *) i), 
-                    (infotype == CURLINFO_HEADER_IN ) ? "<<" : "",
-                    (infotype == CURLINFO_HEADER_OUT) ? ">>" : "",
-                    (infotype == CURLINFO_TEXT      ) ? "**" : "",
-                    mesg);
-
-  free(mesg);  
-  return 0;
-}                  
-
-
-int translate_sitecast_url(char **sitecast_url, char *raw_url)
-{
-  int request_length, response_length, i, ret, s, igroup;
-  struct sockaddr_in srv, from;
-  socklen_t fromlen;
-#define MAXBUF 8192  
-  char *request, response[MAXBUF], *p;
-  GRSThtcpMessage msg;
-  struct timeval start_timeval, wait_timeval;
-  struct grst_sitecast_group 
-   { unsigned char quad1; unsigned char quad2;
-     unsigned char quad3; unsigned char quad4;
-     int port; int timewait; int ttl; } groups[GRST_SLASH_MAX_GROUPS];
-  fd_set readsckts;
-
-  p = sitecast_groups;
-  igroup = -1;
-
-  for (igroup=-1; igroup+1 < GRST_SLASH_MAX_GROUPS;)
-     {  
-       /* defaults for when sscanf fails to find all parameters */
-
-       groups[igroup+1].port     = GRST_SLASH_HTCP_PORT;
-       groups[igroup+1].timewait = 1;
-       groups[igroup+1].ttl      = 1;
-       
-       ret = sscanf(p, "%d.%d.%d.%d:%d:%d:%d", 
-                 &(groups[igroup+1].quad1),
-                 &(groups[igroup+1].quad2),    
-                 &(groups[igroup+1].quad3),
-                 &(groups[igroup+1].quad4),    
-                 &(groups[igroup+1].port),
-                 &(groups[igroup+1].ttl),
-                 &(groups[igroup+1].timewait));
-
-       if (ret == 0) break; /* end of list ? */
-         
-       if (ret < 5)
-         {
-           syslog(LOG_WARNING,
-                  "Failed parsing multicast group parameter %s\n", p);
-           return GRST_RET_FAILED;
-         }
-         
-       ++igroup;  
-       
-       if ((p = index(p, ',')) == NULL) break;       
-       ++p;
-     }
-
-  if (igroup == -1)
-    {
-      syslog(LOG_WARNING, "Failed parsing multicast group parameter %s\n", p);
-      return GRST_RET_FAILED;
-    }
-
-  if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
-    {
-      syslog(LOG_WARNING, "Failed to open SiteCast UDP socket\n");
-      return GRST_RET_FAILED;
-    }
-
-  /* loop through multicast groups since we need to take each 
-     ones timewait into account */
-
-  gettimeofday(&start_timeval, NULL);
-
-  for (i=0; i <= igroup; ++i)
-     {
-       if (debugmode)
-        syslog(LOG_DEBUG, "Querying multicast group %d.%d.%d.%d:%d:%d:%d\n",
-                groups[i].quad1, groups[i].quad2,
-                groups[i].quad3, groups[i].quad4,
-                groups[i].port, groups[i].ttl,
-                groups[i].timewait);
-        
-       bzero(&srv, sizeof(srv));
-       srv.sin_family = AF_INET;
-       srv.sin_port = htons(groups[i].port);
-       srv.sin_addr.s_addr = htonl(groups[i].quad1*0x1000000
-                                 + groups[i].quad2*0x10000
-                                 + groups[i].quad3*0x100
-                                 + groups[i].quad4);
-
-       /* send off queries, one for each source file */
-
-       GRSThtcpTSTrequestMake(&request, &request_length, 
-                                   (int) (start_timeval.tv_usec),
-                                   "GET", raw_url, "");
-
-       sendto(s, request, request_length, 0, 
-                       (struct sockaddr *) &srv, sizeof(srv));
-
-       free(request);
-          
-       /* reusing wait_timeval is a Linux-specific feature of select() */
-       wait_timeval.tv_usec = 0;
-       wait_timeval.tv_sec  = groups[i].timewait;
-
-       while ((wait_timeval.tv_sec > 0) || (wait_timeval.tv_usec > 0))
-            {
-              FD_ZERO(&readsckts);
-              FD_SET(s, &readsckts);
-  
-              ret = select(s + 1, &readsckts, NULL, NULL, &wait_timeval);
-
-              if (ret > 0)
-                {
-                  response_length = recvfrom(s, response, MAXBUF,
-                                             0, &from, &fromlen);
-  
-                  if ((GRSThtcpMessageParse(&msg, response, response_length) 
-                                                      == GRST_RET_OK) &&
-                      (msg.opcode == GRSThtcpTSTop) && (msg.rr == 1) && 
-                      (msg.trans_id == (int) start_timeval.tv_usec) &&
-                      (msg.resp_hdrs != NULL) &&
-                      (GRSThtcpCountstrLen(msg.resp_hdrs) > 12))
-                    { 
-                      /* found one */ 
-
-                      if (debugmode)
-                        syslog(LOG_DEBUG, "Sitecast %s -> %.*s\n",
-                                raw_url, 
-                                GRSThtcpCountstrLen(msg.resp_hdrs) - 12,
-                                &(msg.resp_hdrs->text[10]));
-                      
-                      asprintf(sitecast_url, "%.*s",
-                          GRSThtcpCountstrLen(msg.resp_hdrs) - 12, 
-                          &(msg.resp_hdrs->text[10]));
-                          
-                      return GRST_RET_OK;
-                    }
-                }
-            }
-     }
-     
-  return GRST_RET_FAILED;
-}
-
-char *check_x509_user_proxy(pid_t pid)
-{
-  int fd;
-  char file[80], *proxyfile = NULL, *pid_environ, *p;
-  struct stat statbuf1, statbuf2;
-  
-  snprintf(file, sizeof(file), "/proc/%d/environ", (int) pid);
-  
-  if ((fd = open(file, O_RDONLY)) == -1) return NULL;
-
-  if (debugmode) syslog(LOG_DEBUG, "Opened for %d environ in %s", (int) pid, file);
-  
-  fstat(fd, &statbuf1);
-  
-  pid_environ = malloc(statbuf1.st_size + 1);
-  
-  read(fd, pid_environ, statbuf1.st_size);
-  
-  close(fd);
-  
-  pid_environ[statbuf1.st_size] = '\0';
-    
-  for (p = pid_environ; p < pid_environ + statbuf1.st_size; p += (strlen(p) + 1))
-     {
-       if (debugmode) syslog(LOG_DEBUG, "Examine %s in environ", p);
-  
-       if (strncmp(p, "X509_USER_PROXY=", 16) == 0)
-         {
-           if ((p[16] != '\0') &&
-               (stat(&p[16], &statbuf2) == 0)) proxyfile = strdup(&p[16]);
-           break;
-         }
-     }
-  
-  free(pid_environ);
-
-  return proxyfile;    
-}
-
-char *mapdir_uid_to_dn(uid_t uid)
-{
-     int            ret;
-     char           *firstlinkpath, *otherlinkpath, *dn, *buf = NULL;
-     struct dirent  *mapdirentry;
-     DIR            *mapdirstream;
-     ino_t          firstinode;
-     long           buflen;
-     struct stat    statbuf;
-     struct passwd  pw, *pwp;
-     
-     if (gridmapdir == NULL) return NULL;
-
-     buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
-     buf = malloc(buflen);
-
-     if ((buflen <= 0) ||
-         (getpwuid_r(uid, &pw, buf, buflen, &pwp) != 0) ||
-         (pw.pw_name == NULL))
-       {
-         if (buf != NULL) free(buf);
-         return NULL;
-       }
-
-     asprintf(&firstlinkpath, "%s/%s", gridmapdir, pw.pw_name);
-     ret = stat(firstlinkpath, &statbuf);
-
-     free(firstlinkpath);
-
-     if ((ret != 0) || (statbuf.st_nlink != 2))
-       {
-         free(buf);
-         return NULL;
-       }
-
-     firstinode = statbuf.st_ino; /* save for comparisons */
-
-     mapdirstream = opendir(gridmapdir);
-
-     if (mapdirstream != NULL)
-       {
-         while ((mapdirentry = readdir(mapdirstream)) != NULL)
-              {
-                 if (strcmp(mapdirentry->d_name, pw.pw_name) == 0) continue;
-
-                 if (mapdirentry->d_ino == firstinode)
-                   {
-                      asprintf(&otherlinkpath, "%s/%s", gridmapdir,
-                                            mapdirentry->d_name);
-
-                      utime(otherlinkpath, (struct utimbuf *) NULL);
-                      free(otherlinkpath);
-                      
-                      dn = GRSThttpUrlDecode(mapdirentry->d_name);
-            
-                      if (debugmode) syslog(LOG_DEBUG, "mapdir_uid_to_dn "
-                                  "maps %s(%d) to %s", pw.pw_name, uid, dn);
-
-                      closedir(mapdirstream);
-                      free(buf);
-                      return dn;
-                   }
-              }
-
-         closedir(mapdirstream);
-       }
-
-     free(buf);
-     return NULL;
-}
-
-
-int perform_request(struct grst_request *request_data,
-                    struct fuse_context *fuse_ctx)
-{
-  int                ret, i, j, itry, ishttps = 0;
-  char              *proxyfile = NULL, *range_header = NULL, *url;
-  struct stat        statbuf;
-  struct curl_slist *headers_list = NULL;
-
-  if (strncmp(request_data->url, "https://", 8) == 0) /* HTTPS options */
-    {
-// check for X509_USER_PROXY in that PID's environ too
-      ishttps = 1;
-
-      if ((proxyfile = check_x509_user_proxy(fuse_ctx->pid)) == NULL)
-        {
-          asprintf(&proxyfile, "/tmp/x509up_u%d", fuse_ctx->uid);
-          /* if proxyfile is used, it will be referenced by handles[].proxyfile
-             and freed when this handle is eventually freed */
-
-          if ((stat(proxyfile, &statbuf) != 0) ||
-              (statbuf.st_uid != fuse_ctx->uid))
-            {
-              free(proxyfile);
-              proxyfile = NULL;
-            }
-        }
-    }
-
-  if (debugmode && (proxyfile != NULL))
-       syslog(LOG_DEBUG, "Using proxy file %s", proxyfile);
-
-  /* try to find an existing handle for this uid/proxyfile */
-
-  for (i=0; i < GRST_SLASH_MAX_HANDLES; ++i)
-     {
-       if ((handles[i].curl_handle != NULL)  &&
-           (handles[i].uid == fuse_ctx->uid) &&
-           (((handles[i].proxyfile == NULL) && (proxyfile == NULL)) ||
-            ((handles[i].proxyfile != NULL) && (proxyfile != NULL) &&
-             (strcmp(handles[i].proxyfile, proxyfile) == 0))))
-         {
-           break;
-         }
-     }
-     
-  if (i >= GRST_SLASH_MAX_HANDLES) /* no existing match found */
-    {
-      i=0;
-    
-      for (j=0; j < GRST_SLASH_MAX_HANDLES; ++j)
-         {
-           if (handles[j].curl_handle == NULL) /* unused slot */
-             {
-               i = j;
-               break;
-             }
-             
-           if (handles[j].last_used < handles[i].last_used) i = j;
-         }
-    }
-
-  /* now lock this handle and recheck settings inside the mutex lock */
-
-  pthread_mutex_lock(&(handles[i].mutex)); /* unlock just before return */
-
-  if ((handles[i].curl_handle == NULL)  ||
-      (handles[i].uid != fuse_ctx->uid) ||
-      (((handles[i].proxyfile != NULL) || (proxyfile != NULL)) &&
-       ((handles[i].proxyfile == NULL) || (proxyfile == NULL) ||
-        (strcmp(handles[i].proxyfile, proxyfile) != 0))))
-    {
-      /* we do need to initialise this handle */
-      
-      handles[i].uid = fuse_ctx->uid;
-
-      if (handles[i].curl_handle != NULL)
-                              curl_easy_cleanup(handles[i].curl_handle);
-      handles[i].curl_handle = curl_easy_init();
-      
-      if (handles[i].proxyfile != NULL) free(handles[i].proxyfile);
-      handles[i].proxyfile = proxyfile; /* proxyfile might be NULL itself */
-      
-      if (handles[i].proxyfile != NULL)
-        {
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERTTYPE, "PEM");
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERT,
-                                                    handles[i].proxyfile);
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLKEYTYPE, "PEM");
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLKEY,  
-                                                    handles[i].proxyfile);
-        }
-      else
-        {
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLKEYTYPE,  "ENG");
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERTTYPE, "ENG");
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERT,     NULL);
-        }
-
-      if (debugmode)
-        {
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_VERBOSE, 1);
-          curl_easy_setopt(handles[i].curl_handle, CURLOPT_DEBUGFUNCTION,
-                                                          debug_callback);
-        }
-
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_USERAGENT, 
-                       "SlashGrid http://www.gridsite.org/slashgrid/");
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_FOLLOWLOCATION, 0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_HEADERFUNCTION, headers_callback);
-
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_CAPATH, 
-                                        "/etc/grid-security/certificates");
-
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSL_VERIFYPEER, 2);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
-    }   
-
-  if (request_data->method == GRST_SLASH_GET)
-    {
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_CUSTOMREQUEST, NULL);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_NOBODY,  0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPGET, 1);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_UPLOAD,  0);
-    }
-  else if ((request_data->method == GRST_SLASH_PUT) || 
-           (request_data->method == GRST_SLASH_TRUNC))
-    {
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_CUSTOMREQUEST, NULL);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_NOBODY,  0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPGET, 0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_UPLOAD,  1);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_INFILESIZE,  
-                                            (long) request_data->infilesize);
-    }
-  else if (request_data->method == GRST_SLASH_DELETE)
-    {
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_NOBODY,  0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPGET, 0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_UPLOAD,  0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_CUSTOMREQUEST, "DELETE");
-    }
-  else if (request_data->method == GRST_SLASH_MOVE)
-    {
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_NOBODY,  0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPGET, 0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_UPLOAD,  0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_CUSTOMREQUEST, "MOVE");
-    }
-  else /* default or GRST_SLASH_HEAD */
-    {
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_CUSTOMREQUEST, NULL);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_NOBODY,  1);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPGET, 0);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_UPLOAD,  0);
-    }
-
-  curl_easy_setopt(handles[i].curl_handle, CURLOPT_WRITEHEADER, request_data);
-  
-  if (request_data->errorbuffer != NULL)
-        curl_easy_setopt(handles[i].curl_handle, CURLOPT_ERRORBUFFER,
-                                      request_data->errorbuffer);
-
-  if (debugmode)
-        curl_easy_setopt(handles[i].curl_handle, CURLOPT_DEBUGDATA, &i);
-
-  curl_easy_setopt(handles[i].curl_handle, CURLOPT_READFUNCTION, request_data->readfunction);
-  curl_easy_setopt(handles[i].curl_handle, CURLOPT_READDATA, request_data->readdata);
-  curl_easy_setopt(handles[i].curl_handle, CURLOPT_WRITEFUNCTION, request_data->writefunction);
-  curl_easy_setopt(handles[i].curl_handle, CURLOPT_WRITEDATA, request_data->writedata);
-
-  if ((request_data->start >= 0) && 
-      (request_data->finish >= request_data->start))
-    {
-      if (request_data->method == GRST_SLASH_PUT)
-           asprintf(&range_header, "Content-Range: bytes %ld-%ld/*", 
-               (long) request_data->start, (long) request_data->finish);
-      else if (request_data->method == GRST_SLASH_TRUNC)
-           asprintf(&range_header, "Content-Range: bytes *-*/%ld", 
-               (long) request_data->finish);
-      else asprintf(&range_header, "Range: bytes=%ld-%ld", 
-               (long) request_data->start, (long) request_data->finish);
-
-      headers_list = curl_slist_append(headers_list, range_header);
-      curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPHEADER, headers_list);
-    }
-  else curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPHEADER, NULL);
-
-  /* retry loop */
-
-  for (itry=1; itry <= number_of_tries; ++itry)
-     {
-       request_data->length_set   = 0;
-       request_data->modified_set = 0;
-       request_data->retcode      = 0;
-       request_data->location[0]  = '\0';
-    
-       if ((sitecast_domain != NULL) &&
-           (sitecast_groups != NULL) &&
-
-           ((request_data->method == GRST_SLASH_HEAD) ||
-            (request_data->method == GRST_SLASH_GET)) &&
-
-           ((!ishttps && 
-             (strncmp(&(request_data->url[7]), sitecast_domain, 
-                                   sitecast_domain_len) == 0) &&
-             ((request_data->url[7+sitecast_domain_len] == ':') ||
-              (request_data->url[7+sitecast_domain_len] == '/')) )
-                                                                   ||
-            (ishttps &&
-             (strncmp(&(request_data->url[8]), sitecast_domain, 
-                                    sitecast_domain_len) == 0) &&
-             ((request_data->url[8+sitecast_domain_len] == ':') ||
-              (request_data->url[8+sitecast_domain_len] == '/')) ) ) )
-         {
-           if (debugmode)
-             syslog(LOG_DEBUG, "Apply SiteCast to URL %s", request_data->url);
-
-           if (translate_sitecast_url(&url, request_data->url) ==
-                GRST_RET_OK)
-             {
-               curl_easy_setopt(handles[i].curl_handle,
-                                            CURLOPT_URL, url);
-               ret = curl_easy_perform(handles[i].curl_handle);
-
-               free(url);               
-             }
-           else
-             {
-               ret = 1;
-               request_data->retcode = 404; /* HTTP not found */
-             }
-         }
-       else
-         {
-           curl_easy_setopt(handles[i].curl_handle,
-                                            CURLOPT_URL, request_data->url);
-           ret = curl_easy_perform(handles[i].curl_handle);
-         }
-
-// tests on whether to retry due to server error / timeout go here...
-       break;
-     }
-
-  if (headers_list != NULL) curl_slist_free_all(headers_list);
-  if (range_header != NULL) free(range_header);
-
-  pthread_mutex_unlock(&(handles[i].mutex));
-  
-  return ret;
-}
-
-size_t rawbody_callback(void *ptr, size_t size, size_t nmemb, void *data)
-{
-  if ( ((struct grst_body_text *) data)->used + size * nmemb >=
-                             ((struct grst_body_text *) data)->allocated )
-    {
-      ((struct grst_body_text *) data)->allocated = 
-        ((struct grst_body_text *) data)->used + size * nmemb + 4096;
-
-      ((struct grst_body_text *) data)->text = 
-         realloc( ((struct grst_body_text *) data)->text,
-                  ((struct grst_body_text *) data)->allocated );
-    }
-    
-  memcpy( &( ((struct grst_body_text *) 
-                 data)->text[((struct grst_body_text *) data)->used] ),
-          ptr, size * nmemb);
-          
-  ((struct grst_body_text *) data)->used += size * nmemb;
-  
-  return size * nmemb;
-}
-
-size_t null_callback(void *ptr, size_t size, size_t nmemb, void *data)
-{
-  return size * nmemb;
-}
-
-size_t read_data_callback(void *ptr, size_t size, size_t nmemb, void *data)
-{
-  size_t sent;
-  
-  if (((struct grst_read_data *) data)->sent 
-        >= ((struct grst_read_data *) data)->maxsent) return 0;
-        
-  if (size * nmemb + ((struct grst_read_data *) data)->sent 
-        >= ((struct grst_read_data *) data)->maxsent)
-    {
-      sent = ((struct grst_read_data *) data)->maxsent 
-             - ((struct grst_read_data *) data)->sent;
-    }
-  else sent = size * nmemb;        
-
-  memcpy(ptr, 
-         ((struct grst_read_data *) data)->buf +
-         ((struct grst_read_data *) data)->sent,
-         sent);
-
-  ((struct grst_read_data *) data)->sent += sent;
-  
-  return sent;
-}
-
-char *canonicalise(char *link, char *source)
-{
-  int   i, j, srclen;
-  char *s;
-
-  srclen = strlen(source);
-
-  if ((strncmp(link, "https://", 8) == 0) ||
-      (strncmp(link, "http://", 7) == 0))
-    {
-      if (strncmp(link, source, srclen) != 0) return NULL; /* other site */
-      
-      if (link[srclen] == '\0') return NULL; /* we dont self-link! */
-      
-      for (i=0; link[srclen + i] != '\0'; ++i)
-        if (link[srclen + i] == '/')
-          { 
-            if (link[srclen + i + 1] != '\0') return NULL; /* no subdirs */
-            else return strdup(&link[srclen]); /* resolves to this dir */
-          }
-    }
-  else if (link[0] != '/') /* relative link - need to check for subsubdirs */
-    {
-      for (i=0; link[i] != '\0'; ++i) 
-        if ((link[i] == '/') && (link[i+1] != '\0')) return NULL;
-
-      s = strdup(link);
-      
-      for (i=0; s[i] != '\0'; ++i) 
-       if (s[i] == '#')
-         {
-           s[i] = '\0';
-           break;
-         }
-
-      return s;
-    }
-
-  /* absolute link on this server, starting / */
-
-  for (i=8; source[i] != '\0'; ++i) if (source[i] == '/') break;
-       
-  if (strncmp(link, &source[i], srclen - i) != 0) return NULL;
-
-  for (j = srclen - i; link[j] != '\0'; ++j)
-        if ((link[j] == '/') && (link[j+1] != '\0')) return NULL;
-        
-  s = strdup(&link[srclen - i]);
-      
-  for (i=0; s[i] != '\0'; ++i) 
-       if (s[i] == '#')
-         {
-           s[i] = '\0';
-           break;
-         }
-
-  if (s[0] == '\0') /* on second thoughts... */
-    {
-      free(s);
-      return NULL;
-    }
-         
-  return s;      
-}
-
-int grst_dir_list_cmp(const void *a, const void *b)
-{
-  return strcmp( ((struct grst_dir_list *) a)->filename, 
-                 ((struct grst_dir_list *) b)->filename);
-}
-
-struct grst_dir_list *index_to_dir_list(char *text, char *source)
-{
-  int   taglevel = 0, wordnew = 1, i, namestart, used = 0, 
-        allocated = 256;
-  char *p, *s;
-  struct grst_dir_list *list;
-  
-  list = (struct grst_dir_list *)
-              malloc(allocated * sizeof(struct grst_dir_list));
-              
-  list[0].filename     = NULL;
-  list[0].length       = 0;
-  list[0].length_set   = 0;
-  list[0].modified     = 0;
-  list[0].modified_set = 0;
-    
-  for (p=text; *p != '\0'; ++p)
-     {
-       if (*p == '<') 
-         {
-           ++taglevel;
-           
-           if ((taglevel == 1) && (list[used].filename != NULL))
-             {
-               ++used;
-               if (used >= allocated) 
-                 {
-                   allocated += 256;
-                   list = (struct grst_dir_list *)
-                           realloc((void *) list,
-                                   allocated * sizeof(struct grst_dir_list));
-                 }
-                 
-               list[used].filename     = NULL;
-               list[used].length       = 0;
-               list[used].length_set   = 0;
-               list[used].modified     = 0;
-               list[used].modified_set = 0;
-             }
-
-           wordnew = 1;
-           continue;
-         }
-
-       if (*p == '>') 
-         {
-           --taglevel;
-           wordnew = 1;
-           continue;
-         }
-         
-       if (isspace(*p))
-         {
-           wordnew = 1;
-           continue;
-         }
-
-       if ((wordnew) && (taglevel == 1))
-         {        
-           if (((*p == 'h') || (*p == 'H')) && 
-               (strncasecmp(p, "href=", 5) == 0))
-             {
-               if (p[5] == '"') { namestart = 6;
-                                  for (i=namestart; (p[i] != '\0') &&
-                                                    (p[i] != '"' ) &&
-                                                    (p[i] != '\n') &&
-                                                    (p[i] != '\t') &&
-                                                    (p[i] != '>' ) ; ++i) ; }
-               else { namestart = 5;
-                      for (i=namestart; (p[i] != '\0') &&
-                                        (p[i] != '"' ) &&
-                                        (p[i] != ' ' ) &&
-                                        (p[i] != '\n') &&
-                                        (p[i] != '\t') &&
-                                        (p[i] != ')' ) &&
-                                        (p[i] != '>' ) ; ++i) ; }
-               if (i > namestart)
-                 {
-                   s = malloc(1 + i - namestart);
-                   memcpy(s, &p[namestart], i - namestart);
-                   s[i - namestart] = '\0';
-
-                   list[used].filename = canonicalise(s, source);
-                   free(s);
-                   
-                   if ((list[used].filename != NULL) &&
-                       ((list[used].filename[0] == '\0') ||
-                        (strcmp(list[used].filename, "/") == 0)))
-                     {
-                       free(list[used].filename);
-                       list[used].filename = NULL;
-                     }
-                 }
-                 
-               p = &p[i-1]; /* -1 since continue results in ++i */
-               continue;
-             }
-
-           if (((*p == 'c') || (*p == 'C')) && 
-               (strncasecmp(p, "content-length=", 15) == 0))
-             {
-               list[used].length     = 0;
-               list[used].length_set = 1;
-               
-               if (p[15] == '"') list[used].length = atoi(&p[16]);
-               else              list[used].length = atoi(&p[15]);
-
-               p = &p[15];
-               continue;
-             }
-
-           if (((*p == 'l') || (*p == 'L')) && 
-               (strncasecmp(p, "last-modified=", 14) == 0))
-             {
-               list[used].modified     = 0;
-               list[used].modified_set = 1;
-               
-               if (p[14] == '"') list[used].modified = atoi(&p[15]);
-               else              list[used].modified = atoi(&p[14]);
-
-               p = &p[14];
-               continue;
-             }
-         }
-         
-       wordnew = 0;
-     }  
-
-  qsort((void *) list, used, sizeof(struct grst_dir_list), grst_dir_list_cmp);
-
-  return list;  
-}
-
-#if 0
-static char *GRSThttpUrlMildencode(char *in)
-/* Return a pointer to a malloc'd string holding a partially URL-encoded
-   version of *in. "Partially" means that A-Z a-z 0-9 . = - _ @ and /
-   are passed through unmodified. (DN's processed by GRSThttpUrlMildencode()
-   can be used as valid Unix paths+filenames if you are prepared to
-   create or simulate the resulting /X=xyz directories.) */
-{
-  char *out, *p, *q;
-
-  out = malloc(3*strlen(in) + 1);
-
-  p = in;
-  q = out;
-
-  while (*p != '\0')
-       {
-         if (isalnum(*p) || (*p == '.') || (*p == '=') || (*p == '-')
-                         || (*p == '/') || (*p == '@') || (*p == '_'))
-           {
-             *q = *p;
-             ++q;
-           }
-         else if (*p == ' ')
-           {
-             *q = '+';
-             ++q;
-           }
-         else
-           {
-             sprintf(q, "%%%2X", *p);
-             q = &q[3];
-           }
-
-         ++p;
-       }
-
-  *q = '\0';
-  return out;
-}
-#endif
-
-GRSTgaclPerm get_gaclPerm(struct fuse_context *fuse_ctx, char *path)
-{
-  GRSTgaclPerm perm = GRST_PERM_NONE; 
-  GRSTgaclCred *cred;
-  GRSTgaclUser *user = NULL;
-  GRSTgaclAcl  *acl;
-  char *dn = NULL;
-
-// eventually want a UID cache here...
-
-/*
-// want root to be able to read anything, and to write to anything under
-// local_root - need to test if talking about a symbolic link??
-  if (fuse_ctx->uid == 0) 
-    {
-      if (debugmode) syslog(LOG_DEBUG, 
-              "get_gaclPerm returns perm=%d for root user", GRST_PERM_ALL);
-      return GRST_PERM_ALL;
-    }
-*/
-  dn = mapdir_uid_to_dn(fuse_ctx->uid);
-  
-  if (dn != NULL)
-    {
-      cred = GRSTgaclCredNew("person");
-      GRSTgaclCredAddValue(cred, "dn", dn);
-      user = GRSTgaclUserNew(cred);
-      free(dn);
-    }   
-  
-  acl  = GRSTgaclAclLoadforFile(path); 
-  perm = GRSTgaclAclTestUser(acl, user);
-  GRSTgaclAclFree(acl);
-  GRSTgaclUserFree(user);
-  
-  if (strstr(path, GRST_ACL_FILE) != NULL) perm &= ~GRST_PERM_WRITE;
-
-  if (debugmode) syslog(LOG_DEBUG, "get_gaclPerm returns perm=%d", perm);
-
-  return perm;            
-}
-
-int read_headers_from_cache(struct fuse_context *fuse_ctx, char *filename, 
-                            off_t *length, time_t *modified)
-{
-  char *encoded_filename, *disk_filename;
-  int   len;
-  long  content_length, last_modified;
-  FILE *fp;
-  struct stat statbuf;
-  time_t now;
-  
-  encoded_filename = GRSThttpUrlMildencode(filename);
-  
-  len = strlen(encoded_filename);
-
-  if (encoded_filename[len - 1] == '/') /* a directory */
-       asprintf(&disk_filename, "%s/%d%s%s", 
-                GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename, GRST_SLASH_DIRFILE);
-  else asprintf(&disk_filename, "%s/%d%s%s", 
-                GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
-
-  free(encoded_filename);
-
-// Change to fstat for the benefit of multiple threads:
-
-  if (stat(disk_filename, &statbuf) != 0) /* no cache file to read */
-    {
-      free(disk_filename);
-      return 0;
-    }
-
-  time(&now);
-
-  if (statbuf.st_mtime < now - GRST_SLASH_HEADERS_EXPIRE)
-    {
-      unlink(disk_filename); /* tidy up expired cache file */
-      free(disk_filename);
-      return 0;
-    }      
-
-  last_modified  = 0;
-  content_length = 0;
-
-  if (debugmode) syslog(LOG_DEBUG, "Opening %s from cache", disk_filename);
-
-  fp = fopen(disk_filename, "r");
-  free(disk_filename);
-
-  if (fp != NULL)
-    {
-      fscanf(fp, "content-length=%ld last-modified=%ld ", 
-                 &content_length, &last_modified);
-      fclose(fp);
-
-      if (debugmode) syslog(LOG_DEBUG, "content-length=%ld last-modified=%ld", 
-                            content_length, last_modified);
-
-      *length   = (off_t)  content_length;
-      *modified = (time_t) last_modified;
-
-      return 1;
-    }
-
-  return 0;
-}
-
-int write_headers_to_cache(struct fuse_context *fuse_ctx, char *filename, 
-                           off_t length, time_t modified)
-{
-  int         fd, len;
-  char       *tempfile, *headline, *encoded_filename, *p, *newdir,
-             *new_filename;
-  struct stat statbuf;
-
-  asprintf(&tempfile, "%s/headers-XXXXXX", GRST_SLASH_TMP);
-  fd = mkstemp(tempfile);
-
-  if (fd == -1)
-    {
-      free(tempfile);
-      return 0;
-    }
-
-  asprintf(&headline, "content-length=%ld last-modified=%ld \n", 
-                                (long) length, (long) modified);
-  
-  if ((write(fd, headline, strlen(headline)) == -1) ||
-      (close(fd) == -1))
-    {
-      free(tempfile);
-      free(headline);
-      return 0;
-    }
-
-  free(headline);
-                     
-  encoded_filename = GRSThttpUrlMildencode(filename);
-
-// need to protect against .. ?
-   
-  for (p = encoded_filename; *p != '\0'; ++p)
-     {  
-       if (*p != '/') continue;
-     
-       *p = '\0';
-       asprintf(&newdir, "%s/%d%s", GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
-       *p = '/';
-           
-       if (stat(newdir, &statbuf) == 0)
-         {
-           if (!S_ISDIR(statbuf.st_mode)) /* exists already - not a directory! */
-             {
-               unlink(newdir);
-               mkdir(newdir, S_IRUSR | S_IWUSR | S_IXUSR);
-             }
-           /* else it already exists as a directory - so ok */
-         }
-       else mkdir(newdir, S_IRUSR | S_IWUSR | S_IXUSR);
-
-       free(newdir);
-     }
-
-  len = strlen(encoded_filename);
-
-  if (encoded_filename[len - 1] == '/') /* a directory */
-       asprintf(&new_filename, "%s/%d%s%s", 
-                GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename, GRST_SLASH_DIRFILE);
-  else asprintf(&new_filename, "%s/%d%s", 
-                GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
-
-  free(encoded_filename);
-  
-  if ((stat(new_filename, &statbuf) == 0) && S_ISDIR(statbuf.st_mode))
-    {
-// need change this to do it recursively in case any files/subdirs too
-      rmdir(new_filename);
-    }
-
-  rename(tempfile, new_filename);
-
-  if (debugmode) syslog(LOG_DEBUG, "Added %s to cache (%ld %ld)\n", 
-                                   new_filename, length, modified);
-
-  free(tempfile);
-  free(new_filename);
-
-  return 1;
-}
-
-static int slashgrid_readdir(const char *path, void *buf, 
-                             fuse_fill_dir_t filler,
-                             off_t offset, struct fuse_file_info *fi)
-{
-  (void) offset;
-  (void) fi;
-
-  int          anyerror = 0, thiserror, i, ilast, len, isdir;
-  const char  *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
-                            "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-  char        *s, *url, errorbuffer[CURL_ERROR_SIZE+1] = "", *dirname, *p;
-  struct       grst_body_text  rawindex;
-  struct       grst_dir_list   *list;
-  struct       grst_request request_data;
-  struct       tm               modified_tm;
-  struct       stat             stat_tmp;
-  time_t                        now;
-  struct fuse_context fuse_ctx;
-  struct dirent **dirlist;
-  GRSTgaclPerm  perm;
-  
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
-  if (debugmode) syslog(LOG_DEBUG, "in slashgrid_readdir");
-
-  if (strcmp(path, "/") == 0)
-    {
-      filler(buf, ".",     NULL, 0);
-      filler(buf, "..",    NULL, 0);
-      filler(buf, "http",  NULL, 0);
-      filler(buf, "https", NULL, 0);
-      return 0;
-    }
-    
-  if ((strcmp(path, "/http") == 0) || (strcmp(path, "/https") == 0))
-    {
-      filler(buf, ".",     NULL, 0);
-      filler(buf, "..",    NULL, 0);
-
-      asprintf(&dirname, "%s/%d%s", GRST_SLASH_HEADERS, fuse_ctx.uid, path);
-      ilast = scandir(dirname, &dirlist, 0, alphasort) - 1;
-
-      for (i=0; i <= ilast; ++i)
-         {
-           if (dirlist[i]->d_name[0] != '.')
-                 filler(buf, dirlist[i]->d_name, NULL, 0);
-           free(dirlist[i]);
-         }
-         
-      if (ilast >= 0) free(dirlist);      
-      free(dirname);
-    
-      return 0;
-    }
-  else if ((local_root != NULL) &&
-           ((strcmp(path, "/local") == 0) || 
-            (strncmp(path, "/local/", 7) == 0)))
-    {
-      asprintf(&dirname, "%s%s/", local_root, &path[6]);
-
-      perm = get_gaclPerm(&fuse_ctx, dirname);
-
-      if (!GRSTgaclPermHasList(perm))
-        {
-          free(dirname);
-          return -EACCES;
-        }
-        
-      ilast = scandir(dirname, &dirlist, 0, alphasort) - 1;
-      free(dirname);
-
-      if (ilast < 0) return -ENOENT;
-              
-//      filler(buf, ".",     NULL, 0);
-//      filler(buf, "..",    NULL, 0);
-
-      for (i=0; i <= ilast; ++i)
-         {
-//           if (dirlist[i]->d_name[0] != '.')
-                 filler(buf, dirlist[i]->d_name, NULL, 0);
-           free(dirlist[i]);
-         }
-         
-      free(dirlist);      
-
-      return 0;
-    }
-  else if (strncmp(path, "/http/", 6) == 0)
-    asprintf(&url, "http://%s/", &path[6]);
-  else if (strncmp(path, "/https/", 7) == 0)
-    asprintf(&url, "https://%s/", &path[7]);
-  else return -ENOENT;
-
-  rawindex.text      = NULL;
-  rawindex.used      = 0;
-  rawindex.allocated = 0;
-
-  bzero(&request_data, sizeof(struct grst_request));
-  request_data.writefunction = rawbody_callback;
-  request_data.writedata     = (void *) &rawindex;
-  request_data.errorbuffer   = errorbuffer;
-  request_data.url           = url;
-  request_data.method        = GRST_SLASH_GET;
-  request_data.start         = -1;
-  request_data.finish        = -1;
-  
-  if (debugmode) syslog(LOG_DEBUG, "Get directory listing from URL %s", url);
-  
-  thiserror = perform_request(&request_data, &fuse_ctx);
-
-  if ((thiserror != 0) ||
-           (request_data.retcode <  200) ||
-           (request_data.retcode >= 300))
-         {
-           if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-           
-           if (thiserror != 0) anyerror = thiserror;
-           else                anyerror = request_data.retcode;
-
-           if (request_data.retcode == 403) return -EACCES;
-           else return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-         }
-  else
-         {
-           time(&now);
-
-           filler(buf, ".", NULL, 0);
-           filler(buf, "..", NULL, 0);
-
-           rawindex.text[rawindex.used] = '\0';
-
-// we need to get this out of headers cache instead iff still valid
-
-           list  = index_to_dir_list(rawindex.text, url);
-           ilast = -1;
-
-           for (i=0; list[i].filename != NULL; ++i)
-              {
-                if (debugmode) syslog(LOG_DEBUG, 
-                         "in slashgrid_readdir, list[%d].filename=%s",
-                         i, list[i].filename);
-              
-                if (strncmp(list[i].filename, "mailto:", 7) == 0) continue;
-
-                len = strlen(list[i].filename);
-                if (list[i].filename[len-1] == '/')
-                  {
-                    isdir = 1;
-                    list[i].filename[len-1] = '\0';
-                  }
-                else 
-                  {
-                    isdir = 0;
-                    
-                    if ((p = index(list[i].filename, '?')) != NULL) *p = '\0';
-                  }
-                
-                /* skip over duplicates */
-                
-                if ((ilast >= 0) && 
-                    (strcmp(list[i].filename, list[ilast].filename) == 0))
-                                                                 continue;
-                ilast=i; /* last distinct entry */
-                
-                if (debugmode) syslog(LOG_DEBUG, 
-                         "in slashgrid_readdir, list[%d].filename=%s not dup",
-                         i, list[i].filename);
-
-                asprintf(&s, "%s/%s", path, list[i].filename);
-                write_headers_to_cache(&fuse_ctx, s, list[i].length, 
-                                       list[i].modified);
-                free(s);
-           
-                bzero(&stat_tmp, sizeof(struct stat));
-
-                stat_tmp.st_size  = list[i].length;
-                stat_tmp.st_mtime = list[i].modified;
-                stat_tmp.st_ctime = list[i].modified;
-                stat_tmp.st_atime = now;
-                stat_tmp.st_mode  = isdir ? 0777 : 0666;
-                filler(buf, list[i].filename, &stat_tmp, 0);
-
-                if (debugmode) syslog(LOG_DEBUG, 
-                         "in slashgrid_readdir, filler list[%d].filename=%s %lu %lu",
-                         i, list[i].filename, stat_tmp.st_size, stat_tmp.st_mtime);
-              }
-         }
-     
-  if (debugmode) syslog(LOG_DEBUG, 
-                         "in slashgrid_readdir, return 0");
-  return 0;
-}
-
-static int slashgrid_getattr(const char *rawpath, struct stat *stbuf)
-{
-  int          anyerror = 0, thiserror, i, ilast, len, ret;
-  char        *s, *url, *path, errorbuffer[CURL_ERROR_SIZE+1] = "", *p;
-  struct       grst_dir_list   *list;
-  struct       grst_request request_data;
-  struct       tm               modified_tm;
-  struct       stat             stat_tmp;
-  time_t                        now;
-  GRSTgaclPerm dirperm, perm;
-
-  struct fuse_context fuse_ctx;
-
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
-  if (debugmode) syslog(LOG_DEBUG, 
-                         "in slashgrid_getattr, rawpath=%s, UID=%d\n",
-                         rawpath, fuse_ctx.uid);
-
-  memset(stbuf, 0, sizeof(struct stat));
-  stbuf->st_mode  = S_IFREG | 0755;
-  stbuf->st_nlink = 1;
-  
-  if ((strcmp(rawpath, "/")      == 0) ||
-      (strcmp(rawpath, "/http")  == 0) ||
-      (strcmp(rawpath, "/https") == 0) ||
-      ((local_root != NULL) && (strcmp(rawpath, "/local") == 0)))
-    {
-      stbuf->st_mode = S_IFDIR | 0755;
-              
-      return 0; /* Empty top level directories: OK */
-    }
-  else if (strncmp(rawpath, "/http/", 6) == 0)
-    {
-      if (index(&rawpath[6], '/') == NULL) /* top directory for remote server */
-        {
-          stbuf->st_mode = S_IFDIR | 0755;
-          
-          asprintf(&url, "http://%s/", &rawpath[6]);
-          asprintf(&path, "%s/", rawpath);
-        }
-      else 
-        {
-          asprintf(&url, "http://%s", &rawpath[6]);      
-          path = strdup(rawpath);
-        }
-    }
-  else if (strncmp(rawpath, "/https/", 7) == 0)
-    {
-      if (index(&rawpath[7], '/') == NULL) /* top directory for remote server */
-        {
-          stbuf->st_mode = S_IFDIR | 0755;
-
-          asprintf(&url, "https://%s/", &rawpath[7]);
-          asprintf(&path, "%s/", rawpath);
-        }
-      else 
-        {
-          asprintf(&url, "https://%s", &rawpath[7]);
-          path = strdup(rawpath);
-        }
-    }
-  else if ((local_root != NULL) && (strncmp(rawpath, "/local/", 7) == 0))
-    {      
-      asprintf(&path, "%s/%s", local_root, &rawpath[7]);
- 
-      ret = stat(path, &stat_tmp);
-
-      if (debugmode) syslog(LOG_DEBUG, "path=%s ret=%d", path, ret);
-
-      if ((ret == 0) && S_ISDIR(stat_tmp.st_mode))
-        {
-          dirperm = get_gaclPerm(&fuse_ctx, path);
-        
-          p = rindex(path, '/');
-          if (p != NULL) *p = '\0'; 
-          /* strip off directory name itself if a directory, 
-             so get the GACL of the parent directory */
-
-          perm = get_gaclPerm(&fuse_ctx, path);
-        }
-      else
-        {      
-          perm = get_gaclPerm(&fuse_ctx, path);
-          dirperm = perm;
-        }
-
-      if (!GRSTgaclPermHasRead(perm)) ret = -EACCES;
-      else if (ret == 0)
-        {
-          stbuf->st_nlink   = 1;
-          stbuf->st_uid     = fuse_ctx.uid;
-          stbuf->st_gid     = fuse_ctx.gid;
-          stbuf->st_size    = stat_tmp.st_size;
-          stbuf->st_blksize = stat_tmp.st_blksize;
-          stbuf->st_blocks  = stat_tmp.st_blocks;
-          stbuf->st_atime   = stat_tmp.st_atime;
-          stbuf->st_mtime   = stat_tmp.st_mtime;
-          stbuf->st_ctime   = stat_tmp.st_ctime;
-        
-          if (S_ISDIR(stat_tmp.st_mode))
-            {
-              stbuf->st_mode = S_IFDIR;
-            
-              if (GRSTgaclPermHasWrite(dirperm)) 
-                                        stbuf->st_mode |= S_IWUSR;
-
-              if (GRSTgaclPermHasList(dirperm)) 
-                                        stbuf->st_mode |= S_IRUSR | S_IXUSR;
-            }
-          else
-            {
-              stbuf->st_mode = S_IFREG;
-
-              if (GRSTgaclPermHasWrite(perm)) 
-                                        stbuf->st_mode |= S_IWUSR;
-
-              if (GRSTgaclPermHasRead(perm)) 
-                                        stbuf->st_mode |= S_IRUSR;
-            }          
-            
-          
-        }  
-      else ret = -ENOENT;
-      
-      free(path);
-
-      if (debugmode) syslog(LOG_DEBUG, "slashgrid_getattr returns %d for %s",
-                                       ret, rawpath);
-      return ret;
-    }
-  else return -ENOENT;
-  
-  time(&now);
-
-  if (read_headers_from_cache(&fuse_ctx, path, 
-                              &(stbuf->st_size), &(stbuf->st_mtime)))
-    {
-      if (debugmode) syslog(LOG_DEBUG, 
-          "Retrieving details for %s from cache (%ld %ld)\n", url,
-          (long) stbuf->st_mtime, (long) stbuf->st_size);
-    
-      stbuf->st_ctime = stbuf->st_mtime;
-      stbuf->st_atime = now;
-      
-      free(url);
-      free(path);
-      return 0;    
-    }
-
-  bzero(&request_data, sizeof(struct grst_request));
-  request_data.writefunction = null_callback;
-  request_data.writedata     = NULL;
-  request_data.errorbuffer   = errorbuffer;
-  request_data.url           = url;
-  request_data.method        = GRST_SLASH_HEAD;
-  request_data.start         = -1;
-  request_data.finish        = -1;
-
-  thiserror = perform_request(&request_data, &fuse_ctx);
-
-  if ((thiserror != 0) ||
-           (request_data.retcode < 200) ||
-           (request_data.retcode > 301))
-         {
-           if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-           
-           if (thiserror != 0) anyerror = thiserror;
-           else                anyerror = request_data.retcode;
-
-           free(url);
-           free(path);
-           
-           if (request_data.retcode == 403) return -EACCES;
-           else return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-         }
-         
-  if (request_data.retcode == 301)
-    {
-       if (debugmode) syslog(LOG_DEBUG, "301 detected");
-
-       len = strlen(url);
-      
-       if ((request_data.location[0] != '\0') &&
-          (len + 1 == strlen(request_data.location)) &&
-          (request_data.location[len] == '/') &&
-          (strncmp(url, request_data.location, len) == 0))
-        {
-          free(url);
-          url = strdup(request_data.location);
-          request_data.url = url;
-                  
-          thiserror = perform_request(&request_data, &fuse_ctx);
-
-          if ((thiserror != 0) ||
-              (request_data.retcode < 200) ||
-              ((request_data.retcode > 299) && (request_data.retcode != 403)))
-            {
-              if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-           
-              if (thiserror != 0) anyerror = thiserror;
-              else                anyerror = request_data.retcode;
-
-              free(url);
-              free(path);
-              return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-            }
-            
-          stbuf->st_mode  = S_IFDIR | 0755;  /* this is a directory */
-
-          free(path);
-          asprintf(&path, "%s/", rawpath);
-        }
-      else 
-        {
-          free(url);
-          free(path);
-          return -ENOENT;
-        }
-    }
-
-  if (request_data.length_set) stbuf->st_size  = request_data.length;
-  else stbuf->st_size = 0;
-  
-  if (request_data.modified_set)
-    {
-      stbuf->st_mtime = request_data.modified;
-      stbuf->st_ctime = request_data.modified;
-    }
-
-  stbuf->st_atime = now;
-
-  write_headers_to_cache(&fuse_ctx, path, stbuf->st_size, stbuf->st_mtime);
-
-  free(url);
-  free(path);
-  return 0;
-}
-
-int write_block_to_cache(struct fuse_context *fuse_ctx, char *filename,  
-                         off_t start, off_t finish)
-{
-  int          anyerror = 0, thiserror, i, fd;
-  char        *s, *url, *tempfile, *encoded_filename, *p,
-              *newdir, *new_filename, errorbuffer[CURL_ERROR_SIZE+1] = "";
-  struct       stat statbuf;
-  struct       grst_request request_data;
-  FILE        *fp;
-
-  asprintf(&tempfile, "%s/blocks-XXXXXX", GRST_SLASH_TMP);
-  fd = mkstemp(tempfile);
-
-  if (fd == -1)
-    {
-      free(tempfile);
-      return -EIO;
-    }
-
-  fp = fdopen(fd, "w");
-
-  if (strncmp(filename, "/http/", 6) == 0)
-    asprintf(&url, "http://%s", &filename[6]);
-  else if (strncmp(filename, "/https/", 7) == 0)
-    asprintf(&url, "https://%s", &filename[7]);
-  else return -ENOENT;
-
-  bzero(&request_data, sizeof(struct grst_request));
-  request_data.writefunction = fwrite;
-  request_data.writedata     = (void *) fp;
-  request_data.errorbuffer   = errorbuffer;
-  request_data.url           = url;
-  request_data.method        = GRST_SLASH_GET;
-  request_data.start         = start;
-  request_data.finish        = finish;
-
-  if (debugmode) syslog(LOG_DEBUG, "Get block %ld-%ld from URL %s\n",
-                                   (long) start, (long) finish, url);
-  
-  thiserror = perform_request(&request_data, fuse_ctx);
-
-  free(url);
-
-  fclose(fp);  
-
-  if ((thiserror != 0) ||
-           (request_data.retcode <  200) ||
-           (request_data.retcode >= 300))
-         {
-           if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-
-           if (thiserror != 0) anyerror = thiserror;
-           else                anyerror = request_data.retcode;
-
-           if (request_data.retcode == 403) return -EACCES;
-           else return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-         }
-
-  encoded_filename = GRSThttpUrlMildencode(filename);
-
-// need to protect against .. ?
-// can optimise by checking for existing of filename as a dir at the start
-
-  for (p = encoded_filename; ; ++p)
-     {  
-       if ((*p != '/') && (*p != '\0')) continue;
-     
-       if (*p == '/') 
-         {
-           *p = '\0';
-           asprintf(&newdir, "%s/%d%s", 
-                    GRST_SLASH_BLOCKS, fuse_ctx->uid, encoded_filename);
-           *p = '/';
-         }
-       else asprintf(&newdir, "%s/%d%s", 
-                     GRST_SLASH_BLOCKS, fuse_ctx->uid, encoded_filename);
-           
-       if (stat(newdir, &statbuf) != 0)
-                                   mkdir(newdir, S_IRUSR | S_IWUSR | S_IXUSR);
-       free(newdir);
-       
-       if (*p == '\0') break;
-     }
-
-  asprintf(&new_filename, "%s/%d%s/%ld-%ld", GRST_SLASH_BLOCKS, fuse_ctx->uid,
-                           encoded_filename, (long) start, (long) finish);
-
-  free(encoded_filename);
-  
-  rename(tempfile, new_filename);
-
-  if (debugmode) syslog(LOG_DEBUG, "Added %s to block cache", new_filename);
-
-  free(tempfile);
-  free(new_filename);
-
-  return 0;
-}
-
-int drop_cache_blocks(struct fuse_context *fuse_ctx, char *filename)
-/* drop ALL the blocks cached for this file, and delete the directory in
-   the blocks cache for this file */
-{
-  int   ret;
-  char *encoded_filename, *dirname, *blockname;
-  DIR *blocksDIR;
-  struct dirent *blocks_ent;
-
-  encoded_filename = GRSThttpUrlMildencode(filename);
-  
-  asprintf(&dirname, "%s/%d%s", 
-                     GRST_SLASH_BLOCKS, fuse_ctx->uid, encoded_filename);
-
-  free(encoded_filename);
-
-  blocksDIR = opendir(dirname);
-  
-  if (blocksDIR == NULL) /* no directory to delete (probably) */
-    {
-      free(dirname);
-      return 1;
-    }
-    
-  while ((blocks_ent = readdir(blocksDIR)) != NULL)
-       {
-         asprintf(&blockname, "%s/%s", dirname, blocks_ent->d_name);
-         remove(blockname);
-         free(blockname);
-       }  
-  
-  closedir(blocksDIR);
-    
-  ret = rmdir(dirname);
-  free(dirname);  
-
-  return ret ? 1 : 0; /* return 1 on error, 0 on rmdir() success */
-}
-
-static int slashgrid_read(const char *path, char *buf, 
-                          size_t size, off_t offset,
-                          struct fuse_file_info *fi)
-{
-  (void) offset;
-  (void) fi;
-
-  int          anyerror = 0, thiserror, i, ilast, fd;
-  char        *s, *url, *disk_filename, *encoded_filename, *localpath;
-  off_t        block_start, block_finish, block_i, len;
-  struct       grst_body_text   rawbody;
-  struct       grst_request request_data;
-  struct       tm               modified_tm;
-  struct       stat             statbuf;
-  time_t                        now;
-  GRSTgaclPerm perm;
-  struct fuse_context fuse_ctx;
-
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-  
-  if (debugmode) syslog(LOG_DEBUG, "in slashgrid_read size=%ld offset=%ld",
-                                    (long) size, (long) offset);
-
-  if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
-    {
-      asprintf(&localpath, "%s/%s", local_root, &path[7]);
-      
-      perm = get_gaclPerm(&fuse_ctx, localpath);
-      
-      if (GRSTgaclPermHasRead(perm))
-        {
-          fd = open(localpath, O_RDONLY);
-
-          if (lseek(fd, offset, SEEK_SET) < 0) size = -1;
-          else size = read(fd, buf, size);
-
-          close(fd);                  
-        }
-      else size = -1;
-      
-      free(localpath);
-      
-      return size;
-    }
-
-  if ((strncmp(path, "/http/",  6) != 0) &&
-      (strncmp(path, "/https/", 7) != 0)) return -ENOENT;
-
-  block_start  = GRST_SLASH_BLOCK_SIZE * (offset / GRST_SLASH_BLOCK_SIZE);
-  block_finish = GRST_SLASH_BLOCK_SIZE *
-                                ((offset + size - 1) / GRST_SLASH_BLOCK_SIZE);
-
-  encoded_filename = GRSThttpUrlMildencode((char *) path);
-  time(&now);
- 
-  for (block_i = block_start; block_i <= block_finish; block_i += GRST_SLASH_BLOCK_SIZE)
-     {     
-       asprintf(&disk_filename, "%s/%d%s/%ld-%ld", 
-                 GRST_SLASH_BLOCKS, fuse_ctx.uid, encoded_filename, 
-                 (long) block_i, (long) (block_i + GRST_SLASH_BLOCK_SIZE - 1));
-
-       if (debugmode) syslog(LOG_DEBUG, "disk_filename=%s", disk_filename);
-                 
-       if ((stat(disk_filename, &statbuf) != 0) ||
-           (statbuf.st_mtime < now - GRST_SLASH_HEADERS_EXPIRE))
-         {
-           write_block_to_cache(&fuse_ctx, (char *) path, 
-                            block_i, block_i + GRST_SLASH_BLOCK_SIZE - 1);
-         }
-
-// need to worry about cached copy being deleted (invalidated by a writing
-// thread?) between write_block_to_cache() and these reads?
-// maybe return fd from write_block_to_cache() itself???
-// the initial stat() needs to be part of this too
-
-       if ((fd = open(disk_filename, O_RDONLY)) != -1)
-         {
-           if (block_i == block_start)              
-             {
-               lseek(fd, offset - block_start, SEEK_SET);
-               read(fd, buf, 
-                        (offset - block_start + size < GRST_SLASH_BLOCK_SIZE) 
-                       ? size : GRST_SLASH_BLOCK_SIZE - offset + block_start);
-             }
-           else if (block_i == block_finish)
-             {
-               read(fd, buf + (block_i - block_start),
-                        offset + size - block_i);
-             }
-           else 
-             {
-               read(fd, buf + (block_i - block_start), 
-                        GRST_SLASH_BLOCK_SIZE);
-             }
-             
-           close(fd);
-         }        
-       else syslog(LOG_ERR, "Failed to open %s in cache", disk_filename);
-     }
-
-  free(disk_filename);
-  free(encoded_filename);
-
-  return size;
-}
-
-static int slashgrid_write(const char *path, const char *buf, 
-                           size_t size, off_t offset,
-                           struct fuse_file_info *fi)
-{
-  int          anyerror = 0, thiserror, i, fd;
-  char        *s, *url, *p, errorbuffer[CURL_ERROR_SIZE+1] = "", *localpath;
-  GRSTgaclPerm perm;
-
-  struct grst_read_data read_data;
-  struct grst_request request_data;
-  struct fuse_context fuse_ctx;
-  
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));  
-
-  if (debugmode) syslog(LOG_DEBUG, "in slashgrid_write, path=%s, UID=%d\n",
-                                   path, fuse_ctx.uid);
-                         
-  if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
-    {
-      asprintf(&localpath, "%s/%s", local_root, &path[7]);      
-      perm = get_gaclPerm(&fuse_ctx, localpath);
-      
-      if (GRSTgaclPermHasWrite(perm))
-        {
-          fd = open(localpath, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
-
-          if (lseek(fd, offset, SEEK_SET) < 0) size = -1;
-          else size = write(fd, buf, size);
-
-          fchown(fd, local_uid, local_gid);
-          close(fd);                  
-        }
-      else size = -1;
-      
-      free(localpath);
-      
-      return size;
-    }
-
-  if (strncmp(path, "/http/", 6) == 0)
-    asprintf(&url, "http://%s", &path[6]);
-  else if (strncmp(path, "/https/", 7) == 0)
-    asprintf(&url, "https://%s", &path[7]);
-  else return -ENOENT;
-
-  read_data.buf     = buf;
-  read_data.sent    = 0;
-  read_data.maxsent = size;
-
-  if (debugmode) syslog(LOG_DEBUG, "Put block %ld-%ld to URL %s", 
-                                   (long) offset, (long) offset+size-1, url);
-
-  drop_cache_blocks(&fuse_ctx, (char *) path); /* we drop all read-cache blocks first */
-  
-  bzero(&request_data, sizeof(struct grst_request));
-  request_data.writefunction = null_callback;
-  request_data.readfunction  = read_data_callback;
-  request_data.readdata      = &read_data;
-  request_data.infilesize    = size;
-  request_data.errorbuffer   = errorbuffer;
-  request_data.url           = url;
-  request_data.method        = GRST_SLASH_PUT;
-  request_data.start         = offset;
-  request_data.finish        = (off_t) (offset + size - 1);
-
-  thiserror = perform_request(&request_data, &fuse_ctx);
-
-  free(url);
-
-  if ((thiserror != 0) ||
-      (request_data.retcode <  200) ||
-      (request_data.retcode >= 300))
-    {
-           if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-           
-           if (thiserror != 0) anyerror = thiserror;
-           else                anyerror = request_data.retcode;
-
-           if (request_data.retcode == 403) return -EACCES;
-           else return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-    }
-
-  return size;
-}
-
-int slashgrid_rename(const char *oldpath, const char *newpath)
-{
-  int          anyerror = 0, thiserror, i, fd, ret;
-  char        *s, *url, *p, *destination, errorbuffer[CURL_ERROR_SIZE+1] = "",
-              *oldlocalpath, *newlocalpath;
-
-  struct grst_read_data read_data;
-  struct fuse_context fuse_ctx;
-  struct grst_request request_data;
-  GRSTgaclPerm oldperm, newperm;
-
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
-  if ((local_root != NULL) && 
-      ((strncmp(oldpath, "/local/", 7) == 0) ||
-       (strncmp(newpath, "/local/", 7) == 0)))
-    {
-      if (strncmp(oldpath, newpath, 7) != 0)
-        {
-          return -EXDEV; /* not on same filesystem */
-        }
-    
-      asprintf(&oldlocalpath, "%s/%s", local_root, &oldpath[7]);
-      asprintf(&newlocalpath, "%s/%s", local_root, &newpath[7]);
-      
-      oldperm = get_gaclPerm(&fuse_ctx, oldlocalpath);
-      newperm = get_gaclPerm(&fuse_ctx, newlocalpath);
-      
-      if (GRSTgaclPermHasWrite(oldperm) &&
-          GRSTgaclPermHasWrite(newperm))
-        {
-          ret = rename(oldlocalpath, newlocalpath);
-          free(oldlocalpath);
-          free(newlocalpath);
-          
-          return (ret == 0) ? 0 : -errno;
-        }
-
-      free(oldlocalpath);
-      free(newlocalpath);
-      return -EACCES;
-    }
-  else if (strncmp(oldpath, "/http/", 6) == 0)
-    {
-      if (strncmp(newpath, "/http/", 6) != 0) return -EXDEV;
-
-      asprintf(&url,         "http://%s", &oldpath[6]);
-      asprintf(&destination, "http://%s", &newpath[6]);
-    }
-  else if (strncmp(oldpath, "/https/", 7) == 0)
-    {
-      if (strncmp(newpath, "/https/", 7) != 0) return -EXDEV;
-
-      asprintf(&url,         "https://%s", &oldpath[7]);
-      asprintf(&destination, "https://%s", &newpath[7]);
-    }
-  else return -ENOENT;
-
-  read_data.buf     = "";
-  read_data.sent    = 0;
-  read_data.maxsent = 0;
-
-  if (debugmode) syslog(LOG_DEBUG, "MOVE URL %s to %s", url, destination);
-  
-  bzero(&request_data, sizeof(struct grst_request));
-  request_data.writefunction = null_callback;
-  request_data.readfunction  = read_data_callback;
-  request_data.readdata      = &read_data;
-  request_data.errorbuffer   = errorbuffer;
-  request_data.url           = url;
-  request_data.method        = GRST_SLASH_MOVE;
-  request_data.destination   = destination;
-
-  thiserror = perform_request(&request_data, &fuse_ctx);
-
-  free(url);
-  free(destination);
-
-  if ((thiserror != 0) ||
-      (request_data.retcode <  200) ||
-      (request_data.retcode >= 300))
-    {
-      if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-
-      if (thiserror != 0) anyerror = thiserror;
-      else                anyerror = request_data.retcode;
-
-      if (request_data.retcode == 403) return -EACCES;
-      else return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-    }
-
-  return 0;
-}
-
-int slashgrid_unlink(const char *path)
-{
-  int   anyerror = 0, thiserror, i, fd, ret;
-  char *s, *url, *p, errorbuffer[CURL_ERROR_SIZE+1] = "",
-              *localpath;
-
-  struct grst_read_data read_data;
-  struct fuse_context fuse_ctx;
-  struct grst_request request_data;
-  GRSTgaclPerm perm;
-
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
-  if (debugmode) syslog(LOG_DEBUG, "slashgrid_unlink called for %s", path);
-  
-  if (strncmp(path, "/http/", 6) == 0)
-    asprintf(&url, "http://%s", &path[6]);
-  else if (strncmp(path, "/https/", 7) == 0)
-    asprintf(&url, "https://%s", &path[7]);
-  else if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
-    {
-      asprintf(&localpath, "%s/%s", local_root, &path[7]);
-      
-      perm = get_gaclPerm(&fuse_ctx, localpath);
-      
-      if (GRSTgaclPermHasWrite(perm))
-        {
-          ret = remove(localpath);
-          free(localpath);
-          
-          return (ret == 0) ? 0 : -errno;
-        }
-
-      free(localpath);
-      return -EACCES;
-    }
-  else return -ENOENT;
-
-  read_data.buf     = "";
-  read_data.sent    = 0;
-  read_data.maxsent = 0;
-
-  if (debugmode) syslog(LOG_DEBUG, "DELETE URL %s", url);
-  
-  bzero(&request_data, sizeof(struct grst_request));
-  request_data.writefunction = null_callback;
-  request_data.readfunction  = read_data_callback;
-  request_data.readdata      = &read_data;
-  request_data.errorbuffer   = errorbuffer;
-  request_data.url           = url;
-  request_data.method        = GRST_SLASH_DELETE;
-
-  thiserror = perform_request(&request_data, &fuse_ctx);
-
-  free(url);
-
-  if ((thiserror != 0) ||
-           (request_data.retcode <  200) ||
-           (request_data.retcode >= 300))
-         {
-           if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-
-           if (thiserror != 0) anyerror = thiserror;
-           else                anyerror = request_data.retcode;
-
-           if (request_data.retcode == 403) return -EACCES;
-           else return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-         }
-
-  return 0;
-}
-
-int slashgrid_rmdir(const char *path)
-{
-  int   ret;
-  char *pathwithslash, *localpath;
-
-  asprintf(&pathwithslash, "%s/", path);
-  ret = slashgrid_unlink(pathwithslash);  
-  free(pathwithslash);
-
-/* error on GridSite side still??? */
-  
-  return ret;
-}
-
-int slashgrid_mknod(const char *path, mode_t mode, dev_t dev)
-{
-  int ret;
-
-  if (debugmode) syslog(LOG_DEBUG, "slashgrid_mknod called for %s", path);
-  
-  ret = slashgrid_write(path, "", 0, 0, NULL);
-
-  return (ret < 0) ? ret : 0;
-}
-
-int slashgrid_mkdir(const char *path, mode_t mode)
-{
-  int   ret;
-  char *pathwithslash, *localpath;
-  struct fuse_context fuse_ctx;
-  GRSTgaclPerm perm;
-  
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
-  if (debugmode) syslog(LOG_DEBUG, "slashgrid_mkdir, for %s", path);
-                                  
-  if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
-    {
-      asprintf(&localpath, "%s/%s", local_root, &path[7]);
-      
-      perm = get_gaclPerm(&fuse_ctx, localpath);
-      
-      if (GRSTgaclPermHasWrite(perm))
-        {
-          ret = mkdir(localpath, S_IRUSR | S_IWUSR | S_IXUSR);
-          chown(localpath, local_uid, local_gid);
-          free(localpath);
-          
-          return (ret == 0) ? 0 : -errno;
-        }
-
-      free(localpath);
-      return -EACCES;
-    }
-
-  asprintf(&pathwithslash, "%s/", path);
-  ret = slashgrid_write(pathwithslash, "", 0, 0, NULL);
-  free(pathwithslash);
-
-  return (ret < 0) ? ret : 0;
-}
-
-int slashgrid_chown(const char *path, uid_t uid, gid_t gid)
-{
-  if (debugmode) syslog(LOG_DEBUG, "slashgrid_chown - NOP");
-  return 0;
-}
-
-int slashgrid_chmod(const char *path, mode_t mode)
-{
-  if (debugmode) syslog(LOG_DEBUG, "slashgrid_chmod - NOP");
-  return 0;
-}
-
-int slashgrid_truncate(const char *path, off_t offset)
-{
-  int   anyerror = 0, thiserror, i, fd, ret;
-  char *s, *url, *p, errorbuffer[CURL_ERROR_SIZE+1] = "", *localpath;
-  GRSTgaclPerm perm;
-
-  struct grst_read_data read_data;
-  struct fuse_context fuse_ctx;
-  struct grst_request request_data;
-
-  memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
-  if (debugmode) syslog(LOG_DEBUG, "slashgrid_truncate, for %s (%d)",
-                                  path, offset);
-
-  if (strncmp(path, "/http/", 6) == 0)
-    asprintf(&url, "http://%s", &path[6]);
-  else if (strncmp(path, "/https/", 7) == 0)
-    asprintf(&url, "https://%s", &path[7]);
-  else if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
-    {
-      asprintf(&localpath, "%s/%s", local_root, &path[7]);
-      
-      perm = get_gaclPerm(&fuse_ctx, localpath);
-      
-      if (GRSTgaclPermHasWrite(perm))
-        {
-          ret = truncate(localpath, offset);
-          free(localpath);
-          
-          return (ret == 0) ? 0 : -errno;
-        }
-
-      free(localpath);
-      return -EACCES;
-    }
-  else return -ENOENT;
-
-  read_data.buf     = "";
-  read_data.sent    = 0;
-  read_data.maxsent = 0;
-
-  if (debugmode) syslog(LOG_DEBUG, "Truncate URL %s to %ld\n", 
-                                   url, (long) offset);
-  
-  bzero(&request_data, sizeof(struct grst_request));
-  request_data.writefunction = null_callback;
-  request_data.readfunction  = read_data_callback;
-  request_data.readdata      = &read_data;
-  request_data.errorbuffer   = errorbuffer;
-  request_data.url           = url;
-  request_data.method        = GRST_SLASH_TRUNC;
-  request_data.finish        = offset;
-
-  thiserror = perform_request(&request_data, &fuse_ctx);
-
-  free(url);
-
-  if ((thiserror != 0) ||
-           (request_data.retcode <  200) ||
-           (request_data.retcode >= 300))
-         {
-           if (debugmode)
-                syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
-                       errorbuffer, thiserror, request_data.retcode);
-
-           if (thiserror != 0) anyerror = thiserror;
-           else                anyerror = request_data.retcode;
-
-           if (request_data.retcode == 403) return -EACCES;
-           else return -ENOENT; 
-/* memory clean up still needed here!!!!!! */
-         }
-
-  return 0;
-}
-
-int slashgrid_statfs(const char *path, struct statfs *fs)
-{
-  /* statfs() on /local not used in practice, since not mounted separately */
-
-  if ((strncmp(path, "/local/", 7) == 0) ||
-      (strcmp(path, "/local") == 0))
-       return statfs(local_root, fs);
-  else return statfs(GRST_SLASH_BLOCKS, fs);
-}
-
-void *slashgrid_init(void)
-{
-  FILE *fp;
-  
-  if ((fp = fopen(GRST_SLASH_PIDFILE, "w")) != NULL)
-    {
-      fprintf(fp, "%d\n", (int) getpid());
-      fclose(fp);
-    }
-
-  return NULL;
-}
-
-void slashgrid_destroy(void *p)
-{
-  unlink(GRST_SLASH_PIDFILE);
-}
-
-static struct fuse_operations slashgrid_oper = {
-  .getattr	= slashgrid_getattr,
-  .chown	= slashgrid_chown,    
-  .chmod	= slashgrid_chmod,
-  .truncate	= slashgrid_truncate,    
-  .readdir	= slashgrid_readdir,
-  .write	= slashgrid_write,
-  .read		= slashgrid_read,
-  .mknod	= slashgrid_mknod,
-  .mkdir	= slashgrid_mkdir,
-  .unlink	= slashgrid_unlink,
-  .rmdir	= slashgrid_rmdir,
-  .rename	= slashgrid_rename,
-  .statfs	= slashgrid_statfs,
-  .init		= slashgrid_init,
-  .destroy	= slashgrid_destroy
-};
-
-void slashgrid_logfunc(char *file, int line, int level, char *fmt, ...)
-{
-  char *mesg;
-  va_list ap;
-
-  va_start(ap, fmt);
-  vasprintf(&mesg, fmt, ap);
-  va_end(ap);
-  
-  syslog(level, "%s(%d) %s", file, line, mesg);
-  
-  free(mesg);
-}
-
-int main(int argc, char *argv[])
-{
-  char *fuse_argv[] = { "slashgrid", "/grid", "-o", "allow_other",
-                        "-s", "-d" };
-  int   i, ret, fuse_argc = 4; /* by default, ignore the final 2 args */
-  struct passwd *pw;
-  struct rlimit unlimited = { RLIM_INFINITY, RLIM_INFINITY };
-  
-  for (i=1; i < argc; ++i)
-     {
-       if (strcmp(argv[i], "--debug") == 0) 
-         {
-           debugmode = 1;
-         }
-       else if (strcmp(argv[i], "--foreground") == 0) 
-         {
-           debugmode = 1;
-           fuse_argc = 6;
-         }
-       else if ((strcmp(argv[i], "--domain") == 0) && (i + 1 < argc))
-         {
-           sitecast_domain = argv[i+1];
-           sitecast_domain_len = strlen(sitecast_domain);
-           ++i;
-         }
-       else if ((strcmp(argv[i], "--groups") == 0) && (i + 1 < argc))
-         {
-           sitecast_groups = argv[i+1];
-           ++i;
-         }          
-       else if ((strcmp(argv[i], "--local-root") == 0) && (i + 1 < argc))
-         {
-           local_root = argv[i+1];
-           ++i;
-         }          
-       else if ((strcmp(argv[i], "--local-user") == 0) && (i + 1 < argc))
-         {
-           if ((pw = getpwnam(argv[i+1])) == NULL)
-             {
-               fprintf(stderr, "unable to find user %s\n", argv[i+1]);
-               return 1;
-             }
-            
-           local_uid = pw->pw_uid;
-           local_gid = pw->pw_gid;
-           ++i;           
-         }
-       else if ((strcmp(argv[i], "--gridmapdir") == 0) && (i + 1 < argc))
-         {
-           gridmapdir = argv[i+1];
-           ++i;
-         }          
-       else
-         {
-           fprintf(stderr, "argument %s not recognised\n", argv[i]);
-           return 1;
-         }
-     }              
-
-  if ((local_root != NULL) && 
-      ((local_uid == 0) || (local_gid == 0)))
-    {
-      fprintf(stderr, "if --local-root is given, "
-                "--local-user must be given too and not be the root user\n");
-      return 1;
-    }
-
-  openlog("slashgrid", 0, LOG_DAEMON);
-    
-  umount("/grid"); /* in case of a crash, but will fail if still busy */
-
-  for (i=0; i < GRST_SLASH_MAX_HANDLES; ++i)
-     {
-       pthread_mutex_init(&(handles[i].mutex), NULL);
-       handles[i].curl_handle = NULL;
-       handles[i].proxyfile   = NULL;
-       handles[i].last_used   = 0;
-     }
-
-  if (debugmode) 
-    {
-      chdir("/var/tmp");
-      setrlimit(RLIMIT_CORE, &unlimited);
-    }
-
-//  GRSTerrorLogFunc = slashgrid_logfunc;
- 
-  GRSTgaclInit();
- 
-  ret = fuse_main(fuse_argc, fuse_argv, &slashgrid_oper);
-
-  return ret;
-}
diff --git a/org.gridsite.core/src/slashgrid.init b/org.gridsite.core/src/slashgrid.init
deleted file mode 100755
index f83b43e..0000000
--- a/org.gridsite.core/src/slashgrid.init
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash
-#
-# slashgrid        Startup script for the SlashGrid client-side server
-#
-# chkconfig: - 90 10
-# description: Filesystem extension for access to HTTP(S) file servers
-# processname: slashgrid
-# config: /etc/sysconfig/slashgrid
-# pidfile: /var/run/slashgrid.pid
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-# Examples of useful overrides of default settings:
-#
-# OPTIONS=--debug			# to turn on LOG_DEBUG in syslog
-# SLASHGRID=/usr/local/sbin/slashgrid	# if slashgrid not in /usr/sbin
-# PATH=$PATH:/usr/local/bin		# if fusermount not on old $PATH
-#
-if [ -f /etc/sysconfig/slashgrid ] ; then
- . /etc/sysconfig/slashgrid
-fi
-
-slashgrid=${SLASHGRID-/usr/sbin/slashgrid}
-pidfile=${PIDFILE-/var/run/slashgrid.pid}
-lockfile=${LOCKFILE-/var/lock/subsys/slashgrid}
-prog=slashgrid
-RETVAL=0
-
-start() {
-        echo -n $"Starting $prog: "
-        modprobe fuse
-        sleep 1
-        daemon $slashgrid $OPTIONS
-        RETVAL=$?
-        echo
-        [ $RETVAL = 0 ] && touch ${lockfile}
-        return $RETVAL
-}
-
-stop() {
-	echo -n $"Stopping $prog: "
-	killproc $slashgrid
-	RETVAL=$?
-	echo
-	[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
-}
-
-# Invoke the right function
-
-case "$1" in
-  start)
-	start
-	;;
-  stop)
-	stop
-	;;
-  restart)
-	stop
-	start
-	;;
-  *)
-	echo $"Usage: $prog {start|stop|restart|help}"
-	exit 1
-esac
-
-exit $RETVAL
diff --git a/org.gridsite.core/src/urlencode.c b/org.gridsite.core/src/urlencode.c
deleted file mode 100644
index bea36a9..0000000
--- a/org.gridsite.core/src/urlencode.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-   Copyright (c) 2002-3, Andrew McNab, University of Manchester
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or
-   without modification, are permitted provided that the following
-   conditions are met:
-
-     o Redistributions of source code must retain the above
-       copyright notice, this list of conditions and the following
-       disclaimer. 
-     o Redistributions in binary form must reproduce the above
-       copyright notice, this list of conditions and the following
-       disclaimer in the documentation and/or other materials
-       provided with the distribution. 
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-   POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*---------------------------------------------------------------*
- * For more about GridSite: http://www.gridsite.org/             *
- *---------------------------------------------------------------*/
-
-#include 
-#include 
-
-#include "gridsite.h"
-
-int main(int argn, char *argv[])
-{
-  int    i;
-
-  if (argn == 1)
-    {
-      puts("urlencode [-m|-d] string-to-encode-or-decode");
-      return 0;
-    }
-
-  if      (strcmp(argv[1], "-d") == 0) /* decode */
-   for (i = 2; i < argn; ++i) 
-      {
-        if (i > 2) fputs(" ", stdout);
-        fputs(GRSThttpUrlDecode(argv[i]), stdout);
-      }
-  else if (strcmp(argv[1], "-m") == 0) /* mild encode */
-   for (i = 2; i < argn; ++i) 
-      {
-        if (i > 2) fputs("%20", stdout);
-        fputs(GRSThttpUrlMildencode(argv[i]), stdout);
-      }
-  else /* standard encode */
-   for (i = 1; i < argn; ++i) 
-      {
-        if (i > 1) fputs("%20", stdout);
-        fputs(GRSThttpUrlEncode(argv[i]), stdout);
-      }
-
-  puts("");
-
-  return 0;
-}
diff --git a/org.gridsite.core/src/xacmlexample.c b/org.gridsite.core/src/xacmlexample.c
deleted file mode 100644
index af914b9..0000000
--- a/org.gridsite.core/src/xacmlexample.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
-   Copyright (c) 2005, Andrew McNab and Shiv Kaushal, University of Manchester
-   All rights reserved.
-
-   Redistribution and use in source and binary forms, with or
-   without modification, are permitted provided that the following
-   conditions are met:
-
-     o Redistributions of source code must retain the above
-       copyright notice, this list of conditions and the following
-       disclaimer. 
-     o Redistributions in binary form must reproduce the above
-       copyright notice, this list of conditions and the following
-       disclaimer in the documentation and/or other materials
-       provided with the distribution. 
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-   POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*---------------------------------------------------------------*
- * For more about GridSite: http://www.gridsite.org/             *
- *---------------------------------------------------------------*/
-
-/*
-   Example program using XACML
-
-   Build with:
-   
-    gcc -o xacmlexample xacmlexample.c -L. -I. -lgridsite -lxml2 -lz -lm
-*/
-
-#include 
-#include 
-#include 
-#include 
-
-int main()
-{
-  GRSTgaclCred  *cred, *usercred;
-  GRSTgaclEntry *entry;
-  GRSTgaclAcl   *acl1, *acl2;
-  GRSTgaclUser  *user;
-  GRSTgaclPerm   perm0, perm1, perm2;
-  FILE          *fp;
-
-  /* must initialise GACL before using XACML functions */
-
-  GRSTgaclInit();
-
-  /* build up an ACL, starting with a credential */
-
-  cred = GRSTgaclCredNew("person");
-
-  GRSTgaclCredAddValue(cred, "dn", "/O=Grid/CN=Mr Grid Person");
-
-  /* create an entry to put it in */
-
-  entry = GRSTgaclEntryNew();
-
-  /* add the credential to it */
-
-  GRSTgaclEntryAddCred(entry, cred);
-
-  /* add another credential */
-
-  cred = GRSTgaclCredNew("dn-list");
-  GRSTgaclCredAddValue(cred, "url", "example-dn-list");
-  GRSTgaclEntryAddCred(entry, cred);
-
-  fp = fopen("example-dn-list", "w");
-  fputs("/O=Grid/CN=Mr Grid Person\n", fp);
-  fclose(fp);
-
-  /* associate some permissions and denials to the credential */
-
-  GRSTgaclEntryAllowPerm( entry, GRST_PERM_READ);
-  GRSTgaclEntryAllowPerm( entry, GRST_PERM_WRITE);
-  GRSTgaclEntryAllowPerm( entry, GRST_PERM_ADMIN);
-  GRSTgaclEntryDenyPerm(  entry, GRST_PERM_ADMIN);
-  GRSTgaclEntryDenyPerm(  entry, GRST_PERM_LIST);
-
-  perm0 = GRST_PERM_READ | GRST_PERM_WRITE;
-
-  printf("test perm should be %d\n", perm0);
-
-  /* create a new ACL and add the entry to it */
-
-  acl1 = GRSTgaclAclNew();
-
-  GRSTgaclAclAddEntry(acl1, entry);
-
-  /* create a GRSTgaclUser to compare with the ACL */
-
-  usercred = GRSTgaclCredNew("person");
-
-  GRSTgaclCredAddValue(usercred, "dn", "/O=Grid/CN=Mr Grid Person");
-
-  user = GRSTgaclUserNew(usercred);
-
-  GRSTgaclUserSetDNlists(user, getcwd(NULL, 0));
-  printf("DN Lists dir %s\n", getcwd(NULL, 0));
-
-//  putenv("GRST_DN_LISTS=.");
-
-  perm1 = GRSTgaclAclTestUser(acl1, user);
-
-  printf("test /O=Grid/CN=Mr Grid Person in acl = %d\n", perm1);
-
-  /* print and save the whole ACL */
-
-  GRSTgaclAclPrint(acl1, stdout);
-
-  GRSTxacmlAclSave(acl1, "example.xacml");
-
-  puts("gridacl.out saved");
-
-  puts("");
-
-  /* load the ACL back off the disk, print and test it */
-
-  acl2 = GRSTxacmlAclLoadFile("example.xacml");
-
-  puts("gridacl.out loaded");
-
-  if (acl2 != NULL) GRSTgaclAclPrint(acl2, stdout); else puts("acl2 is NULL");
-
-  perm2 = GRSTgaclAclTestUser(acl2, user);
-
-  printf("test /O=Grid/CN=Mr Grid Person in acl = %d\n", perm2);
-
-  if (perm1 != perm0) return 1;
-  if (perm2 != perm0) return 2;
-
-  return 0;
-}
-
-- 
1.8.2.3

81}E|E6ugZF>LOG8pD_z!!UlR*|?PMfnoCj8VAR)%Lkf?+?p&xK)Q z@DazbJ1&i5*on&%G3;YtoW`)vkOB;wmw;iHO>$uHW`rCVEJ4_T!AlW#U@$bt*};Aj zD>t9zYz!-PmAl$q?n2iNHvB+4*h?6@3&U#h8N;w53|cU(0)a#fOS*rRl{;g*1|er` zBN2ASR*JAQwtBu?*8Jgbd&94xF8unjT|4mW2m}-HYlxHBq<(^6B7RM95|^qAS<;1H z!|?6GuYUSd@ar)LzqaC8o8-~>^??2)e>hk0tJY4}_~o~gH_e;){qZZ={&n*VY1TX% zR;9MC#~C6YIJV5eF$#Rm%Ed)S<>Ic9i8zM49QbY>ooi0bCX+a9e*Pz55^)w`B?UN# zw9L@5$^uV&?0Uig(vNb@A7?vsEhG5wfe{f;h z`}l}s+2E;hENi|e5z87-USruEC<82e$-%PN`@=HzB}{f|Zt?J793J08tOJjqBkaIq zh$ebuLHEVV{fOmkT%!R{r`)&ha>Or(TO4vATnm7-xNt2SpJ-g~W^ZE{f@>dhJUwA@3c>c#-`G@h99OVv697{yTNqOK}#W@b<@mo%rUC5XP5K zAMN?+`3R~NpY>W_KfAuo0Ph3V_qeOR)nE2n-br@)gjr(c05YwqcFHQA|EKMI4=;;;+mbxZX- z*p2mJlG*0&LbjTB!}MI8673N19|+GNLhmT}D^s8N<&%QHjS|tKBOpMK&pVy;-IaS#t(3Z)sM3*4%O#+^PKbbhA{+ZYrE^GOKr`wujRepx%_CXh`5mXELRB9>;ef zUuwIn-nq?Ay)}RCk-0=?4yVnRNqU^}PU;?_!#52vJiEk;5-d#Nz`nby>pSv3T43}7 z!Zws?e1w&PbZZG8VENUIPLY7mpamF^e>x60mSrpVa_;xDS87{3aIgQx2Veh;@3sDO zKD1ZPxNL2*E9MDXEBcvMpiH8NAbnf^au3Sy`HwdhI>6nA861}|=ZRF|Ay_3yWCkV6q@4AfOPHiyQOQP7FY{g@nMfBB(~eriAVH+RWF+26|`&unzDzg@q#+27TRTA-1wO7aM!_8RVEkn9X_YZ5+eN^f`fFK%S(uTCjRJ4dADy1k+9Q9~f%6xp9VFd; z^_PIZuJ#Jkla!bHT~qp-YWgzpj%8%l86(q16=puM)f}09#>jMrj3p~EB6-siuie2P zP`&xPN#D^{xNsVw|N78^=dP@AwKOi7qL(ngT&vFQ0(Ck zilESFz{JQ5T)E&U%Nz}u7?}-&55_n1TN{ubP;c3_;31Ms^rkwwXTk-EFT=b!O{RQQ z-X8O2nQBaW-X7!K!uerxWU;xo))$gN)ky%!Gsxc`G8Y@OI6ewn52hvunVRk!k)^_zR24tyO2^BA!Vg_7K?xyXt$|E-AKDBWqRb~P zEjeIIEa0>h?H6x}I_SEk+;H*0OWZBVn6S=ksQrwV_#-Xl9k3;4b6OhhYUwl1o{WjJ z*V5%0lb$`lwPpm$8X^AGv-i^41I-@uIW7GW@aD`O6{q53s{N>EOF7n>A<_{4+Urz$ zz?PWNX=xwyq@0#0<%*AK*4I5-0z~9WOZ;oM6#dJA#>9+HOVrGBTACPZN!BUl@E)*- zF=a?g{A;%~|9~wqqtnt_?7JW(9E!P`wz15ni}5!sMwe0~L~~30FI-DQOZ?9Wd*_Fl z8BRU(J`L7=uvbksu?3Az%cE)*-hG&5Y2nab>{-lSPzDY4Gtm%?DD;0`DmV^#X-C1% zN#o|%9aVRpg=~tum^kO>+;G^=4^38aEo5RxlbpJCBvLRP{4JpX^Q*)qQi>TpVRFh~3EMZ=QRB zwD)gxUU!YruJ$A=H|?8VoTsy{jAdnX&#b!;N8*oKt1i(sGRmE;CS9f~d>hr7@c)$X zZ43D$AwFs1f5!d1@x-wxEKemF6~0aMwh?lq238~M_JI=l&G}qi=pFz3d~LL%$!cW( zXqDb?HZajwrjF8ynm1|WP+_jzRro*9d&4?+9RffCOA3Plx7yXV+bPeZjMd0RNi5lH zr%#b|t}owN$6Ic)(~p#N0#Hy|evM=B4_bPqt3ZW~(uS_gq$RVYB>(D?*-~;#zPsda_9km{pp@iaU2>3= zT%1rc{7tfwJhNzRNnMh9b}1^DQ1Xu{>U=eUup`4Oo{dDLa#8 zD`j0O+q>@Evu|G>9^9o{CAB`kSxaUEC)cZfsX^^72=u_l+Wd`IJr8>0X0{LpzgXEd z`U|)G#>IVV{_+Q&w}RNnaTpWr>MXo!3T=kRj~00R_+oZ;!B~3y7)6gCH^AeEP#mM( zb!10>fjc&1=dat-KeN7t+ohbYj2Gw-8%HWQlgYe| zoEaWNdkb+uuOpM?GiSrN1Z4$a=|4K_P;y{KNQy|hISbYcywER%X;-zyPT!=t(z1*V^74DDm3EBTDAnAE6DZ{`^7PvwA zedr2!r}IPIhg&J!Ik>I1J`zeebmblk>*DWVUs4YJN?2Rf%bF{?2Lv zkemzvIWhFc?Bh&X&4OD9DmM~T0ss{eoYcd&$$YN#^Q7g*^Q7Ze9shRShG=6;^abd_uT%* zcX^wvAgoa^w+#z`5eHyc8@DUtOVl*PT@!&Qlu*-GdFw4-s`0i{iw&0MtnB=^=Jvy2kUOzA) z=vQ9o*JC)a3g*cw^TUGb1vvA|+NnD!iS-~}AElXL!8>pZ*#$Sc*LEl> z0E$=^Hw0@<8$PY&0}=MAMH)iGA$~TDI36C7rtc~^9yXU6Zv&K1vtD==xx*orS@tU= zXO-!^tMQ>8sHMaKMy19eb9u$|xd7*&8VA^R?(@ccX5}6k!>vQ>I>F?~{w!3(uimXE zYEHis1-y?bx{zt7*hoe1Jx5!W>qZRAIA5 z#%aU}HHkFhUzk&$Zw6}q6e-b_PQO3IS630is05N#C;)C_#8;@3IWjP^Rz^I52-pj# zBjY7@fM7+Y6m+;G!|#I;pvb*~)+d60Xf7;v3$J2ybPC1*`0mH#nDB}pDu`>P9(T9X z&|7Eblj!)7j>2HiS6JBC-R%$*k-OVZp`CzOJx8aZ^WvnXG0Y+P)zyXZIr{3B#5vkL zPv|IW{u}B59lZeE6FO?!ON59oG#ng2Sg06QKc(vourIwT;_azRkXk*9Ponq-)cv1> zp2-HY1c7L`+y_BhhzhmV+%&#Mcnv~5WQYAnjXED;z46Tq!71V5a^jU=WwWb~qU787 z_W`&-$j~6h9!s6TQF~#!67OSp@bcruk-tvCL}(oC;y4!$5h2rweM>MaxSv*&F&n_t zx#f2Azd`eiKN=I=^-Drb+}`)QSP717DIPGKj3gP@bLd$Y*-X56n2n#Vbo`l~f{lK9 zJJxv-U#112ZCpn|*B@3?D?0%dyP#=K{co}sdhUg z)sv?}0~?ZC!;@{m6jUX6?Q~vQc6||J$Q*uXH|hbOXRdA_x_psYA0YE{2>PmpG$lUyocipGFS&XZx-GMm8`O+%B$mLNY&4z^cz=*sD8{0 z;6A60;QQ2D?Bepg9ya(I0&357kfaq)tk8@qXJUN0q1|;APYD?EMoB$EQUZjI)GWBt z^eoV(s_G-x)Nhvu%8_dpsD;RaEdaJwBnynCz*d#cLYA3Xu4a}sWPP6{ZU7+c%!V}u zk?|6hwa6Y3@y?e!O?-*frUEHCuR!~agZcgjub)R-2n1n91p$~f!L9r0??aL(47Mo` ziO`IdJ+wHIduQ|oQ=FfDxwAli=Uuv8URmp>*QN{_#;j6d!+m~aIS&R#<6!(HX6QUH zX^D2)<(WC#dj37O#XQ9vO%4w9x@tor=e}&NnS(?&$lrNWw}*IY&?f}b;t2tkwCo1u zWYS1+3k+W|dzsxD6WCgbw8jjs)|k--F3vC|niCpm9ZYQzu$mSORHl>b`hq8ti4 z^q^%5QoFUtNx$fZV!AaHIh_gN!om8n2&D{pLzurlbI~dQt*OT$qk`!jdCqQx3Rza3 zFX}c@+w!&=p<#?&6CZcprh+xhseK!o7Du4#!;O!en)14#?r+FzKw(|Z)s=z=`I#xE z4#2>if>Ut;Tn-+u(+Yfpfxe9wqpkvMqpD%o(GzZ9BO;IDIngS zvG@Q@m8KWmz@}sl3dXW2=|{m>cT<&|7|;=s7HXe|x%%cJizDziU&5JpG)P`q z&ox|sl+cUINkR$!3k$d%lKep`-DDH#b#c|Iu9Y8?R$FkVyWNdRl>Q!hfp1{RU9 zZQNz=ulCFegn|1=2OAt&o`asK-y?4%#31r_EyHNIU%1Qz*J7*I{M9M5xfkL5_tR>S zBRc2g|Ga7ft4QgB{u(wUZ9g%361E!*()B7jA7elh_K=WRrcUFqfSy0aF2mf_4YZ=5 zUn#0Xb^d6xlVT?Xqr3RN*=77kpWo4;O@N|8xi;ec&%y08*6oJnUfjU`>Na?&2#j!D zq8X*z_^vZF7Cepi8f_I#gpn9-1+x%oJ88XMRryD z`#jHMJP*v$hb5uI*uJ(m|^`#Y*^|wu$hBz%}5R0rx`8yQiO#wZYdDSk{2Pw}Z zCFb+IWGno8Ow_|n^m+b_j*b4LhtG3-LY)|fbE2zIr#K(T`&0b%h5^jX&@s1PvO&b#s5uwN|o0BH}GjKBwarcpN8!` zC_Y{4KPW!^N@q!qPd~vEn&kM@A1OWY=~JJymc++-WMyyoblvja@F^r^NXmQS({GRx z!za&Hulk*CxQCDP%XRDzz^C``?VmEO+{UNSGL27p*id`oQvjw+wf>ExFT=|wqNPb1 zX>V3>3g=UAa_nJQmnv4dza-X{yhQX9Ea_Cg!BcbFgh3$NMquye{j*OQ`w$qSZ*de0(&x5 za-8m313t$+;h(@s|TEK4{{`*?=$T2?myp0a=bRX;GXZV#^+-va?|EoBalWr%jGphK?s3ic8hj+ocgqdE&bM5QWP{mUM zusQn+EV+u(2=wB|4L5HbY6gbEA+|ALxN*}^qimRU(+ICMZDLTp`UFWG#B6mf6LAyt z0zT=TeyUkC(;PS37(LUNFxxDeWkih8v&_I8v#82^x)wlZjINr$Ue8HAKg;GAYb9Q8 zQ>?q01W{h)UHwyTU$PV*;Ak7}W&mm*@`B8G$2WfiIYFN#nk{}G>>UBiM+~yolH*YC zZ3lB+nNh9{MpTHc2yHN;f5~^mK`NNQN=llwb``1tG7u$~h@@ZcbB((h)>lG?-0MP| zQ7{*-Y%n(^sCd0D$G;WYTdQ%KL_v`RUjIhIo+I=C&;(RVvJ4n|8<}ksXPYB)jN%+~ zWUf)1YmOXf6c2{OE?Rvs|j1B8I$I3px#NjF&B1# zrOqO$4JIenGQk{`W||DlZzb762aH8JKEs%co@AgxCInUcpRs0UQBDQAVa$b7$$=Qq z{8mCdI%BP60RCLo1E(h?G$+%Qt$k=(Yl$<+w&hPrYa_l%Z44mWjlI@Jx@oQDUt}Ax zU*9-C)fvVo=6!RJ#au9(fA6Zr-}&oFV2%43Z`{Us<8H=V_cI>e-uH3lptrwZspQ~a zb3v1Y`IpSAR%Haq!u#}g2>4#WeMS#@Mf)Sw=`#o{R0FHHfEy#VS22~#;WdsQX-uhw zx&AQbj=VlN`tA$xE+flJZ=mNi^MZ6BWOo7Yj6Oki8orU3gLmGr2Z9gRGY#|whdc3* z8C2Kc2*iWi_1D__7SCJI2aFUB)tYdz?_oW@hsVG9q(6QB`(Qig8NQ(j*R8yd1#G#} zhaDt+_-f5hxcYCtOuxpF=i(2A4nq+#tL;k_1Ix} zGGwohSvWJc9*N_hsEmTd@lWn;{C3+{IBgS7b^X%*ENOqD)BZ0K+n*I{U*0eAy+i{b zRcrF4`mH4-rGB-0asQM}eMxN%tY;y-r?z4>i(`qGY0iNvQ%JS;X3)bRrmk8-I-yEQgro?RFs?yLe&?mU*m zqq+@nJDy$O8OZN}Mjz`ocH4QX6EmT<={D{SsXps&*%EL_Jeebr{Xo6_cM-bS{@CsJ z1-1@jKyBW(Z(q+LKZFuO2JH2_y_VIVN=+#}j}DDMI@c2xieRH1COC5oM&(wY4Ap3# z*Bq7Y#Ra`j?YaU!5L&1hjcK*D^P5{B?ScC@_(e)EmA~go*~j}aId)gi5A`2hr}en2 z{{|I1cT9=*iT!Y&SXBmBsD1pZaXMZyIQMXEC{i&Ace9Ir4PIuleaEx`AKEDTTFhMf zX`o~Jxr1uDl>Lb-NKZ$3T*9H+Yf&bO_krk}+f=^VPw{!p)i^K2uRnf^Pt1e9Ldw4k zALJLk2te_f@}@1$-166+Ux<$YYa$3Uiw1e24uO9|@StJuR&4Tgr8%&mD7X4FOuQc{ znD}6}U;XBC469;OaZW0BmXq~sGwOcyHu<+;aOhf+$*->4Z}R7&@`F!)&Q-3-ABQ3` z`A1<^W0UW}M||?lLGj5y{*uJWk7APaX1DO9P!K#9Q4^yEJeh#q* zH4hJh0bdX#k}g8`{QVZ;E3|O%MOcD$jbXqh6p=-+rnwfO1t0N6IOLT0BHT4KaS^UW zdA$fTQRaIs!qY%%*CJGD9M>3dF4vfgFrG`A?0u@}CrzQUsVC$1Qe5Elg*JCX;~?tD zg$ClUC?T~TDH%vinh~t4$@(^P;h%M=Z|0(vk_qZnjQ-^#X>7%p;fWaCnblh^i)x zqY zu-w5@JRFvrLom>om0__`ysHr@uUP)pHO+ErLXRIrO}NPCGFF7;@{o0bJp(7aoG<_n zlel@1YCYU-Q`AYXu-R;T4aq={9+WTNnbu9n2))0u!TE1yTGW35*n~q_cHVpmWm+Am zrtSqI3H0<%Vy;Gh>>JcLliGTc%LvgfB|)A*DAnVKHPL1E|2)nI6xl{79T8NN*)NBI z9A;xTlPzYViP3AYb`S5r|V6uyVK5~y8obNqmg|O zjVt3FG>*t$fJ1@LM5bl+Rec7cpMLO2dzO^nNG=SfeLSwi=07Mks}eesw3}p_(__96b|P`@^KN zIp*kDhE*uphU2fbh}@nzy2`w}76IG@GimvS%&a8^%ZZ^rqj3y=pbKy@e$?p;AT$!CoSuK))T;rpo5Ty+z!Z;FuI*lfj2(Z-69fz{TZ@_DWK102#={_u|X)#POf&qEP^^_u5_fv9Uj2sxS z7BGbT-ON85M7rFx7_Ok`0uqtyA;ZYF?xG06x}Sg1nSjx_8(I8nHqOzgpC3Ky7omdG z&k*WYtUpKB&v1|WCrbVNtLxt-^|zybWX!>0P*7l6jE;>0{WnFVV2Vh=TttzAA;Jek zgb&6YB4oIaW$~Qw51eFC=LfJEB5Keskqi+v)V{!tIwdo-ARSHdHS)CK0dvAIpIJ5( z@-6OPbO@0ZS-uUuNKC!JNzINdUn!~b1N`&HYB(NwY9D$Vsq-T5MMA7({s*83^E47# z%U7ZK$a11+WH~XGN9bdI2Gp}c4TuCSW)AKjaEAP+ZXgzHr9zVq41mw#*enb<6r^P7!4kS+&sSaxOx9K(HT>OvgDM?1%G zyJ#P;DwcR2#;r!?#vvU?a=$uL;)m-xJ91d-8ED*SwL*j03byTWLpT(RpD?OSf`jb| ze>ors)z^(9@o8jCIdqL`?xK8hIXg~e#B2F!Sq&@wcFjqzOxsw zMv6XXoDqivvyqfJEMUPtLLayW@~85OfVG?@aDU&(2{J8KkNNsJKXn%;VKxWibJFD4 z^gW5r=%(UTvdMeSO+HQY886EZ1IK7irU{J0)r^+~b}a+y@gW`)#61PO2DT8{F!b65 z)Y)hq&T=xm*x1X|nwLcafQR>G>S_t&#eJDN6G1FE?6a-3clmV~8TkMyHP2P*?0Bg? z8|_kyoKnqFDqEMj$W`iFWCc{Stqo48NlvL}q?FymPbDW!1HfK=ywpsm)G1D>Hg^wS zaFx0~Ug{jD)W7~{k87j5hqt*(71*WFYzl%{zcRHJrSM*XMH*#7LTr@$m&M&Sf5V(Z z%tl5TN17q2`HlwAd$W=AkiWs2l*SB9Fpf6udN^2XQo1fHRfkx$add%HZuv6i9b!t* z=mW)b=JsV3NbO9J%8(${__7P6Rwl42NQD-#1GYit%+M!%yRkdN=DqNkg)BgddUpfz z4jW`gtCm&)3R{+x8G4MGXBIg(FSxwj_!YGqGeq9bizio$S_o=#*bVJMTxRG&>;d}B zD@P3+PH-UlEP&%?`KHl0_JV)>2S#G8Lhd-BB^E5faRZdU_JvL)rBoeZN(EHUJs)+V z^VVJ5bnzAw14{|Z4lGEiCh?$h2RF5_uq(oJFW|RBSk6Tb^F{7Y<>mq}ekvTjh7)eX zN%TH$p3{&t9KViR@xDmW8*+F7H)IFfM$qL! zO`8@h#lTYie(NqyJ+_dOZh;8&5Rry&1L!j2KZsbu6TmC;jI@9LVR0|1bd!V-#R1%J0rh3 zmbaq^E>yr;Hk<{n;Ny-EQzDzuOIxikGxRF-lE19X=-P;18Se=%;Q&+e8J09mRlb`ZKJ$0Qdsr#+d^WON9CUG@N9et>$mjX&+Z=D)YMBX}0C~--T zZp8Ytd^fo4%d<-AB-95%y zb2^6R52}A<#>Z7NE^%BXs6vk`fMR@mfbPk-prZIU?5eg+4Ej2ln`P@uVpRib31-+O zADgJrQp?AV#T*H;p2^7)`Iso!o1Rs1N%OpBSMeXAc-)!lm+Z^4T1oOnp{OxZ3V)G5 z7Z6AN)?K|3RQMPNTZ_5Z6jc*c?YY|rTK5WslAxt8lBU`em9D{&@+4BMJ4j1i6qWps zQyrsy5yOdzrmKE+NIZ5tRM8%pZL7|ZxQ@NKe@fRiprUvKL74)6{(~QT{qS`*AQxi$ z$DQ{d&$99t1od0-CW--4Z}k8U9hgRE$2-Q^@x-+s zbd5AH2C;Z!66Y0Fp>BYwq3KA4BOAMIuNve^YmhYlWxu>CJ)R~ME8dh}?1W2mgOQz2 zTDIf7fl)B72e0by`WpVC)+=>&}8zo-8zt&wc~KkNUZrUUCMiUK;h;efh*4c7m_n!juF1V@r7#{qIg z^LMGvl3Y{qra2&jNi}~fk8n!(tdnT|zB{`&e5$^_H+(Xsj4&rXH0iHLN(`T<`CF?S?xFcRL&yGL ze0u*nxBl-ejZb;lvkrhy_f6~tpFTV`2|jH_doDH}L5y)O5i8 ziKo(l+S)-(iirW@8r#@(>^CVV;9?(H4unZxpRB>Zq}h~rJ5b|<$p*0WKAfmK_#i9k z&eV#Oo|yE6UDf_OQzPq1x-*?|ZEu(~QpzO5q|>GCB9WPx#H4d{!#yx*ppNaSLyvt5 zt_${Q`-a$q3k61vlx;8r|{?9qyL-u zbG@|ozkxreqo(hHKa1ZvDE@SubWr?xPG?EJ6D^0DdUE`!LrPElxz4U?fBY$BJxTE= zI-@uINtH6m@aLb`_t=TPz{!JTB9XJ})UiJRf2LmT!k<+1j6B^#qk6-i%)eCUs^iAv zve<*`-fXLA1nrC(o^8D7`t^}<6beixpDSpNx`c*xH%WS`39spRu3xjN;H!!lQDe|E>p$4UETs z;ks3J$S7IOns!0(1u5Gn36CV9;mo{+x;Fj36W4M%UeObwHi_&@<*N?L;e~P!idVnZ zS(4+G=epkT>I|gx#H(ZNs`kgLZy`)fj#o>r>J6_Rl`_fjY7tTrIK2CC0@)w08gy** z)Wj2$eLkXl2%eX=^f)i|xzdGO58;EjbL8Eox;1HbA~)Bj)m+OzVY_;o5yWC!8<`sggl@$19i^oC!rAf+dMt<90v zlANHHv!0~;*4dZ$hF=#+nPm9&b7|Yf_x(yY++*JwtYd!we%+E*rXKvYjbD76?72+i zS69LQ_yu$QJ>Q4piHcWU`bXgHe*P9<&G$nXDmO}VE4wa0juMCjx50kWWJ$gfH*{>MWoIMh4e9 zSU-kKGp6RX`mI}1RWUvtmpc^*Bc5B8bz`dfjVoy$!;_c>&2K9JRZV{o`XmhxaM*a3 z0U_`dWC3Dn+dm@QL*(f?GG9#GXd5a{(rzrd%41x{cYgJ2Bsi|I79eacXKfXFWa=5job`rjRk2yPv0NYe!f3;@ zr%kC`neDbQB^YbTESN-NN+V%40-DiV!!J=Ko9-$q?Je`Ev426^v=KJn z^m$zapG3G%--HY>x>?hHSy#I4sf;El?6DU zV1Q`ZzQc#RC9l`=G(iPv%NCqXOPlbn)308fg@H}A#4ZpXf80L+=Ngo&fG4l=S#|3t z!n$BVHMS(NNhK-+;0f|jxmDd1_B1&$$07!8b=`=$=BioCXCp*y(8|rAStADFKASC} z)MPX>T$<4ar`Xt-nY6@F&Q4t{Hte7prc>>jSV2isbPKZn3;#lL z9SW%StC<_nBlIxq98K6Y{o02oO|vmZuiAY-DFpxo;gl6|4BIC0LN$~^7^Bn9i8G)? zV|-PQhXlM4MZ=h2+=n9z-tSB{JS&2#86VTk$`u+ljmj13EhfVjnc-RHSDX0(id?fS zFKpB-o90tr#!5HAUphZ3oAO$z-DOlZLB9<#Xy5QGWpkt&59^qG&(h3A_t?~g4qmRc zbH=F2`F6(eysKH3XmFgJXOr-oPVBDxqz!m?JYRedFU@N+E0-Bxd-L8gJu8e){X!+7 z>hTSX>lv7rrDXogg2nK^tOdMgI(!kY9v!Vm8ax^;)z(eLmQMU3YI7~G|0~=aMAC$7k&~&#Ps0o zArh-i5B?86L{p{o5y-wi`S*a>v#|MRB;Nh|P#$;xP}wX)89a)a$Gd<3K1>>>l~;dn zE{_A!KM@8w0JZk3=OtbP(%%qv04cQgTV1#shBM!iOd1M5LfE16FG{>F{073Y!Zb_z z63KVhEQIVEPPhJnb~Ak3*lSoX=+g z%)Z&i$SOK&@y#(ybBsG#F!8yq^B%4c$Yg7e7Y(7J$ZN=I1_pOmZ#03J2= z&=7}BtPwD+uVf0=#bB?qZDNNI>XwUSEb-G!Yo;-bslb(@0J;O=2U5oXse>YUH zFfOw&Cwci-o%Gz~>5n_LGpIfEa!pw#b&9pP>Gon>#!zvU$ffojW$8 zWJjsmY@avKp98daMnZc(+rPczlC;<1=|r=ecXsV4QIVF&*BzbjcGm9l)b1^;KB6On z-fVXK0d}#S>Ax^!EpwQHHj4R5uN>&=BD;>Q0r#Ch)Wk83Z z`pY-iD#f4yl;?x$TnM6%ee|Xsdg9K?Q8R$n28GP{feZXc9iy0xD4fdT3rkfkK zYE}_PbG>Ez0t1CZ_0K?|5rfoYB{0)rm9Cg(j>99I9F3zZz#r;PVUD||W1iyrcF>p2 z=WIidS<~B`uAd@9QiQz+dVfN1SKt+kGvOOSdofI^E&U9QM-LNrGN@Ymqeqzijlgm; zvBKL&6FrvM^oy)kKbdNHEmdzr#SG&&T2;;019(&6*n;>@%VhSq1yO1@H3>~60JvUH zEM~-$5mAx#9q+x{*%A3-qbIZe$KXt3p7Jv5&#~FlYPb%fycy<8gX;V#vXVx)ZqL4| zv7vpL4YyD!96L1Zxje~idEK}Q%nxT;zh(kfX?I3Ha=KRT3jhs3*Z?Tc5yFP2eiP~I zs3e=gw1OZke3LlAlSn`Cx5fa}2?(O47@RL*uH{YhIkqsrmGy~oADDidzOP1NUO{M?7xFt^i~Nz<>MH@bS_^ zLdJ1ecp>0R&vhYS^dSta%z_ZXTzoNFgW~7P_B4)4yp43UH>ZrD_N}9(8e>z>16m?i zKPJbtRQaKXUAUi?>iJNAK7f{L8TiRGzj_-GSTV^~s2+eKlc(V<{rXQNRevtCZ0b9B>?z94(}%(SpjSNxD27o4RJ$4#fKA=!u&EvG9qnDGVm5lUg#9tL zEbxl{x|YNJP{(`%pU~IEXrrAphJ776Av3uE0bv(6yKH;LIhfJtf?(8m^uWQW8!*V2 ze`RPjla_4&{zg|!UqNHjZ{qd0Ha1hg@PrM7AfsfPIVsItEb#hf z82&5pO5vM6iH0!Y4-xEumEA;3L5CPYSZ~>exiZ2mnwry1bqjr4SU=LLe}#XH5=dI4F>7+RroL`z*S*p{S*X+K9i~H9?a<~ zC&3s0pOU_o>3p}s^sWvt7}nFA$*v=j4{*PXG0&VvFzJYN%_0K=fdS^L6*e@`jc7^I z&0!9}P(Zov#5gEFLim==A=(Q3(2@qugVwcOma6xN6~JVIumiti2tCzV0W}$BI;W$_A*(2+EQl z#%%imRO4j=P=F!A)aYUo+6lQ88lV7A0iSvUfM&0V2B>t_t^w*>2cU#)FV2OYZCV*X z3V;QGYSJYMP(v}5BB#0h(*fLVCQXh3)ccU|AO=mu(bD(=@C1LNfc+Reee`RACqR+9 z--A1b@ww#y`U-%Q;aP`%{xsIl= z;&-H$bjJNnK+xZHyJu3|RGRM70>`Vbh07yPlL1!W)22^lHnG+4+B1K?iZUX6HO z{T}%bmHaDQ=e@-CyRKpTD|=1fEa|IyO@CCxBj8XK1JPseLpS+_+JpyaubffJe~3uf$tam7XkP@Y7$I7O@_tx zS!wIP>TBjeB9V^-qk5ZBxfQV7;o0h(N`-!z)$Np~b^6G6^@VYJH2~R>G1_0>2e+Cf z3Vy-G@MSQFc0K|;lMDToY?4_2@8AD-XW9M#0yGxgpNxj5Iwm!Lk9sktZj7OVt~dLd z<>~P9g8|HDi~A2i`nP}o$7+0w_rF^DFT>;bh>z_5T<|V&`Z$P=r@)kX)eN8$_J^>C z2jUbSTH9}z6RP3C*$;1BAJw1vp7wdalZe@N`X=%#%rV-|v1wk3e4lP-Xchb~Q(qcV zVSekppF+Ij4dM#o@}&|L>9>xC*HawB>-|m74hS=M6h$``NB@Y-_-OB{1{rWeNcRQX zJv-#M9An3;`hnx}s2w#pId?i-vc@m2moO965F4(8IviFTPCz)8fO;I?5ye}Eut$In z8xU$}e=o8*?75sSK^96z(mF;Rb#DV1%JE}YRxmC{llge?-$0_Yj zOze)5HhcgGcU;l7qomyiMZZ5Lidr3Wf;0Cxn_7jA{dQmE7+_Idq&&^&_m2U1P!kKP}xQW$5y1gBI$fgjfE;9-r6Z^J;?)5$M2 zRG;{)%4eY3{w$6s$nXqP;LLe|+4mx&Pu+&J=zlPe;N{BHrO@Y-sjZ&lBFFIoF8{GT zz?H{<^YyeLuj?%!jym2TjsQV*4-gWVvem3?o9aCBTyrrc$0ePB2tk%U=1?HY{fITH zS4KQ5QJ1sm=#EwLxK+9u6NW1(pWhqytY)vnp2zv44!wc&5JO*$X9vb`v+{AHJS{pO zWTA!xCjNG+kktcoE<6DpCkql(HP~%9tJ};Ha5Ly+nY>;t1D!YuxuYNaAo}ocs6z^U zdl)$CrVo8k--dARlzNz0{ zUD90Z91@$zPuC*>tKwBZ%8{}5V{+_}$Pbl?OQ>lT#v!!Eco~O{+q>HUe5f2HAuGXk z7JG<$!)5#pdsgsAy{$WdQ@hQ6Kdd8gOkc#SM@I7+;W|4X^;-o!e`V*}H18TG>UcX3 z%@|9bkLn#_Sd7=NS+EAGu4)2Sr*!mdA}w@1Sgqo`9H2J_@!ob7tC*j3xH7>X|kAl!_S^(F#0d>A`mL+X~+}NYO zNzh@RW>zLH<6HqZI){GFuO6?v)EnccvseJFd_Bk_W!XWnFetn*znX~WLwbtHy?X}ku*wc0_ znipWG$`+$kX&-$!uI!+hwsRq|tR3w#+%R8Yg%CzPW@myW6eXuW7q|P&>8!1w}5+m zsa3y1r6DkXvjxw zNI(V9iuz5%T&zRqJ~yddH^*+xaZYOz=LK`LZHXS^fs;WPnwMZd3z9fEGNk;|>vP>+ z(j&47>v#yQ-|xw}!2bq*|iEsB5l;`{@Atm?+7oCUAs#Cp3!Br=*4LNT4Y)d zn_jLI%aG#iS1@{!9XgR&vs|orCDTCAV9sD#jf73LL7c-eL&p`h!R+Li!Q+bBVKs70 z;kcq`QXHrNHpIZ_3SuutyU5s*hcMOgbGa{vp*C;U4%^^Yb}YP%?olxQl^Y8$)$SlH zfdzcAaGn};2ad@hSp1yJU1CPL9)?(WiR#aoiC}#UGDPkpmVu=w%g=0!RQz_P*7moc zr(_N?a|8p$h;39aAQt&_4vZ>{X{)CZX7;Y7R;^4XO_l<4MU^N~)gPu7#Pd2qU213c z*4jpy#6}gCn%E0nmoJHJ>AHLo>_%PQ2=8F{%9g<=Ki(w>(ym2Lgtrl~$hx`fZT$U- zNtfC`yV`cOcD>bAmba@l{wf|DW4gg7g2{$#OaSf6jYmV`&mg9GGxp|Sp4uuQ5=`j_ zb2R!eIOS%fJ)>SzhoOzG?3(M;)I zV<}m;HHkjnfvMK;A(i zKp&s_CrcB#1@jQ2grYFPVP)?@Z;}cV+L`Schsc4x!S*017(pKQ_*8Bf7%G|#g=vxx zX-Y9d4DptMX2oE0oCn_tL#@e;5EB??4y=FIV`M>dvpEnS=!nZ(XnG3~yitOO>)@e~ z<{Yxo^bR#oGV-Y|di((+OB9AX^mP&GYfTpP8#wg!L``2mB7GH2Yap&Cu$|#tisA+Q z!6Q@FTZNLPqpS^Q9ReEE;OKxx8m$@>s{si-1JIVBtX0S&l=bUJxhU&oc=RrVVl{Wa zm;{Y8vr<9hAD9bGSu>EwO<74G=iw;-;_twU3+Ecq%7AL2y9_!|EB$IM-4lnJ!NC9w zOj>4_Hr+cvFXp)=z6Z1_!OxR&W?>{Wp{+H&wL)kk^GTK-G zGB=R)keEtJlJnlFPtxOS@6&a*5U8{iXXopcheWcVP?NQoh;ZVhWAFF79;CdaeF%tZ zC81I85`acVYy|};nHk0puZ8h50t^la6!^ubfuGolYmmmANJ&nlwDS7aZ}LEman9qN zpvh)QUgkfn>?NSgvCLS-%GelBtYQhGyWX$J2+Q@l` zRe-vg(+BBDEBjX{U^AGkyEeuumcqRSWNk~Vq9L}$oIbSm?LI?dT_R1$WV<%SDi+1Y z9M~C;RV)Y1lk#CEatnx_?WT(@PZC1#*zNgC0eJPpMWBTPxUD`6E&Qd>p4@(i(!x7& zpVf;NE(gpx0H2N)0^mWk&IODo0RC!Z5r7}o-v#iO!Xp4*Q;(C%!<&-;U(_!Z;EzIn zO=5G9$4v_ldoLFxxkVBiF%OdS4s<1g}@u^F-HxJ3zgX&F&7b0a=cDIMs z^#_B;m<}r?9+vw6$evL$4LlpG;3bL2k>NH8M2YCn^G@K65;z&VQPWFBCT$)ATo>%2 zMQtn28yA34GY?wFvqzqP@dYPmRbOq^Y%-^NAchS6UAgAGO-8A6ttlt|;>p%*$n}05 za0%U`m9ST>UDJH(7`Vuhm@*XCrh!6U{7j^CLN?o63@1-EfAJ8ab9?Ud1?)Eb@^(+g zt>K+ug`pXSx3e+4y=M{WHwF=+`2&#=85qEE`s^&n8&ZGM?k6)Lgr1EAL1pOD;fAa- zaGB@3=keExzb*o)vtE*QW`?m<&5rEIx$O$9mB@q3p^!Q$HV}8Auz@KCdZXU$GT-P- zCL_F!U=+!5&%0J400pXRAX|vJga%O1p@1(~4$7)i5lS=E^Vc4gVTmnUj73QOY#gq~ zWJ3rYJjfw}*C^>;+|5f#dC8KL!Mu_T3=u$`U;TjDr7Bl;v~Y%#Js%n=SuR-9YCN;A zqt7a9#QgZxe%iT{cvp5z%^+mQT8RgG6UG@a?BanS6Ej~hJ^+@q!fmXWhEjk_xR$>J zy#n53{&Cyqz?^NLY1|R}qK4SkRbRpI1Bph%0dd9gGoUtOS(1 zC6UG{F>q?9uu4X06R9kz28kdCW22Q=OSO}kO{@)iKfj7z;(WFmT2C)V2-vF`3^65f z6|9~@cK*E*V42u%O(L3@bWP&g53uDRu36mmyU^`42}f}p6Bot}kZ{2`8HXg&$sE`) zfBGokodgi|&LQgMG(1e0luTwNF>r!el54J;jPil^1kW&luaU44P}Oe}7y+fL9oYFX zLgd~-&d6>SPxh&+G9AR7u3bRf$#B8yC=qtWU?QwoqP~O9KsG~ffs?p< z780V&_+{*}9K6ak68qJ5%Y(La!*lD3x%ee2i;?0+F$WtzpIIQ!`Yh2Qz68e+c1U0t z{DuS)l&gFGB<*HwnbTdriX=mcn$qcVb)6248z_?*WI(|RN|x92IKsg*mPz-i=gx45 zhXxABOD01EaIoLhAx~sdMxQq|C?TkZLG`Qj8-%0->o__+kLDf9;P#YI~L z(Nr@=k_&UYv4IH51^Vh&T~tM|)J0VUd(gBCC6P^47zo9i4(UM|rz5%&vfU0zv6p$X ziREEAetxV&Oq!S(me-z=5N~4@*nx*X^$q=T6AzBnuCd`Fy` zK#+E%ClHkrTc|6;yh&0^x;FB zK5XE!<)#lIb<-|sGtu2;xcc&BsLRsxBpuo_m#NbbhbIwEhTB8mOp*mouTM24Lj(lM zRlN=&S*Tu!d_i@}fddEQKa~bjNnFn>_}dLaz@Fp7qnJ$(u&+pvglD@oN%#Y3scS#- zB7mN3P#6l_-^WKX?{o8I9(`|*G5w{-SDYhdf@vpTC;JW ztd$kht(1ri`H|!=^cE8rMM|X-m^6RKu0;n3r9&g@NuJ%Lpby zI~18$_9;Lt-cxnt7=2Cg4T&nT?O5$>TCCy7ZYMJ%EE^k=@DGK~G-A`j(y?io zzz}UOzDiSYBs&*@(f*iu)a%ioEcti}3lOLl9z4KJ3pys=+2XBqyqCet^|@rSG23I! z_5@{95>iXP51PY!Y%JZwQ2WS!dS9}QusPck`MBmra~&f$F1QPrQ@R!*SO+B{KiklPxGJ2Y@Nq&&q4Wkw_S^VAH~OANaIGt!WFvzb!B;3eBU*&`ssXa>#44Y<253LttzTB8Sj4 z4S54AdtuR*>Z8r?8{Y$uw`fbv-@(6g?b3s4$Q2kKKG(#Z9hRAYTrS=s@4f}ENx)_u zU_|ZrVL^45og})zD=BWUQ)qdmpenWF+ZKESjR4OR0%2f&lI^)4+zA@JotT%|Rcz$d z^=vKe`3<5Wr?f9V7nA4=l>OEF*VO(EPWI2UuxMlTSJ0!bKCzS7zl}8?pmV(IoDt^M zIH<|%Lrx!WNbTd7?%$b*>)%Yfad!Vk+HFhpZ=fCT>fh^^>M3^m z_q6uI0tN2}gX$JL{>$`l$bYDR0}t1~TkXc#{hMmHEz!R-?RZ!JKKXHK|6bSrME@SL zd&+m`6xcst(JzZ2{<&is9XEg(VInZKy^LtgO6@LBZb z`Zoucdl2(kiKRJ1U5WCs(lHeZ zzE5^-^HLU=(=Y@P06mdc7-E<1U9L`r6BoooMCE}|v)rdfIg!iM*>Fw;Il=qy@*%B8 z*)lc5iCn5CGiP`yS~;Z62rpF^!Y@Q_391RHq<(BiLuj)d`0OlBf#2m;_OKE$8KWMC+5=P@%joJGI~hWo;YGzpcu{-~2!&a*q{OIM66g9#vIc22 zkTr~w8Ok%qs+UUV;U4*gHTuL0AY{+$As)4%t_ z$^P|2xYNIee-Xbnqa0!{@as7^Q}Ju36S+)ngEJMs4my!b)knqd|sO@DkwKzk*+hWtjLi zIz4`EdQamQqZ9Z=k9rO#j$Zf`1y~#zzkURiNZ{8}WD)$D`mPJVZi6R@U)vu`;@4&I zRQwu_{2IT`LmuGQ1!!ARJ_!11raJKV5?l`a-3PaWU+ds@;4hNEuRkR6y~cbtem(5U zx51t7OXF8x&>$CnZNgwA@aq(fIW~UI`&fa{cPm z0isS8`o!$$e;dEz*GN6UucQBc{7P&CiC?wp@$0f4jbDsT;1@k=IJ=Rv4mzrOPqH-1$=lEg0$lDXHf?Z7vUUvD4=__d%HeuXL>_`4P^ z2mZ#u?Z96J+z$LD@oPpRUk&rw_;ryhU)Y`ROXJrA=)DWSE`t}9+w!mIw&2$f;rNpH zRT^^o7lzB}-`Q|G{qw@@^zUEAucPeJfnT2od*fGu6S+(s3uh{RUEoA6Rm0(Q<5wa4 zXppmh{T&6vn~Gm8IuMJ8>?Uq^(m3naEIVGWUt{g)e;dDytEDZ#uaW;gekG0}#IKh0 z_~n7+PISH>qZ9Z=kNO<9A-(Wx0KnqN_;nvpB7tAqffa&Z_q^@GudVPT*RQ;XlK8di zPpSA-jrAVMo&F z65T2k?3QgM`AhEf)bHn{U-Gvjr(f?%KYHJh(^DUyQ~tj6>4SIx>xJq9XqE`7X*xY# zBm~vU_j#&G2&Oyy7s}ROj*Cz-bB_YtxVOucr${L;+g0A0j}BYj@pgI70JOiby!H1> zf24gapB%Ql=c{%5u0B$E*SN~-{KsL-tFg;FF->_QU&Plo&dGT`Pk;L8C(OMO)M?pL zb84&)cusg~XRFxAtntUZw(Yil)kXF5@-nNBkMbE>hUNrzIBdXP8ND@78Q>Uwt9gl8 zYA@({p}VW66@OF^6H*`fZF)(jA?$T(FPVmqNWfAjey?~hcjEWvEIv-3^+Rg3orZk6 zkou~fq%CLhpV36=6D-cb$>ViMc!)K7Denpc-TTNxya7B!a@jmL8&LgYzk$rG;h7kZ zLeYg7G#coak^QQ#wB;)~3N-o+ejLlH*qhlY{JN;;W{ym8{JMiM-RH#j^`b^_^A4%T zTk~w1YP>ZMCbIS_8YB1s?(f-=Nkh@}`1Pm<>bP(g*&FWyhuUEf(hhwRL^VF=0{JbI z56195{A}T<&&)7=o^p^V5Q5kL$;IpdXo`L$oXl>^A7Ox9@H6Mj!q0>R81#d@)4u>e z;K(}gQ~jzyP85){LFW1QlTskZ)Luf)8i}uR;`iG8=8!tWNdxHl0D~au`q=3-^lYCf zr4|8tHX(%#J->yM6LNzmq31rr2bv1_2<7!y4sd+x0*=ioz=3%_ z6g~!i_YnB_o@~IOKeR-X%E`Lt0-g=&N60QXS z532b{*uz^BT-525&>w=NT*`ikU5v~Z#v90s$F+TD_L+(6uZM4PjdXH818Nu`3OHTl z&93Hfz}%PQ2&fx$4!!cb1~Ua70*XfCkbfK=8;1|b8)tcMo-F6Px}2Wfht3C8M6S{K zM;|u--+nGF@0Fio1$Y!PmSWv_qyU5)Pi%wCZJ2Jn+Gl1XTNY z(@>++n2mn4=RE#N&f`(L9s|Or#RbOfL6C>I?PR7cgVLMo(*VR!x_GPi*Nss7MTyXt zv2t>aJ-dZ$+t%HErD+wrrD>5CB(ClcixQbV+nT#ax>>chCS{+xai^s1$LPdXoE|m% z9|wAG#pmug;#U09a`m-cuC4e*$RbW;I*4`FpN?n!RNPlRE6_fa?g zhHS-A?B5X6^U#v!ooJkhsOk0A9x~d^h%3Sq(fWZmrC0G~2oR1cuAY;|Lv5z&SCGiH zX?_{aPHdX*Km(6tM$&qctT@@rXuIXXKD*&3%(<1^Y){iAcgIQ?kP5#sGvktz5q{kPkb zl_tO3Kbz9tOw*r@cRpis&l=+yI~wmU%rSXqjme_RxN{YHByWC_r91cos#mv{^c{6Y zM-SuvFgkj;{*2&frYERc8}Z~t^fH5XLSHqM?oFKmvZ%FP2i1K}{A7v$D&mnG`xK+? z_f(Np*Tyzt&h0$W(bvEa^B%MGr&@pJ=+9jF)YkHYf6>|o?SPgxk9iAAqLPq4QEx57 zi?-y{TbN*TF&~Q7x8(b+itWBYxf+_u)swp=b1^eT(MkM{@#v3+iBiDCm~346;FD{X z0w%`f`FsK6v%0oMqzkBX?NabiO9r~VUhcU}j<%{6LO8xVaA)~^-+%z;f;AHsM=8yts8~BMufk5 z^iKQ2nwZY1iLWf2(aTHe)0%?bHRW6DhDt^JwdZNwLC9SkcAl8fscDF-rV)vn*r!3? z?p+fgqCjfmuU*rGFRY0Poth$$7<2kGEm0HaY039{*MvT0OHKT>YkKSRFX|H$IyJq8 zbr+-I*h_V{AWacbx{@oL#snR4A#GW zKt1#-mZeh95Q>xGt%@1)L?Z{VjxqVj5TxoaMCDK^IpA3-;3TA_Qb{`{70zGx)%x=! zNni&J26%R! zGl#k`!VP9c16p7-F~P`EG;ab+YN_sLfNg#lg400#)W}W@<**l`Oylut*m=`|4;=gF^ zqY2j<+hwd-3zxBsyY*=8>O}l1+tsf3UEFn9O{~ffidAmb5egtbeI-QjxR)@jCN`JW z1Io=tM*8u7Sx3gl0-&rW_8j&|T$#_b<3C{!KE~!1suvd81%JhkdjxS-6Q?RQ?|The zYiEhXbJqD{Jz4iwJN`2q*sLakRZ!}Fg5?Jxzh}p zQ*u7>X}UTuk(~V1IWLo(yK3G2JO(+n8UU+l7E@|_B9MN@^!Om45;DpfF)uhOVqWfN z-muI|xGR3;{(}dH;OStNRaWaSH*2{q!5MeOJPk0{fE9@iue}rUsrNyJWLt*)WH^4t z#|f4Z{q8*<_nZIXc`S&99)~q%^XB4JR%A0Qvb4Y=%g1x_MvkXNma(+Ray=}v2=y_# zTt|A;2YzMU-cbNp9MjBtqA@h_=QL!2F4A#Z4C{6M{sB1+om@`k^kre@7>6}xyD9$Ip1k{zGgN_F|%<(ZO`nKr}M22TeSH{BKhtpFla_g$fEUsY>`lX|M**YDlO}I43t&@^1hWkm(^`%laeAdeiVT#57Uas1A10g!wH0CH;Nl{qJwGMgiBBB;zJs008i!dPj5?U_2xbUkUh z`7G(VQNNbI&oY4}?)XheVr+o|oUJ{EAr**Vu|1)=(DGOG$DBpf-)XE{kF-S}R1dR8 zoonoeVc5}x5`aP9IrdZ+?VCTq_(Pl))TE0vJ zU^mz#1hzsvb_1J8VB8=7KTvreSiE_`a@BzMU|h1c1IR<=&|f=S2N+S!NG{7ps9%Nc z&Q4A!;45AjWEyhA0j$8q|>f}N4?fT?gTV+%|+tMs;lM$w1a8^;M}=~ z9QTn`aBKq4jsl+LG+Yd5AsaCpud9v&c0gUo?a1g;B}d5E$Ih6GjBmW?%6QBXGLl}f z#yn)a4;g{q$KJ{sx1;+|cf6W?xC(s$t29Y3o<^jrAD&~uROm%7GRu{pOXju#(N7@<7Pf$|)aRg|7k6F(>nCMl4R-Ovb<+AK@Ka?tU-$OKypM+gR^XL*c zvnxSY7oib=@qUa>FuUkcH{+7I*S+&%K!Gz(Y2*?~SE2o5$O{+|$EeOUWD#c9H__&V zTt^TdF{;xPWw*-JFB_BNG-OliIDHxwx{8tyA_jEz0yIzPs;xf~EWyZN>;tr2Qa}Lg zF$(E}D}D+#LWdP1JQY*w;&;7?mJ{LM=BtMLIbGzOJp+g4cM-Mbd-%lSQ*Z*25-OoJ z4jqp+!p{W3Y0;8OB3QY)fbIP)#1CJ`-`m&_g7F64_jrmjjy(WGjgvhyqL>VE+UVfYU*+VS%UI!Pt%1MN;N#j6Y| zWs^Sr87+&S2p{iz@RWnwqxey_|EfXQ1zgpIy@S@b{wv_Dsz(lcybo2Sle73SG|@GZ zO~BLm69_}4PvRq$&SIsj;Bzy#;FkT%*-#q=_1D+{&C3P;!W>-zbW!DF6O=cyimTes zxvGr?wR;XQongF>H+mE!q|alQGz%A$Ha!s z*)L_IAng9kHOq)TALleY#m&)I&{jiqjabk!SK_gzW8ZTXhQ=((3KTK={e7 z*b2&1kCgHj{Lp?_Zpvu-eLO&e9|;9Ca6s=1Zf>&9JPPkfS-XCfk2Y9&!%AWWxA**B zKdS#^*GPH#x8O%RM9+Y!C&`+IJkWlV36=eIF?r-=H02@;#^0bRj1visqNt}Uav|KT zYxxk?#WW@CYCd=ex@bcJ=Ra=>Q;rp0gG39a@6ZqUh4*G!JfL)4n{8J(8a|^b55K65 z$wPK+j9_iwk=mHRRT~o;5eClhFm^c|XZMG+XT}W8)v|`dU$ix6@tNec=uXQJWbQK} zg^1Hn3?Y|q<6QHa~9LEqwbehM*wq<@}SL#43=C>=hVR= z&FmP`X=UGRSR`0lV}b79koJ-5m?dX%5sTC&0%d@3^CW{agi~QOapNJ|q92$|EFJrs zZ=2RAx;D@GCNO{G^+V^KY|87(k>dx03`pe2@va?C!!v+5O*G9Wc2Ywbg$_*F*>tZM zhS07oQ&c>3WiR=+Yy3a<3S>!mirNIGZe!w-tvnBN@7dU$(X|=Mi{xP*j3UYNO6Wxr zz>lrC7|qg6EU8z3FAkX@P0qRP9THDj2@qw7L%$7$ElfQRoZTXE=iIhHQnT}>Fd@eo z5%EX^k%J>zBoLEx+kR|kW4c9eb@!_kU9FDZ>REd1y5vb=Yy~+d<~sgz6>FM9gDU!^+h7c?|u;eJ$v+eXs{#Zmx0mf>33eMRspyA193SkO>%i>p~--ot* zo)2T;J!Z|Go_gNL>!B7P!Co#4Tkn{#>(p0~Iu;=h2RY&vXOjzCd^4lOr1J*@aEPqg)EfFAy7u(6~uP z0{t$1o35K%y>ROFt9~yuE#t=cy{&kT5*X#W^fM~9^PTKDcVJIdJc@0xiYG(q4kv98 z0{uX z1U%NAWD!TTy?LW%y;V>4cC?;x{MW02C3ca`(R${S6e)L(hIcK8CsS%;QCyTw?^;`b zgk4dzekr2zVMhmDcFL*WWV@{TPPhy&bRZO}rdNxkEgN8 zxnFhg>E0I(gHM0HEe$?(BJh6-pH5>h+|&I3D?U9zewm==zl%>-q9ka8`d9F&q5FvV zbnM+n#HaUusgarmG~rdyie%Cak$ci zxjB%j`qB7x43@lw20P1_L)uu@iBcBH8p`rGWszg^IC8Ko(l)bxFMge}nh>K!3y^0e zA`fe_PB-2UOIhj0 z`vT-hKi;Ra|02rKd%Q>5^&dLkUq?*pcz+i)r;hh24AJAgakp!{FMq4oc+dL%VaJ;X z0;rQ1Ke)XQgh!4ba_8*VhKnXJWXv|F4>N> zakcqeEdlZ72K?4-McNcnGmUZhdC@F&-b>r=HKxU=kmpEY> zAB5^Qa$6WOUM{bTic58N_lI2!T224f4xAUl*_CKwRb3lVwyvGOqK`u><#=GJDCK~; zqwE=!F@k2xt!5pso6TRY!LM-(-F5A&QHfc%TtfJ3*72&sxJ7<{#gw=sZhwA2#xvZ; zRT{Jol2vs;%o{_L+lYSnAT1z;_fphh%rIm2aHDvb7Pc|Rj4+Bvpq+JX#AukfIh9~l zoQ)02JgCQk#=JbE1PYV!+ymBx*Rx(|zG*e@YGFfeVE~$5*D8*hY(qlo+DXOC;w(w#M8JRrpDLKvgPk=DY}a&vgfS++u3d;<=^$f_ z6hEdQ*pDG7e!DtLAR7W!+o4t`8|}boOk*V|xD*zv(VE;qKZYQAr&`a_D>|o}#rZQ> z`dFH1h2Cm5WvrAAO8~b~hQqwM7Qe>6Rw*W!VP?* zzL=Vu; z-G!!lm>W{Rh98mnFkTCLKk&Go(Qt#_=Gb@GfHMSzk6YIz?~BpiaBTE2eM^k?Y5(wE z{t-z(RV-xH{R!LJ1%`iE%Js57AG+g*A0d9kA@O`21pXl@N?G3NtVP#V_miQXS&pb1e6L8Mk12ba9!!T9d`H7QJI8iNjOyB z57Oa-5RQDAMwc}{dx4!9Ec@J%-hu_pXJpoI1X0Nw=^aG>Afu0U3oCP;QYBR0wcoeb~YLa`Z=nr*sPh;dNuLT{`&p(t}&GsY(6Ph2D zi$)at917^c+fB61ZCpVeA_(5^37jpG+BMqONDuYJn1PCc4L-FJ4qS{uA8OAQXKeYk z#~17=q6~?ySq!^4#e?xT6nmMyFJtFW0#mGmMiv*;dDwMiB z!X%WSlj$d6^yWh*;Ud&<BFDD`b@g4%L$ z{2?rIP$aH`UzJ!=k_m9u&&&O1&Z05e)i-DH4;WpROT*4XB`^=s-_R~Z=QA2|Vz{+D zhJjd}Xe;P3k_z$)@p9`v-DIN;*F6o{$Ld67plyvhg28{!#Ujv_)9_b(xyhrs^GSt% zyqGLEZx|X>KYF#lmcN=Tc?KB~C`1K2J=X^jeEb2VN{9N?c}}u#BN@s8XldIv`1R#;tBaDH{rwuN|DHH>O>vbXya9KdxZT#&~^rGVAl4`3 zZ6r6Nu8qIb4;Z_IWnsJy4n^@W%VP1y*kNFU6pt{*4@Y`q>3T|o)G5rA61ZsedkGi%_#9AAq z`Z2l2=ipmt9tP@r2__+?R2uUOaNajc^6i6u$so14Cmrun&U)`VtD z)VJqzzlPIv`l85-sBbSsntKmh4jB+S&3Uv^QJh}|1_!tw`O>yQM#&(vPB;y}6yC!V zTQg)7M=rqX{i-cxDDEz zMePO;rYj>Sl64dYSU=J>$BpotvxW!FIm1HgfmcXqU_m7-wqh-?0qdg4lP>7YBqR$B zFE?ilgUqCztRj&t&y@5&^XDT%=J?@$bL=pmsz9>XTXpZCfeY&1=C4LeV+AqNTGxo* z*b1U0kIJEHqU5@(;3Y~%BaG&ff(`aPxZ@VOhh-Y(71?y?GDbW^mEME`laPvw1%Lu; z!(bK{*^V}o9}-fvHCQ}WNGOi&f0`ucaUH-@c|iRNTJ+IjoG)Uf!}P&Cpl(HAtTcHr z52!ghnPsu4Sm}uFd@fDbqgtyei*>effw^NgI$=ggW2&MNhD#4DaYCN>&Vd;-EQ{fl z0q9qTTJmmIg#&uC8J zj$!zUaR`A@WhWe+|N8=LC?i)nAsF+w5i$cHS*a^C$6RA=ARPrUAk7P@jp*MLUH4Rs zJncFDO{PK*G?pjKhz2BFdrtlX@u3>Wxt4I&1sgW>D4Bt3s+i-vO6AROQVt>{f$JZbV|S- z7)nU?q63Lsy||HH!5TcQQzKm^{NV$;7cche#m&r;?8Oh@P4?o`jmcijb4uvw)r$)y z3%h`Z`_$i&#~w-a>1p_;PS-IbQG(ed!?=RY(A#&5OLNg1bNic33^a~4BT|Ee;|&MG ziZ)tPJWRj{<2bX4!(dIxD*6Cir4P&qi!_cK8DW0QpS_^JDNdu08DVzIpF2{@WP}uf z2r0s!SF}%fOMUcu*H0Ko8@Tp^9$$ci6=qsT={4JD@88-Zl143SMa>0;cBs0MeV4(k z{XMxtC?rlHx^>(DLLiBoJ|89stcu8sa6?ik2x2+*5B87^GRG8*jBG+oPGkob6rPze zz1UB#mz>~UsLXqCs*x3b`V5|*{Q=bn#N1lZh$Kn+Om^tqIJf}7Yd6Rdr}`_p7|JnU z%QX;Plcic;C+OWwsIHysWAc2I6eUs@n@L`sn2P_E9SQ63+OLe`8{S zwW-+C%Ek;iVBHMBdmfTd^el1eQ{&Jm83NK{>G-(}!C3Fw#5+DT7!gpoqUJv@i?$KukhX{(HzGlJcK6NvM8NF!UGXar6cGgc>-m2iHwWvN;YeWs{PO zzL%GYq&!M~4P`)5UKoAQ*~8OPK&^#cX+T{Z*8H&XUX5S-TCdy}(s+}p_O-gU&kpvC z1R5}7BXL&tAuuM++mmu|9i;)hS7~}fdn9Jg3j*OOS1Y7Kq>*IqSDwh*m0TT!3m0(r zy@?<^jPaF|z5hJ~aW%TT?C6Z{64^ZG#5=Q#kwxB_9f!F~uoFw*5l&VU=LWNEgp#v-;+?6p90y3?of%608)7ia z2g%OmEZg#y&7-AnT~=7E$0Yi;5_Pk0j86289(6aas(SIMA3!Y*moAN^SHAT?3(g17 zCi*rDS)^}2K)Vusn+cEZ8;x?JZ;u6&eLMe-)V>{)=-Y9+Zx^6>`VHNoil80&QUUG& zM%l%$%hTAZnWnF!EWzRTSg7dxvsIw1PIA7*9B>F`NkSknuc2Q_bHGnC+cR1$)J2%_ zKq?{Z*@1mC#+INaj1f((VWwjg=A{=&Uar%c>*UlgL^)}*egW1&O_ir(gGajTP}k#$ znzFvswF*_vc2nh2yHKIXnmkKJi0g&a8!ZlDo?%mFhcLG=MhG*Axlm?DT$;?@vZcN1#33ug?Din?UkB zeFh11H~eun1@BV0%HXq2e@-Ke{|sB;o_q243iI;d-dHDFRxb9USj~nk zRKo{E%XH$NdRJ)jxDpcK;CgiO9)UW@em78|^jA@->vyQo7YEni0J^pckA7?W1g@`a74JFTSU6NpJjT2gYk4Y$&> z?XbV3Lwn9hm0Y&hYXk;}itRleF8O83TYdvdnM8h>@_^67!_CmuSd9|6L`Nz?=#5Xqb&~Y> zbOH|G>GA2Y=0ou*evN>2nwJ0zkUBj+UCx-a_;eHA=A_4`A0Z}zPn2Aqr7O1A0SBL| zbm+f~Pp|yWCBIzrw8p0sv0!}xKHYZDVesj->1pt(1%dxl_>{w5{MXi}`@;Vzd4p6e+)EooB0VMe%OnUcf4gP800K5c_ReDUiblstt^eell zLszDAkUBjkoy?fDm~=MlPP;OlfS43a`j)P^7bfNE(B5wVuq0J+vn~2ru`q4cZ)&(E z-S(6Vht6KBap<*0E*wf-k0vfV4E{7tO@lwR2>hSIpO>rtoA~o1sqH_p9-V-az6AaZ zd*g`s^U@VZ#GglWlJqN)^~~Y$=bKL+ia#^#q7KEMzdvy}{Mo^nwD|LW^WpI4b;P9L z&pSAIkW8fR>^gPmzkojz*SPTKeR#O1Yr=sku?D5!PtNaZ3e>UD)w zH?OqHE0ZV`m~2#Z@>1=51X}X)PK%2=Pdw!{rcv=?s`GaJ8(gMV!;MHw7fgFlgb989W>8U3s`+O9y z(C4Ksz0OM?JnF)&rpGjH72WK@twYXBf?to^o*utGn4AW`x)Jz4ggUUqAWHq4@QXUDToYbv{z3$FFZP zCM|vyvF^0{zS9tsf?wa!757@V@^$FHfM0x1eaFK#esLps&LbMXVhaz&FPInT{k~o9 zpx?g_e2%@T&rz0CKzs6^p%~t%CI(&_-w2gLBz_)ly`bL+F9*Mrilgy^ z&FgJFb>m^?xIGi9A7?82dn5%{zYERw*S#TQ^vb)x1v>1TneJAtK6dIsh!{wMmvs2Z3` zF0j)_owPlG8B|yl%~{-Lr>n>|J}*}vAi^<4^)=+u+K8%j&(wtoIr|mUs%Et?T-qA> z*ywLB&#QIGRM>0LS~m)h52dA+-F{&XBD)Y zO)Srhu-)YtYhTE(PFjbMSu{;8V?rsi;DemP-Os}dp`m#l?egd)gPX%9Oo{FdH!C;D7|E+Qq@P4d zD%^d}^aPZ3W)?5XL&~#()D8+yo3*<5nVBKA<}uJ<9+WYKt5BeC2X!6icAtt1;65RB zJE9G-6byN+UeSF+>Uvl7AK9FWY+XQJ_o?RCYqXkkiap##P{muEs#%d8HQ%D(%-(Fg z?}7E>4!JnG8mAR>5H;KP_8UFW^9Pk%(D4|CbSJcJK^_1)|DHz2rfY305Ib1t#~}y# zs*F~na#nroWQY)*x*qFO;^K~*?`#xq)i~;281fHXvZJmztep^Dd|Ek|4-y^wIzYfi z6$aD~SQBzhMKvc&HCpo#D;swW)f?konNO{G7PWbou@fx#J`}7Ab2R}%3Wi-FZv>an zkcmtI2EiTx=ug%udagns6G)Lk<)C>&f5l%!uAKnmvH9dp4@ZLG-CgiQ}CFKB&z+DTsgK?83Tℜ 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�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˜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

Xi(scaHLHk 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 literal 0 HcmV?d00001 diff --git a/org.glite.jp/examples/pch06/cheat.pl b/org.glite.jp/examples/pch06/cheat.pl new file mode 100644 index 0000000..f917cbf --- /dev/null +++ b/org.glite.jp/examples/pch06/cheat.pl @@ -0,0 +1,201 @@ +#!/usr/bin/perl + +use Getopt::Std; + +getopt('g:s:f:'); +$glite = $opt_g ? $opt_g : "$ENV{HOME}/glite/stage"; +$dagids = "$glite/examples/glite-lb-dagids"; +$regjob = "$glite/examples/glite-lb-job_reg"; +$logevent = "$glite/bin/glite-lb-logevent -I"; + +die "usage: $0 -s bkserver -f file_prefix [ -g glite_install_dir ] dump \n" unless $opt_s && $opt_f && $#ARGV == 0; +$server = $opt_s; +$fprefix = $opt_f; + +%omap = +( +# common => { + 'DG.SOURCE' => 'source', + 'DG.SRC_INSTANCE' => 'source-instance', + 'DG.SEQCODE' => 'sequence', +# +# }, +# UserTag => { +# 'DG.USERTAG.NAME' => '', +# 'DG.USERTAG.VALUE' => '', +# }, +# Accepted => { +# 'DG.ACCEPTED.FROM' => '' +## DG.ACCEPTED.FROM_HOST +# }, +# EnQueued => { +# DG.ENQUEUED.QUEUE +# DG.ENQUEUED.JOB +# DG.ENQUEUED.RESULT +# }, +); + +%smap = +( + 'HOST' => 1, + 'DATE' => 1, + 'LVL' => 1, + 'PROG' => 1, + 'DG.ARRIVED' => 1, + 'DG.PRIORITY' => 1, + 'DG.EVNT' => 1, + 'DG.JOBID' => 1, + 'DG.USER' => 1, +); + +while ($_ = <>) { + next if /^\s*$/; + + chomp; + @F = split / /; + + undef $prev; + undef %f; + + for $f (@F) { + if ($f =~ /^[.A-Z_]+="/) { + # print $prev,"\n" if $prev; + @P = split /=/,$prev,2; + $P[0] =~ s/^\s*//; $P[0] =~ s/\s*$//; + $P[1] =~ s/^\s*\"//; $P[1] =~ s/\"\s*$//; + $f{$P[0]} = $P[1]; + $prev = $f; + } + else { $prev .= ' '.$f; } + } + + # print $prev,"\n"; + @P = split /=/,$prev,2; + $P[0] =~ s/^\s*//; $P[0] =~ s/\s*$//; + $P[1] =~ s/^\s*\"//; $P[1] =~ s/\"\s*$//; + $f{$P[0]} = $P[1]; + + push @events,{%f}; +} + +for (@events) { +# print $_->{'DG.JOBID'},"\n"; + push @{$jobs{$_->{'DG.JOBID'}}},$_; + + if ($_->{'DG.EVNT'} eq 'UserTag' && + $_->{'DG.USERTAG.NAME'} eq 'ipaw_stage') + { + my $s = $_->{'DG.USERTAG.VALUE'}; + push @{$stage{$s}},$_->{'DG.JOBID'}; + } +} + +$odag = $events[0]->{'DG.JOBID'}; +print "dag: $odag\n"; + +for (keys %jobs) { + next if $_ eq $odag; + push @onode,$_; + $index{$_} = $#onode; +} + +for (sort { $a <=> $b } keys %stage) { + local $"="\n\t"; + print "stage $_\n\t@{$stage{$_}}\n"; +} + +$nodes = $#onode + 1; +open REG,"$dagids -m $server -n $nodes -s $$|" or die "$dagids: $!\n"; + +while ($_ = ) { +# print $_; + eval "\$$_"; +} +close REG; + +$jdl = $jobs{$odag}->[0]->{'DG.REGJOB.JDL'}; + +print "substituting edg_jobid ...\n"; +print "$odag -> $dag\n"; +$jdl =~ s|edg_jobid = \\"$odag\\"|edg_jobid = \\"$dag\\"|; +for (0..$nodes-1) { + print "$onode[$_] -> $node[$_]\n"; + $jdl =~ s|edg_jobid = \\"$onode[$_]\\"|edg_jobid = \\"$node[$_]\\"|; +} + +$jdlf="/tmp/cheat.$$"; +open JDL,">$jdlf" or die "$jdlf: $!"; +print JDL $jdl; +close JDL; + +print "$regjob -j $dag -s NetworkServer -e $seed -n $nodes -l $jdlf\n"; +system "$regjob -j $dag -s NetworkServer -e $seed -n $nodes -l $jdlf"; # XXX: or die "$regjob\n"; + +sub logit { + local $_ = shift; + my $job = shift; + my @opt = (); + my $ev = $_->{'DG.EVNT'}; + + for my $k (keys %$_) { + next if $smap{$k}; + + if ($omap{$k}) { + push @opt,"--$omap{$k}"; + push @opt,"'$_->{$k}'"; + } + else { + $k =~ /^DG\.([A-Z]+)\.([A-Z_]+)$/; + die "$k: unexpected in $ev\n" unless $1 eq uc $ev; + push @opt,'--'.lc $2; + if ($ev eq 'UserTag' && $2 eq 'VALUE' && + ($_->{'DG.USERTAG.NAME'} eq 'ipaw_input' || $_->{'DG.USERTAG.NAME'} eq 'ipaw_output') + ) { + my $val = $_->{$k}; + $val =~ s|.*/|$fprefix|; + push @opt,"'$val'"; + } + else { + push @opt,"'$_->{$k}'"; + } + } + + } + print "\n#####\n$logevent -j $job -e $_->{'DG.EVNT'} @opt\n\n#####\n"; + system "$logevent -j $job -e $_->{'DG.EVNT'} @opt\n"; +} + +print "DAG events up to Running ...\n"; +for (sort { $a->{'DG.SEQCODE'} cmp $b->{'DG.SEQCODE'} } @{$jobs{$odag}}) { + my $ev = $_->{'DG.EVNT'}; + next if $ev eq 'RegJob'; + logit $_,$dag; + last if $ev eq 'Running'; +} + + +for my $s (sort { $a <=> $b } keys %stage) { + print "\n### stage $s ###\n"; + for my $ojob (@{$stage{$s}}) { + for (sort { $a->{'DG.SEQCODE'} cmp $b->{'DG.SEQCODE'} } @{$jobs{$ojob}}) { + my $ev = $_->{'DG.EVNT'}; + next if $ev eq 'RegJob'; + + logit $_,$node[$index{$ojob}]; + } + } +} + + +print "Final DAG events ...\n"; +undef $gotrun; +for (sort { $a->{'DG.SEQCODE'} cmp $b->{'DG.SEQCODE'} } @{$jobs{$odag}}) { + my $ev = $_->{'DG.EVNT'}; + next unless $gotrun || $ev eq 'Running'; + $gotrun = 1; + next if $ev eq 'Running'; + + logit $_,$dag; +} + + diff --git a/org.glite.jp/examples/pch06/convert b/org.glite.jp/examples/pch06/convert new file mode 100644 index 0000000000000000000000000000000000000000..432407f3155590c289a56c897ae690e33f077388 GIT binary patch literal 3965946 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