Sprout from master 2008-06-26 12:43:54 UTC Aleš Křenek <ljocha@ics.muni.cz> 'merge 313_5'
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.jobid.api-c/Makefile
org.glite.jobid.api-c/interface/cjobid.h
org.glite.jobid.api-c/interface/strmd5.h
org.glite.jobid.api-c/src/cjobid.c
org.glite.jobid.api-c/src/md32_common.h
org.glite.jobid.api-c/src/md5.h
org.glite.jobid.api-c/src/md5_dgst.c
org.glite.jobid.api-c/src/md5_locl.h
org.glite.jobid.api-c/src/strmd5.c
org.glite.jobid.api-c/test/base64_test.cpp
org.glite.jobid.api-cpp/Makefile
org.glite.jobid.api-cpp/interface/JobId.h
org.glite.jobid.api-java/build.xml
org.glite.jobid.api-java/nbproject/build-impl.xml
org.glite.jobid.api-java/nbproject/genfiles.properties
org.glite.jobid.api-java/nbproject/private/config.properties
org.glite.jobid.api-java/nbproject/private/private.properties
org.glite.jobid.api-java/nbproject/private/private.xml
org.glite.jobid.api-java/nbproject/project.properties
org.glite.jobid.api-java/nbproject/project.xml
org.glite.jobid.api-java/src/org/glite/jobid/CheckedString.java
org.glite.jobid.api-java/src/org/glite/jobid/ExampleJobid.java
org.glite.jobid.api-java/src/org/glite/jobid/Jobid.java
org.glite.jp.client/.cvsignore
org.glite.jp.client/Makefile
org.glite.jp.client/build.xml
org.glite.jp.client/config/startup
org.glite.jp.client/doc/README.jpimporter
org.glite.jp.client/examples/glite-jp-importer.sh
org.glite.jp.client/examples/jpps_upload_files.c
org.glite.jp.client/examples/mill_feed.c
org.glite.jp.client/interface/jp_client.h
org.glite.jp.client/interface/jpcl_ctx_int.h
org.glite.jp.client/interface/jpimporter.h
org.glite.jp.client/project/build.number
org.glite.jp.client/project/build.properties
org.glite.jp.client/project/configure.properties.xml
org.glite.jp.client/project/properties.xml
org.glite.jp.client/project/tar_exclude
org.glite.jp.client/project/version.properties
org.glite.jp.client/src/jpcl_ctx.c
org.glite.jp.client/src/jpimp_lib.c
org.glite.jp.client/src/jpimporter.c
org.glite.jp.client/src/jptype_map.h
org.glite.jp.client/src/typemap.dat
org.glite.jp.common/.cvsignore
org.glite.jp.common/Makefile
org.glite.jp.common/build.xml
org.glite.jp.common/interface/attr.h
org.glite.jp.common/interface/backend.h
org.glite.jp.common/interface/builtin_plugins.h
org.glite.jp.common/interface/context.h
org.glite.jp.common/interface/file_plugin.h
org.glite.jp.common/interface/indexdb.h
org.glite.jp.common/interface/known_attr.h
org.glite.jp.common/interface/type_plugin.h
org.glite.jp.common/interface/types.h
org.glite.jp.common/project/build.number
org.glite.jp.common/project/build.properties
org.glite.jp.common/project/configure.properties.xml
org.glite.jp.common/project/properties.xml
org.glite.jp.common/project/tar_exclude
org.glite.jp.common/project/version.properties
org.glite.jp.common/src/attr.c
org.glite.jp.common/src/context.c
org.glite.jp.common/src/indexdb.c
org.glite.jp.common/src/utils.c
org.glite.jp.common/test/type_test.cpp
org.glite.jp.doc/LICENSE
org.glite.jp.doc/Makefile
org.glite.jp.doc/src/JPAG-Configuration.tex
org.glite.jp.doc/src/JPAG-Installation.tex
org.glite.jp.doc/src/JPAG-Introduction.tex
org.glite.jp.doc/src/JPAG-Running.tex
org.glite.jp.doc/src/JPAG-Testing.tex
org.glite.jp.doc/src/JPAG-Troubleshooting.tex
org.glite.jp.doc/src/JPAG.tex
org.glite.jp.doc/src/JPDG-Introduction.tex
org.glite.jp.doc/src/JPDG-WS.tex
org.glite.jp.doc/src/JPDG.tex
org.glite.jp.doc/src/JPUG-Introduction.tex
org.glite.jp.doc/src/JPUG-Tools.tex
org.glite.jp.doc/src/JPUG-UseCases.tex
org.glite.jp.doc/src/JPUG.tex
org.glite.jp.doc/src/LB-JP-interaction.tex
org.glite.jp.doc/src/README
org.glite.jp.doc/src/copyright.tex
org.glite.jp.doc/src/definitions.tex
org.glite.jp.doc/src/egee.cls
org.glite.jp.doc/src/frontmatter.tex
org.glite.jp.doc/src/glite-jpis-client.tex
org.glite.jp.doc/src/glite_installation_guide_JP.doc
org.glite.jp.doc/src/glite_installation_guide_LB.doc
org.glite.jp.doc/src/gui.tex
org.glite.jp.doc/src/images/JP-interactions.cdr
org.glite.jp.doc/src/images/JP-interactions.pdf
org.glite.jp.doc/src/images/JP-query.cdr
org.glite.jp.doc/src/images/JP-query.pdf
org.glite.jp.doc/src/images/LB-JP-interaction-details.cdr
org.glite.jp.doc/src/images/LB-JP-interaction-details.pdf
org.glite.jp.doc/src/images/LB-JP-interaction-drawing.pdf
org.glite.jp.doc/src/images/egee.pdf
org.glite.jp.doc/src/images/isi.pdf
org.glite.jp.doc/src/jpimporter.tex
org.glite.jp.doc/src/jpws.tex
org.glite.jp.doc/src/lbjp.bib
org.glite.jp.index/.cvsignore
org.glite.jp.index/Makefile
org.glite.jp.index/build.xml
org.glite.jp.index/config/dbsetup.sh
org.glite.jp.index/config/defaults/glite-jpis.pre
org.glite.jp.index/config/functions/config_glite_jpis
org.glite.jp.index/config/glite-jp-index-dbsetup.sql
org.glite.jp.index/config/glite-jpis-config.xml
org.glite.jp.index/config/glite-jpis-test-config.xml
org.glite.jp.index/config/node-info.d/glite-jpis
org.glite.jp.index/config/site-info.def.example
org.glite.jp.index/config/startup
org.glite.jp.index/doc/README
org.glite.jp.index/doc/client_conf.xsd
org.glite.jp.index/doc/glite-jp-indexd.sgml
org.glite.jp.index/doc/glite-jpis-client.sgml
org.glite.jp.index/doc/server_conf.xsd
org.glite.jp.index/examples/jpis-client.c
org.glite.jp.index/examples/jpis-db-internal.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.in
org.glite.jp.index/examples/query-tests/complex_query.out
org.glite.jp.index/examples/query-tests/dump1.sql
org.glite.jp.index/examples/query-tests/exists_query.in
org.glite.jp.index/examples/query-tests/exists_query.out
org.glite.jp.index/examples/query-tests/jobid_query.in
org.glite.jp.index/examples/query-tests/jobid_query.out
org.glite.jp.index/examples/query-tests/origin_query.in
org.glite.jp.index/examples/query-tests/origin_query.out
org.glite.jp.index/examples/query-tests/run-test.sh
org.glite.jp.index/examples/query-tests/simple_query.in
org.glite.jp.index/examples/query-tests/simple_query.out
org.glite.jp.index/examples/query-tests/within_query.in
org.glite.jp.index/examples/query-tests/within_query.out
org.glite.jp.index/interface/JobProvenanceISClient.xsd
org.glite.jp.index/project/build.number
org.glite.jp.index/project/build.properties
org.glite.jp.index/project/configure.properties.xml
org.glite.jp.index/project/properties.xml
org.glite.jp.index/project/tar_exclude
org.glite.jp.index/project/version.properties
org.glite.jp.index/src/bones_server.c
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/conf.h
org.glite.jp.index/src/context.c
org.glite.jp.index/src/context.h
org.glite.jp.index/src/db_ops.c
org.glite.jp.index/src/db_ops.h
org.glite.jp.index/src/simple_server.c
org.glite.jp.index/src/soap_ops.c
org.glite.jp.index/src/soap_ps_calls.c
org.glite.jp.index/src/soap_ps_calls.h
org.glite.jp.index/src/type_plugin.c
org.glite.jp.index/src/typemap.dat
org.glite.jp.index/src/ws_is_typeref.c
org.glite.jp.index/src/ws_is_typeref.h
org.glite.jp.index/src/ws_ps_typeref.c
org.glite.jp.index/src/ws_ps_typeref.h
org.glite.jp.index/src/ws_typemap.h
org.glite.jp.primary/.cvsignore
org.glite.jp.primary/Makefile
org.glite.jp.primary/build.xml
org.glite.jp.primary/config/defaults/glite-jpps.pre
org.glite.jp.primary/config/functions/config_glite_jpps
org.glite.jp.primary/config/glite-jp-primary-dbsetup.sh
org.glite.jp.primary/config/glite-jp-primary-dbsetup.sql
org.glite.jp.primary/config/gsi_authz.conf.example
org.glite.jp.primary/config/node-info.d/glite-jpps
org.glite.jp.primary/config/site-info.def.example
org.glite.jp.primary/config/startup
org.glite.jp.primary/doc/README.install
org.glite.jp.primary/examples/README.test
org.glite.jp.primary/examples/dag-deps.c
org.glite.jp.primary/examples/getjobattr.pl
org.glite.jp.primary/examples/job_template
org.glite.jp.primary/examples/jpps-test.c
org.glite.jp.primary/examples/jpps_store_test
org.glite.jp.primary/examples/recordmultitags.pl
org.glite.jp.primary/examples/sample_job_aborted
org.glite.jp.primary/examples/sample_job_cleared
org.glite.jp.primary/examples/sample_job_tagged_done
org.glite.jp.primary/examples/sample_job_waiting
org.glite.jp.primary/project/build.number
org.glite.jp.primary/project/build.properties
org.glite.jp.primary/project/configure.properties.xml
org.glite.jp.primary/project/properties.xml
org.glite.jp.primary/project/tar_exclude
org.glite.jp.primary/project/version.properties
org.glite.jp.primary/src/attrs.c
org.glite.jp.primary/src/attrs.h
org.glite.jp.primary/src/authz.c
org.glite.jp.primary/src/authz.h
org.glite.jp.primary/src/backend.h
org.glite.jp.primary/src/backend_private.h
org.glite.jp.primary/src/bones_server.c
org.glite.jp.primary/src/classad_plugin.c
org.glite.jp.primary/src/feed.c
org.glite.jp.primary/src/feed.h
org.glite.jp.primary/src/file_plugin.c
org.glite.jp.primary/src/ftpd_auth.c
org.glite.jp.primary/src/is_client.c
org.glite.jp.primary/src/is_client.h
org.glite.jp.primary/src/jp_callouts.c
org.glite.jp.primary/src/jp_callouts.h
org.glite.jp.primary/src/jptype_map.h
org.glite.jp.primary/src/mk_soap_switch.pl
org.glite.jp.primary/src/new_ftp_backend.c
org.glite.jp.primary/src/sandbox_plugin.c
org.glite.jp.primary/src/simple_server.c
org.glite.jp.primary/src/soap_ops.c
org.glite.jp.primary/src/soap_util.c
org.glite.jp.primary/src/tags.c
org.glite.jp.primary/src/tags.h
org.glite.jp.primary/src/typemap.dat
org.glite.jp.server-common/Makefile
org.glite.jp.server-common/build.xml
org.glite.jp.server-common/examples/db-test-int.c
org.glite.jp.server-common/interface/db.h
org.glite.jp.server-common/project/build.number
org.glite.jp.server-common/project/configure.properties.xml
org.glite.jp.server-common/project/properties.xml
org.glite.jp.server-common/project/tar_exclude
org.glite.jp.server-common/project/version.properties
org.glite.jp.server-common/src/db.c
org.glite.jp.ws-interface/.cvsignore
org.glite.jp.ws-interface/LICENSE
org.glite.jp.ws-interface/Makefile
org.glite.jp.ws-interface/build.xml
org.glite.jp.ws-interface/project/build.number
org.glite.jp.ws-interface/project/build.properties
org.glite.jp.ws-interface/project/configure.properties.xml
org.glite.jp.ws-interface/project/properties.xml
org.glite.jp.ws-interface/project/tar_exclude
org.glite.jp.ws-interface/project/version.properties
org.glite.jp.ws-interface/src/JobProvenanceIS.xml
org.glite.jp.ws-interface/src/JobProvenancePS.xml
org.glite.jp.ws-interface/src/JobProvenanceTypes.xml
org.glite.jp.ws-interface/src/doc.xml
org.glite.jp.ws-interface/src/jpdev.sh
org.glite.jp.ws-interface/src/jpdev.xml.sh
org.glite.jp.ws-interface/src/puke-schema.xsl
org.glite.jp.ws-interface/src/puke-ug.xsl
org.glite.jp.ws-interface/src/puke-wsdl.xsl
org.glite.jp.ws-interface/src/ws_fault.c
org.glite.jp/.cvsignore
org.glite.jp/build.xml
org.glite.jp/doc/README
org.glite.jp/project/build.number
org.glite.jp/project/build.properties
org.glite.jp/project/dependencies.properties
org.glite.jp/project/glite.jp.csf.xml
org.glite.jp/project/properties.xml
org.glite.jp/project/run-workspace
org.glite.jp/project/taskdefs.xml
org.glite.jp/project/version.properties
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_expire.c
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/Exception.h
org.glite.lb-utils.jobid/interface/JobId.h
org.glite.lb-utils.jobid/interface/JobIdExceptions.h
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.client-interface/.cvsignore
org.glite.lb.client-interface/IMPORTANT-README
org.glite.lb.client-interface/LICENSE
org.glite.lb.client-interface/Makefile
org.glite.lb.client-interface/build.xml
org.glite.lb.client-interface/project/build.number
org.glite.lb.client-interface/project/build.properties
org.glite.lb.client-interface/project/configure.properties.xml
org.glite.lb.client-interface/project/properties.xml
org.glite.lb.client-interface/project/tar_exclude
org.glite.lb.client-interface/project/version.properties
org.glite.lb.proxy/.cvsignore
org.glite.lb.proxy/LICENSE
org.glite.lb.proxy/Makefile
org.glite.lb.proxy/build.xml
org.glite.lb.proxy/config/glite-lb-dbsetup-proxy.sql
org.glite.lb.proxy/config/startup
org.glite.lb.proxy/doc/README
org.glite.lb.proxy/doc/README.deploy
org.glite.lb.proxy/examples/test.sh
org.glite.lb.proxy/examples/test1.sh
org.glite.lb.proxy/examples/test2.sh
org.glite.lb.proxy/examples/test3.sh
org.glite.lb.proxy/project/build.number
org.glite.lb.proxy/project/build.properties
org.glite.lb.proxy/project/configure.properties.xml
org.glite.lb.proxy/project/properties.xml
org.glite.lb.proxy/project/tar_exclude
org.glite.lb.proxy/project/version.properties
org.glite.lb.proxy/src/fake_write2rgma.c
org.glite.lb.proxy/src/lbproxy.c
org.glite.lb.proxy/src/perftest_proxy.sh
org.glite.lb.server-bones/.cvsignore
org.glite.lb.server-bones/Makefile
org.glite.lb.server-bones/build.xml
org.glite.lb.server-bones/examples/cnt_example.c
org.glite.lb.server-bones/examples/srv_example.c
org.glite.lb.server-bones/interface/srvbones.h
org.glite.lb.server-bones/project/build.number
org.glite.lb.server-bones/project/build.properties
org.glite.lb.server-bones/project/configure.properties.xml
org.glite.lb.server-bones/project/properties.xml
org.glite.lb.server-bones/project/tar_exclude
org.glite.lb.server-bones/project/version.properties
org.glite.lb.server-bones/src/srvbones.c
org.glite.lbjp-utils.db/.cvsignore
org.glite.lbjp-utils.db/LICENSE
org.glite.lbjp-utils.db/Makefile
org.glite.lbjp-utils.db/examples/db_expire.c
org.glite.lbjp-utils.db/examples/db_test.c
org.glite.lbjp-utils.db/interface/db.h
org.glite.lbjp-utils.db/src/db.c
org.glite.lbjp-utils.jobid/.cvsignore
org.glite.lbjp-utils.jobid/LICENSE
org.glite.lbjp-utils.jobid/Makefile
org.glite.lbjp-utils.jobid/interface/Exception.h
org.glite.lbjp-utils.jobid/interface/JobId.h
org.glite.lbjp-utils.jobid/interface/JobIdExceptions.h
org.glite.lbjp-utils.jobid/interface/cjobid.h
org.glite.lbjp-utils.jobid/interface/strmd5.h
org.glite.lbjp-utils.jobid/src/cjobid.c
org.glite.lbjp-utils.jobid/src/strmd5.c
org.glite.lbjp-utils.server-bones/.cvsignore
org.glite.lbjp-utils.server-bones/Makefile
org.glite.lbjp-utils.server-bones/examples/cnt_example.c
org.glite.lbjp-utils.server-bones/examples/srv_example.c
org.glite.lbjp-utils.server-bones/interface/srvbones.h
org.glite.lbjp-utils.server-bones/src/srvbones.c
org.glite.lbjp-utils.trio/.cvsignore
org.glite.lbjp-utils.trio/LICENSE
org.glite.lbjp-utils.trio/Makefile
org.glite.lbjp-utils.trio/interface/escape.h
org.glite.lbjp-utils.trio/interface/trio.h
org.glite.lbjp-utils.trio/src/escape.c
org.glite.lbjp-utils.trio/src/strio.c
org.glite.lbjp-utils.trio/src/strio.h
org.glite.lbjp-utils.trio/src/trio.c
org.glite.lbjp-utils.trio/src/triop.h
org.glite.lbjp-utils.trio/test/trio_test.cpp
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.testsuites.ctb/LB/Makefile
org.glite.testsuites.ctb/LB/Readme.txt
org.glite.testsuites.ctb/LB/Readme2.txt
org.glite.testsuites.ctb/LB/lb-l1.sh
org.glite.testsuites.ctb/LB/lb-l2.sh
org.glite.testsuites.ctb/LB/lb-l2ILR.sh
org.glite.testsuites.ctb/LB/lb-l2Stat.sh
org.glite.testsuites.ctb/LB/testSocket.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.glite.yaim.lb/.cvsignore
org.glite.yaim.lb/LICENSE
org.glite.yaim.lb/Makefile
org.glite.yaim.lb/config/defaults/glite-lb.pre
org.glite.yaim.lb/config/defaults/glite-lb_30.pre
org.glite.yaim.lb/config/functions/config_gip_lb
org.glite.yaim.lb/config/functions/config_gip_lb_30
org.glite.yaim.lb/config/functions/config_glite_lb
org.glite.yaim.lb/config/functions/config_glite_lb_30
org.glite.yaim.lb/config/functions/config_info_service_lb
org.glite.yaim.lb/config/functions/config_jobmon
org.glite.yaim.lb/config/node-info.d/glite-lb
org.glite.yaim.lb/config/node-info.d/glite-lb_30
org.glite.yaim.lb/glite-yaim-lb.spec
org.glite.yaim.myproxy/.cvsignore
org.glite.yaim.myproxy/LICENSE
org.glite.yaim.myproxy/Makefile
org.glite.yaim.myproxy/config/functions/config_gip_px
org.glite.yaim.myproxy/config/functions/config_info_service_px
org.glite.yaim.myproxy/config/functions/config_proxy_server
org.glite.yaim.myproxy/config/man/yaim-myproxy.1
org.glite.yaim.myproxy/config/node-info.d/glite-px
org.glite.yaim.myproxy/config/node-info.d/glite-px_30
org.glite.yaim.myproxy/config/services/glite-px
org.glite.yaim.myproxy/glite-yaim-myproxy.spec
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/gsoap-devel.spec
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/htproxyinfo.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-storage.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/slashgrid.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/gridsite-storage.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_gridsite_example.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
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the gLite JP Server Deployment Unit
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
-
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
-
--->
-
-<project name="deployment-lb" default="dist">
-
- <!-- =========================================
- Builds the gLite JP Deployment Unit
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load configure options
- ========================================= -->
- <property file="${global.configure.options.file}"/>
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-external-dependencies.file}"/>
- <import file="${global.targets-deploy.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- </target>
-
- <target name="localcompile"
- description="Module specific compilation tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#!/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())
-
+++ /dev/null
-<!-- Parameters for configuring the org.glite.data.io-daemon service -->
-<config>
- <parameters>
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- User-defined parameters - Please change them -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
- <!-- gLite services user accounts -->
- <glite.user.name
- description="Name of the user account used to run the gLite services
- on this JP node"
- value="changeme"/>
-
- <glite.user.group
- description="Group of the user specified in the 'glite.user.name'
- parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
- value="changeme"/>
-
- <mysql.root.password
- description="The mysql root password"
- value="changeme"/>
-
- <!-- JP Index Server configuration -->
- <jpis.ps
- description="URL of JP Index Server, typically https://localhost:jpps.port"
- value="changeme"/>
-
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- Advanced parameters - Change them if you know what you're doing -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
- <!-- Installer configuration -->
- <glite.installer.verbose
- description="Enable verbose output"
- value="true"/>
-
- <glite.installer.checkcerts
- description="Enable check of host certificates"
- value="true"/>
-
- <!-- mysql configuration -->
- <set.mysql.root.password
- description="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"
- value="false"/>
-
- <!-- JP Index Server configuration -->
- <jpis.debug
- description="enables to pass various debug options to JP IS"
- value=""/>
-
- <jpis.qt
- description="enables to set query type - one of hist/cont/both"
- value="both"/>
-
- <jpis.auth
- description="setting to '-n' switches off authorization"
- value=""/>
-
- <jpis.database.name
- description="JP IS DB name"
- value="jpis"/>
-
- <jpis.database.username
- description="JP IS DB user"
- value="jpis"/>
-
- <jpis.port
- description="default JP IS port"
- value="8902"/>
-
- <jpis.pid.file
- description="path to non-default pidfile"
- value=""/>
-
- <jpis.log.file
- description="path to non-default logfile"
- value=""/>
-
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- System parameters - You should leave these alone -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
-
- </parameters>
-
-</config>
+++ /dev/null
-#Wed Apr 13 09:36:57 CEST 2005
-module.build=232
+++ /dev/null
-<?xml version ="1.0" encoding="UTF-8"?>
-<!--
- 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
--->
-
-<node name="glite-jpis-node" version="@module.version@">
- <services>
- <service name="glite-jpis-service">
- <components>
- <component name="glite-config"
- version="@org.glite.deployment.config.info.version@"
- age="@org.glite.deployment.config.info.age@"
- build="@org.glite.deployment.config.info.build@"
- arch="noarch"/>
-
- <component name="glite-jpis-config"
- version="@module.version@"
- age="@module.age@"
- build="@module.build@"
- arch="noarch"/>
-
- <component name="glite-jp-ws-interface"
- version="@org.glite.jp.ws-interface.info.version@"
- age="@org.glite.jp.ws-interface.info.age@"
- build="@org.glite.jp.ws-interface.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-common"
- version="@org.glite.jp.common.info.version@"
- age="@org.glite.jp.common.info.age@"
- build="@org.glite.jp.common.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-index"
- version="@org.glite.jp.index.info.version@"
- age="@org.glite.jp.index.info.age@"
- build="@org.glite.jp.index.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-server-common"
- version="@org.glite.jp.server-common.info.version@"
- age="@org.glite.jp.server-common.info.age@"
- build="@org.glite.jp.server-common.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-jobid"
- version="@org.glite.wms-utils.jobid.info.version@"
- age="@org.glite.wms-utils.jobid.info.age@"
- build="@org.glite.wms-utils.jobid.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-exception"
- version="@org.glite.wms-utils.exception.info.version@"
- age="@org.glite.wms-utils.exception.info.age@"
- build="@org.glite.wms-utils.exception.info.build@"
- arch="i386"/>
-
- <component name="glite-security-gsoap-plugin"
- version="@org.glite.security.gsoap-plugin.info.version@"
- age="@org.glite.security.gsoap-plugin.info.age@"
- build="@org.glite.security.gsoap-plugin.info.build@"
- arch="i386"/>
-
- <component name="glite-security-voms-api-c"
- version="@org.glite.security.voms-api-c.info.version@"
- age="@org.glite.security.voms-api-c.info.age@"
- build="@org.glite.security.voms-api-c.info.build@"
- arch="i386"/>
-
- <component name="gridsite"
- version="@org.gridsite.core.info.version@"
- age="@org.gridsite.core.info.age@"
- build="@org.gridsite.core.info.build@"
- arch="i386"/>
- </components>
- <dependencies>
- <external name="@ext.mysql-server.rpm.name@"
- version="@ext.mysql-server.version@"
- age="@ext.mysql-server.rpm.age@"
- arch="@ext.mysql-server.platform@"/>
- <external name="@ext.mysql-client.rpm.name@"
- version="@ext.mysql-client.version@"
- age="@ext.mysql-client.rpm.age@"
- arch="@ext.mysql-client.platform@"/>
- <external name="@ext.c-ares.rpm.name@"
- version="@ext.c-ares.version@"
- age="@ext.c-ares.rpm.age@"
- arch="@ext.c-ares.platform@"/>
- <external name="@ext.globus-essentials.rpm.name@"
- version="@ext.globus-essentials.rpm.version@"
- age="@ext.globus-essentials.rpm.age@"
- arch="@ext.globus-essentials.platform@"/>
- <external name="@ext.gpt.rpm.name@"
- version="@ext.gpt.rpm.version@"
- age="@ext.gpt.rpm.age@"
- arch="@ext.gpt.platform@"/>
- <external name="@ext.myproxy.rpm.name@"
- version="@ext.myproxy.version@"
- age="@ext.myproxy.rpm.age@"
- arch="@ext.myproxy.platform@"/>
- <external name="@ext.perl-expect-pm.rpm.name@"
- version="@ext.perl-expect-pm.version@"
- age="@ext.perl-expect-pm.rpm.age@"
- arch="@ext.perl-expect-pm.platform@"/>
- </dependencies>
- </service>
-
- <!-- Security Utilities -->
- <service name="glite-security-utils">
- <subservice name="glite-security-utils"/>
- </service>
- </services>
- <dependencies>
- </dependencies>
-</node>
+++ /dev/null
-<?xml version ="1.0" encoding="UTF-8"?>
-<!--
- 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
--->
-
-<node name="glite-jpis-node" version="@module.version@">
- <services>
- <service name="glite-jpis-service">
- <components>
- <component name="glite-config"
- version="@org.glite.deployment.config.info.version@"
- age="@org.glite.deployment.config.info.age@"
- build="@org.glite.deployment.config.info.build@"
- arch="noarch"/>
-
- <component name="glite-jpis-config"
- version="@module.version@"
- age="@module.age@"
- build="@module.build@"
- arch="noarch"/>
-
- <component name="glite-jp-ws-interface"
- version="@org.glite.jp.ws-interface.info.version@"
- age="@org.glite.jp.ws-interface.info.age@"
- build="@org.glite.jp.ws-interface.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-common"
- version="@org.glite.jp.common.info.version@"
- age="@org.glite.jp.common.info.age@"
- build="@org.glite.jp.common.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-index"
- version="@org.glite.jp.index.info.version@"
- age="@org.glite.jp.index.info.age@"
- build="@org.glite.jp.index.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-server-common"
- version="@org.glite.jp.server-common.info.version@"
- age="@org.glite.jp.server-common.info.age@"
- build="@org.glite.jp.server-common.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-jobid"
- version="@org.glite.wms-utils.jobid.info.version@"
- age="@org.glite.wms-utils.jobid.info.age@"
- build="@org.glite.wms-utils.jobid.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-exception"
- version="@org.glite.wms-utils.exception.info.version@"
- age="@org.glite.wms-utils.exception.info.age@"
- build="@org.glite.wms-utils.exception.info.build@"
- arch="i386"/>
-
- <component name="glite-security-gsoap-plugin"
- version="@org.glite.security.gsoap-plugin.info.version@"
- age="@org.glite.security.gsoap-plugin.info.age@"
- build="@org.glite.security.gsoap-plugin.info.build@"
- arch="i386"/>
-
- <component name="glite-security-voms-api-c"
- version="@org.glite.security.voms-api-c.info.version@"
- age="@org.glite.security.voms-api-c.info.age@"
- build="@org.glite.security.voms-api-c.info.build@"
- arch="i386"/>
-
- <component name="gridsite"
- version="@org.gridsite.core.info.version@"
- age="@org.gridsite.core.info.age@"
- build="@org.gridsite.core.info.build@"
- arch="i386"/>
- </components>
- <dependencies>
- <external name="@ext.mysql-server.rpm.name@"
- version="@ext.mysql-server.version@"
- age="@ext.mysql-server.rpm.age@"
- arch="@ext.mysql-server.platform@"/>
- <external name="@ext.mysql-client.rpm.name@"
- version="@ext.mysql-client.version@"
- age="@ext.mysql-client.rpm.age@"
- arch="@ext.mysql-client.platform@"/>
- <external name="@ext.c-ares.rpm.name@"
- version="@ext.c-ares.version@"
- age="@ext.c-ares.rpm.age@"
- arch="@ext.c-ares.platform@"/>
- <external name="@ext.globus-essentials.rpm.name@"
- version="@ext.globus-essentials.rpm.version@"
- age="@ext.globus-essentials.rpm.age@"
- arch="@ext.globus-essentials.platform@"/>
- <external name="@ext.gpt.rpm.name@"
- version="@ext.gpt.rpm.version@"
- age="@ext.gpt.rpm.age@"
- arch="@ext.gpt.platform@"/>
- <external name="@ext.myproxy.rpm.name@"
- version="@ext.myproxy.version@"
- age="@ext.myproxy.rpm.age@"
- arch="@ext.myproxy.platform@"/>
- <external name="@ext.perl-expect-pm.rpm.name@"
- version="@ext.perl-expect-pm.version@"
- age="@ext.perl-expect-pm.rpm.age@"
- arch="@ext.perl-expect-pm.platform@"/>
- </dependencies>
- </service>
-
- <!-- Security Utilities -->
- <service name="glite-security-utils">
- <subservice name="glite-security-utils"/>
- </service>
- </services>
- <dependencies>
- </dependencies>
-</node>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
- <xsl:param name="installers"/>
- <xsl:param name="repository"/>
- <xsl:param name="ext-repository"/>
-
- <!-- global processing -->
- <xsl:template match="/">
-#!/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. <xsl:value-of select="/node/@version"/>
-#
-# 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
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
- # Download <xsl:value-of select="@name"/> scripts from repository
- <xsl:for-each select=".">
- <xsl:apply-templates select="subservice">
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
-
- # Download <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- # Download <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- </xsl:for-each>
-
- # 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
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
- # <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- # <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- </xsl:for-each>
-
- # 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. <xsl:value-of select="/node/@version"/>
- 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. <xsl:value-of select="/node/@version"/>
- 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
- </xsl:template>
-
- <xsl:template name="subservices" match="subservice">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>_installer.sh</xsl:variable>
- <xsl:choose>
- <xsl:when test="$install = 'true'">
-wget -N -nv <xsl:value-of select="$installers"/><xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-chmod u+x <xsl:value-of select="$package"/>
-SCRIPTLIST="$SCRIPTLIST ./<xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-SCRIPTLISTUn="$SCRIPTLISTUn ./<xsl:value-of select="$package"/> -u "
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="dependencies" match="external">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
- <xsl:variable name="package.name"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/></xsl:variable>
- <xsl:choose>
- <xsl:when test="$install = 'true'">
-wget -N -nv <xsl:value-of select="$ext-repository"/><xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-RPMLIST="$RPMLIST <xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-RPMLIST="$RPMLIST <xsl:value-of select="$package.name"/>"
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template name="components" match="component">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
- <xsl:variable name="package.name"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/></xsl:variable>
- <xsl:choose>
- <xsl:when test="$install='true'">
-wget -N -nv <xsl:value-of select="$repository"/><xsl:value-of select="@arch"/>/RPMS/<xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-RPMLIST="$RPMLIST <xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-RPMLIST="$RPMLIST <xsl:value-of select="$package.name"/>"
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
- <xsl:param name="repository"/>
- <xsl:param name="ext-repository"/>
-
- <!-- global processing -->
- <xsl:template match="/">
-#!/bin/sh
-#
-# glite-jpis_tgz_installer
-# usage: glite-jpis_tgz_installer [-u]
-# -u uninstall
-#
-# glite-jpis_tgz_installer installs the gLite <xsl:value-of select="/node/@name"/> Deployment Unit from biniary tarballs
-#
-<!-- Put here pre-install instructions -->
-PREFIX=/opt/glite
-
-###############################################################################
-# Download global dependencies
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
-
- <xsl:for-each select="node/services/service">
-###############################################################################
-# Download <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
-# Download <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
- </xsl:for-each>
-
- </xsl:template>
-
- <xsl:template name="dependencies" match="external">
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
-wget <xsl:value-of select="$ext-repository"/><xsl:value-of select="$package"/>
- </xsl:template>
-
- <xsl:template name="components" match="component">
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>_bin.tar.gz</xsl:variable>
-wget <xsl:value-of select="$repository"/>i386/tgz/<xsl:value-of select="$package"/>
-tar -xzf <xsl:value-of select="$package"/> $PREFIX
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP Index Server Node Deployment Unit
-
- Author: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2005/07/08 13:18:40 dimeglio
- Merged from branch 1.2.2
-
- Revision 1.1 2004/10/06 09:19:24 dimeglio
- First version of this file
-
--->
-
-<project name="gLite JP Index Server Deployment Unit common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${deployment.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${deployment.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="jpis" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <property name="build.package.summary" value="gLite Job Provenance Index Server node configuration files" />
- <property name="build.package.description" value="gLite Job Provenance Index Server node configuration files" />
- <property name="build.package.files" value="
-%attr(755,root,root) %{prefix}/etc/config/scripts/glite-jpis-config.py\n
-%attr(644,root,root) %{prefix}/etc/config/templates/glite-jpis.cfg.xml\n"
- />
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
-
- <!-- global processing -->
- <xsl:template match="/">
-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. <xsl:value-of select="/node/@version"/>
-#
-
-## CAs
-
-include pro_software_glite_CA;
-
-
-
-# Global dependencies
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
-# <xsl:value-of select="@name"/> dependencies
- <xsl:for-each select="dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-
-# <xsl:value-of select="@name"/> RPMS
- <xsl:for-each select="components">
- <xsl:apply-templates/>
- </xsl:for-each>
-
- <xsl:for-each select="subservice">
-include pro_software_<xsl:value-of select="translate(@name, '-', '_')"/>;
- </xsl:for-each>
-
-
- </xsl:for-each>
- </xsl:template>
-
- <xsl:template name="dependencies" match="external">
-"/software/packages"=pkg_repl("<xsl:value-of select="@name"/>","<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>","<xsl:value-of select="@arch"/>");
- </xsl:template>
-
- <xsl:template name="components" match="component">
-"/software/packages"=pkg_repl("<xsl:value-of select="@name"/>","<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>","<xsl:value-of select="@arch"/>");
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-
-module.version = 2.2.0
-module.age = 2
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the gLite JP Server Deployment Unit
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
-
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
-
--->
-
-<project name="deployment-lb" default="dist">
-
- <!-- =========================================
- Builds the gLite JP Deployment Unit
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load configure options
- ========================================= -->
- <property file="${global.configure.options.file}"/>
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-external-dependencies.file}"/>
- <import file="${global.targets-deploy.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- </target>
-
- <target name="localcompile"
- description="Module specific compilation tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#!/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())
-
+++ /dev/null
-<!-- Parameters for configuring the org.glite.data.io-daemon service -->
-<config>
- <parameters>
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- User-defined parameters - Please change them -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
- <!-- gLite services user accounts -->
- <glite.user.name
- description="Name of the user account used to run the gLite services
- on this JP node"
- value="changeme"/>
-
- <glite.user.group
- description="Group of the user specified in the 'glite.user.name'
- parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
- value="changeme"/>
-
- <mysql.root.password
- description="The mysql root password"
- value="changeme"/>
-
- <!-- JP primary server configuration -->
- <jpps.peers
- description="file with list (one per line) of X509 certificate subjects of 'trusted peers', i.e. LB servers which may upload data to this JPPS"
- value="changeme"/>
-
- <jpps.internal
- description="directory where the JPPS files are stored (local path)"
- value="changeme"/>
-
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- Advanced parameters - Change them if you know what you're doing -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
- <!-- Installer configuration -->
- <glite.installer.verbose
- description="Enable verbose output"
- value="true"/>
-
- <glite.installer.checkcerts
- description="Enable check of host certificates"
- value="true"/>
-
- <!-- mysql configuration -->
- <set.mysql.root.password
- description="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"
- value="false"/>
-
- <!-- JP primary server configuration -->
- <jpps.debug
- description="enables to pass various debug options to JP PS
- (e.g. -l path_to_log_file; -s XX number of forked slaves;....)"
- value=""/>
-
- <jpps.port
- description="default JP PS port"
- value="8901"/>
-
- <jpps.ftp.port
- description="default port for the ftp JPPS interface (bulk file transfers)
- WARNING: changing this value will cause that files previously uploaded
- to PS will be unaccessable!"
- value="8950"/>
-
-
- <jpps.database.username
- description="JP PS database user
- default: jpps"
- value="jpps"/>
-
- <jpps.database.name
- description="JP PS database name
- default: jpps"
- value="jpps"/>
-
- <jpps.pid.file
- description="non-default JP PS pidfile ($GLITE_LOCATION_VAR/glite-jp-primarystoraged.pid)"
- value=""/>
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- System parameters - You should leave these alone -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
-
- </parameters>
-
-</config>
+++ /dev/null
-#Wed Apr 13 09:36:57 CEST 2005
-module.build=232
+++ /dev/null
-<?xml version ="1.0" encoding="UTF-8"?>
-<!--
- 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
--->
-
-<node name="glite-jpps-node" version="@module.version@">
- <services>
- <service name="glite-jpps-service">
- <components>
- <component name="glite-config"
- version="@org.glite.deployment.config.info.version@"
- age="@org.glite.deployment.config.info.age@"
- build="@org.glite.deployment.config.info.build@"
- arch="noarch"/>
-
- <component name="glite-jpps-config"
- version="@module.version@"
- age="@module.age@"
- build="@module.build@"
- arch="noarch"/>
-
- <component name="glite-jp-ws-interface"
- version="@org.glite.jp.ws-interface.info.version@"
- age="@org.glite.jp.ws-interface.info.age@"
- build="@org.glite.jp.ws-interface.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-common"
- version="@org.glite.jp.common.info.version@"
- age="@org.glite.jp.common.info.age@"
- build="@org.glite.jp.common.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-primary"
- version="@org.glite.jp.primary.info.version@"
- age="@org.glite.jp.primary.info.age@"
- build="@org.glite.jp.primary.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-server-common"
- version="@org.glite.jp.server-common.info.version@"
- age="@org.glite.jp.server-common.info.age@"
- build="@org.glite.jp.server-common.info.build@"
- arch="i386"/>
-
- <component name="glite-lb-server"
- version="@org.glite.lb.server.info.version@"
- age="@org.glite.lb.server.info.age@"
- build="@org.glite.lb.server.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-jobid"
- version="@org.glite.wms-utils.jobid.info.version@"
- age="@org.glite.wms-utils.jobid.info.age@"
- build="@org.glite.wms-utils.jobid.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-exception"
- version="@org.glite.wms-utils.exception.info.version@"
- age="@org.glite.wms-utils.exception.info.age@"
- build="@org.glite.wms-utils.exception.info.build@"
- arch="i386"/>
-
- <component name="glite-security-gsoap-plugin"
- version="@org.glite.security.gsoap-plugin.info.version@"
- age="@org.glite.security.gsoap-plugin.info.age@"
- build="@org.glite.security.gsoap-plugin.info.build@"
- arch="i386"/>
-
- <component name="glite-security-voms-api-c"
- version="@org.glite.security.voms-api-c.info.version@"
- age="@org.glite.security.voms-api-c.info.age@"
- build="@org.glite.security.voms-api-c.info.build@"
- arch="i386"/>
-
- <component name="gridsite"
- version="@org.gridsite.core.info.version@"
- age="@org.gridsite.core.info.age@"
- build="@org.gridsite.core.info.build@"
- arch="i386"/>
- </components>
- <dependencies>
- <external name="@ext.mysql-server.rpm.name@"
- version="@ext.mysql-server.version@"
- age="@ext.mysql-server.rpm.age@"
- arch="@ext.mysql-server.platform@"/>
- <external name="@ext.mysql-client.rpm.name@"
- version="@ext.mysql-client.version@"
- age="@ext.mysql-client.rpm.age@"
- arch="@ext.mysql-client.platform@"/>
- <external name="@ext.c-ares.rpm.name@"
- version="@ext.c-ares.version@"
- age="@ext.c-ares.rpm.age@"
- arch="@ext.c-ares.platform@"/>
- <external name="@ext.globus-essentials.rpm.name@"
- version="@ext.globus-essentials.rpm.version@"
- age="@ext.globus-essentials.rpm.age@"
- arch="@ext.globus-essentials.platform@"/>
- <external name="@ext.globus-data-server.rpm.name@"
- version="@ext.globus-data-server.rpm.version@"
- age="@ext.globus-data-server.rpm.age@"
- arch="@ext.globus-data-server.platform@"/>
- <external name="@ext.gpt.rpm.name@"
- version="@ext.gpt.rpm.version@"
- age="@ext.gpt.rpm.age@"
- arch="@ext.gpt.platform@"/>
- <external name="@ext.myproxy.rpm.name@"
- version="@ext.myproxy.version@"
- age="@ext.myproxy.rpm.age@"
- arch="@ext.myproxy.platform@"/>
- <external name="@ext.perl-expect-pm.rpm.name@"
- version="@ext.perl-expect-pm.version@"
- age="@ext.perl-expect-pm.rpm.age@"
- arch="@ext.perl-expect-pm.platform@"/>
- </dependencies>
- </service>
-
- <!-- Security Utilities -->
- <service name="glite-security-utils">
- <subservice name="glite-security-utils"/>
- </service>
- </services>
- <dependencies>
- </dependencies>
-</node>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
- <xsl:param name="installers"/>
- <xsl:param name="repository"/>
- <xsl:param name="ext-repository"/>
-
- <!-- global processing -->
- <xsl:template match="/">
-#!/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. <xsl:value-of select="/node/@version"/>
-#
-# 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
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
- # Download <xsl:value-of select="@name"/> scripts from repository
- <xsl:for-each select=".">
- <xsl:apply-templates select="subservice">
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
-
- # Download <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- # Download <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- </xsl:for-each>
-
- # 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
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
- # <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- # <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- </xsl:for-each>
-
- # 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. <xsl:value-of select="/node/@version"/>
- 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. <xsl:value-of select="/node/@version"/>
- 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
- </xsl:template>
-
- <xsl:template name="subservices" match="subservice">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>_installer.sh</xsl:variable>
- <xsl:choose>
- <xsl:when test="$install = 'true'">
-wget -N -nv <xsl:value-of select="$installers"/><xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-chmod u+x <xsl:value-of select="$package"/>
-SCRIPTLIST="$SCRIPTLIST ./<xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-SCRIPTLISTUn="$SCRIPTLISTUn ./<xsl:value-of select="$package"/> -u "
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="dependencies" match="external">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
- <xsl:variable name="package.name"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/></xsl:variable>
- <xsl:choose>
- <xsl:when test="$install = 'true'">
-wget -N -nv <xsl:value-of select="$ext-repository"/><xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-RPMLIST="$RPMLIST <xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-RPMLIST="$RPMLIST <xsl:value-of select="$package.name"/>"
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template name="components" match="component">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
- <xsl:variable name="package.name"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/></xsl:variable>
- <xsl:choose>
- <xsl:when test="$install='true'">
-wget -N -nv <xsl:value-of select="$repository"/><xsl:value-of select="@arch"/>/RPMS/<xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-RPMLIST="$RPMLIST <xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-RPMLIST="$RPMLIST <xsl:value-of select="$package.name"/>"
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
- <xsl:param name="repository"/>
- <xsl:param name="ext-repository"/>
-
- <!-- global processing -->
- <xsl:template match="/">
-#!/bin/sh
-#
-# glite-jpps_tgz_installer
-# usage: glite-jpps_tgz_installer [-u]
-# -u uninstall
-#
-# glite-jpps_tgz_installer installs the gLite <xsl:value-of select="/node/@name"/> Deployment Unit from biniary tarballs
-#
-<!-- Put here pre-install instructions -->
-PREFIX=/opt/glite
-
-###############################################################################
-# Download global dependencies
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
-
- <xsl:for-each select="node/services/service">
-###############################################################################
-# Download <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
-# Download <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
- </xsl:for-each>
-
- </xsl:template>
-
- <xsl:template name="dependencies" match="external">
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
-wget <xsl:value-of select="$ext-repository"/><xsl:value-of select="$package"/>
- </xsl:template>
-
- <xsl:template name="components" match="component">
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>_bin.tar.gz</xsl:variable>
-wget <xsl:value-of select="$repository"/>i386/tgz/<xsl:value-of select="$package"/>
-tar -xzf <xsl:value-of select="$package"/> $PREFIX
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP Primary Storage Node Deployment Unit
-
- Author: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2005/07/08 13:18:40 dimeglio
- Merged from branch 1.2.2
-
- Revision 1.1 2004/10/06 09:19:24 dimeglio
- First version of this file
-
--->
-
-<project name="gLite JP Primary Storage Deployment Unit common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${deployment.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${deployment.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="jpps" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <property name="build.package.summary" value="gLite Job Provenance Primary Storage node configuration files" />
- <property name="build.package.description" value="gLite Job Provenance Primary Storage node configuration files" />
- <property name="build.package.files" value="
-%attr(755,root,root) %{prefix}/etc/config/scripts/glite-jpps-config.py\n
-%attr(644,root,root) %{prefix}/etc/config/templates/glite-jpps.cfg.xml\n"
- />
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
-
- <!-- global processing -->
- <xsl:template match="/">
-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. <xsl:value-of select="/node/@version"/>
-#
-
-## CAs
-
-include pro_software_glite_CA;
-
-
-
-# Global dependencies
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
-# <xsl:value-of select="@name"/> dependencies
- <xsl:for-each select="dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-
-# <xsl:value-of select="@name"/> RPMS
- <xsl:for-each select="components">
- <xsl:apply-templates/>
- </xsl:for-each>
-
- <xsl:for-each select="subservice">
-include pro_software_<xsl:value-of select="translate(@name, '-', '_')"/>;
- </xsl:for-each>
-
-
- </xsl:for-each>
- </xsl:template>
-
- <xsl:template name="dependencies" match="external">
-"/software/packages"=pkg_repl("<xsl:value-of select="@name"/>","<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>","<xsl:value-of select="@arch"/>");
- </xsl:template>
-
- <xsl:template name="components" match="component">
-"/software/packages"=pkg_repl("<xsl:value-of select="@name"/>","<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>","<xsl:value-of select="@arch"/>");
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-
-module.version = 2.2.0
-module.age = 2
-
+++ /dev/null
-DATE: 13-03-2006 16:20\r
-[flammer] Increased version to 2.3.0 after branching.\r
-\r
-DATE: 13-03-2006 16:15\r
-[flammer] Merge of HEAD with branch 2.1.0\r
-[flammer] Increased version to 2.2.0\r
-\r
-DATE: 04-12-2005 21:15\r
-[dimeglio] Added configuration parameter for setting mysql max_allowed_packet\r
-\r
-DATE: 23-11-2005 23:50\r
-[dimeglio] Use ConfigParams class\r
-[dimeglio] Removed servietool instabce config params, put instance creation in script\r
-\r
-DATE: 08-07-2005 15:20\r
-[dimeglio] Merged from branch 1.2.2\r
-\r
-DATE: 25-05-2005 20:00\r
-[dimeglio] Merged from branch 1.2.2\r
-\r
-DATE: 21-03-2005 17:21\r
-[dimeglio] Implemented status method\r
-\r
-DATE: 21-03-2005 00:32\r
-[dimeglio] Added PERL5LIB env var\r
-\r
-DATE: 17-03-2005 17:33\r
-[gdiez] Stopping and starting the database before the index creation (just after the database is created and the user granted)\r
-\r
-DATE: 09-03-2005 23:05\r
-[dimeglio] Moved creation of indices inside database creation (if database\r
- exists indices are not recreated)\r
-\r
-DATE: 02-03-2005 11:05\r
-[dimeglio] Started CHANGELOG\r
-[dimeglio] Fixed formatting, improved display of message using glib.printXxxMessage functions\r
-[dimeglio] Fixed some problems when starting/stopping services\r
-[dimeglio] GLITE_USER parameter not exposed anymore in config file, use same user parameters\r
- as WMS to allow installation on same node\r
-[dimeglio] Increased module version number to 1.2.0
\ No newline at end of file
+++ /dev/null
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 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
-
- Build file for the gLite LB Server Deployment Unit
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
-
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.5 2004/10/17 22:34:39 dimeglio
- Use new installer script format
- Use global filters
- Use RH standard expat rpm in sdf template
-
- Revision 1.4 2004/10/14 16:07:53 dimeglio
- Removed wms.thirdparty-globus-ssl-utils
-
- Revision 1.3 2004/10/14 11:50:22 dimeglio
- Fixed some name and formatting issues
-
- Revision 1.2 2004/10/06 11:42:02 harakaly
- first fill-up
-
- Revision 1.1 2004/10/06 09:19:24 dimeglio
- First version of this file
-
--->
-
-<project name="deployment-lb" default="dist">
-
- <!-- =========================================
- Builds the gLite LB Server Deployment Unit
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load configure options
- ========================================= -->
- <property file="${global.configure.options.file}"/>
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-external-dependencies.file}"/>
- <import file="${global.targets-deploy.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- </target>
-
- <target name="localcompile"
- description="Module specific compilation tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#!/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 <Diana.Bosio@cern.ch>
-# Leanne Guy <leanne.guy@cern.ch>
-#
-# 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())
-
+++ /dev/null
-<!-- Parameters for configuring the LB Server service -->
-<config>
- <parameters>
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- User-defined parameters - Please change them -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
- <!-- gLite services user accounts -->
- <glite.user.name
- description="Name of the user account used to run the gLite services
- on this LB node"
- value="changeme"/>
-
- <glite.user.group
- description="Group of the user specified in the 'glite.user.name'
- parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
- value="changeme"/>
-
- <mysql.root.password
- description="The mysql root password"
- value="changeme"/>
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- Advanced parameters - Change them if you know what you're doing -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
- <!-- Installer configuration -->
- <glite.installer.verbose
- description="Enable verbose output"
- value="true"/>
-
- <glite.installer.checkcerts
- description="Enable check of host certificates"
- value="true"/>
-
- <rgma.servicetool.activate
- description="Turn on/off servicetool for the node.
- [Example: true ] [Type: 'boolean']"
- value="true"/>
-
- <!-- mysql configuration -->
- <set.mysql.root.password
- description="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]"
- value="false"/>
-
- <mysql.max_allowed_packet
- description="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
- It must be a number followed by a unit symbol, like M for megabytes or G for gigabytes.
- [Example: 17M][Type: Integer][Unit: MB]"
- value="17M"/>
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- System parameters - You should leave these alone -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
- <lb.index.list
- description="Definitions of indices on all the currently supported indexed system attributes">
-
- <value>owner</value>
- <value>location</value>
- <value>destination</value>
-
- </lb.index.list>
-
- </parameters>
-
-</config>
+++ /dev/null
-<html>
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=Generator content="Microsoft Word 11 (filtered)">
-<title>gLite LB Server Release Notes</title>
-<style>
-<!--
- /* Font Definitions */
- @font-face
- {font-family:Helvetica;
- panose-1:2 11 6 4 2 2 2 2 2 4;}
-@font-face
- {font-family:Wingdings;
- panose-1:5 0 0 0 0 0 0 0 0 0;}
-@font-face
- {font-family:Tahoma;
- panose-1:2 11 6 4 3 5 4 4 2 4;}
-@font-face
- {font-family:Times;
- panose-1:2 2 6 3 5 4 5 2 3 4;}
-@font-face
- {font-family:ZWAdobeF;
- panose-1:0 0 0 0 0 0 0 0 0 0;}
-@font-face
- {font-family:"Univers \(W1\)";}
- /* Style Definitions */
- p.MsoNormal, li.MsoNormal, div.MsoNormal
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-h1
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:21.6pt;
- text-align:justify;
- text-indent:-21.6pt;
- font-size:12.0pt;
- font-family:Arial;
- text-transform:uppercase;
- layout-grid-mode:line;
- font-weight:bold;}
-h2
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:28.8pt;
- text-align:justify;
- text-indent:-28.8pt;
- font-size:11.0pt;
- font-family:Arial;
- text-transform:uppercase;
- font-weight:bold;}
-h3
- {margin-top:10.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:36.0pt;
- text-align:justify;
- text-indent:-36.0pt;
- font-size:11.0pt;
- font-family:Arial;
- font-weight:bold;}
-h4
- {margin-top:10.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:43.2pt;
- text-align:justify;
- text-indent:-43.2pt;
- page-break-after:avoid;
- font-size:11.0pt;
- font-family:Arial;
- font-weight:bold;
- font-style:italic;}
-h5
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:50.4pt;
- text-align:justify;
- text-indent:-50.4pt;
- font-size:11.0pt;
- font-family:"Times New Roman";
- font-weight:normal;}
-h6
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:57.6pt;
- text-align:justify;
- text-indent:-57.6pt;
- font-size:11.0pt;
- font-family:"Times New Roman";
- font-weight:normal;
- font-style:italic;}
-p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:64.8pt;
- text-align:justify;
- text-indent:-64.8pt;
- font-size:11.0pt;
- font-family:Arial;}
-p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:72.0pt;
- text-align:justify;
- text-indent:-72.0pt;
- font-size:11.0pt;
- font-family:Arial;
- font-style:italic;}
-p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:79.2pt;
- text-align:justify;
- text-indent:-79.2pt;
- font-size:9.0pt;
- font-family:Arial;
- font-weight:bold;
- font-style:italic;}
-p.MsoIndex1, li.MsoIndex1, div.MsoIndex1
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:12.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:12.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:22.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:33.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:44.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:55.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:66.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:77.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:88.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:99.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoToc1, li.MsoToc1, div.MsoToc1
- {margin-top:6.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Times New Roman";
- text-transform:uppercase;
- font-weight:bold;}
-p.MsoToc2, li.MsoToc2, div.MsoToc2
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:11.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Times New Roman";
- font-variant:small-caps;}
-p.MsoToc3, li.MsoToc3, div.MsoToc3
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:22.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Times New Roman";
- font-style:italic;}
-p.MsoToc4, li.MsoToc4, div.MsoToc4
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:33.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:9.0pt;
- font-family:"Times New Roman";}
-p.MsoToc5, li.MsoToc5, div.MsoToc5
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:44.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:9.0pt;
- font-family:"Times New Roman";}
-p.MsoToc6, li.MsoToc6, div.MsoToc6
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:55.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:9.0pt;
- font-family:"Times New Roman";}
-p.MsoToc7, li.MsoToc7, div.MsoToc7
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:66.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:9.0pt;
- font-family:"Times New Roman";}
-p.MsoToc8, li.MsoToc8, div.MsoToc8
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:77.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:9.0pt;
- font-family:"Times New Roman";}
-p.MsoToc9, li.MsoToc9, div.MsoToc9
- {margin-top:0mm;
- margin-right:0mm;
- margin-bottom:0mm;
- margin-left:88.0pt;
- margin-bottom:.0001pt;
- text-align:justify;
- font-size:9.0pt;
- font-family:"Times New Roman";}
-p.MsoNormalIndent, li.MsoNormalIndent, div.MsoNormalIndent
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:12.0pt;
- margin-left:35.4pt;
- text-align:justify;
- text-indent:-7.0pt;
- font-size:12.0pt;
- font-family:Times;}
-p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:8.0pt;
- font-family:"Times New Roman";}
-p.MsoHeader, li.MsoHeader, div.MsoHeader
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoFooter, li.MsoFooter, div.MsoFooter
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:Arial;
- font-weight:bold;}
-p.MsoCaption, li.MsoCaption, div.MsoCaption
- {margin-top:6.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";
- font-weight:bold;}
-p.MsoTof, li.MsoTof, div.MsoTof
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoEnvelopeAddress, li.MsoEnvelopeAddress, div.MsoEnvelopeAddress
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:144.0pt;
- text-align:justify;
- font-size:12.0pt;
- font-family:Arial;}
-p.MsoEnvelopeReturn, li.MsoEnvelopeReturn, div.MsoEnvelopeReturn
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:10.0pt;
- font-family:Arial;}
-span.MsoFootnoteReference
- {vertical-align:super;}
-p.MsoEndnoteText, li.MsoEndnoteText, div.MsoEndnoteText
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Times New Roman";}
-p.MsoToa, li.MsoToa, div.MsoToa
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:11.0pt;
- text-align:justify;
- text-indent:-11.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoMacroText, li.MsoMacroText, div.MsoMacroText
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Courier New";}
-p.MsoToaHeading, li.MsoToaHeading, div.MsoToaHeading
- {margin-top:6.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:12.0pt;
- font-family:Arial;
- font-weight:bold;}
-p.MsoList, li.MsoList, div.MsoList
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:18.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListBullet, li.MsoListBullet, div.MsoListBullet
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:18.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListNumber, li.MsoListNumber, div.MsoListNumber
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:18.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoList2, li.MsoList2, div.MsoList2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:36.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoList3, li.MsoList3, div.MsoList3
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:54.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoList4, li.MsoList4, div.MsoList4
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:72.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoList5, li.MsoList5, div.MsoList5
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:90.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListBullet2, li.MsoListBullet2, div.MsoListBullet2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:36.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListBullet3, li.MsoListBullet3, div.MsoListBullet3
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:54.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListBullet4, li.MsoListBullet4, div.MsoListBullet4
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:72.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListBullet5, li.MsoListBullet5, div.MsoListBullet5
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:90.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListNumber2, li.MsoListNumber2, div.MsoListNumber2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:36.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListNumber3, li.MsoListNumber3, div.MsoListNumber3
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:54.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListNumber4, li.MsoListNumber4, div.MsoListNumber4
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:72.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListNumber5, li.MsoListNumber5, div.MsoListNumber5
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:90.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoTitle, li.MsoTitle, div.MsoTitle
- {margin-top:12.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:0mm;
- text-align:center;
- font-size:16.0pt;
- font-family:Arial;
- font-weight:bold;}
-p.MsoClosing, li.MsoClosing, div.MsoClosing
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:216.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoSignature, li.MsoSignature, div.MsoSignature
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:216.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoBodyText, li.MsoBodyText, div.MsoBodyText
- {margin-top:3.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoBodyTextIndent, li.MsoBodyTextIndent, div.MsoBodyTextIndent
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:18.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListContinue, li.MsoListContinue, div.MsoListContinue
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:18.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListContinue2, li.MsoListContinue2, div.MsoListContinue2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:36.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListContinue3, li.MsoListContinue3, div.MsoListContinue3
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:54.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListContinue4, li.MsoListContinue4, div.MsoListContinue4
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:72.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoListContinue5, li.MsoListContinue5, div.MsoListContinue5
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:90.0pt;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoMessageHeader, li.MsoMessageHeader, div.MsoMessageHeader
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:54.0pt;
- text-align:justify;
- text-indent:-54.0pt;
- background:#CCCCCC;
- border:none;
- padding:0mm;
- font-size:12.0pt;
- font-family:Arial;}
-p.MsoSubtitle, li.MsoSubtitle, div.MsoSubtitle
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:0mm;
- text-align:center;
- font-size:12.0pt;
- font-family:Arial;}
-p.MsoSalutation, li.MsoSalutation, div.MsoSalutation
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoDate, li.MsoDate, div.MsoDate
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoBodyTextFirstIndent, li.MsoBodyTextFirstIndent, div.MsoBodyTextFirstIndent
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:0mm;
- text-align:justify;
- text-indent:10.5pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoBodyTextFirstIndent2, li.MsoBodyTextFirstIndent2, div.MsoBodyTextFirstIndent2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:18.0pt;
- text-align:justify;
- text-indent:10.5pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoNoteHeading, li.MsoNoteHeading, div.MsoNoteHeading
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoBodyText2, li.MsoBodyText2, div.MsoBodyText2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:0mm;
- text-align:justify;
- line-height:200%;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoBodyText3, li.MsoBodyText3, div.MsoBodyText3
- {margin-top:2.5pt;
- margin-right:0mm;
- margin-bottom:2.5pt;
- margin-left:0mm;
- text-align:justify;
- page-break-after:avoid;
- font-size:10.0pt;
- font-family:Arial;}
-p.MsoBodyTextIndent2, li.MsoBodyTextIndent2, div.MsoBodyTextIndent2
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:18.0pt;
- text-align:justify;
- line-height:200%;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.MsoBodyTextIndent3, li.MsoBodyTextIndent3, div.MsoBodyTextIndent3
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:18.0pt;
- text-align:justify;
- font-size:8.0pt;
- font-family:"Times New Roman";}
-p.MsoBlockText, li.MsoBlockText, div.MsoBlockText
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- text-indent:17.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-a:link, span.MsoHyperlink
- {color:blue;
- text-decoration:underline;}
-a:visited, span.MsoHyperlinkFollowed
- {color:purple;
- text-decoration:underline;}
-p.MsoDocumentMap, li.MsoDocumentMap, div.MsoDocumentMap
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- background:navy;
- font-size:11.0pt;
- font-family:Tahoma;}
-p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Courier New";}
-p.MsoAutoSig, li.MsoAutoSig, div.MsoAutoSig
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p
- {margin-top:5.0pt;
- margin-right:0mm;
- margin-bottom:5.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:12.0pt;
- font-family:"Times New Roman";}
-address
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:"Times New Roman";
- font-style:italic;}
-pre
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Courier New";}
-tt
- {font-family:"Courier New";}
-p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:10.0pt;
- font-family:"Times New Roman";
- font-weight:bold;}
-p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:8.0pt;
- font-family:Tahoma;}
-p.3eretraitnormal, li.3eretraitnormal, div.3eretraitnormal
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:102.9pt;
- text-align:justify;
- text-indent:-17.85pt;
- font-size:12.0pt;
- font-family:"Times New Roman";}
-p.2eretraitjustifi, li.2eretraitjustifi, div.2eretraitjustifi
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:40.0mm;
- text-align:justify;
- text-indent:-7.1pt;
- line-height:12.0pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.2eretraitnormal, li.2eretraitnormal, div.2eretraitnormal
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:3.0pt;
- margin-left:18.0pt;
- text-align:justify;
- text-indent:-18.0pt;
- font-size:12.0pt;
- font-family:"Times New Roman";}
-p.1erretraitnormal, li.1erretraitnormal, div.1erretraitnormal
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:12.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:12.0pt;
- font-family:"Times New Roman";}
-p.titrebloc, li.titrebloc, div.titrebloc
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:Arial;
- font-weight:bold;}
-p.TitreTable, li.TitreTable, div.TitreTable
- {margin-top:6.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:center;
- font-size:12.0pt;
- font-family:Arial;
- font-weight:bold;}
-p.form, li.form, div.form
- {margin-top:6.0pt;
- margin-right:7.05pt;
- margin-bottom:0mm;
- margin-left:0mm;
- margin-bottom:.0001pt;
- text-align:justify;
- background:black;
- border:none;
- padding:0mm;
- font-size:14.0pt;
- font-family:"Univers \(W1\)";
- color:white;
- text-transform:uppercase;
- font-weight:bold;}
-p.HB, li.HB, div.HB
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:12.0pt;
- margin-left:0mm;
- text-align:justify;
- page-break-after:avoid;
- font-size:12.0pt;
- font-family:"Times New Roman";
- color:black;
- font-weight:bold;}
-p.reference, li.reference, div.reference
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:justify;
- page-break-after:avoid;
- font-size:9.0pt;
- font-family:Arial;}
-p.1erretraitjustifi, li.1erretraitjustifi, div.1erretraitjustifi
- {margin-top:6.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:14.2pt;
- text-align:justify;
- text-indent:-14.2pt;
- font-size:11.0pt;
- font-family:"Times New Roman";}
-p.ZonetatEnTte, li.ZonetatEnTte, div.ZonetatEnTte
- {margin-top:2.0pt;
- margin-right:2.85pt;
- margin-bottom:2.0pt;
- margin-left:2.85pt;
- text-align:center;
- page-break-after:avoid;
- font-size:36.0pt;
- font-family:Arial;
- text-transform:uppercase;
- font-weight:bold;}
-p.DocTitle, li.DocTitle, div.DocTitle
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:center;
- font-size:22.0pt;
- font-family:Arial;
- font-variant:small-caps;
- color:gray;
- letter-spacing:4.0pt;
- font-weight:bold;}
-p.DocDate, li.DocDate, div.DocDate
- {margin-top:6.0pt;
- margin-right:0mm;
- margin-bottom:6.0pt;
- margin-left:0mm;
- text-align:justify;
- font-size:11.0pt;
- font-family:Arial;
- layout-grid-mode:line;
- font-weight:bold;}
-p.DocSubTitle, li.DocSubTitle, div.DocSubTitle
- {margin-top:2.0pt;
- margin-right:0mm;
- margin-bottom:2.0pt;
- margin-left:0mm;
- text-align:center;
- line-height:12.0pt;
- font-size:12.0pt;
- font-family:Arial;
- font-variant:small-caps;
- color:gray;
- letter-spacing:4.0pt;
- font-weight:bold;}
- /* Page Definitions */
- @page Section1
- {size:595.3pt 841.9pt;
- margin:70.85pt 70.85pt 70.85pt 70.85pt;}
-div.Section1
- {page:Section1;}
- /* List Definitions */
- ol
- {margin-bottom:0mm;}
-ul
- {margin-bottom:0mm;}
--->
-</style>
-
-</head>
-
-<body lang=EN-GB link=blue vlink=purple>
-
-<div class=Section1>
-
-<p class=DocTitle><span lang=FR style='font-variant:normal !important;
-text-transform:uppercase'>gLite Logging & Bookkeeping Server</span></p>
-
-<h1><span lang=FR>1. </span><span lang=FR>Release Description</span></h1>
-
-<p class=MsoNormal>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. </p>
-
-<h1 style='margin-left:0mm;text-indent:0mm'><span lang=FR>2. </span><span
-lang=FR>Changes in this release</span></h1>
-
-<h2><span lang=FR>2.1. </span><span lang=FR>Changes in functionality</span></h2>
-
-<p class=MsoNormal><span lang=EN-US>There are no functional changes in this
-release.</span></p>
-
-<h2>2.2. Changes in Configuration</h2>
-
-<p class=MsoNormal><span lang=EN-US>The following new parameters have been
-added to the glite-lb.cfg.xml file:</span></p>
-
-<p class=MsoNormal><span lang=EN-US> </span></p>
-
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
- style='border-collapse:collapse;border:none'>
- <tr>
- <td width=185 valign=top style='width:138.8pt;border:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span lang=EN-US>Parameter name</span></b></p>
- </td>
- <td width=101 valign=top style='width:75.9pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span lang=EN-US>Default value</span></b></p>
- </td>
- <td width=333 valign=top style='width:249.7pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span lang=EN-US>Description</span></b></p>
- </td>
- </tr>
- <tr>
- <td width=185 valign=top style='width:138.8pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>rgma.servicetool.activate</span></p>
- </td>
- <td width=101 valign=top style='width:75.9pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>true</span></p>
- </td>
- <td width=333 valign=top style='width:249.7pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>Turn on/off servicetool for the node.</span></p>
- <p class=MsoNormal><span lang=EN-US>[Example: true ] [Type: 'boolean']</span></p>
- </td>
- </tr>
- <tr>
- <td width=185 valign=top style='width:138.8pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>set.mysql.root.password</span></p>
- </td>
- <td width=101 valign=top style='width:75.9pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>false</span></p>
- </td>
- <td width=333 valign=top style='width:249.7pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>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.</span></p>
- <p class=MsoNormal><span lang=EN-US>[Example: false][Type: boolean]</span></p>
- </td>
- </tr>
- <tr>
- <td width=185 valign=top style='width:138.8pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>mysql.max_allowed_packet</span></p>
- </td>
- <td width=101 valign=top style='width:75.9pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>17</span></p>
- </td>
- <td width=333 valign=top style='width:249.7pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US>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.</span></p>
- <p class=MsoNormal><span lang=EN-US>[Example: 17][Type: Integer][Unit: MB]</span></p>
- </td>
- </tr>
-</table>
-
-<p class=MsoNormal><span lang=EN-US> </span></p>
-
-<p class=MsoNormal><span lang=EN-US>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.</span></p>
-
-<p class=MsoNormal><span lang=EN-US> </span></p>
-
-<h1>3. Release contents</h1>
-
-<h2><a name="_Ref114562685">3.1. Glite sub-deployment modules</a></h2>
-
-<p class=MsoNormal>The gLite Logging and Bookkeeping module requires the
-following sub-modules:</p>
-
-<p class=MsoNormal> </p>
-
-<p class=MsoNormal style='margin-left:36.0pt;text-indent:-18.0pt'>-<span
-style='font:7.0pt "Times New Roman"'>
-</span>gLite Security Utilities</p>
-
-<p class=MsoNormal style='margin-left:36.0pt;text-indent:-18.0pt'>-<span
-style='font:7.0pt "Times New Roman"'>
-</span>gLite R-GMA Servicetool</p>
-
-<p class=MsoNormal> </p>
-
-<p class=MsoNormal>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.</p>
-
-<h2>3.2. Glite RPMS</h2>
-
-<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 2.1.1 is
-composed of the following gLite components:</p>
-
-<p class=MsoNormal> </p>
-
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width="100%"
- style='width:100.36%;border-collapse:collapse;border:none'>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Component name</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Description</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Version</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>File</span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-config</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>gLite configuration scripts</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.6.22</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-config-1.6.22-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-config-1.6.22-1.noarch.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-jp-common</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.1.0</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-common-1.1.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-common-1.1.0-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-jp-primary</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.1.1</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-primary-1.1.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-primary-1.1.1-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-jp-server-common</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.0.0</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-server-common-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-server-common-1.0.0-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-jp-ws-interface</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.1.0</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-ws-interface-1.1.0-0.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-jp-ws-interface-1.1.0-0.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-lb-client-interface</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>L&B client library header files</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>2.1.0</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-client-interface-2.1.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-client-interface-2.1.0-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-lb-config</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>gLite LB Configuration files</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>2.1.1</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-config-2.1.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-config-2.1.1-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-lb-common</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>L&B common subroutines library</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>3.0.1</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-common-3.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-common-3.0.1-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-lb-logger</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>L&B local logger</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.2.1</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-logger-1.2.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-logger-1.2.1-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-lb-server</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>L&B bookkeeping server</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.3.3</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-server-1.3.3-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-server-1.3.3-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-lb-server-bones</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>L&B server bones</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>2.1.1</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-server-bones-2.1.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-server-bones-2.1.1-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-lb-ws-interface</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>2.1.0</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-ws-interface-2.1.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-lb-ws-interface-2.1.0-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-rgma-servicetool-config</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>gLite R-GMA servicetool installation</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>5.2.2</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-rgma-servicetool-config-5.2.2-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-rgma-servicetool-config-5.2.2-1.noarch.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-security-gsoap-plugin</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>gSOAP plugin and gss libraries</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.2.1</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-security-gsoap-plugin-1.2.1-0.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-security-gsoap-plugin-1.2.1-0.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-security-utils-config</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>gLite Security Utilities configuration files</span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.2.1</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-security-utils-config-1.2.1-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/noarch/RPMS/glite-security-utils-config-1.2.1-1.noarch.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-security-voms-api-c</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.6.10</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="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">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</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-wms-utils-exception</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.0.3</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.3-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.3-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width="20%" valign=top style='width:20.92%;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>glite-wms-utils-jobid</span></p>
- </td>
- <td width="22%" valign=top style='width:22.8%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'> </span></p>
- </td>
- <td width="10%" valign=top style='width:10.66%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.0.2</span></p>
- </td>
- <td width="45%" valign=top style='width:45.62%;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.2-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.5/R20051130/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.2-1.i386.rpm</a></span></p>
- </td>
- </tr>
-</table>
-
-<h1>4. Dependencies</h1>
-
-<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 2.1.1 module
-has the following dependencies:</p>
-
-<p class=MsoNormal> </p>
-
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=621
- style='width:466.1pt;border-collapse:collapse;border:none'>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Component name</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Description</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:8.0pt'>Version</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:8.0pt'>RPM file name</span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>c-ares</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>A library that performs asynchronous DNS operations</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.3.0</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/c-ares-1.3.0-1.slc3.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/c-ares-1.3.0-1.slc3.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>gpt</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>The Grid Packaging Toolkit (GPT)</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>VDT1.2.2rh9</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.2rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.2rh9-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.5pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>gridsite</span></p>
- </td>
- <td width=142 valign=top style='width:106.25pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>GridSite</span></p>
- </td>
- <td width=66 valign=top style='width:49.7pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.1.15</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gridsite-1.1.15-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gridsite-1.1.15-1.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>j2re</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:8.0pt'>Java </span><span lang=PL
- style='font-size:8.0pt'>JR</span><span style='font-size:8.0pt'>E</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:8.0pt'>1.4.2</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/j2re-1_4_2_08-linux-i586.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/<span
- lang=EN-US>j2re-1_4_2_08-linux-i586.rpm</span></a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>myproxy</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Credential repository for the Grid.</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.14</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-1.14-EGEE.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-1.14-EGEE.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>MySQL-client</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>MySQL - Client</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>4.1.11</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-4.1.11-0.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-4.1.11-0.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>MySQL-server</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>MySQL</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>4.1.11</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-4.1.11-0.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-4.1.11-0.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>perl-Expect.pm</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Expect.pm module for perl (./id/A/AU/AUSCHUTZ)</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>1.01</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/perl-Expect.pm-1.01-9.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/perl-Expect.pm-1.01-9.i386.rpm</a></span></p>
- </td>
- </tr>
- <tr>
- <td width=130 valign=top style='width:97.55pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>vdt_globus_essentials</span></p>
- </td>
- <td width=142 valign=top style='width:106.3pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>Virtual Data Toolkit</span></p>
- </td>
- <td width=66 valign=top style='width:49.65pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'>VDT1.2.2rh9</span></p>
- </td>
- <td width=283 valign=top style='width:212.6pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 8.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.2rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.2rh9-1.i386.rpm</a></span></p>
- </td>
- </tr>
-</table>
-
-<p class=MsoNormal> </p>
-
-<h1>5. Known bugs and issues</h1>
-
-<p class=MsoNormal align=left style='text-align:left;text-autospace:ideograph-numeric'>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 <span
-style='font-size:1.0pt;font-family:ZWAdobeF'>H</span><a
-href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bugs/?group=jra1mdw</a><span
-style='font-size:1.0pt;font-family:ZWAdobeF'>H</span> .</p>
-
-<p class=MsoNormal align=left style='text-align:left'> </p>
-
-<ul style='margin-top:0mm' type=disc>
- <li class=MsoNormal style='text-align:left'>There is an infinite loop during
- the initialization of the LB_Events data structure</li>
- <li class=MsoNormal style='text-align:left'>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.</li>
-</ul>
-
-<p class=MsoNormal align=left style='text-align:left'> </p>
-
-<p class=MsoNormal align=left style='text-align:left'>Known open bugs:</p>
-
-<p class=MsoNormal align=left style='text-align:left'> </p>
-
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
- style='border-collapse:collapse;border:none'>
- <tr>
- <td width=62 valign=top style='width:46.8pt;border:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span style='font-size:10.0pt'>Bug number</span></b></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span style='font-size:10.0pt'>Description</span></b></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span style='font-size:10.0pt'> </span></b></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7324"><span
- style='color:windowtext;text-decoration:none'> #7324</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7324"><span
- style='color:windowtext;text-decoration:none'>lb-bkserver is running with no
- pid</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9701"><span
- style='color:windowtext;text-decoration:none'> #9701</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9701"><span
- style='color:windowtext;text-decoration:none'>erroneous rpath in several
- shared objects</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9777"><span
- style='color:windowtext;text-decoration:none'> #9777</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9777"><span
- style='color:windowtext;text-decoration:none'>unable to get logging-info -2
- info for 1000 jobs</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=10781"><span
- style='color:windowtext;text-decoration:none'> #10781</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=10781"><span
- style='color:windowtext;text-decoration:none'>Missing the timestamps of
- 'Scheduled' and 'Running' status</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11535"><span
- style='color:windowtext;text-decoration:none'> #11535</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11535"><span
- style='color:windowtext;text-decoration:none'>Job submission extremely slow</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13418"><span
- style='color:windowtext;text-decoration:none'> #13418</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13418"><span
- style='color:windowtext;text-decoration:none'>problem in computing status (of
- resubmitted jobs)</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13492"><span
- style='color:windowtext;text-decoration:none'> #13492</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13492"><span
- style='color:windowtext;text-decoration:none'>Job State Information Log File</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13832"><span
- style='color:windowtext;text-decoration:none'> #13832</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13832"><span
- style='color:windowtext;text-decoration:none'>Default mysql configuration
- imposes unnecessary limits on LB server</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13879"><span
- style='color:windowtext;text-decoration:none'> #13879</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13879"><span
- style='color:windowtext;text-decoration:none'>Some data do not propagate from
- lbproxy to bkserver...</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13929"><span
- style='color:windowtext;text-decoration:none'> #13929</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13929"><span
- style='color:windowtext;text-decoration:none'>The glite-lb-bkserverd has
- wrong default for var directory</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13951"><span
- style='color:windowtext;text-decoration:none'> #13951</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13951"><span
- style='color:windowtext;text-decoration:none'>lb proxy sends garbage response
- on error </span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13988"><span
- style='color:windowtext;text-decoration:none'> #13988</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13988"><span
- style='color:windowtext;text-decoration:none'>Failed to start
- glite-lb-locallogger on glite 1.4.1</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=14247"><span
- style='color:windowtext;text-decoration:none'> #14247</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=14247"><span
- style='color:windowtext;text-decoration:none'>No events are found querying LB
- for events satisfying jobid and source instance</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=14339"><span
- style='color:windowtext;text-decoration:none'> #14339</span></a></span></p>
- </td>
- <td width=540 valign=top style='width:405.15pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=14339"><span
- style='color:windowtext;text-decoration:none'>Wrong computing state when
- proxy expires</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
-</table>
-
-<p class=MsoNormal> </p>
-
-<p class=MsoNormal>Bugs fixed in this or previous releases, but not yet officially
-tested:</p>
-
-<p class=MsoNormal> </p>
-
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
- style='border-collapse:collapse;border:none'>
- <tr>
- <td width=61 valign=top style='width:45.4pt;border:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><b><span
- style='font-size:10.0pt;color:#333333'>Bug number</span></b></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><b><span
- style='font-size:10.0pt;color:#333333'>Description</span></b></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><b><span
- style='font-size:10.0pt;color:#333333'> </span></b></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7307"><span
- style='color:#333333;text-decoration:none'> #7307</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7307"><span
- style='color:#333333;text-decoration:none'>lb config script does _not_ fail
- if mysql root password is set</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7305"><span
- style='color:#333333;text-decoration:none'> #7305</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7305"><span
- style='color:#333333;text-decoration:none'>lb.database.username paramenter in
- config file</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7300"><span
- style='color:#333333;text-decoration:none'> #7300</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7300"><span
- style='color:#333333;text-decoration:none'>update of the lb instructions at
- the end of the installer script </span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053"><span
- style='color:#333333;text-decoration:none'> #7053</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053"><span
- style='color:#333333;text-decoration:none'>LB configuration fails if the
- mysql root pwd is set</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13928"><span
- style='color:#333333;text-decoration:none'> #13928</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13928"><span
- style='color:#333333;text-decoration:none'>org.glite.lb.server depends on
- full VOMS package instead of individual APIs packages</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13048"><span
- style='color:#333333;text-decoration:none'> #13048</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=13048"><span
- style='color:#333333;text-decoration:none'>interlogger does not handle errors
- from bookkeeping server</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=12648"><span
- style='color:#333333;text-decoration:none'> #12648</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=12648"><span
- style='color:#333333;text-decoration:none'>The memory usage of one LB process
- keeps growing</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11387"><span
- style='color:#333333;text-decoration:none'> #11387</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11387"><span
- style='color:#333333;text-decoration:none'>LBProxy SIGSEGV</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11050"><span
- style='color:#333333;text-decoration:none'> #11050</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11050"><span
- style='color:#333333;text-decoration:none'>Too heavy locallogger retry
- strategy</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9183"><span
- style='color:#333333;text-decoration:none'> #9183</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9183"><span
- style='color:#333333;text-decoration:none'>Broken connections in LB contect
- connection pool</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9135"><span
- style='color:#333333;text-decoration:none'> #9135</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9135"><span
- style='color:#333333;text-decoration:none'>The interlogd has problem sending
- event to the LB server</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=8630"><span
- style='color:#333333;text-decoration:none'> #8630</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=8630"><span
- style='color:#333333;text-decoration:none'>EDG_WL_* variables in LB library</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7910"><span
- style='color:#333333;text-decoration:none'> #7910</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7910"><span
- style='color:#333333;text-decoration:none'>Duplicate apostroph in MySQL calls</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11509"><span
- style='color:#333333;text-decoration:none'> #11509</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=11509"><span
- style='color:#333333;text-decoration:none'>glite-lb-config.py overwrites
- HOSTNAME_org.glite.wms.workloadmanager.service with the wrong WMS version</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=10686"><span
- style='color:#333333;text-decoration:none'> #10686</span></a></span></p>
- </td>
- <td width=542 valign=top style='width:406.55pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=10686"><span
- style='color:#333333;text-decoration:none'>MySQL library fails on hostnames
- containing dashes</span></a></span></p>
- </td>
- <td width=17 valign=top style='width:12.45pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt;color:#333333'> </span></p>
- </td>
- </tr>
-</table>
-
-<p class=MsoNormal align=left style='margin:0mm;margin-bottom:.0001pt;
-text-align:left;text-autospace:none'><span lang=EN-US style='font-size:10.0pt;
-font-family:"Courier New"'> </span></p>
-
-<h1>6. Bugs closed since last release</h1>
-
-<p class=MsoNormal align=left style='text-align:left;text-autospace:ideograph-numeric'>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 <span
-style='font-size:1.0pt;font-family:ZWAdobeF'>H</span><a
-href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bugs/?group=jra1mdw</a><span
-style='font-size:1.0pt;font-family:ZWAdobeF'>H</span> </p>
-
-<p class=MsoNormal align=left style='text-align:left'> </p>
-
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
- style='border-collapse:collapse;border:none'>
- <tr>
- <td width=64 valign=top style='width:47.8pt;border:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span style='font-size:10.0pt'>Bug number</span></b></p>
- </td>
- <td width=529 valign=top style='width:397.05pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span style='font-size:10.0pt'>Description</span></b></p>
- </td>
- <td width=26 valign=top style='width:19.55pt;border:solid windowtext 1.0pt;
- border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><b><span style='font-size:10.0pt'> </span></b></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6722"><span
- style='color:windowtext;text-decoration:none'> #6722</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6722"><span
- style='color:windowtext;text-decoration:none'>glite-job-status -all doesn't
- work</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7237"><span
- style='color:windowtext;text-decoration:none'> #7237</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7237"><span
- style='color:windowtext;text-decoration:none'>Intermittent errors with job
- submission</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9148"><span
- style='color:windowtext;text-decoration:none'> #9148</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=9148"><span
- style='color:windowtext;text-decoration:none'>Job stays 'Submitted' forever</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
- <tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=10730"><span
- style='color:windowtext;text-decoration:none'> #10730</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=10730"><span
- style='color:windowtext;text-decoration:none'>Error on glite-job-submit</span></a></span></p>
- </td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
- </td>
- </tr>
-</table>
-
-<p class=MsoNormal align=left style='text-align:left'> </p>
-
-</div>
-
-</body>
-
-</html>
+++ /dev/null
-glite-lb.sdf.xml
+++ /dev/null
-#Mon Mar 13 07:52:27 CET 2006
-module.build=0326
+++ /dev/null
-<?xml version ="1.0" encoding="UTF-8"?>
-<!--
- 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
--->
-
-<node name="glite-lb-node" version="@module.version@">
- <services>
- <service name="glite-lb-service">
- <components>
- <component name="glite-config"
- version="@org.glite.deployment.config.info.version@"
- age="@org.glite.deployment.config.info.age@"
- build="@org.glite.deployment.config.info.build@"
- arch="noarch"/>
-
- <component name="glite-LB"
- version="@module.version@"
- age="@module.age@"
- build="@module.build@"
- arch="noarch"/>
-
- <component name="glite-lb-client-interface"
- version="@org.glite.lb.client-interface.info.version@"
- age="@org.glite.lb.client-interface.info.age@"
- build="@org.glite.lb.client-interface.info.build@"
- arch="i386"/>
-
- <component name="glite-lb-ws-interface"
- version="@org.glite.lb.ws-interface.info.version@"
- age="@org.glite.lb.ws-interface.info.age@"
- build="@org.glite.lb.ws-interface.info.build@"
- arch="i386"/>
-
- <component name="glite-lb-logger"
- version="@org.glite.lb.logger.info.version@"
- age="@org.glite.lb.logger.info.age@"
- build="@org.glite.lb.logger.info.build@"
- arch="i386"/>
-
- <component name="glite-lb-common"
- version="@org.glite.lb.common.info.version@"
- age="@org.glite.lb.common.info.age@"
- build="@org.glite.lb.common.info.build@"
- arch="i386"/>
-
- <component name="glite-lb-server"
- version="@org.glite.lb.server.info.version@"
- age="@org.glite.lb.server.info.age@"
- build="@org.glite.lb.server.info.build@"
- arch="i386"/>
-
- <component name="glite-lb-server-bones"
- version="@org.glite.lb.server-bones.info.version@"
- age="@org.glite.lb.server-bones.info.age@"
- build="@org.glite.lb.server-bones.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-jobid"
- version="@org.glite.wms-utils.jobid.info.version@"
- age="@org.glite.wms-utils.jobid.info.age@"
- build="@org.glite.wms-utils.jobid.info.build@"
- arch="i386"/>
-
- <component name="glite-wms-utils-exception"
- version="@org.glite.wms-utils.exception.info.version@"
- age="@org.glite.wms-utils.exception.info.age@"
- build="@org.glite.wms-utils.exception.info.build@"
- arch="i386"/>
-
- <component name="glite-security-gsoap-plugin"
- version="@org.glite.security.gsoap-plugin.info.version@"
- age="@org.glite.security.gsoap-plugin.info.age@"
- build="@org.glite.security.gsoap-plugin.info.build@"
- arch="i386"/>
-
- <component name="glite-security-voms-api-c"
- version="@org.glite.security.voms-api-c.info.version@"
- age="@org.glite.security.voms-api-c.info.age@"
- build="@org.glite.security.voms-api-c.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-primary"
- version="@org.glite.jp.primary.info.version@"
- age="@org.glite.jp.primary.info.age@"
- build="@org.glite.jp.primary.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-common"
- version="@org.glite.jp.common.info.version@"
- age="@org.glite.jp.common.info.age@"
- build="@org.glite.jp.common.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-server-common"
- version="@org.glite.jp.server-common.info.version@"
- age="@org.glite.jp.server-common.info.age@"
- build="@org.glite.jp.server-common.info.build@"
- arch="i386"/>
-
- <component name="glite-jp-ws-interface"
- version="@org.glite.jp.ws-interface.info.version@"
- age="@org.glite.jp.ws-interface.info.age@"
- build="@org.glite.jp.ws-interface.info.build@"
- arch="i386"/>
-
- <component name="gridsite"
- version="@org.gridsite.core.info.version@"
- age="@org.gridsite.core.info.age@"
- build="@org.gridsite.core.info.build@"
- arch="i386"/>
- </components>
- <dependencies>
- <external name="@ext.mysql-server.rpm.name@"
- version="@ext.mysql-server.version@"
- age="@ext.mysql-server.rpm.age@"
- arch="@ext.mysql-server.platform@"/>
- <external name="@ext.mysql-client.rpm.name@"
- version="@ext.mysql-client.version@"
- age="@ext.mysql-client.rpm.age@"
- arch="@ext.mysql-client.platform@"/>
- <external name="@ext.c-ares.rpm.name@"
- version="@ext.c-ares.version@"
- age="@ext.c-ares.rpm.age@"
- arch="@ext.c-ares.platform@"/>
- <external name="@ext.globus-essentials.rpm.name@"
- version="@ext.globus-essentials.rpm.version@"
- age="@ext.globus-essentials.rpm.age@"
- arch="@ext.globus-essentials.platform@"/>
- <external name="@ext.gpt.rpm.name@"
- version="@ext.gpt.rpm.version@"
- age="@ext.gpt.rpm.age@"
- arch="@ext.gpt.platform@"/>
- <external name="@ext.myproxy.rpm.name@"
- version="@ext.myproxy.version@"
- age="@ext.myproxy.rpm.age@"
- arch="@ext.myproxy.platform@"/>
- <external name="@ext.perl-expect-pm.rpm.name@"
- version="@ext.perl-expect-pm.version@"
- age="@ext.perl-expect-pm.rpm.age@"
- arch="@ext.perl-expect-pm.platform@"/>
- </dependencies>
- </service>
-
- <!-- Security Utilities -->
- <service name="glite-security-utils">
- <subservice name="glite-security-utils"/>
- </service>
- <!-- RGMA servicetool -->
- <service name="glite-rgma-servicetool">
- <subservice name="glite-rgma-servicetool"/>
- </service>
- </services>
- <dependencies>
- </dependencies>
-</node>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
- <xsl:param name="installers"/>
- <xsl:param name="repository"/>
- <xsl:param name="ext-repository"/>
-
- <!-- global processing -->
- <xsl:template match="/">
-#!/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. <xsl:value-of select="/node/@version"/>
-#
-# 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
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
- # Download <xsl:value-of select="@name"/> scripts from repository
- <xsl:for-each select=".">
- <xsl:apply-templates select="subservice">
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
-
- # Download <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- # Download <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates>
- <xsl:with-param name="install">true</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- </xsl:for-each>
-
- # 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
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
- # <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- # <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates>
- <xsl:with-param name="install">false</xsl:with-param>
- </xsl:apply-templates>
- </xsl:for-each>
-
- </xsl:for-each>
-
- # 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. <xsl:value-of select="/node/@version"/>
- 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. <xsl:value-of select="/node/@version"/>
- 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
- </xsl:template>
-
- <xsl:template name="subservices" match="subservice">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>_installer.sh</xsl:variable>
- <xsl:choose>
- <xsl:when test="$install = 'true'">
-wget -N -nv <xsl:value-of select="$installers"/><xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-chmod u+x <xsl:value-of select="$package"/>
-SCRIPTLIST="$SCRIPTLIST ./<xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-SCRIPTLISTUn="$SCRIPTLISTUn ./<xsl:value-of select="$package"/> -u "
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="dependencies" match="external">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
- <xsl:variable name="package.name"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/></xsl:variable>
- <xsl:choose>
- <xsl:when test="$install = 'true'">
-wget -N -nv <xsl:value-of select="$ext-repository"/><xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-RPMLIST="$RPMLIST <xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-RPMLIST="$RPMLIST <xsl:value-of select="$package.name"/>"
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template name="components" match="component">
- <xsl:param name="install"/>
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
- <xsl:variable name="package.name"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/></xsl:variable>
- <xsl:choose>
- <xsl:when test="$install='true'">
-wget -N -nv <xsl:value-of select="$repository"/><xsl:value-of select="@arch"/>/RPMS/<xsl:value-of select="$package"/>
-if [ ! -f "<xsl:value-of select="$package"/>" ]
-then
- echo
- echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
- exit 1
-fi
-RPMLIST="$RPMLIST <xsl:value-of select="$package"/>"
- </xsl:when>
- <xsl:otherwise>
-RPMLIST="$RPMLIST <xsl:value-of select="$package.name"/>"
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
- <xsl:param name="repository"/>
- <xsl:param name="ext-repository"/>
-
- <!-- global processing -->
- <xsl:template match="/">
-#!/bin/sh
-#
-# glite-lb_tgz_installer
-# usage: glite-lb_tgz_installer [-u]
-# -u uninstall
-#
-# glite-lb_tgz_installer installs the gLite <xsl:value-of select="/node/@name"/> Deployment Unit from biniary tarballs
-#
-<!-- Put here pre-install instructions -->
-PREFIX=/opt/glite
-
-###############################################################################
-# Download global dependencies
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
-
- <xsl:for-each select="node/services/service">
-###############################################################################
-# Download <xsl:value-of select="@name"/> dependencies RPMS from repository
- <xsl:for-each select="dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
-# Download <xsl:value-of select="@name"/> RPMS from repository
- <xsl:for-each select="components">
- <xsl:apply-templates/>
- </xsl:for-each>
-###############################################################################
- </xsl:for-each>
-
- </xsl:template>
-
- <xsl:template name="dependencies" match="external">
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
-wget <xsl:value-of select="$ext-repository"/><xsl:value-of select="$package"/>
- </xsl:template>
-
- <xsl:template name="components" match="component">
- <xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>_bin.tar.gz</xsl:variable>
-wget <xsl:value-of select="$repository"/>i386/tgz/<xsl:value-of select="$package"/>
-tar -xzf <xsl:value-of select="$package"/> $PREFIX
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite LB Server Node Deployment Unit
-
- Author: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2.4.2 2006/03/13 15:04:06 flammer
- Changed name of rpm to glite-LB.
-
- Revision 1.2.4.1 2005/11/27 16:16:17 dimeglio
- Restrict config file to root
-
- Revision 1.2 2005/07/08 13:18:40 dimeglio
- Merged from branch 1.2.2
-
- Revision 1.1 2004/10/06 09:19:24 dimeglio
- First version of this file
-
--->
-
-<project name="gLite LB Server Deployment Unit common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${deployment.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${deployment.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="lb" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <property name="build.package.name" value="glite-LB"/>
- <property name="build.package.summary" value="gLite Logging and Bookkeeping node configuration files" />
- <property name="build.package.description" value="gLite Logging and Bookkeeping node configuration files" />
- <property name="build.package.files" value="
-%attr(755,root,root) %{prefix}/etc/config/scripts/glite-lb-config.py\n
-%attr(600,root,root) %{prefix}/etc/config/templates/glite-lb.cfg.xml\n
-%attr(644,root,root) %{prefix}/share/doc/glite-LB/release_notes/release_notes.doc\n
-%attr(644,root,root) %{prefix}/share/doc/glite-LB/release_notes/release_notes.pdf\n
-%attr(644,root,root) %{prefix}/share/doc/glite-LB/release_notes/release_notes.html\n"/>
- <property name="build.package.obsolete" value="glite-lb-config"/>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml"
- indent="yes"
- encoding="UTF-8"
- omit-xml-declaration="yes"/>
-
- <!-- Definition of variables and parameters -->
-
- <!-- global processing -->
- <xsl:template match="/">
-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. <xsl:value-of select="/node/@version"/>
-#
-
-## CAs
-
-include pro_software_glite_CA;
-
-
-
-# Global dependencies
- <xsl:for-each select="node/dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-
- <xsl:for-each select="node/services/service">
-
-# <xsl:value-of select="@name"/> dependencies
- <xsl:for-each select="dependencies">
- <xsl:apply-templates/>
- </xsl:for-each>
-
-# <xsl:value-of select="@name"/> RPMS
- <xsl:for-each select="components">
- <xsl:apply-templates/>
- </xsl:for-each>
-
- <xsl:for-each select="subservice">
-include pro_software_<xsl:value-of select="translate(@name, '-', '_')"/>;
- </xsl:for-each>
-
-
- </xsl:for-each>
- </xsl:template>
-
- <xsl:template name="dependencies" match="external">
-"/software/packages"=pkg_repl("<xsl:value-of select="@name"/>","<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>","<xsl:value-of select="@arch"/>");
- </xsl:template>
-
- <xsl:template name="components" match="component">
-"/software/packages"=pkg_repl("<xsl:value-of select="@name"/>","<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>","<xsl:value-of select="@arch"/>");
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-
-module.version = 2.3.0
-module.age = 0
-
\ No newline at end of file
+++ /dev/null
-# Default values
-top_srcdir=.
-stagedir=.
-globalprefix=glite
-jobidprefix=jobid
-package=glite-jobid-api-c
-version=0.0.0
-
-CC:=gcc
-CXX:=g++
-
--include Makefile.inc
-
-VPATH=${top_srcdir}/src:${top_srcdir}/interface:${top_srcdir}/test
-CHECK_VERSION:=VERSION=${version} VERSION_AHEAD=0 perl ${top_srcdir}/project/check_version.pl
-
-DEBUG:=-g -O0 -Wall
-
-CFLAGS:=${DEBUG} \
- -I${top_srcdir}/interface -I${top_srcdir}/src \
- ${COVERAGE_FLAGS} \
- -D_GNU_SOURCE
-
-COMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS}
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-LIBOBJS:=cjobid.o strmd5.o
-HDRS:=cjobid.h strmd5.h
-
-LIBLOBJS:=${LIBOBJS:.o=.lo}
-
-LIB:=libglite_jobid.la
-
-TEST_LIBS:=-L${cppunit_prefix}/lib -lcppunit -ldl
-TEST_INC:=-I${cppunit_prefix}/include
-
-compile all: ${LIB}
-
-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 ${PREFIX}/lib
-
-check: compile base64_test
- ./base64_test base64_test.xml
-
-base64_test: %: %.cpp compile
- ${CXX} -c ${CFLAGS} ${TEST_INC} $<
- ${LINKXX} -o $@ $@.o ${LIB} ${TEST_LIBS}
-
-clean:
- rm -rvf *.o *.lo .libs lib* *.c *.cpp *.h
- rm -rvf log.xml project rpmbuild RPMS tgz
-
-install: ${LIB}
- mkdir -p ${PREFIX}/lib
- mkdir -p ${PREFIX}/include/${globalprefix}/${jobidprefix}
- ${INSTALL} -m 644 ${LIB} ${PREFIX}/lib
- (cd ${top_srcdir}/interface; ${INSTALL} -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${jobidprefix})
-
-
-%.o: %.c
- ${COMPILE} -o $@ -c $<
-
-
-.PHONY: default all compile check install clean
+++ /dev/null
-#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 *glite_jobid_t;
-typedef const struct _edg_wlc_JobId *glite_jobid_const_t;
-typedef glite_jobid_t edg_wlc_JobId;
-
-#define edg_wlc_JobIdCreate glite_jobid_create
-#define edg_wlc_JobIdRecreate glite_jobid_recreate
-#define edg_wlc_JobIdDup glite_jobid_dup
-#define edg_wlc_JobIdFree glite_jobid_free
-#define edg_wlc_JobIdParse glite_jobid_parse
-#define edg_wlc_JobIdUnparse glite_jobid_unparse
-#define edg_wlc_JobIdGetServer glite_jobid_getServer
-#define edg_wlc_JobIdGetServerParts glite_jobid_getServerParts
-#define edg_wlc_JobIdGetUnique glite_jobid_getUnique
-
-#define GLITE_JOBID_DEFAULT_PORT 9000 /**< Default port where bookkeeping server listens */
-#define GLITE_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_jobid_create(const char * bkserver, int port, glite_jobid_t * 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_jobid_recreate(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 glite_jobid_dup(glite_jobid_const_t in, glite_jobid_t * jobid);
-
-/*
- * Free jobid structure
- * \param jobid for dealocation
- */
-void glite_jobid_free(glite_jobid_t 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_jobid_parse(const char* jobidstr, glite_jobid_t * 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_jobid_unparse(glite_jobid_const_t 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_jobid_getServer(glite_jobid_const_t 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_jobid_getServerParts(glite_jobid_const_t jobid, char **srvName, unsigned int *srvPort);
-
-/**
- * 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_jobid_getServerParts_internal(glite_jobid_const_t 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_jobid_getUnique(glite_jobid_const_t jobid);
-
-/**
- * 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_jobid_getUnique_internal(glite_jobid_const_t jobid);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _GLITE_JOBID_H */
+++ /dev/null
-#ifndef _GLITE_STRMD5_H
-#define _GLITE_STRMD5_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#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);
-
-int base64_encode(const void *enc, int enc_size, char *out, int out_max_size);
-int base64_decode(const char *enc,char *out,int out_size);
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* _GLITE_STRMD5_H */
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <ctype.h>
-#include <netdb.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-#include "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 glite_jobid_create(const char *bkserver, int port, glite_jobid_t *jobId)
-{
- return glite_jobid_recreate(bkserver, port, NULL, jobId);
-}
-
-
-int glite_jobid_recreate(const char* bkserver, int port, const char *unique, glite_jobid_t *jobId)
-{
- glite_jobid_t 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_jobid_t) malloc (sizeof(*out));
- if (!out)
- return ENOMEM;
-
- memset(out, 0, sizeof(*out));
-
- /* check if it begins with prefix */
- /* unsupported */
- /* FIXME: fill in PROTO_PREFIX if missing */
- if (strncmp(bkserver, GLITE_JOBID_PROTO_PREFIX, sizeof(GLITE_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_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_jobid_free(out);
- return ENOMEM;
- }
-
- *jobId = out;
- return 0;
-}
-
-
-int glite_jobid_dup(glite_jobid_const_t in, glite_jobid_t *out)
-{
- glite_jobid_t 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_jobid_free(jid);
- return ENOMEM;
- }
-
- jid->BSport = in->BSport;
- *out = jid;
- return 0;
-}
-
-
-// XXX
-// use recreate
-// parse name, port, unique
-int glite_jobid_parse(const char *idString, glite_jobid_t *jobId)
-{
- char *pom, *pom1, *pom2;
- glite_jobid_t out;
-
- *jobId = NULL;
-
- out = (glite_jobid_t) malloc (sizeof(*out));
- if (out == NULL )
- return ENOMEM;
-
- memset(out,0,sizeof(*out));
-
- if (strncmp(idString, GLITE_JOBID_PROTO_PREFIX, sizeof(GLITE_JOBID_PROTO_PREFIX) - 1)) {
- out->BShost = (char *) NULL;
- out->BSport = 0;
-
- free(out);
- return EINVAL;
- }
-
- pom = strdup(idString + sizeof(GLITE_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_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_jobid_free(out);
- return EINVAL;
- }
-
- free(pom);
- *jobId = out;
- return 0;
-}
-
-
-void glite_jobid_free(glite_jobid_t job)
-{
- if (job) {
- free(job->id);
- free(job->BShost);
- free(job->info);
- free(job);
- }
-}
-
-
-char* glite_jobid_unparse(glite_jobid_const_t jobid)
-{
- char *out, port[40];
-
- if (!jobid)
- return NULL;
-
- if (jobid->BSport)
- sprintf(port,":%d",jobid->BSport);
- else
- *port = 0;
-
- asprintf(&out, GLITE_JOBID_PROTO_PREFIX"%s%s/%s%s%s",
- jobid->BShost,port,
- jobid->id,
- (jobid->info ? "?" : ""),
- (jobid->info ? jobid->info : ""));
-
- return out;
-}
-
-
-char* glite_jobid_getServer(glite_jobid_const_t jobid)
-{
- char *bs = NULL;
-
- if (jobid)
- asprintf(&bs, "%s:%u", jobid->BShost,
- jobid->BSport ? jobid->BSport : GLITE_JOBID_DEFAULT_PORT);
-
- return bs;
-}
-
-
-void glite_jobid_getServerParts(glite_jobid_const_t jobid, char **srvName, unsigned int *srvPort)
-{
- if (jobid) {
- *srvName = strdup(jobid->BShost);
- *srvPort = jobid->BSport ? jobid->BSport : GLITE_JOBID_DEFAULT_PORT;
- }
-}
-
-
-char* glite_jobid_getUnique(glite_jobid_const_t jobid)
-{
- return jobid ? strdup(jobid->id) : NULL;
-}
-
-
-void glite_jobid_getServerParts_internal(glite_jobid_const_t jobid, char **srvName, unsigned int *srvPort)
-{
- if (jobid) {
- *srvName = jobid->BShost;
- *srvPort = jobid->BSport ? jobid->BSport : GLITE_JOBID_DEFAULT_PORT;
- }
-}
-
-
-char* glite_jobid_getUnique_internal(glite_jobid_const_t jobid)
-{
- return jobid ? jobid->id : NULL;
-}
+++ /dev/null
-/* crypto/md32_common.h */
-/* ====================================================================
- * Copyright (c) 1999-2002 The OpenSSL Project. All rights reserved.
- *
- * 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. All advertising materials mentioning features or use of this
- * software must display the following acknowledgment:
- * "This product includes software developed by the OpenSSL Project
- * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- * endorse or promote products derived from this software without
- * prior written permission. For written permission, please contact
- * licensing@OpenSSL.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- * nor may "OpenSSL" appear in their names without prior written
- * permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- * acknowledgment:
- * "This product includes software developed by the OpenSSL Project
- * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``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 THE OpenSSL 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 product includes cryptographic software written by Eric Young
- * (eay@cryptsoft.com). This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com).
- *
- */
-
-/*
- * This is a generic 32 bit "collector" for message digest algorithms.
- * Whenever needed it collects input character stream into chunks of
- * 32 bit values and invokes a block function that performs actual hash
- * calculations.
- *
- * Porting guide.
- *
- * Obligatory macros:
- *
- * DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN
- * this macro defines byte order of input stream.
- * HASH_CBLOCK
- * size of a unit chunk HASH_BLOCK operates on.
- * HASH_LONG
- * has to be at lest 32 bit wide, if it's wider, then
- * HASH_LONG_LOG2 *has to* be defined along
- * HASH_CTX
- * context structure that at least contains following
- * members:
- * typedef struct {
- * ...
- * HASH_LONG Nl,Nh;
- * HASH_LONG data[HASH_LBLOCK];
- * unsigned int num;
- * ...
- * } HASH_CTX;
- * HASH_UPDATE
- * name of "Update" function, implemented here.
- * HASH_TRANSFORM
- * name of "Transform" function, implemented here.
- * HASH_FINAL
- * name of "Final" function, implemented here.
- * HASH_BLOCK_HOST_ORDER
- * name of "block" function treating *aligned* input message
- * in host byte order, implemented externally.
- * HASH_BLOCK_DATA_ORDER
- * name of "block" function treating *unaligned* input message
- * in original (data) byte order, implemented externally (it
- * actually is optional if data and host are of the same
- * "endianess").
- * HASH_MAKE_STRING
- * macro convering context variables to an ASCII hash string.
- *
- * Optional macros:
- *
- * B_ENDIAN or L_ENDIAN
- * defines host byte-order.
- * HASH_LONG_LOG2
- * defaults to 2 if not states otherwise.
- * HASH_LBLOCK
- * assumed to be HASH_CBLOCK/4 if not stated otherwise.
- * HASH_BLOCK_DATA_ORDER_ALIGNED
- * alternative "block" function capable of treating
- * aligned input message in original (data) order,
- * implemented externally.
- *
- * MD5 example:
- *
- * #define DATA_ORDER_IS_LITTLE_ENDIAN
- *
- * #define HASH_LONG MD5_LONG
- * #define HASH_LONG_LOG2 MD5_LONG_LOG2
- * #define HASH_CTX MD5_CTX
- * #define HASH_CBLOCK MD5_CBLOCK
- * #define HASH_LBLOCK MD5_LBLOCK
- * #define HASH_UPDATE MD5_Update
- * #define HASH_TRANSFORM MD5_Transform
- * #define HASH_FINAL MD5_Final
- * #define HASH_BLOCK_HOST_ORDER md5_block_host_order
- * #define HASH_BLOCK_DATA_ORDER md5_block_data_order
- *
- * <appro@fy.chalmers.se>
- */
-
-#if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN)
-#error "DATA_ORDER must be defined!"
-#endif
-
-#ifndef HASH_CBLOCK
-#error "HASH_CBLOCK must be defined!"
-#endif
-#ifndef HASH_LONG
-#error "HASH_LONG must be defined!"
-#endif
-#ifndef HASH_CTX
-#error "HASH_CTX must be defined!"
-#endif
-
-#ifndef HASH_UPDATE
-#error "HASH_UPDATE must be defined!"
-#endif
-#ifndef HASH_TRANSFORM
-#error "HASH_TRANSFORM must be defined!"
-#endif
-#ifndef HASH_FINAL
-#error "HASH_FINAL must be defined!"
-#endif
-
-#ifndef HASH_BLOCK_HOST_ORDER
-#error "HASH_BLOCK_HOST_ORDER must be defined!"
-#endif
-
-#if 0
-/*
- * Moved below as it's required only if HASH_BLOCK_DATA_ORDER_ALIGNED
- * isn't defined.
- */
-#ifndef HASH_BLOCK_DATA_ORDER
-#error "HASH_BLOCK_DATA_ORDER must be defined!"
-#endif
-#endif
-
-#ifndef HASH_LBLOCK
-#define HASH_LBLOCK (HASH_CBLOCK/4)
-#endif
-
-#ifndef HASH_LONG_LOG2
-#define HASH_LONG_LOG2 2
-#endif
-
-/*
- * Engage compiler specific rotate intrinsic function if available.
- */
-#undef ROTATE
-#ifndef PEDANTIC
-# if defined(_MSC_VER) || defined(__ICC)
-# define ROTATE(a,n) _lrotl(a,n)
-# elif defined(__MWERKS__)
-# if defined(__POWERPC__)
-# define ROTATE(a,n) __rlwinm(a,n,0,31)
-# elif defined(__MC68K__)
- /* Motorola specific tweak. <appro@fy.chalmers.se> */
-# define ROTATE(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) )
-# else
-# define ROTATE(a,n) __rol(a,n)
-# endif
-# elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
- /*
- * Some GNU C inline assembler templates. Note that these are
- * rotates by *constant* number of bits! But that's exactly
- * what we need here...
- * <appro@fy.chalmers.se>
- */
-# if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
-# define ROTATE(a,n) ({ register unsigned int ret; \
- asm ( \
- "roll %1,%0" \
- : "=r"(ret) \
- : "I"(n), "0"(a) \
- : "cc"); \
- ret; \
- })
-# elif defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
-# define ROTATE(a,n) ({ register unsigned int ret; \
- asm ( \
- "rlwinm %0,%1,%2,0,31" \
- : "=r"(ret) \
- : "r"(a), "I"(n)); \
- ret; \
- })
-# endif
-# endif
-#endif /* PEDANTIC */
-
-#if HASH_LONG_LOG2==2 /* Engage only if sizeof(HASH_LONG)== 4 */
-/* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */
-#ifdef ROTATE
-/* 5 instructions with rotate instruction, else 9 */
-#define REVERSE_FETCH32(a,l) ( \
- l=*(const HASH_LONG *)(a), \
- ((ROTATE(l,8)&0x00FF00FF)|(ROTATE((l&0x00FF00FF),24))) \
- )
-#else
-/* 6 instructions with rotate instruction, else 8 */
-#define REVERSE_FETCH32(a,l) ( \
- l=*(const HASH_LONG *)(a), \
- l=(((l>>8)&0x00FF00FF)|((l&0x00FF00FF)<<8)), \
- ROTATE(l,16) \
- )
-/*
- * Originally the middle line started with l=(((l&0xFF00FF00)>>8)|...
- * It's rewritten as above for two reasons:
- * - RISCs aren't good at long constants and have to explicitely
- * compose 'em with several (well, usually 2) instructions in a
- * register before performing the actual operation and (as you
- * already realized:-) having same constant should inspire the
- * compiler to permanently allocate the only register for it;
- * - most modern CPUs have two ALUs, but usually only one has
- * circuitry for shifts:-( this minor tweak inspires compiler
- * to schedule shift instructions in a better way...
- *
- * <appro@fy.chalmers.se>
- */
-#endif
-#endif
-
-#ifndef ROTATE
-#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
-#endif
-
-/*
- * Make some obvious choices. E.g., HASH_BLOCK_DATA_ORDER_ALIGNED
- * and HASH_BLOCK_HOST_ORDER ought to be the same if input data
- * and host are of the same "endianess". It's possible to mask
- * this with blank #define HASH_BLOCK_DATA_ORDER though...
- *
- * <appro@fy.chalmers.se>
- */
-#if defined(B_ENDIAN)
-# if defined(DATA_ORDER_IS_BIG_ENDIAN)
-# if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2
-# define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER
-# endif
-# endif
-#elif defined(L_ENDIAN)
-# if defined(DATA_ORDER_IS_LITTLE_ENDIAN)
-# if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2
-# define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER
-# endif
-# endif
-#endif
-
-#if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
-#ifndef HASH_BLOCK_DATA_ORDER
-#error "HASH_BLOCK_DATA_ORDER must be defined!"
-#endif
-#endif
-
-#if defined(DATA_ORDER_IS_BIG_ENDIAN)
-
-#ifndef PEDANTIC
-# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
-# if ((defined(__i386) || defined(__i386__)) && !defined(I386_ONLY)) || \
- (defined(__x86_64) || defined(__x86_64__))
- /*
- * This gives ~30-40% performance improvement in SHA-256 compiled
- * with gcc [on P4]. Well, first macro to be frank. We can pull
- * this trick on x86* platforms only, because these CPUs can fetch
- * unaligned data without raising an exception.
- */
-# define HOST_c2l(c,l) ({ unsigned int r=*((const unsigned int *)(c)); \
- asm ("bswapl %0":"=r"(r):"0"(r)); \
- (c)+=4; (l)=r; })
-# define HOST_l2c(l,c) ({ unsigned int r=(l); \
- asm ("bswapl %0":"=r"(r):"0"(r)); \
- *((unsigned int *)(c))=r; (c)+=4; r; })
-# endif
-# endif
-#endif
-
-#ifndef HOST_c2l
-#define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24), \
- l|=(((unsigned long)(*((c)++)))<<16), \
- l|=(((unsigned long)(*((c)++)))<< 8), \
- l|=(((unsigned long)(*((c)++))) ), \
- l)
-#endif
-#define HOST_p_c2l(c,l,n) { \
- switch (n) { \
- case 0: l =((unsigned long)(*((c)++)))<<24; \
- case 1: l|=((unsigned long)(*((c)++)))<<16; \
- case 2: l|=((unsigned long)(*((c)++)))<< 8; \
- case 3: l|=((unsigned long)(*((c)++))); \
- } }
-#define HOST_p_c2l_p(c,l,sc,len) { \
- switch (sc) { \
- case 0: l =((unsigned long)(*((c)++)))<<24; \
- if (--len == 0) break; \
- case 1: l|=((unsigned long)(*((c)++)))<<16; \
- if (--len == 0) break; \
- case 2: l|=((unsigned long)(*((c)++)))<< 8; \
- } }
-/* NOTE the pointer is not incremented at the end of this */
-#define HOST_c2l_p(c,l,n) { \
- l=0; (c)+=n; \
- switch (n) { \
- case 3: l =((unsigned long)(*(--(c))))<< 8; \
- case 2: l|=((unsigned long)(*(--(c))))<<16; \
- case 1: l|=((unsigned long)(*(--(c))))<<24; \
- } }
-#ifndef HOST_l2c
-#define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
- *((c)++)=(unsigned char)(((l)>>16)&0xff), \
- *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
- *((c)++)=(unsigned char)(((l) )&0xff), \
- l)
-#endif
-
-#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
-
-#if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
-# ifndef B_ENDIAN
- /* See comment in DATA_ORDER_IS_BIG_ENDIAN section. */
-# define HOST_c2l(c,l) ((l)=*((const unsigned int *)(c)), (c)+=4, l)
-# define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, l)
-# endif
-#endif
-
-#ifndef HOST_c2l
-#define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \
- l|=(((unsigned long)(*((c)++)))<< 8), \
- l|=(((unsigned long)(*((c)++)))<<16), \
- l|=(((unsigned long)(*((c)++)))<<24), \
- l)
-#endif
-#define HOST_p_c2l(c,l,n) { \
- switch (n) { \
- case 0: l =((unsigned long)(*((c)++))); \
- case 1: l|=((unsigned long)(*((c)++)))<< 8; \
- case 2: l|=((unsigned long)(*((c)++)))<<16; \
- case 3: l|=((unsigned long)(*((c)++)))<<24; \
- } }
-#define HOST_p_c2l_p(c,l,sc,len) { \
- switch (sc) { \
- case 0: l =((unsigned long)(*((c)++))); \
- if (--len == 0) break; \
- case 1: l|=((unsigned long)(*((c)++)))<< 8; \
- if (--len == 0) break; \
- case 2: l|=((unsigned long)(*((c)++)))<<16; \
- } }
-/* NOTE the pointer is not incremented at the end of this */
-#define HOST_c2l_p(c,l,n) { \
- l=0; (c)+=n; \
- switch (n) { \
- case 3: l =((unsigned long)(*(--(c))))<<16; \
- case 2: l|=((unsigned long)(*(--(c))))<< 8; \
- case 1: l|=((unsigned long)(*(--(c)))); \
- } }
-#ifndef HOST_l2c
-#define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
- *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
- *((c)++)=(unsigned char)(((l)>>16)&0xff), \
- *((c)++)=(unsigned char)(((l)>>24)&0xff), \
- l)
-#endif
-
-#endif
-
-/*
- * Time for some action:-)
- */
-
-MD5_JOBID_PROTO int HASH_UPDATE (HASH_CTX *c, const void *data_, size_t len)
- {
- const unsigned char *data=data_;
- register HASH_LONG * p;
- register HASH_LONG l;
- size_t sw,sc,ew,ec;
-
- if (len==0) return 1;
-
- l=(c->Nl+(((HASH_LONG)len)<<3))&0xffffffffUL;
- /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
- * Wei Dai <weidai@eskimo.com> for pointing it out. */
- if (l < c->Nl) /* overflow */
- c->Nh++;
- c->Nh+=(len>>29); /* might cause compiler warning on 16-bit */
- c->Nl=l;
-
- if (c->num != 0)
- {
- p=c->data;
- sw=c->num>>2;
- sc=c->num&0x03;
-
- if ((c->num+len) >= HASH_CBLOCK)
- {
- l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l;
- for (; sw<HASH_LBLOCK; sw++)
- {
- HOST_c2l(data,l); p[sw]=l;
- }
- HASH_BLOCK_HOST_ORDER (c,p,1);
- len-=(HASH_CBLOCK-c->num);
- c->num=0;
- /* drop through and do the rest */
- }
- else
- {
- c->num+=(unsigned int)len;
- if ((sc+len) < 4) /* ugly, add char's to a word */
- {
- l=p[sw]; HOST_p_c2l_p(data,l,sc,len); p[sw]=l;
- }
- else
- {
- ew=(c->num>>2);
- ec=(c->num&0x03);
- if (sc)
- l=p[sw];
- HOST_p_c2l(data,l,sc);
- p[sw++]=l;
- for (; sw < ew; sw++)
- {
- HOST_c2l(data,l); p[sw]=l;
- }
- if (ec)
- {
- HOST_c2l_p(data,l,ec); p[sw]=l;
- }
- }
- return 1;
- }
- }
-
- sw=len/HASH_CBLOCK;
- if (sw > 0)
- {
-#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
- /*
- * Note that HASH_BLOCK_DATA_ORDER_ALIGNED gets defined
- * only if sizeof(HASH_LONG)==4.
- */
- if ((((size_t)data)%4) == 0)
- {
- /* data is properly aligned so that we can cast it: */
- HASH_BLOCK_DATA_ORDER_ALIGNED (c,(const HASH_LONG *)data,sw);
- sw*=HASH_CBLOCK;
- data+=sw;
- len-=sw;
- }
- else
-#if !defined(HASH_BLOCK_DATA_ORDER)
- while (sw--)
- {
- memcpy (p=c->data,data,HASH_CBLOCK);
- HASH_BLOCK_DATA_ORDER_ALIGNED(c,p,1);
- data+=HASH_CBLOCK;
- len-=HASH_CBLOCK;
- }
-#endif
-#endif
-#if defined(HASH_BLOCK_DATA_ORDER)
- {
- HASH_BLOCK_DATA_ORDER(c,data,sw);
- sw*=HASH_CBLOCK;
- data+=sw;
- len-=sw;
- }
-#endif
- }
-
- if (len!=0)
- {
- p = c->data;
- c->num = len;
- ew=len>>2; /* words to copy */
- ec=len&0x03;
- for (; ew; ew--,p++)
- {
- HOST_c2l(data,l); *p=l;
- }
- HOST_c2l_p(data,l,ec);
- *p=l;
- }
- return 1;
- }
-
-
-MD5_JOBID_PROTO void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
- {
-#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
- if ((((size_t)data)%4) == 0)
- /* data is properly aligned so that we can cast it: */
- HASH_BLOCK_DATA_ORDER_ALIGNED (c,(const HASH_LONG *)data,1);
- else
-#if !defined(HASH_BLOCK_DATA_ORDER)
- {
-
- HASH_BLOCK_DATA_ORDER_ALIGNED (c,c->data,1);
- }
-#endif
-#endif
-#if defined(HASH_BLOCK_DATA_ORDER)
- HASH_BLOCK_DATA_ORDER (c,data,1);
-#endif
- }
-
-
-MD5_JOBID_PROTO int HASH_FINAL (unsigned char *md, HASH_CTX *c)
- {
- register HASH_LONG *p;
- register unsigned long l;
- register int i,j;
- static const unsigned char end[4]={0x80,0x00,0x00,0x00};
- const unsigned char *cp=end;
-
- /* c->num should definitly have room for at least one more byte. */
- p=c->data;
- i=c->num>>2;
- j=c->num&0x03;
-
-#if 0
- /* purify often complains about the following line as an
- * Uninitialized Memory Read. While this can be true, the
- * following p_c2l macro will reset l when that case is true.
- * This is because j&0x03 contains the number of 'valid' bytes
- * already in p[i]. If and only if j&0x03 == 0, the UMR will
- * occur but this is also the only time p_c2l will do
- * l= *(cp++) instead of l|= *(cp++)
- * Many thanks to Alex Tang <altitude@cic.net> for pickup this
- * 'potential bug' */
-#ifdef PURIFY
- if (j==0) p[i]=0; /* Yeah, but that's not the way to fix it:-) */
-#endif
- l=p[i];
-#else
- l = (j==0) ? 0 : p[i];
-#endif
- HOST_p_c2l(cp,l,j); p[i++]=l; /* i is the next 'undefined word' */
-
- if (i>(HASH_LBLOCK-2)) /* save room for Nl and Nh */
- {
- if (i<HASH_LBLOCK) p[i]=0;
- HASH_BLOCK_HOST_ORDER (c,p,1);
- i=0;
- }
- for (; i<(HASH_LBLOCK-2); i++)
- p[i]=0;
-
-#if defined(DATA_ORDER_IS_BIG_ENDIAN)
- p[HASH_LBLOCK-2]=c->Nh;
- p[HASH_LBLOCK-1]=c->Nl;
-#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
- p[HASH_LBLOCK-2]=c->Nl;
- p[HASH_LBLOCK-1]=c->Nh;
-#endif
- HASH_BLOCK_HOST_ORDER (c,p,1);
-
-#ifndef HASH_MAKE_STRING
-#error "HASH_MAKE_STRING must be defined!"
-#else
- HASH_MAKE_STRING(c,md);
-#endif
-
- c->num=0;
- /* clear stuff, HASH_BLOCK may be leaving some stuff on the stack
- * but I'm not worried :-)
- OPENSSL_cleanse((void *)c,sizeof(HASH_CTX));
- */
- return 1;
- }
-
-#ifndef MD32_REG_T
-#define MD32_REG_T long
-/*
- * This comment was originaly written for MD5, which is why it
- * discusses A-D. But it basically applies to all 32-bit digests,
- * which is why it was moved to common header file.
- *
- * In case you wonder why A-D are declared as long and not
- * as MD5_LONG. Doing so results in slight performance
- * boost on LP64 architectures. The catch is we don't
- * really care if 32 MSBs of a 64-bit register get polluted
- * with eventual overflows as we *save* only 32 LSBs in
- * *either* case. Now declaring 'em long excuses the compiler
- * from keeping 32 MSBs zeroed resulting in 13% performance
- * improvement under SPARC Solaris7/64 and 5% under AlphaLinux.
- * Well, to be honest it should say that this *prevents*
- * performance degradation.
- * <appro@fy.chalmers.se>
- * Apparently there're LP64 compilers that generate better
- * code if A-D are declared int. Most notably GCC-x86_64
- * generates better code.
- * <appro@fy.chalmers.se>
- */
-#endif
+++ /dev/null
-/* crypto/md5/md5.h */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to. The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code. The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * 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 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * "This product includes cryptographic software written by
- * Eric Young (eay@cryptsoft.com)"
- * The word 'cryptographic' can be left out if the rouines from the library
- * being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- * the apps directory (application code) you must include an acknowledgement:
- * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed. i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-#ifndef HEADER_MD5_H
-#define HEADER_MD5_H
-
-/* ljocha
-#include <openssl/e_os2.h>
-*/
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef OPENSSL_NO_MD5
-#error MD5 is disabled.
-#endif
-
-/*
- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then !
- * ! MD5_LONG_LOG2 has to be defined along. !
- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- */
-
-#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__)
-#define MD5_LONG unsigned long
-#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
-#define MD5_LONG unsigned long
-#define MD5_LONG_LOG2 3
-
-/* _CRAY note. I could declare short, but I have no idea what impact
- * does it have on performance on none-T3E machines. I could declare
- * int, but at least on C90 sizeof(int) can be chosen at compile time.
- * So I've chosen long... * <appro@fy.chalmers.se>
- */
-#else
-#define MD5_LONG unsigned int
-#endif
-
-#define MD5_CBLOCK 64
-#define MD5_LBLOCK (MD5_CBLOCK/4)
-#define MD5_DIGEST_LENGTH 16
-
-typedef struct MD5state_st
- {
- MD5_LONG A,B,C,D;
- MD5_LONG Nl,Nh;
- MD5_LONG data[MD5_LBLOCK];
- unsigned int num;
- } MD5_CTX;
-
-MD5_JOBID_PROTO int MD5_Init(MD5_CTX *c);
-MD5_JOBID_PROTO int MD5_Update(MD5_CTX *c, const void *data, size_t len);
-MD5_JOBID_PROTO int MD5_Final(unsigned char *md, MD5_CTX *c);
-MD5_JOBID_PROTO unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
-MD5_JOBID_PROTO void MD5_Transform(MD5_CTX *c, const unsigned char *b);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/* crypto/md5/md5_dgst.c */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to. The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code. The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * 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 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * "This product includes cryptographic software written by
- * Eric Young (eay@cryptsoft.com)"
- * The word 'cryptographic' can be left out if the rouines from the library
- * being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- * the apps directory (application code) you must include an acknowledgement:
- * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed. i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-#ifndef MD5_JOBID_PROTO
-#define MD5_JOBID_PROTO
-#endif
-
-#include <stdio.h>
-#include "md5_locl.h"
-/* ljocha
-#include <openssl/opensslv.h>
-
-const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT;
-*/
-
-/* Implemented from RFC1321 The MD5 Message-Digest Algorithm
- */
-
-#define INIT_DATA_A (unsigned long)0x67452301L
-#define INIT_DATA_B (unsigned long)0xefcdab89L
-#define INIT_DATA_C (unsigned long)0x98badcfeL
-#define INIT_DATA_D (unsigned long)0x10325476L
-
-MD5_JOBID_PROTO int MD5_Init(MD5_CTX *c)
- {
- c->A=INIT_DATA_A;
- c->B=INIT_DATA_B;
- c->C=INIT_DATA_C;
- c->D=INIT_DATA_D;
- c->Nl=0;
- c->Nh=0;
- c->num=0;
- return 1;
- }
-
-#ifndef md5_block_host_order
-MD5_JOBID_PROTO void md5_block_host_order (MD5_CTX *c, const void *data, size_t num)
- {
- const MD5_LONG *X=data;
- register unsigned MD32_REG_T A,B,C,D;
-
- A=c->A;
- B=c->B;
- C=c->C;
- D=c->D;
-
- for (;num--;X+=HASH_LBLOCK)
- {
- /* Round 0 */
- R0(A,B,C,D,X[ 0], 7,0xd76aa478L);
- R0(D,A,B,C,X[ 1],12,0xe8c7b756L);
- R0(C,D,A,B,X[ 2],17,0x242070dbL);
- R0(B,C,D,A,X[ 3],22,0xc1bdceeeL);
- R0(A,B,C,D,X[ 4], 7,0xf57c0fafL);
- R0(D,A,B,C,X[ 5],12,0x4787c62aL);
- R0(C,D,A,B,X[ 6],17,0xa8304613L);
- R0(B,C,D,A,X[ 7],22,0xfd469501L);
- R0(A,B,C,D,X[ 8], 7,0x698098d8L);
- R0(D,A,B,C,X[ 9],12,0x8b44f7afL);
- R0(C,D,A,B,X[10],17,0xffff5bb1L);
- R0(B,C,D,A,X[11],22,0x895cd7beL);
- R0(A,B,C,D,X[12], 7,0x6b901122L);
- R0(D,A,B,C,X[13],12,0xfd987193L);
- R0(C,D,A,B,X[14],17,0xa679438eL);
- R0(B,C,D,A,X[15],22,0x49b40821L);
- /* Round 1 */
- R1(A,B,C,D,X[ 1], 5,0xf61e2562L);
- R1(D,A,B,C,X[ 6], 9,0xc040b340L);
- R1(C,D,A,B,X[11],14,0x265e5a51L);
- R1(B,C,D,A,X[ 0],20,0xe9b6c7aaL);
- R1(A,B,C,D,X[ 5], 5,0xd62f105dL);
- R1(D,A,B,C,X[10], 9,0x02441453L);
- R1(C,D,A,B,X[15],14,0xd8a1e681L);
- R1(B,C,D,A,X[ 4],20,0xe7d3fbc8L);
- R1(A,B,C,D,X[ 9], 5,0x21e1cde6L);
- R1(D,A,B,C,X[14], 9,0xc33707d6L);
- R1(C,D,A,B,X[ 3],14,0xf4d50d87L);
- R1(B,C,D,A,X[ 8],20,0x455a14edL);
- R1(A,B,C,D,X[13], 5,0xa9e3e905L);
- R1(D,A,B,C,X[ 2], 9,0xfcefa3f8L);
- R1(C,D,A,B,X[ 7],14,0x676f02d9L);
- R1(B,C,D,A,X[12],20,0x8d2a4c8aL);
- /* Round 2 */
- R2(A,B,C,D,X[ 5], 4,0xfffa3942L);
- R2(D,A,B,C,X[ 8],11,0x8771f681L);
- R2(C,D,A,B,X[11],16,0x6d9d6122L);
- R2(B,C,D,A,X[14],23,0xfde5380cL);
- R2(A,B,C,D,X[ 1], 4,0xa4beea44L);
- R2(D,A,B,C,X[ 4],11,0x4bdecfa9L);
- R2(C,D,A,B,X[ 7],16,0xf6bb4b60L);
- R2(B,C,D,A,X[10],23,0xbebfbc70L);
- R2(A,B,C,D,X[13], 4,0x289b7ec6L);
- R2(D,A,B,C,X[ 0],11,0xeaa127faL);
- R2(C,D,A,B,X[ 3],16,0xd4ef3085L);
- R2(B,C,D,A,X[ 6],23,0x04881d05L);
- R2(A,B,C,D,X[ 9], 4,0xd9d4d039L);
- R2(D,A,B,C,X[12],11,0xe6db99e5L);
- R2(C,D,A,B,X[15],16,0x1fa27cf8L);
- R2(B,C,D,A,X[ 2],23,0xc4ac5665L);
- /* Round 3 */
- R3(A,B,C,D,X[ 0], 6,0xf4292244L);
- R3(D,A,B,C,X[ 7],10,0x432aff97L);
- R3(C,D,A,B,X[14],15,0xab9423a7L);
- R3(B,C,D,A,X[ 5],21,0xfc93a039L);
- R3(A,B,C,D,X[12], 6,0x655b59c3L);
- R3(D,A,B,C,X[ 3],10,0x8f0ccc92L);
- R3(C,D,A,B,X[10],15,0xffeff47dL);
- R3(B,C,D,A,X[ 1],21,0x85845dd1L);
- R3(A,B,C,D,X[ 8], 6,0x6fa87e4fL);
- R3(D,A,B,C,X[15],10,0xfe2ce6e0L);
- R3(C,D,A,B,X[ 6],15,0xa3014314L);
- R3(B,C,D,A,X[13],21,0x4e0811a1L);
- R3(A,B,C,D,X[ 4], 6,0xf7537e82L);
- R3(D,A,B,C,X[11],10,0xbd3af235L);
- R3(C,D,A,B,X[ 2],15,0x2ad7d2bbL);
- R3(B,C,D,A,X[ 9],21,0xeb86d391L);
-
- A = c->A += A;
- B = c->B += B;
- C = c->C += C;
- D = c->D += D;
- }
- }
-#endif
-
-#ifndef md5_block_data_order
-#ifdef X
-#undef X
-#endif
-MD5_JOBID_PROTO void md5_block_data_order (MD5_CTX *c, const void *data_, size_t num)
- {
- const unsigned char *data=data_;
- register unsigned MD32_REG_T A,B,C,D,l;
-#ifndef MD32_XARRAY
- /* See comment in crypto/sha/sha_locl.h for details. */
- unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
- XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15;
-# define X(i) XX##i
-#else
- MD5_LONG XX[MD5_LBLOCK];
-# define X(i) XX[i]
-#endif
-
- A=c->A;
- B=c->B;
- C=c->C;
- D=c->D;
-
- for (;num--;)
- {
- HOST_c2l(data,l); X( 0)=l; HOST_c2l(data,l); X( 1)=l;
- /* Round 0 */
- R0(A,B,C,D,X( 0), 7,0xd76aa478L); HOST_c2l(data,l); X( 2)=l;
- R0(D,A,B,C,X( 1),12,0xe8c7b756L); HOST_c2l(data,l); X( 3)=l;
- R0(C,D,A,B,X( 2),17,0x242070dbL); HOST_c2l(data,l); X( 4)=l;
- R0(B,C,D,A,X( 3),22,0xc1bdceeeL); HOST_c2l(data,l); X( 5)=l;
- R0(A,B,C,D,X( 4), 7,0xf57c0fafL); HOST_c2l(data,l); X( 6)=l;
- R0(D,A,B,C,X( 5),12,0x4787c62aL); HOST_c2l(data,l); X( 7)=l;
- R0(C,D,A,B,X( 6),17,0xa8304613L); HOST_c2l(data,l); X( 8)=l;
- R0(B,C,D,A,X( 7),22,0xfd469501L); HOST_c2l(data,l); X( 9)=l;
- R0(A,B,C,D,X( 8), 7,0x698098d8L); HOST_c2l(data,l); X(10)=l;
- R0(D,A,B,C,X( 9),12,0x8b44f7afL); HOST_c2l(data,l); X(11)=l;
- R0(C,D,A,B,X(10),17,0xffff5bb1L); HOST_c2l(data,l); X(12)=l;
- R0(B,C,D,A,X(11),22,0x895cd7beL); HOST_c2l(data,l); X(13)=l;
- R0(A,B,C,D,X(12), 7,0x6b901122L); HOST_c2l(data,l); X(14)=l;
- R0(D,A,B,C,X(13),12,0xfd987193L); HOST_c2l(data,l); X(15)=l;
- R0(C,D,A,B,X(14),17,0xa679438eL);
- R0(B,C,D,A,X(15),22,0x49b40821L);
- /* Round 1 */
- R1(A,B,C,D,X( 1), 5,0xf61e2562L);
- R1(D,A,B,C,X( 6), 9,0xc040b340L);
- R1(C,D,A,B,X(11),14,0x265e5a51L);
- R1(B,C,D,A,X( 0),20,0xe9b6c7aaL);
- R1(A,B,C,D,X( 5), 5,0xd62f105dL);
- R1(D,A,B,C,X(10), 9,0x02441453L);
- R1(C,D,A,B,X(15),14,0xd8a1e681L);
- R1(B,C,D,A,X( 4),20,0xe7d3fbc8L);
- R1(A,B,C,D,X( 9), 5,0x21e1cde6L);
- R1(D,A,B,C,X(14), 9,0xc33707d6L);
- R1(C,D,A,B,X( 3),14,0xf4d50d87L);
- R1(B,C,D,A,X( 8),20,0x455a14edL);
- R1(A,B,C,D,X(13), 5,0xa9e3e905L);
- R1(D,A,B,C,X( 2), 9,0xfcefa3f8L);
- R1(C,D,A,B,X( 7),14,0x676f02d9L);
- R1(B,C,D,A,X(12),20,0x8d2a4c8aL);
- /* Round 2 */
- R2(A,B,C,D,X( 5), 4,0xfffa3942L);
- R2(D,A,B,C,X( 8),11,0x8771f681L);
- R2(C,D,A,B,X(11),16,0x6d9d6122L);
- R2(B,C,D,A,X(14),23,0xfde5380cL);
- R2(A,B,C,D,X( 1), 4,0xa4beea44L);
- R2(D,A,B,C,X( 4),11,0x4bdecfa9L);
- R2(C,D,A,B,X( 7),16,0xf6bb4b60L);
- R2(B,C,D,A,X(10),23,0xbebfbc70L);
- R2(A,B,C,D,X(13), 4,0x289b7ec6L);
- R2(D,A,B,C,X( 0),11,0xeaa127faL);
- R2(C,D,A,B,X( 3),16,0xd4ef3085L);
- R2(B,C,D,A,X( 6),23,0x04881d05L);
- R2(A,B,C,D,X( 9), 4,0xd9d4d039L);
- R2(D,A,B,C,X(12),11,0xe6db99e5L);
- R2(C,D,A,B,X(15),16,0x1fa27cf8L);
- R2(B,C,D,A,X( 2),23,0xc4ac5665L);
- /* Round 3 */
- R3(A,B,C,D,X( 0), 6,0xf4292244L);
- R3(D,A,B,C,X( 7),10,0x432aff97L);
- R3(C,D,A,B,X(14),15,0xab9423a7L);
- R3(B,C,D,A,X( 5),21,0xfc93a039L);
- R3(A,B,C,D,X(12), 6,0x655b59c3L);
- R3(D,A,B,C,X( 3),10,0x8f0ccc92L);
- R3(C,D,A,B,X(10),15,0xffeff47dL);
- R3(B,C,D,A,X( 1),21,0x85845dd1L);
- R3(A,B,C,D,X( 8), 6,0x6fa87e4fL);
- R3(D,A,B,C,X(15),10,0xfe2ce6e0L);
- R3(C,D,A,B,X( 6),15,0xa3014314L);
- R3(B,C,D,A,X(13),21,0x4e0811a1L);
- R3(A,B,C,D,X( 4), 6,0xf7537e82L);
- R3(D,A,B,C,X(11),10,0xbd3af235L);
- R3(C,D,A,B,X( 2),15,0x2ad7d2bbL);
- R3(B,C,D,A,X( 9),21,0xeb86d391L);
-
- A = c->A += A;
- B = c->B += B;
- C = c->C += C;
- D = c->D += D;
- }
- }
-#endif
-
-#ifdef undef
-int printit(unsigned long *l)
- {
- int i,ii;
-
- for (i=0; i<2; i++)
- {
- for (ii=0; ii<8; ii++)
- {
- fprintf(stderr,"%08lx ",l[i*8+ii]);
- }
- fprintf(stderr,"\n");
- }
- }
-#endif
+++ /dev/null
-/* crypto/md5/md5_locl.h */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to. The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code. The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * 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 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * "This product includes cryptographic software written by
- * Eric Young (eay@cryptsoft.com)"
- * The word 'cryptographic' can be left out if the rouines from the library
- * being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- * the apps directory (application code) you must include an acknowledgement:
- * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed. i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <openssl/e_os2.h>
-#include <openssl/md5.h>
-
-#ifndef MD5_LONG_LOG2
-#define MD5_LONG_LOG2 2 /* default to 32 bits */
-#endif
-
-#ifdef MD5_ASM
-# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__)
-# if !defined(B_ENDIAN)
-# define md5_block_host_order md5_block_asm_host_order
-# endif
-# elif defined(__sparc) && defined(OPENSSL_SYS_ULTRASPARC)
- void md5_block_asm_data_order_aligned (MD5_CTX *c, const MD5_LONG *p,size_t num);
-# define HASH_BLOCK_DATA_ORDER_ALIGNED md5_block_asm_data_order_aligned
-# endif
-#endif
-
-MD5_JOBID_PROTO void md5_block_host_order (MD5_CTX *c, const void *p,size_t num);
-MD5_JOBID_PROTO void md5_block_data_order (MD5_CTX *c, const void *p,size_t num);
-
-#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__)
-# if !defined(B_ENDIAN)
-/*
- * *_block_host_order is expected to handle aligned data while
- * *_block_data_order - unaligned. As algorithm and host (x86)
- * are in this case of the same "endianness" these two are
- * otherwise indistinguishable. But normally you don't want to
- * call the same function because unaligned access in places
- * where alignment is expected is usually a "Bad Thing". Indeed,
- * on RISCs you get punished with BUS ERROR signal or *severe*
- * performance degradation. Intel CPUs are in turn perfectly
- * capable of loading unaligned data without such drastic side
- * effect. Yes, they say it's slower than aligned load, but no
- * exception is generated and therefore performance degradation
- * is *incomparable* with RISCs. What we should weight here is
- * costs of unaligned access against costs of aligning data.
- * According to my measurements allowing unaligned access results
- * in ~9% performance improvement on Pentium II operating at
- * 266MHz. I won't be surprised if the difference will be higher
- * on faster systems:-)
- *
- * <appro@fy.chalmers.se>
- */
-# define md5_block_data_order md5_block_host_order
-# endif
-#endif
-
-#define DATA_ORDER_IS_LITTLE_ENDIAN
-
-#define HASH_LONG MD5_LONG
-#define HASH_LONG_LOG2 MD5_LONG_LOG2
-#define HASH_CTX MD5_CTX
-#define HASH_CBLOCK MD5_CBLOCK
-#define HASH_LBLOCK MD5_LBLOCK
-#define HASH_UPDATE MD5_Update
-#define HASH_TRANSFORM MD5_Transform
-#define HASH_FINAL MD5_Final
-#define HASH_MAKE_STRING(c,s) do { \
- unsigned long ll; \
- ll=(c)->A; HOST_l2c(ll,(s)); \
- ll=(c)->B; HOST_l2c(ll,(s)); \
- ll=(c)->C; HOST_l2c(ll,(s)); \
- ll=(c)->D; HOST_l2c(ll,(s)); \
- } while (0)
-#define HASH_BLOCK_HOST_ORDER md5_block_host_order
-#if !defined(L_ENDIAN) || defined(md5_block_data_order)
-#define HASH_BLOCK_DATA_ORDER md5_block_data_order
-/*
- * Little-endians (Intel and Alpha) feel better without this.
- * It looks like memcpy does better job than generic
- * md5_block_data_order on copying-n-aligning input data.
- * But frankly speaking I didn't expect such result on Alpha.
- * On the other hand I've got this with egcs-1.0.2 and if
- * program is compiled with another (better?) compiler it
- * might turn out other way around.
- *
- * <appro@fy.chalmers.se>
- */
-#endif
-
-#include "md32_common.h"
-
-/*
-#define F(x,y,z) (((x) & (y)) | ((~(x)) & (z)))
-#define G(x,y,z) (((x) & (z)) | ((y) & (~(z))))
-*/
-
-/* As pointed out by Wei Dai <weidai@eskimo.com>, the above can be
- * simplified to the code below. Wei attributes these optimizations
- * to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel.
- */
-#define F(b,c,d) ((((c) ^ (d)) & (b)) ^ (d))
-#define G(b,c,d) ((((b) ^ (c)) & (d)) ^ (c))
-#define H(b,c,d) ((b) ^ (c) ^ (d))
-#define I(b,c,d) (((~(d)) | (b)) ^ (c))
-
-#define R0(a,b,c,d,k,s,t) { \
- a+=((k)+(t)+F((b),(c),(d))); \
- a=ROTATE(a,s); \
- a+=b; };\
-
-#define R1(a,b,c,d,k,s,t) { \
- a+=((k)+(t)+G((b),(c),(d))); \
- a=ROTATE(a,s); \
- a+=b; };
-
-#define R2(a,b,c,d,k,s,t) { \
- a+=((k)+(t)+H((b),(c),(d))); \
- a=ROTATE(a,s); \
- a+=b; };
-
-#define R3(a,b,c,d,k,s,t) { \
- a+=((k)+(t)+I((b),(c),(d))); \
- a=ROTATE(a,s); \
- a+=b; };
+++ /dev/null
-#ident "$Header$"
-
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define MD5_JOBID_PROTO static
-#include "md5.h"
-#include "strmd5.h"
-
-#include "md5_dgst.c"
-
-
-static char mbuf[33];
-static const char* b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-static char *b64r;
-
-int base64_encode(const void *enc, int enc_size, char *out, int out_max_size)
-{
-
- 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;
-}
-
-int base64_decode(const char *enc,char *out,int max_out_size)
-{
- unsigned int bits = 0;
- int shift = 0;
- int out_size = 0;
-
- if (!b64r) {
- int i;
- b64r = calloc(128,1);
-
- for (i=0; b64[i]; i++) b64r[(int)b64[i]] = i;
- }
-
- while (*enc && *enc != '=') {
- bits <<= 6;
- bits |= b64r[(int)*enc++];
- shift += 6;
-
- while (shift >= 8) {
- if (out_size >= max_out_size) return -1;
- shift -= 8;
- *out++ = (bits >> shift) & 0xff;
- out_size++;
- }
- }
-
- return out_size;
-}
-
-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);
-}
+++ /dev/null
-#include <assert.h>
-#include <fstream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/XmlOutputter.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-
-#include "strmd5.h"
-
-class Base64Test: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE(Base64Test);
- CPPUNIT_TEST(test);
- CPPUNIT_TEST_SUITE_END();
-public:
- void test();
-};
-
-void Base64Test::test()
-{
- int i;
- unsigned char in[2000], b[4000], out[2000];
-
- srandom(0xDEAD);
- in[0] = 'x';
- for (i=1; i<2000; i++) {
- char s[20];
- int len;
- sprintf(s,"%d",i);
- in[i] = random() % 256;
-
- std::cerr << '.';
-
- base64_encode(in,i,(char *) b,sizeof b);
- len = base64_decode((const char *) b,(char *) out,sizeof out);
-
- CPPUNIT_ASSERT_MESSAGE(std::string("len"),i == len);
- CPPUNIT_ASSERT_MESSAGE(std::string(s),!memcmp(in,out,i));
- }
- std::cerr << std::endl;
-}
-
-CPPUNIT_TEST_SUITE_REGISTRATION(Base64Test);
-
-
-int main (int argc,const char *argv[])
-{
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-
- assert(argc == 2);
- std::ofstream xml(argv[1]);
-
- CppUnit::TestResult controller;
- CppUnit::TestResultCollector result;
- controller.addListener( &result );
-
- CppUnit::TestRunner runner;
- runner.addTest(suite);
- runner.run(controller);
-
- CppUnit::XmlOutputter xout( &result, xml );
- CppUnit::CompilerOutputter tout( &result, std::cout);
- xout.write();
- tout.write();
-
- return result.wasSuccessful() ? 0 : 1 ;
-}
+++ /dev/null
-# Default values
-top_srcdir=.
-stagedir=.
-globalprefix=glite
-jobidprefix=jobid
-package=glite-jobid-api-cpp
-version=0.0.0
-
-CC:=gcc
-CXX:=g++
-
--include Makefile.inc
-
-version=${module.version}
-
-VPATH=${top_srcdir}/src:${top_srcdir}/interface:${top_srcdir}/test
-
-DEBUG:=-g -O0 -Wall
-
-CFLAGS:=${DEBUG} \
- -I${top_srcdir}/interface -I${top_srcdir}/src \
- ${COVERAGE_FLAGS} \
- -D_GNU_SOURCE
-
-COMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS}
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-LIBOBJS:=
-HDRS:=JobId.h
-
-LIBLOBJS:=${LIBOBJS:.o=.lo}
-
-LIB:=
-
-compile all:
-
-
-check: compile
-#
-
-clean:
- rm -rvf *.o *.lo .libs lib* *.c *.cpp *.h
- rm -rvf log.xml project rpmbuild RPMS tgz
-
-install:
- mkdir -p ${PREFIX}/include/${globalprefix}/${jobidprefix}
- (cd ${top_srcdir}/interface; ${INSTALL} -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${jobidprefix})
-
-
-%.o: %.c
- ${COMPILE} -o $@ -c $<
-
-
-.PHONY: default all compile check install clean
+++ /dev/null
-#ifndef GLITE_JOBID_JOBID_H
-#define GLITE_JOBID_JOBID_H
-
-#include <string>
-#include <stdexcept>
-#include <new>
-#include <cerrno>
-#include <cassert>
-
-#include "glite/jobid/cjobid.h"
-
-
-namespace glite {
-namespace jobid {
-
-
-/**
- * class glite::jobid::JobIdError
- */
-
-class JobIdError : public std::runtime_error {
-public:
- /** Constructor for mandatory fields.
- *
- * Updates all the mandatory fields and names the exception.
- * \param[in] exception Error message describing the exception.
- */
- JobIdError(std::string const& exception)
- : std::runtime_error(std::string("JobId: bad argument (") + exception + ")")
- {}
-
- virtual ~JobIdError() throw()
- {}
-
-};
-
-
-/**
- * class glite::jobid::JobId
- */
-
-class JobId
-{
-public:
- class Hostname {
- public:
- std::string const& name;
- Hostname(std::string const& n) : name(n)
- {}
- };
-
- //@name Constructors/Destructor
- //@{
-
- /**
- * Constructor from string format.
- * @param job_id_string
- * @throws Exception When a string is passed in a wrong format
- */
- JobId(std::string const& job_id_string);
-
- /**
- * Constructor from job id components.
- * \param host
- * \param port
- * \param unique
- */
- explicit JobId(Hostname const& host = Hostname("localhost"),
- int port = GLITE_JOBID_DEFAULT_PORT,
- std::string const& unique = std::string(""));
-
- /**
- * Destructor.
- */
- ~JobId();
-
- //@}
-
- //@ Conversions, assignments, comparisons
- //@{
-
- /**
- * Copy constructor.
- */
- JobId(JobId const&);
-
- /**
- * Constructor from C jobid.
- * \param src C API job id
- */
- explicit JobId(glite_jobid_const_t src);
-
- /**
- * Assignment operator.
- * Create a deep copy of the JobId instance.
- */
- JobId& operator=(JobId const& src);
-
- /**
- * Casting operator.
- */
- glite_jobid_const_t c_jobid() const;
-
- /**
- * Returns the string representing the job id
- * @return String representation of a JobId
- */
- std::string toString() const;
-
-
- /**
- * Comparison given by lexicographical ordering of string representations.
- * @return Result of comparison.
- */
- int operator< (const JobId &j) const;
- //@}
-
-
- /**@name Member access
- * @{
- */
-
- /**
- * Get server:port.
- * @return hostname and port
- */
- std::string server() const;
-
- /**
- * Get host.
- * @return hostname
- */
- std::string host() const;
-
- /**
- * Get port.
- * @return port
- */
- int port() const;
-
- /**
- * Get unique.
- * @return unique string
- */
- std::string unique() const;
-
- //@}
-
-private:
- glite_jobid_t m_jobid;
-};
-
-
-
-// -------------------- implementation ------------------------
-
-inline
-JobId::JobId(std::string const& job_id_string)
-{
- int ret = glite_jobid_parse(job_id_string.c_str(),
- &m_jobid);
- switch(ret) {
- case EINVAL:
- throw JobIdError(job_id_string);
-
- case ENOMEM:
- throw std::bad_alloc();
-
- default:
- break;
- }
-}
-
-
-inline
-JobId::JobId(JobId::Hostname const& host, int port, std::string const& unique)
-{
- if(port < 0) {
- throw JobIdError("negative port");
- }
-
- int ret = glite_jobid_recreate(host.name.c_str(), port,
- unique.empty() ? NULL : unique.c_str(),
- &m_jobid);
- switch(ret) {
- case EINVAL:
- throw JobIdError(host.name);
-
- case ENOMEM:
- throw std::bad_alloc();
-
- default:
- break;
- }
-}
-
-
-inline
-JobId::~JobId() {
- glite_jobid_free(m_jobid);
-}
-
-
-inline
-JobId::JobId(JobId const& src)
-{
- int ret = glite_jobid_dup(src.m_jobid,
- &m_jobid);
- if(ret) {
- // we rely on dup returning only ENOMEM on error
- assert(ret == ENOMEM);
- throw std::bad_alloc();
- }
-}
-
-
-inline
-JobId::JobId(glite_jobid_const_t src)
-{
- if(src == NULL) {
- throw JobIdError("null");
- }
-
- int ret = glite_jobid_dup(src,
- &m_jobid);
- if(ret) {
- throw std::bad_alloc();
- }
-}
-
-
-inline
-JobId&
-JobId::operator=(JobId const& src)
-{
- if(this == &src) {
- return *this;
- }
-
- glite_jobid_free(m_jobid);
- int ret = glite_jobid_dup(src.m_jobid,
- &m_jobid);
- if(ret) {
- throw std::bad_alloc();
- }
- return *this;
-}
-
-
-inline
-glite_jobid_const_t
-JobId::c_jobid() const
-{
- return m_jobid;
-}
-
-
-inline
-std::string
-JobId::toString() const
-{
- char *out = glite_jobid_unparse(m_jobid);
- std::string res(out);
-
- free(out);
- return res;
-}
-
-
-inline
-int
-JobId::operator< (const JobId &j) const
-{
- std::string me(toString());
- std::string js(j.toString());
-
- return(me < js);
-}
-
-
-inline
-std::string
-JobId::server() const
-{
- char *server = glite_jobid_getServer(m_jobid);
- std::string res(server);
-
- free(server);
- return res;
-}
-
-
-inline
-std::string
-JobId::host() const
-{
- char *name;
- unsigned int port;
-
- glite_jobid_getServerParts_internal(m_jobid,
- &name, &port);
- return std::string(name);
-}
-
-
-inline
-int
-JobId::port() const
-{
- char *name;
- unsigned int port;
-
- glite_jobid_getServerParts_internal(m_jobid,
- &name, &port);
- return port;
-}
-
-
-inline
-std::string
-JobId::unique() const
-{
- char *unique = glite_jobid_getUnique_internal(m_jobid);
- std::string res(unique);
-
- return res;
-}
-
-
-} // namespace jobid
-} // namespace glite
-
-#endif // GLITE_JOBID_JOBID_H
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- You may freely edit this file. See commented blocks below for -->
-<!-- some examples of how to customize the build. -->
-<!-- (If you delete it and reopen the project it will be recreated.) -->
-<project name="jobid-api-java" default="default" basedir=".">
- <description>Builds, tests, and runs the project jobid-api-java.</description>
- <import file="nbproject/build-impl.xml"/>
- <!--
-
- There exist several targets which are by default empty and which can be
- used for execution of your tasks. These targets are usually executed
- before and after some main targets. They are:
-
- -pre-init: called before initialization of project properties
- -post-init: called after initialization of project properties
- -pre-compile: called before javac compilation
- -post-compile: called after javac compilation
- -pre-compile-single: called before javac compilation of single file
- -post-compile-single: called after javac compilation of single file
- -pre-compile-test: called before javac compilation of JUnit tests
- -post-compile-test: called after javac compilation of JUnit tests
- -pre-compile-test-single: called before javac compilation of single JUnit test
- -post-compile-test-single: called after javac compilation of single JUunit test
- -pre-jar: called before JAR building
- -post-jar: called after JAR building
- -post-clean: called after cleaning build products
-
- (Targets beginning with '-' are not intended to be called on their own.)
-
- Example of inserting an obfuscator after compilation could look like this:
-
- <target name="-post-compile">
- <obfuscate>
- <fileset dir="${build.classes.dir}"/>
- </obfuscate>
- </target>
-
- For list of available properties check the imported
- nbproject/build-impl.xml file.
-
-
- Another way to customize the build is by overriding existing main targets.
- The targets of interest are:
-
- -init-macrodef-javac: defines macro for javac compilation
- -init-macrodef-junit: defines macro for junit execution
- -init-macrodef-debug: defines macro for class debugging
- -init-macrodef-java: defines macro for class execution
- -do-jar-with-manifest: JAR building (if you are using a manifest)
- -do-jar-without-manifest: JAR building (if you are not using a manifest)
- run: execution of project
- -javadoc-build: Javadoc generation
- test-report: JUnit report generation
-
- An example of overriding the target for project execution could look like this:
-
- <target name="run" depends="jobid-api-java-impl.jar">
- <exec dir="bin" executable="launcher.exe">
- <arg file="${dist.jar}"/>
- </exec>
- </target>
-
- Notice that the overridden target depends on the jar target and not only on
- the compile target as the regular run target does. Again, for a list of available
- properties which you can use, check the target you are overriding in the
- nbproject/build-impl.xml file.
-
- -->
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-*** GENERATED FROM project.xml - DO NOT EDIT ***
-*** EDIT ../build.xml INSTEAD ***
-
-For the purpose of easier reading the script
-is divided into following sections:
-
- - initialization
- - compilation
- - jar
- - execution
- - debugging
- - javadoc
- - junit compilation
- - junit execution
- - junit debugging
- - applet
- - cleanup
-
- -->
-<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject2="http://www.netbeans.org/ns/j2se-project/2" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="jobid-api-java-impl">
- <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
- <!--
- ======================
- INITIALIZATION SECTION
- ======================
- -->
- <target name="-pre-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="-pre-init" name="-init-private">
- <property file="nbproject/private/config.properties"/>
- <property file="nbproject/private/configs/${config}.properties"/>
- <property file="nbproject/private/private.properties"/>
- </target>
- <target depends="-pre-init,-init-private" name="-init-user">
- <property file="${user.properties.file}"/>
- <!-- The two properties below are usually overridden -->
- <!-- by the active platform. Just a fallback. -->
- <property name="default.javac.source" value="1.4"/>
- <property name="default.javac.target" value="1.4"/>
- </target>
- <target depends="-pre-init,-init-private,-init-user" name="-init-project">
- <property file="nbproject/configs/${config}.properties"/>
- <property file="nbproject/project.properties"/>
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
- <available file="${manifest.file}" property="manifest.available"/>
- <condition property="manifest.available+main.class">
- <and>
- <isset property="manifest.available"/>
- <isset property="main.class"/>
- <not>
- <equals arg1="${main.class}" arg2="" trim="true"/>
- </not>
- </and>
- </condition>
- <condition property="manifest.available+main.class+mkdist.available">
- <and>
- <istrue value="${manifest.available+main.class}"/>
- <isset property="libs.CopyLibs.classpath"/>
- </and>
- </condition>
- <condition property="have.tests">
- <or>
- <available file="${test.src.dir}"/>
- </or>
- </condition>
- <condition property="have.sources">
- <or>
- <available file="${src.dir}"/>
- </or>
- </condition>
- <condition property="netbeans.home+have.tests">
- <and>
- <isset property="netbeans.home"/>
- <isset property="have.tests"/>
- </and>
- </condition>
- <condition property="no.javadoc.preview">
- <and>
- <isset property="javadoc.preview"/>
- <isfalse value="${javadoc.preview}"/>
- </and>
- </condition>
- <property name="run.jvmargs" value=""/>
- <property name="javac.compilerargs" value=""/>
- <property name="work.dir" value="${basedir}"/>
- <condition property="no.deps">
- <and>
- <istrue value="${no.dependencies}"/>
- </and>
- </condition>
- <property name="javac.debug" value="true"/>
- <property name="javadoc.preview" value="true"/>
- <property name="application.args" value=""/>
- <property name="source.encoding" value="${file.encoding}"/>
- <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
- <and>
- <isset property="javadoc.encoding"/>
- <not>
- <equals arg1="${javadoc.encoding}" arg2=""/>
- </not>
- </and>
- </condition>
- <property name="javadoc.encoding.used" value="${source.encoding}"/>
- <property name="includes" value="**"/>
- <property name="excludes" value=""/>
- <property name="do.depend" value="false"/>
- <condition property="do.depend.true">
- <istrue value="${do.depend}"/>
- </condition>
- <condition property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'">
- <and>
- <isset property="jaxws.endorsed.dir"/>
- <available file="nbproject/jaxws-build.xml"/>
- </and>
- </condition>
- </target>
- <target name="-post-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
- <fail unless="src.dir">Must set src.dir</fail>
- <fail unless="test.src.dir">Must set test.src.dir</fail>
- <fail unless="build.dir">Must set build.dir</fail>
- <fail unless="dist.dir">Must set dist.dir</fail>
- <fail unless="build.classes.dir">Must set build.classes.dir</fail>
- <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
- <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
- <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
- <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
- <fail unless="dist.jar">Must set dist.jar</fail>
- </target>
- <target name="-init-macrodef-property">
- <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute name="name"/>
- <attribute name="value"/>
- <sequential>
- <property name="@{name}" value="${@{value}}"/>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-javac">
- <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="${javac.debug}" name="debug"/>
- <attribute default="" name="sourcepath"/>
- <element name="customize" optional="true"/>
- <sequential>
- <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" sourcepath="@{sourcepath}" srcdir="@{srcdir}">
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/>
- <customize/>
- </javac>
- </sequential>
- </macrodef>
- <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <sequential>
- <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- </depend>
- </sequential>
- </macrodef>
- <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${build.classes.dir}" name="destdir"/>
- <sequential>
- <fail unless="javac.includes">Must set javac.includes</fail>
- <pathconvert pathsep="," property="javac.includes.binary">
- <path>
- <filelist dir="@{destdir}" files="${javac.includes}"/>
- </path>
- <globmapper from="*.java" to="*.class"/>
- </pathconvert>
- <delete>
- <files includes="${javac.includes.binary}"/>
- </delete>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-junit">
- <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <sequential>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true">
- <batchtest todir="${build.test.results.dir}">
- <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- </batchtest>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg line="${run.jvmargs}"/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-nbjpda">
- <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${main.class}" name="name"/>
- <attribute default="${debug.classpath}" name="classpath"/>
- <attribute default="" name="stopclassname"/>
- <sequential>
- <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="dt_socket">
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- </nbjpdastart>
- </sequential>
- </macrodef>
- <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${build.classes.dir}" name="dir"/>
- <sequential>
- <nbjpdareload>
- <fileset dir="@{dir}" includes="${fix.includes}*.class"/>
- </nbjpdareload>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-debug-args">
- <property name="version-output" value="java version "${ant.java.version}"/>
- <condition property="have-jdk-older-than-1.4">
- <or>
- <contains string="${version-output}" substring="java version "1.0"/>
- <contains string="${version-output}" substring="java version "1.1"/>
- <contains string="${version-output}" substring="java version "1.2"/>
- <contains string="${version-output}" substring="java version "1.3"/>
- </or>
- </condition>
- <condition property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
- <istrue value="${have-jdk-older-than-1.4}"/>
- </condition>
- </target>
- <target depends="-init-debug-args" name="-init-macrodef-debug">
- <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${main.class}" name="classname"/>
- <attribute default="${debug.classpath}" name="classpath"/>
- <element name="customize" optional="true"/>
- <sequential>
- <java classname="@{classname}" dir="${work.dir}" fork="true">
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
- <jvmarg line="${run.jvmargs}"/>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-java">
- <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${main.class}" name="classname"/>
- <element name="customize" optional="true"/>
- <sequential>
- <java classname="@{classname}" dir="${work.dir}" fork="true">
- <jvmarg line="${run.jvmargs}"/>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-presetdef-jar">
- <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
- <jar compress="${jar.compress}" jarfile="${dist.jar}">
- <j2seproject1:fileset dir="${build.classes.dir}"/>
- </jar>
- </presetdef>
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
- <!--
- ===================
- COMPILATION SECTION
- ===================
- -->
- <target depends="init" name="deps-jar" unless="no.deps"/>
- <target depends="init,deps-jar" name="-pre-pre-compile">
- <mkdir dir="${build.classes.dir}"/>
- </target>
- <target name="-pre-compile">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="do.depend.true" name="-compile-depend">
- <j2seproject3:depend/>
- </target>
- <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
- <j2seproject3:javac/>
- <copy todir="${build.classes.dir}">
- <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target name="-post-compile">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
- <target name="-pre-compile-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
- <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
- <j2seproject3:force-recompile/>
- <j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
- </target>
- <target name="-post-compile-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
- <!--
- ====================
- JAR BUILDING SECTION
- ====================
- -->
- <target depends="init" name="-pre-pre-jar">
- <dirname file="${dist.jar}" property="dist.jar.dir"/>
- <mkdir dir="${dist.jar.dir}"/>
- </target>
- <target name="-pre-jar">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
- <j2seproject1:jar/>
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
- <j2seproject1:jar manifest="${manifest.file}"/>
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
- <j2seproject1:jar manifest="${manifest.file}">
- <j2seproject1:manifest>
- <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
- </j2seproject1:manifest>
- </j2seproject1:jar>
- <echo>To run this application from the command line without Ant, try:</echo>
- <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
- <property location="${dist.jar}" name="dist.jar.resolved"/>
- <pathconvert property="run.classpath.with.dist.jar">
- <path path="${run.classpath}"/>
- <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
- </pathconvert>
- <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
- <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
- <pathconvert property="run.classpath.without.build.classes.dir">
- <path path="${run.classpath}"/>
- <map from="${build.classes.dir.resolved}" to=""/>
- </pathconvert>
- <pathconvert pathsep=" " property="jar.classpath">
- <path path="${run.classpath.without.build.classes.dir}"/>
- <chainedmapper>
- <flattenmapper/>
- <globmapper from="*" to="lib/*"/>
- </chainedmapper>
- </pathconvert>
- <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
- <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
- <fileset dir="${build.classes.dir}"/>
- <manifest>
- <attribute name="Main-Class" value="${main.class}"/>
- <attribute name="Class-Path" value="${jar.classpath}"/>
- </manifest>
- </copylibs>
- <echo>To run this application from the command line without Ant, try:</echo>
- <property location="${dist.jar}" name="dist.jar.resolved"/>
- <echo>java -jar "${dist.jar.resolved}"</echo>
- </target>
- <target name="-post-jar">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
- <!--
- =================
- EXECUTION SECTION
- =================
- -->
- <target depends="init,compile" description="Run a main class." name="run">
- <j2seproject1:java>
- <customize>
- <arg line="${application.args}"/>
- </customize>
- </j2seproject1:java>
- </target>
- <target name="-do-not-recompile">
- <property name="javac.includes.binary" value=""/>
- </target>
- <target depends="init,-do-not-recompile,compile-single" name="run-single">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <j2seproject1:java classname="${run.class}"/>
- </target>
- <!--
- =================
- DEBUGGING SECTION
- =================
- -->
- <target depends="init" if="netbeans.home" name="-debug-start-debugger">
- <j2seproject1:nbjpdastart name="${debug.class}"/>
- </target>
- <target depends="init,compile" name="-debug-start-debuggee">
- <j2seproject3:debug>
- <customize>
- <arg line="${application.args}"/>
- </customize>
- </j2seproject3:debug>
- </target>
- <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
- <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
- <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
- </target>
- <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
- <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
- <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
- <j2seproject3:debug classname="${debug.class}"/>
- </target>
- <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
- <target depends="init" name="-pre-debug-fix">
- <fail unless="fix.includes">Must set fix.includes</fail>
- <property name="javac.includes" value="${fix.includes}.java"/>
- </target>
- <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
- <j2seproject1:nbjpdareload/>
- </target>
- <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
- <!--
- ===============
- JAVADOC SECTION
- ===============
- -->
- <target depends="init" name="-javadoc-build">
- <mkdir dir="${dist.javadoc.dir}"/>
- <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
- <classpath>
- <path path="${javac.classpath}"/>
- </classpath>
- <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
- <filename name="**/*.java"/>
- </fileset>
- </javadoc>
- </target>
- <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
- <nbbrowse file="${dist.javadoc.dir}/index.html"/>
- </target>
- <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
- <!--
- =========================
- JUNIT COMPILATION SECTION
- =========================
- -->
- <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
- <mkdir dir="${build.test.classes.dir}"/>
- </target>
- <target name="-pre-compile-test">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="do.depend.true" name="-compile-test-depend">
- <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
- <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
- <copy todir="${build.test.classes.dir}">
- <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target name="-post-compile-test">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
- <target name="-pre-compile-test-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
- <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
- <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
- <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
- <copy todir="${build.test.classes.dir}">
- <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target name="-post-compile-test-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
- <!--
- =======================
- JUNIT EXECUTION SECTION
- =======================
- -->
- <target depends="init" if="have.tests" name="-pre-test-run">
- <mkdir dir="${build.test.results.dir}"/>
- </target>
- <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
- <j2seproject3:junit testincludes="**/*Test.java"/>
- </target>
- <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
- <fail if="tests.failed">Some tests failed; see details above.</fail>
- </target>
- <target depends="init" if="have.tests" name="test-report"/>
- <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
- <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
- <target depends="init" if="have.tests" name="-pre-test-run-single">
- <mkdir dir="${build.test.results.dir}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
- <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
- <j2seproject3:junit excludes="" includes="${test.includes}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
- <fail if="tests.failed">Some tests failed; see details above.</fail>
- </target>
- <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
- <!--
- =======================
- JUNIT DEBUGGING SECTION
- =======================
- -->
- <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
- <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
- <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
- <delete file="${test.report.file}"/>
- <mkdir dir="${build.test.results.dir}"/>
- <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
- <customize>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <arg value="${test.class}"/>
- <arg value="showoutput=true"/>
- <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
- <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
- </customize>
- </j2seproject3:debug>
- </target>
- <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
- <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
- </target>
- <target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
- <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
- <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
- </target>
- <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
- <!--
- =========================
- APPLET EXECUTION SECTION
- =========================
- -->
- <target depends="init,compile-single" name="run-applet">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <j2seproject1:java classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </j2seproject1:java>
- </target>
- <!--
- =========================
- APPLET DEBUGGING SECTION
- =========================
- -->
- <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <j2seproject3:debug classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </j2seproject3:debug>
- </target>
- <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
- <!--
- ===============
- CLEANUP SECTION
- ===============
- -->
- <target depends="init" name="deps-clean" unless="no.deps"/>
- <target depends="init" name="-do-clean">
- <delete dir="${build.dir}"/>
- <delete dir="${dist.dir}"/>
- </target>
- <target name="-post-clean">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
-</project>
+++ /dev/null
-build.xml.data.CRC32=dbd878b7
-build.xml.script.CRC32=3fb96f09
-build.xml.stylesheet.CRC32=be360661
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=dbd878b7
-nbproject/build-impl.xml.script.CRC32=02cb42d1
-nbproject/build-impl.xml.stylesheet.CRC32=f1d9da08
+++ /dev/null
-do.depend=false
-do.jar=true
-javac.debug=true
-javadoc.preview=true
-jaxws.endorsed.dir=/home/pavel/netbeans-6.0.1/java1/modules/ext/jaxws21/api
-user.properties.file=/home/pavel/.netbeans/6.0/build.properties
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
- <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
-</project-private>
+++ /dev/null
-application.title=jobid-api-java
-application.vendor=xpiskac
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-debug.classpath=\
- ${run.classpath}
-debug.test.classpath=\
- ${run.test.classpath}
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/jobid-api-java.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-excludes=
-# file.reference.commons-codec-1.3.jar=/home/etics/repository/externals/commons-codec/1.3.0/noarch/
-includes=**
-jar.compress=false
-javac.classpath=\
- ${file.reference.commons-codec.jar}
-# Space-separated list of extra javac options
-javac.compilerargs=
-javac.deprecation=false
-javac.source=
-javac.target=
-javac.test.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-main.class=org.glite.test.Test
-manifest.file=manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-platform.active=default_platform
-run.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project
-# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
-# or test-sys-prop.name=value to set system properties for unit tests):
-run.jvmargs=
-run.test.classpath=\
- ${javac.test.classpath}:\
- ${build.test.classes.dir}
-source.encoding=UTF-8
-src.dir=src
-test.src.dir=test
-javac.compilerargs.jaxws=
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
- <type>org.netbeans.modules.java.j2seproject</type>
- <configuration>
- <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
- <name>jobid-api-java</name>
- <minimum-ant-version>1.6.5</minimum-ant-version>
- <source-roots>
- <root id="src.dir"/>
- </source-roots>
- <test-roots>
- <root id="test.src.dir"/>
- </test-roots>
- </data>
- <references xmlns="http://www.netbeans.org/ns/ant-project-references/1"/>
- </configuration>
-</project>
+++ /dev/null
-package org.glite.jobid;
-
-/**
- * Class which escapes \ and new line signs in string which is set as parameter
- * in constructor
- *
- * @author Pavel Piskac (173297@mail.muni.cz)
- * @version 15. 3. 2008
- */
-public class CheckedString {
-
- String checkedString;
-
- /**
- * Creates new instance of CheckedString.
- *
- * @param checkedString string which will be converted
- * @throws java.lang.IllegalArgumentException if checkedString is null
- */
- public CheckedString(String checkedString) {
- if (checkedString == null) {
- throw new IllegalArgumentException("checkedString is null");
- }
-
- setCheckedString(checkedString);
- }
-
- /**
- * Gets converted string.
- *
- * @return converted string
- */
- public String getCheckedString() {
- return checkedString;
- }
-
- /**
- * Sets string which will be converted.
- *
- * @param checkedString string which will be converted.
- */
- public void setCheckedString(String checkedString) {
- checkedString = checkedString.replaceAll("[\\\"]", "\\\\\"");
- checkedString = checkedString.replaceAll("[\n]", "\\\\\\\\n");
- checkedString = checkedString.replaceAll("[/]", "_");
- checkedString = checkedString.replaceAll("[\\+]", "-");
- this.checkedString = checkedString;
- }
-
- /**
- * Returns converted string.
- *
- * @return converted string
- */
- @Override
- public String toString() {
- return checkedString;
- }
-
-}
+++ /dev/null
-package org.glite.jobid;
-
-/**
- * This class shows how Jobid works and how to work with it.
- * @author Pavel Piskac
- */
-public class ExampleJobid {
-
- public static void main(String[] args) {
- //how Jobid class works
- //unique part is automatically generated
- Jobid jobid1 = new Jobid("https://somewhere.cz", 5000);
- System.out.println("bkserver "+ jobid1.getBkserver());
- System.out.println("port "+ jobid1.getPort());
- System.out.println("unique "+ jobid1.getUnique());
- System.out.println("-------------------");
-
- //unique part is set by user
- Jobid jobid2 = new Jobid("https://somewhere.cz", 5000, "my_unique_part");
- System.out.println("bkserver "+ jobid2.getBkserver());
- System.out.println("port "+ jobid2.getPort());
- System.out.println("unique "+ jobid2.getUnique());
- System.out.println("-------------------");
-
- //whole jobid is set by user and then parsed
- Jobid jobid3 = new Jobid("https://somewhere.cz:5000/my_unique_part");
- System.out.println("bkserver "+ jobid3.getBkserver());
- System.out.println("port "+ jobid3.getPort());
- System.out.println("unique "+ jobid3.getUnique());
- System.out.println("-------------------");
-
- //each part is set separately
- Jobid jobid4 = new Jobid();
- jobid4.setBkserver("https://somewhere.cz");
- jobid4.setPort(5000);
- jobid4.setUnique("my_unique_part");
- System.out.println("bkserver "+ jobid4.getBkserver());
- System.out.println("port "+ jobid4.getPort());
- System.out.println("unique "+ jobid4.getUnique());
- System.out.println("-------------------");
- }
-
-}
+++ /dev/null
-package org.glite.jobid;
-
-import java.net.UnknownHostException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Calendar;
-import java.util.Random;
-//import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.codec.binary.Base64;
-
-/**
- * Class representing jobId
- *
- * @author Pavel Piskac (173297@mail.muni.cz)
- * @version 15. 3. 2008
- */
-public class Jobid {
-
- String unique;
- String bkserver;
- int port;
-
- /**
- * Creates new instance of Jobid class.
- */
- public Jobid() {
- }
-
- /**
- * Creates new instace of JobId with BK server address and port number, unique part
- * is generated. If some exception is catched during generating the unique part, then
- * System.exit(-1); is called.
- *
- * @param bkserver BK server address
- * @param port BK server port
- * @throws java.land.IllegalArgumentException if bkserver is null
- * @throws java.lang.IllegalArgumentException if port is lower than 1 or
- * bigger than 65535
- */
-
- public Jobid(String bkserver, int port) {
- if (bkserver == null) {
- throw new IllegalArgumentException("Jobid bkserver");
- }
-
- if (port < 1 || port > 65535) {
- throw new IllegalArgumentException("Jobid port");
- }
-
- if (bkserver.indexOf("https://") == -1) {
- throw new IllegalArgumentException("wrong jobid https");
- }
-
- this.bkserver = bkserver;
- this.port = port;
-
- MessageDigest digest = null;
-
- try {
- String hostname = "";
- try {
- hostname = java.net.InetAddress.getLocalHost().getHostName();
- } catch (UnknownHostException ex) {
- System.err.println(ex);
- }
-
- digest = java.security.MessageDigest.getInstance("MD5");
- unique = hostname + bkserver + port + Calendar.getInstance().getTimeInMillis() +
- new Random().nextInt(999999);
-
- digest.update(unique.getBytes(),0,unique.length());
- Base64 base64 = new Base64();
- byte[] tmp = base64.encode(digest.digest());
- unique = new CheckedString(new String(tmp, 0, tmp.length-2)).toString();
-
- } catch (NoSuchAlgorithmException ex) {
- System.err.println(ex);
- System.exit(-1);
- }
- }
-
- /**
- * Creates new instace of Jobid with BK server address, port number and
- * unique part as parameters.
- *
- * @param bkserver BK server address
- * @param port BK server port
- * @param unique unique part of jobid
- * @throws java.lang.IllegalArgumentException if bkserver is null
- * @throws java.lang.IllegalArgumentException if port is lower than 1 or
- * bigger than 65535
- * @throws java.lang.IllegalArgumentException if unique is null
- */
- public Jobid(String bkserver, int port, String unique) {
- if (bkserver == null) {
- throw new IllegalArgumentException("Jobid bkserver");
- }
-
- if (port < 1 || port > 65535) {
- throw new IllegalArgumentException("Jobid port");
- }
-
- if (unique == null) {
- throw new IllegalArgumentException("Jobid unique");
- }
-
- this.bkserver = bkserver;
- this.port = port;
- this.unique = (new CheckedString(unique)).toString();
- }
-
- /**
- * Creates new instace of Jobid from string which represents jobid
- *
- * @param jobidString jobid string representation
- * @throws java.lang.IllegalArgumentException if jobidString is null
- */
- public Jobid(String jobidString) {
- if (jobidString == null) {
- throw new IllegalArgumentException("Jobid jobidString");
- }
-
- int doubleSlashPosition = jobidString.indexOf("https://");
- if (doubleSlashPosition == -1) {
- throw new IllegalArgumentException("wrong jobid https");
- }
-
- int colonPosition = jobidString.indexOf(":", doubleSlashPosition + 8);
- if (colonPosition == -1) {
- throw new IllegalArgumentException("wrong jobid colon");
- }
-
- int dashAfterPort = jobidString.indexOf("/", colonPosition);
- String bkserverS = jobidString.substring(0, colonPosition);
- Integer portS = new Integer(jobidString.substring(colonPosition+1,
- dashAfterPort));
- String uniqueS = jobidString.substring(dashAfterPort+1, jobidString.length());
-
- this.bkserver = bkserverS;
- this.port = portS;
- this.unique = (new CheckedString(uniqueS)).toString();
- }
-
- /**
- * Returns BK server address
- *
- * @return bkserver BK server address
- */
- public String getBkserver() {
- return bkserver;
- }
-
- /**
- * Sets BK server address
- *
- * @param bkserver BK server address
- * @throws java.lang.IllegalArgumentException if bkserver is null
- */
- public void setBkserver(String bkserver) {
-
- if (bkserver == null) {
- throw new IllegalArgumentException("Jobid bkserver");
- }
-
- this.bkserver = bkserver;
- }
-
- /**
- * Returns unique part of jobId
- *
- * @return unique part of jobId
- */
- public String getUnique() {
- return unique;
- }
-
- /**
- * Sets unique part of jobId
- *
- * @param unique
- * @throws java.lang.IllegalArgumentException if unique is null
- */
- public void setUnique(String unique) {
-
- if (unique == null) {
- throw new IllegalArgumentException("Jobid unique");
- }
-
- this.unique = (new CheckedString(unique)).toString();
- }
-
- /**
- * Returns port number
- *
- * @return port number
- */
- public int getPort() {
- return port;
- }
-
- /**
- * Sets port number
- *
- * @param port number
- * @throws java.lang.IllegalArgumentException if port is lower than 0 or
- * bigger than 65535
- */
- public void setPort(int port) {
-
- if (port <= 0 || port >= 65536) {
- throw new IllegalArgumentException("Jobid port");
- }
-
- this.port = port;
- }
-
- /**
- * Returns Jobid string representation in format bkserver:port/unique
- *
- * @return Jobid string representation in format bkserver:port/unique
- */
- @Override
- public String toString() {
- return bkserver + ":" + port + "/" + unique;
- }
-}
+++ /dev/null
-# defaults
-top_srcdir=.
-builddir=build
-top_builddir=${top_srcdir}/${builddir}
-stagedir=.
-distdir=.
-globalprefix=glite
-jpprefix=jp
-package=glite-jp-client
-version=0.0.0
-PREFIX=/opt/glite
-
-glite_location=/opt/glite
-globus_prefix=/opt/globus
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-gsoap_prefix=/software/gsoap-2.6
-
-CC=gcc
-
--include Makefile.inc
-
-STAGETO=include/${globalprefix}/${jpprefix}
-
-VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/project$:${top_srcdir}/interface:${stagedir}/interface:${top_srcdir}/build
-
-ifdef JP_PERF
- JP_PERF_CFLAGS:=-DJP_PERF=1
-endif
-
-GLOBUS_LIBS:=-L${globus_prefix}/lib \
- -lglobus_ftp_client_${nothrflavour} \
- -lglobus_ftp_control_${nothrflavour}
-
-GLOBUS_CFLAGS:=-I${globus_prefix}/include/${nothrflavour}
-
-DEBUG:=-g -O0 -DDEBUG
-
-CFLAGS:=${DEBUG} -I. -I${top_srcdir}/interface -I${top_srcdir}/src -I${gsoap_prefix}/include -I${gsoap_prefix} -I${stagedir}/include ${GLOBUS_CFLAGS} -I${libtar}/include ${JP_PERF_CFLAGS} -W -Wall -Wno-unused-parameter -D_GNU_SOURCE
-LDFLAGS:=-L${stagedir}/lib -L${libtar}/lib
-
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LTCOMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-LIBTAR:=-L${libtar}/lib -ltar
-
-STAGE_HDRS:=jpcl_ctx_int.h
-HDRS:=jp_client.h jpimporter.h
-
-EXAMPLES:=jpps_upload_files mill_feed
-
-LIBOBJS:=jpcl_ctx.o jpimp_lib.o
-LIBTHROBJS:=${LIBOBJS:.o=.thr.o}
-LIBLOBJS:=${LIBOBJS:.o=.lo}
-
-LIB:=libglite_jp_importer_${nothrflavour}.la
-THRLIB:=libglite_jp_importer_${thrflavour}.la
-
-daemon:=glite-jp-importer
-
-wsprefix:=jpps_
-
-SRCS:=jpimporter.c ${wsprefix}ClientLib.c ${wsprefix}C.c
-OBJS:=${SRCS:.c=.o}
-
-gsoap_bin_prefix:=${shell if [ -x ${gsoap_prefix}/bin/soapcpp2 ]; then echo ${gsoap_prefix}/bin; else echo ${gsoap_prefix}; fi }
-dotless_gsoap_ver:=${shell echo ${gsoap_version} | tr -d . }
-GSOAPLIB:=-lglite_security_gsoap_plugin_${dotless_gsoap_ver}_${nothrflavour}
-
-LBMAILDIRLIB:=-lglite_lbu_maildir
-
-offset=0
-version_info:=-version-info ${shell \
- perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' }
-
-
-default all: compile
-
-compile: ${daemon} ${LIB} ${EXAMPLES}
-
-examples: ${EXAMPLES}
-
-${LIB}: ${LIBOBJS}
- ${LINK} ${version_info} -o $@ ${LIBLOBJS} -rpath ${glite_location}/lib ${LBMAILDIRLIB} ${LIBTAR}
-
-${daemon}: ${OBJS}
- ${LINK} -o $@ ${OBJS} ${LBMAILDIRLIB} ${GSOAPLIB} ${GLOBUS_LIBS}
-
-${EXAMPLES}: ${LIB}
-
-jpps_upload_files: %: %.o
- ${LINK} -o $@ $< ${LIB} ${LBMAILDIRLIB}
-
-mill_feed: %: %.o
- ${LINK} -o $@ $< ${LBMAILDIRLIB} -lglite_jobid
-
-
-
-JobProvenancePS.xh: %.xh: %.wsdl JobProvenanceTypes.wsdl typemap.dat
- cp ${stagedir}/interface/JobProvenanceTypes.wsdl .
- ${gsoap_bin_prefix}/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o $@ $<
- rm -f JobProvenanceTypes.wsdl
-
-${wsprefix}Client.c ${wsprefix}ClientLib.c \
-${wsprefix}C.c ${wsprefix}H.h: JobProvenancePS.xh
- ${gsoap_bin_prefix}/soapcpp2 -n -w -c -p ${wsprefix} JobProvenancePS.xh
-
-env_C.c env_Server.c:
- touch env.xh
- cp ${jpproject}/JobProvenanceTypes.wsdl .
- ${gsoap_bin_prefix}/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o env.xh JobProvenanceTypes.wsdl
- rm -f JobProvenanceTypes.wsdl
- ${gsoap_bin_prefix}/soapcpp2 -w -c -p env_ env.xh
-
-${OBJS}: ${wsprefix}H.h soap_version.h
-
-soap_version.h:
- ${gsoap_bin_prefix}/soapcpp2 /dev/null
- perl -ne '$$. == 2 && /.*([0-9])\.([0-9])\.([0-9]).*/ && printf "#define GSOAP_VERSION %d%02d%02d\n",$$1,$$2,$$3' soapH.h >$@
- -rm soapC.cpp soapH.h soapStub.h soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp
-
-
-
-
-check:
- -echo nothing yet
-
-doc:
-
-stage: compile
- ${MAKE} PREFIX=${stagedir} DOSTAGE=yes install
-
-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}/${STAGETO}
- -mkdir -p ${PREFIX}/bin
- -mkdir -p ${PREFIX}/lib
- -mkdir -p ${PREFIX}/examples
- -mkdir -p ${PREFIX}/etc/init.d
- ${INSTALL} -m 755 ${daemon} ${PREFIX}/bin
- ${INSTALL} -m 644 ${LIB} ${PREFIX}/lib
- ${INSTALL} -m 644 jpps_upload_files ${PREFIX}/examples/glite-jp-primary-upload_files
- ${INSTALL} -m 755 mill_feed ${PREFIX}/examples/glite-jp-mill_feed
- cd ${top_srcdir}/examples && ${INSTALL} -m 755 glite-jp-importer.sh ${PREFIX}/examples/
- ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-jp-importer
- cd ${top_srcdir}/interface && ${INSTALL} -m 644 ${HDRS} ${PREFIX}/${STAGETO}
- if [ x${DOSTAGE} = xyes ]; then \
- cd ${top_srcdir}/interface && ${INSTALL} -m 644 ${STAGE_HDRS} ${PREFIX}/${STAGETO} ; \
- fi
-
-
-clean:
-
-# we have no real config.h but have to force gSoap not to use
-# linux ftime with broken (aka obsolete) DST information
-stdsoap2.o: ${gsoap_prefix}/devel/stdsoap2.c
- test -f config.h || touch config.h
- @echo 'The following warning "time_t (de)serialization is not MT safe on this platform" is harmless'
- ${CC} -o $@ -c -DWITH_NONAMESPACES -DHAVE_CONFIG_H ${CFLAGS} ${gsoap_prefix}/devel/stdsoap2.c
-
-
-%.lo: %.c
- ${LTCOMPILE} -o $@ -c $<
-
-%.o: %.c
- ${LTCOMPILE} -o $@ -c $<
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the GLite JP Primary module
--->
-
-<project name="client" default="dist">
-
- <!-- =========================================
- Builds the gLite JP Primary Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#! /bin/sh
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-
-[ -f $GLITE_LOCATION/etc/lb.conf ] && . $GLITE_LOCATION/etc/lb.conf
-[ -f $GLITE_LOCATION_VAR/etc/lb.conf ] && . $GLITE_LOCATION_VAR/etc/lb.conf
-
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-[ -n "$GLITE_JP_IMPORTER_PIDFILE" ] && pidfile=$GLITE_JP_IMPORTER_PIDFILE ||
- pidfile=$GLITE_LOCATION_VAR/glite-jp-importer.pid
-
-unset creds port
-
-start()
-{
- if test -z "$GLITE_USER" ;then
- echo 'Error: GLITE_USER is not set'
- echo FAILED
- return 1
- fi
-
- [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] &&
- creds="-c $GLITE_HOST_CERT -k $GLITE_HOST_KEY"
-
- if test -z "$creds"; then
- if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
- echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
- creds="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
- fi
- fi
-
- [ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
-
- [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=$GLITE_LOCATION_VAR/jpreg
- jpreg_maildir="--reg-mdir $GLITE_LB_EXPORT_JPREG_MAILDIR "
- [ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP "$GLITE_LB_EXPORT_JPREG_MAILDIR"
- [ -z "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] && GLITE_LB_EXPORT_JPDUMP_MAILDIR=$GLITE_LOCATION_VAR/jpdump
- jpdump_maildir="--dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR "
- [ -d "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP "$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 ...
-
-# XXX: HEAD
-# -i $pidfile $jpreg_maildir $jpdump_maildir $jpps $sandbox_maildir $creds" \
-
- su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-jp-importer \
- -i $pidfile $jpreg_maildir $jpdump_maildir $jpps $sandbox_maildir $keep_jobs \
- $creds $GLITE_JP_IMPORTER_ARGS" \
- && echo " done" || echo " FAILED"
-}
-
-stop()
-{
- if [ -f $pidfile ]; then
- pid=`cat $pidfile`
- kill $pid
- echo -n Stopping glite-jp-importer \($pid\) ...
- try=0
- while ps p $pid >/dev/null 2>&1; do
- sleep 1;
- try=`expr $try + 1`
- if [ $try = 20 ]; then
- echo " giving up after $try retries"
- return 1
- fi
- done
- echo " done"
- rm -f $pidfile
- else
- echo $pidfile does not exist - glite-jp-importer not running? >&2
- return 1
- fi
-}
-
-status()
-{
- retval=0
-
- if [ -f $pidfile ]; then
- pid=`cat $pidfile`
- if ps p $pid >/dev/null 2>&1; then
- echo glite-jp-importer running as $pid
- else
- echo glite-jp-importer not running
- retval=1
- fi
- else
- echo glite-jp-importer not running
- retval=1
- fi
-
- return $retval
-}
-
-case x$1 in
- xstart) start;;
- xstop) stop;;
- xrestart) stop; start;;
- xstatus) status;;
- x*) echo usage: $0 start,stop,restart,status >&2
- exit 1;;
-esac
+++ /dev/null
-jpimporter is a daemon which take care of all job registration from particular
-LB server, forwarding them to the JP primary service and also file uploads, which
-means sending LB dumps, sendbox files etc. to ftp server dedicated by JP PS.
-
-The daemon runs two proceses, one for registrations and another for file uploads.
-Both processes reads the local directory which has a given structure and are
-handled by glite-lb-maildir library calls.
-
-</TODO add lb_maildir docs/>
-
-Namely for the registrations, LB server creates the message describing job, its
-owner and JP primary server address and stores it into given maildir location
-(i.e. /tmp/lb_server_jpreg/). The jpimporter daemon which is running on the same
-host is periodicaly scanning this directory and whenever new messages appears,
-attempts to register this described job to JP PS.
-
-For the file upload is the jpimporter behavior almost the same except the
-message has different structure and a file to deliver must be placed in the
-filesystem.
-
-For LB dumps, there is another utility, which parses common LB dump files
-(created when purging the LB server), creates one file per every job and stores
-message describing the location, destination etc. to local directory. This
-message directory should be obviously monitored by the jpimporter again.
-
-lb_dump_exporter utility usage: lt-lb_dump_exporter [option]
- -h, --help Shows this screen.
- -d, --dump <file> Dump file location.
- File generated by the glite-lb-purge
- -s, --store <prefix> New dump files storage.
- Directory, where to store all dump files
- -j, --jpps <host:port> Target JPPS.
- jpps where should the file be uploaded
- -m, --lbmaildir <path> LB maildir path.
- Directory, where should be stored the message
- describing the file upload (read by jpimporter)
-
-jpimporter daemon usage: glite-jp-importer [option]
- -h, --help displays this screen
- -k, --key private key file
- -c, --cert certificate file
- -C, --CAdir trusted certificates directory
- -g, --debug don't run as daemon, additional diagnostics
- -p, --jpps JP primary service server
- this JPPS server is used by default, when user/lb/...
- does not specifies one
- -r, --reg-mdir path to the 'LB maildir' subtree for registrations
- This directory is scanned for the job registration
- 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
- JobRegistration/FileUpload sleeps after the unsuccessful
- scan (find no new messages)
-Examples:
-
-So, for the job registration and dump upload from the LB server, you should run the
-LB server like this:
-./glite_lb_bkserverd -c <hostcert> -k <hostkey> -S /var/tmp/purge -D /var/tmp/dump -J /tmp/lb_server_jpreg
-
-(Whenever the job is registered to the LB server, the message for jpimporter
-is stored in the /tmp/lb_server_jpreg directory.)
-
-Then you should run the jpimporter daemon on the same host:
-./glite-jp-importer -c <hostcert> -k <hostkey> -p jpps.server.address:8900 -r /tmp/lb_server_jpreg -d /tmp/lb_server_jpdump
-
-(Every job registration anounced in /tmp/lb_server_jpreg directory will be sent
-to the JP PS at the address jpps.server.address:8900.)
-
-According the dump files - on the same host should be periodicaly ran the
-glite-lb-purge utility. (Usually started by cron) Let say, that it stores the
-LB dump file /var/tmp/purge/dump_file.
-
-Then you should run (most likely in the same cron job)
-./lb_dump_exporter -d /var/tmp/purge/dump_file -s /var/tmp/dumps_per_job -j jpps.server.address:8900 -m /tmp/lb_server_jpdump
-
-(Then there is created a set of LB dump file - one per job - and according to them
-lb_dump_exporter will also notify the glite-jp-importer)
-
-
-
-
-For the sandbox files, you should use the JP client API to create messages for
-jpimporter. The function glite_jpimporter_upload_files() do the job. It takes
-one ore more files and create one tarball. Then everything works like with
-LB dumps.
-
-There is an example utility in org.glite.jp.client/examples/jpps_upload_files.c
-(staged as glite-jp-primary-upload_files).
-
-The glite_jpimporter_upload_files funftion prototype:
-
-int glite_jpimporter_upload_files(
- /* JP client context.
- * stores the error code/description
- * user can set default JP PS address there and
- * LB directory for jpimporter announcements
- */
- glite_jpcl_context_t ctx,
-
- /* JobId
- */
- const char *jobid,
- /* File list. Stored in the array of string.
- * Last item has to be NULL
- */
- const char **files,
- /* Location of the user proxy file
- */
- const char *proxy);
-
-
+++ /dev/null
-#! /bin/bash
-
-#
-# all-in-one example script for purging LB and importing the dumps to JP
-#
-# uses helper purging script glite-lb-export.sh from glite.lb.client
-#
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-
-[ -f $GLITE_LOCATION/etc/jp.conf ] && . $GLITE_LOCATION/etc/jp.conf
-[ -f $GLITE_LOCATION_VAR/etc/jp.conf ] && . $GLITE_LOCATION_VAR/etc/jp.conf
-
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-# get default values for purge and export
-PREFIX=${GLITE_LOCATION:-`dirname $0`/..}
-GLITE_LB_EXPORT_ENABLED="false" GLITE_LB_PURGE_ENABLED="false" . $PREFIX/bin/glite-lb-export.sh
-
-# job provenance server
-if [ -z "$GLITE_LB_EXPORT_JPPS" ]; then
- echo "Please specify the Job Provanance Primary Storage server."
- exit 1
-fi
-# certificates
-if [ -z "$X509_USER_CERT" -o -z "$X509_USER_KEY" ]; then
- echo "Please set X509_USER_CERT and X509_USER_KEY."
- exit 1
-fi
-# LB maildir for job registration
-if [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ]; then
- GLITE_LB_EXPORT_JPREG_MAILDIR=$GLITE_LOCATION_VAR/jpreg
- echo "GLITE_LB_EXPORT_JPREG_MAILDIR not specified (-J arguent of the bkserver), used $GLITE_LB_EXPORT_JPREG_MAILDIR"
-fi
-if [ -n "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ]; then
- sandbox_maildir="--sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR "
-fi
-# pidfile
-[ -n "$GLITE_JP_IMPORTER_PIDFILE" ] && pidfile="-i $GLITE_JP_IMPORTER_PIDFILE "
-
-CERT_ARGS="-c $X509_USER_CERT -k $X509_USER_KEY"
-LOGDIR=$GLITE_LOCATION_VAR
-GLITE_LB_EXPORT_PURGE_ARGS=${GLITE_LB_EXPORT_PURGE_ARGS:---cleared 2d --aborted 2w --cancelled 2w --other 2m}
-
-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_maildir}-g --jpps $GLITE_LB_EXPORT_JPPS $pidfile$keep_jobs$GLITE_JP_IMPORTER_ARGS > $LOGDIR/jp-importer.log 2>&1 &
-
-JP_PID=$!
-trap "kill $JP_PID; exit 0" SIGINT
-
-while [ 1 ]; do
- GLITE_LB_EXPORT_ENABLED="true" GLITE_LB_PURGE_ENABLED="true" $PREFIX/bin/glite-lb-export.sh
-
- sleep 30
-done
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-
-#include "jp_client.h"
-#include "jpimporter.h"
-
-static char *myname;
-
-void usage(void)
-{
- fprintf(stderr,
- "Usage: %s [-h][-p user_proxy][-j jobid] file [file ...]\n"
- " -h show this help\n"
- " -p <file> path to the proxy filename\n"
- " -j <jobid> jobid string\n"
- " -m <dir> location of the lb maildir structure\n"
- " -s <addr:port> JP PS server address and port\n"
- , myname);
-}
-
-int main(int argc, char **argv)
-{
- glite_jpcl_context_t ctx;
- char **files,
- *jobid = NULL,
- *proxy = NULL,
- *lbmd = NULL,
- *jpps = NULL;
- int i, j;
-
-
- myname = strrchr(argv[0],'/');
- if ( myname ) myname++; else myname = argv[0];
-
- if ( argc < 2 ) { usage(); return 1; }
- for ( i = 1; i < argc; i++ ) {
- if ( argv[i][0] != '-' ) break;
- if ( argv[i][1] == 'j' ) jobid = argv[++i];
- else if ( argv[i][1] == 'p' ) proxy = argv[++i];
- else if ( argv[i][1] == 'm' ) lbmd = argv[++i];
- else if ( argv[i][1] == 's' ) jpps = argv[++i];
- else if ( argv[i][1] == 'h' || argv[i][1] == '?' ) {usage();return 0;}
- else {usage();return 1;}
- }
-
- 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;
- }
- j = 0;
- while ( i < argc ) files[j++] = argv[i++];
-
- if ( glite_jpcl_InitContext(&ctx) ) {
- perror("glite_jpcl_InitContext()");
- return 1;
- }
-
- if ( lbmd ) glite_jpcl_SetParam(ctx, GLITE_JPCL_PARAM_LBMAILDIR, lbmd);
- if ( jpps ) glite_jpcl_SetParam(ctx, GLITE_JPCL_PARAM_JPPS, jpps);
-
- if ( glite_jpimporter_upload_files(ctx, jobid, (const char **)files, proxy) ) {
- char *errt, *errd;
-
- glite_jpcl_Error(ctx, &errt, &errd);
- printf("Error calling glite_jpimporter_upload_files()\n\t%s: %s\n",
- errt, errd);
- glite_jpcl_FreeContext(ctx);
- return 1;
- }
-
- glite_jpcl_FreeContext(ctx);
- return 0;
-}
+++ /dev/null
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <getopt.h>
-#include "jp_client.h"
-#include "jpimporter.h"
-#include "glite/lbu/maildir.h"
-#include "glite/jobid/cjobid.h"
-
-
-#define USER "Job Generator Buddy"
-#define BKSERVER "funny.zcu.cz"
-#define BKPORT 9000
-#ifndef EDG_DUMP_STORAGE
-#define EDG_DUMP_STORAGE "/tmp/dump"
-#endif
-#ifndef EDG_PURGE_STORAGE
-#define EDG_PURGE_STORAGE "/tmp/purge"
-#endif
-
-
-char *jpreg_dir;
-char *dump_dir;
-char *user;
-int do_exit = 0;
-int perf_regs, perf_dumps;
-char perf_ts[100];
-char *dump; char **dump_index; size_t dump_tokens;
-int speed = 0;
-double duration = 0.0;
-
-static struct option opts[] = {
- { "help", 0, NULL, 'h'},
- { "reg-mdir", 1, NULL, 'R'},
- { "dump-mdir", 1, NULL, 'D'},
- { "break", 1, NULL, 'b'},
- { "dump", 1, NULL, 'd'},
-// { "sandbox-mdir",1, NULL, 's'},
- { NULL, 0, NULL, 0}
-};
-static const char *get_opt_string = "hR:D:b:d:";
-
-static int register_init();
-static int register_add(const char *jobid, char **new_jobid);
-static void get_time(char *s, size_t maxs, double *t);
-static int dump_init(const char *start_jobid, const char *filenmae);
-static int dump_add(const char *filename, const char *jobid);
-static void dump_done();
-
-
-static void handler(int sig) {
- do_exit = sig;
- signal(sig, SIG_DFL);
-}
-
-
-static void usage(const char *program) {
- fprintf(stderr, "Usage: %s [OPTIONS]\n"
- "\t-R,--reg-mdir\n"
- "\t-D,--dump-mdir\n"
-// "\t-s,--sandbox-mdir\n"
- "\t-b,--break speed (jobs/day)\n"
- "\t-d,--dump dump file\n"
- , program);
-}
-
-
-int main(int argc, char *argv[]) {
- char start_jobid[256], stop_jobid[256], *fn;
- double ts, ts2, last, now;
- int ret, opt;
- FILE *f;
- char *jobid, *dumpfile = NULL;
-
- while ((opt = getopt_long(argc, argv, get_opt_string, opts, NULL)) != EOF)
- switch (opt) {
- case 'h': usage(argv[0]); return 0;
- case 'R': jpreg_dir = strdup(optarg); break;
- case 'D': dump_dir = strdup(optarg); break;
- case 'b': speed = atoi(optarg); if (speed) duration = 24.0*3600.0*1000000.0/speed; break;
- case 'd': dumpfile = optarg; break;
- default: printf("opt: %c\n", opt); usage(argv[0]); return 1;
- }
-
- get_time(perf_ts, sizeof(perf_ts), &ts);
- snprintf(start_jobid, sizeof(start_jobid), PERF_JOBID_START_PREFIX "%s", perf_ts);
- snprintf(stop_jobid, sizeof(stop_jobid), PERF_JOBID_STOP_PREFIX "%s", perf_ts);
-
- if ((ret = register_init()) != 0) return ret;
- if ((ret = dump_init(start_jobid, dumpfile)) != 0) return ret;
- if ((ret = register_add(start_jobid, NULL)) != 0) return ret;
- if (signal(SIGINT, handler) == SIG_ERR) {
- ret = errno;
- fprintf(stderr, "%s: can't set signal handler: %s\n", __FUNCTION__, strerror(errno));
- return ret;
- }
- if (speed) printf("speed: %d jobs/day (delay %lf)\n", speed, duration / 1000000.0);
- else printf("speed: unlimited\n");
- printf("dump: %s\n", dumpfile ? dumpfile : "(none)");
- printf("reg-mdir: %s\n", jpreg_dir);
- printf("dump-mdir: %s\n", dump_dir);
- printf("start: %lf\n", ts);
- printf("%s\n", start_jobid);
- last = ts;
- while (!do_exit) {
- struct timeval tv;
-
- if ((ret = register_add(NULL, &jobid)) != 0) return ret;
-// printf("%s\n", jobid);
- if (dumpfile) {
- if ((ret = dump_add(dumpfile, jobid)) != 0) return ret;
-// printf(" dumped %s\n", dumpfile);
- }
- free(jobid);
- gettimeofday(&tv, NULL);
- now = tv.tv_sec + (double)tv.tv_usec / 1000000.0;
- if (now < last + duration) usleep(last + duration - now);
- last = now;
- }
- if ((ret = register_add(stop_jobid, NULL)) != 0) return ret;
- asprintf(&fn, PERF_STOP_FILE_FORMAT, perf_ts);
- if ((f = fopen(fn, "wt")) == NULL) {
- ret = errno;
- free(fn);
- fprintf(stderr, "Can' create file '%s': %s\n", fn, strerror(errno));
- return ret;
- }
- free(fn);
- fprintf(f, "reg-imp\t%d\n", perf_regs);
- fprintf(f, "dump-imp\t%d\n", perf_dumps);
- fclose(f);
- dump_done();
-
- get_time(NULL, -1, &ts2);
- printf("stop: %lf\n", ts2);
- printf("regs: %d (%lf jobs/day)\n", perf_regs, 86400.0 * perf_regs / (ts2-ts));
- printf("dumps: %d (%lf jobs/day)\n", perf_dumps, 86400.0 * perf_dumps / (ts2-ts));
- printf("%s\n", stop_jobid);
-
- return 0;
-}
-
-
-static void get_time(char *s, size_t maxs, double *t) {
- struct timeval tv;
- struct tm tm;
-
- gettimeofday(&tv, NULL);
- if (t) *t = tv.tv_sec + (double)tv.tv_usec / 1000000.0;
- gmtime_r(&tv.tv_sec, &tm);
- if (s && maxs > 0) strftime(s, maxs, "%FT%TZ", &tm);
-}
-
-
-static int register_init() {
- char *env;
-
- if (!jpreg_dir) {
- env = getenv("GLITE_LB_EXPORT_JPREG_MAILDIR");
- if (env) jpreg_dir = strdup(env);
- else jpreg_dir = strdup(GLITE_REG_IMPORTER_MDIR);
- }
-
-
- // TODO: better from certificate
- env = getenv("GLITE_USER");
- if (!env) env = USER;
- user = strdup(env);
-
- if (glite_lbu_MaildirInit(jpreg_dir) != 0) {
- fprintf(stderr, "maildir init on %s failed\n", jpreg_dir);
- return EIO;
- }
-
- perf_regs = 0;
- return 0;
-}
-
-
-static int register_add(const char *jobid, char **new_jobid) {
- glite_jobid_t j;
- char *tmpjobid, *msg;
-
- if (!jobid) {
- if (glite_jobid_create(BKSERVER, BKPORT, &j) != 0 || (tmpjobid = glite_jobid_unparse(j)) == NULL) {
- fprintf(stderr, "Can't create jobid\n");
- return EIO;
- }
- glite_jobid_free(j);
- } else tmpjobid = strdup(jobid);
- asprintf(&msg, "%s\n%s", tmpjobid, user);
- if (new_jobid) *new_jobid = tmpjobid;
- else free(tmpjobid);
- if (glite_lbu_MaildirStoreMsg(jpreg_dir, BKSERVER, msg) != 0) {
- fprintf(stderr, "Can't store message: %s\n", lbm_errdesc);
- return EIO;
- }
- free(msg);
-
- perf_regs++;
- return 0;
-}
-
-
-static int dump_init(const char *start_jobid, const char *filename) {
- char *env, *ptr, *delim;
- FILE *f;
- long ssize;
- size_t i, dump_maxtokens, size;
- int ret;
-
- unlink(PERF_START_FILE);
-
- dump = NULL;
- dump_index = NULL;
- dump_tokens = 0;
- if (filename) {
- if ((f = fopen(filename, "rt")) == NULL) {
- fprintf(stderr, "Can't open '%s': %s\n", filename, strerror(errno));
- return EIO;
- }
- if (fseek(f, 0, SEEK_END) == -1 || (ssize = ftell(f)) == -1 || fseek(f, 0, SEEK_SET) == -1) {
- fprintf(stderr, "Can't get position in '%s': %s\n", filename, strerror(errno));
- return EIO;
- }
- dump = malloc(size = ssize);
- if (fread(dump, size, 1, f) != 1) {
- ret = errno;
- fprintf(stderr, "Error reading %ld bytes from file: %s\n", ssize, strerror(errno));
- return ret;
- }
- fclose(f);
-
- dump_maxtokens = 1024;
- dump_index = malloc(sizeof(char *) * dump_maxtokens);
- i = 0;
- ptr = dump;
- do {
- if (dump_tokens >= dump_maxtokens) {
- dump_maxtokens *= 2;
- dump_index = realloc(dump_index, sizeof(char *) * dump_maxtokens);
- }
- delim = strstr(ptr, "DG.JOBID=\"");
- if (delim != ptr) {
- dump_index[dump_tokens++] = ptr;
- if (delim) {
- delim[10] = '\0';
- ptr = delim + 11;
- } else ptr = NULL;
- }
- if (ptr) ptr = strchr(ptr, '\"');
- } while (ptr && ptr[0]);
- }
-//for (i = 0; i < dump_tokens; i++) printf("####%s\n", dump_index[i]);
-
- if (!dump_dir) {
- // wrong purging to GLITE_LB_EXPORT_DUMPDIR on older versions
- env = getenv("GLITE_LB_EXPORT_PURGEDIR");
- if (env) dump_dir = strdup(env);
- else dump_dir = strdup(EDG_DUMP_STORAGE);
- }
- mkdir(dump_dir, 0755);
- perf_dumps = 0;
-
- if ((f = fopen(PERF_START_FILE, "wt")) == NULL) {
- fprintf(stderr, "Can't create file '" PERF_START_FILE "': %s\n", strerror(errno));
- return EIO;
- }
- if (start_jobid) fprintf(f, "%s\n", start_jobid);
- fclose(f);
-
- return 0;
-}
-
-
-static int dump_add(const char *filename, const char *jobid) {
- char *fn;
- int ret;
- size_t i;
- FILE *f;
-
- ret = 0;
- asprintf(&fn, "%s/mill-test-%s-%06d", dump_dir, perf_ts, perf_dumps);
- if ((f = fopen(fn , "wt")) == NULL) {
- ret = errno;
- fprintf(stderr, "Can't create file '%s': %s\n", fn, strerror(errno));
- goto err;
- }
- for (i = 0; i < dump_tokens; i++) {
- if (fputs(dump_index[i], f) == EOF || (i + 1 < dump_tokens && (fputs(jobid, f) == EOF))) {
- ret = errno;
- fprintf(stderr, "Can't write to '%s': %s\n", fn, strerror(errno));
- goto err_close;
- }
- }
-
- perf_dumps++;
-err_close:
- fclose(f);
-err:
- free(fn);
- return ret;
-}
-
-
-static void dump_done() {
- free(dump_index);
- free(dump);
- dump_tokens = 0;
-}
+++ /dev/null
-#ifndef __GLITE_JP_CLIENT__
-#define __GLITE_JP_CLIENT__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct _glite_jpcl_context_t *glite_jpcl_context_t;
-
-typedef enum _glite_jpcl_ctx_param_t {
- GLITE_JPCL_PARAM_JPPS,
- GLITE_JPCL_PARAM_LBMAILDIR
-} glite_jpcl_ctx_param_t;
-
-extern int glite_jpcl_InitContext(glite_jpcl_context_t *);
-extern void glite_jpcl_FreeContext(glite_jpcl_context_t);
-
-extern int glite_jpcl_SetParam(
- glite_jpcl_context_t ctx,
- int param, ... );
-
-extern int glite_jpcl_Error(
- glite_jpcl_context_t ctx,
- char **errt,
- char **errd);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-#ifndef __GLITE_JPCLIENT_CONTEXT_INT
-#define __GLITE_JPCLIENT_CONTEXT_INT
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct _glite_jpcl_context_t {
- int errCode;
- char *errDesc;
-
- char *jpps;
- char *lbmd_dir;
-};
-
-extern int glite_jpcl_SetError(glite_jpcl_context_t, int, const char *);
-extern int glite_jpcl_ResetError(glite_jpcl_context_t);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-#ifndef __GLITE_JPIMPORTER__
-#define __GLITE_JPIMPORTER__
-
-#ifndef GLITE_REG_IMPORTER_MDIR
-#define GLITE_REG_IMPORTER_MDIR "/var/glite/jpreg"
-#endif
-
-#ifndef GLITE_DUMP_IMPORTER_MDIR
-#define GLITE_DUMP_IMPORTER_MDIR "/var/glite/jpdump"
-#endif
-
-#ifndef GLITE_SANDBOX_IMPORTER_MDIR
-#define GLITE_SANDBOX_IMPORTER_MDIR "/var/glite/jpsandbox"
-#endif
-
-#define PERF_JOBID_START_PREFIX "https://start.megajob/START-"
-#define PERF_JOBID_STOP_PREFIX "https://stop.megajob/STOP-"
-#define PERF_START_FILE "/tmp/jp_megajob_start"
-#define PERF_STOP_FILE_FORMAT "/tmp/jp_megajob_%s"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int glite_jpimporter_upload_files(
- glite_jpcl_context_t ctx,
- const char *jobid,
- const char **files,
- const char *proxy);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-#Thu Dec 15 09:23:26 CET 2005
-module.build=0
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Configuration options for the gLite JP client module
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="LB Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-gsoap_prefix=${with.gsoap.prefix}
-gsoap_version=${ext.gsoap.version}
-mysql_prefix=${with.mysql.prefix}
-mysql_version=${ext.mysql.version}
-libtar=${with.libtar.prefix}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-cppunit=${with.cppunit.prefix}
-jpproject=${subsystem.project.dir}
-project=${component.project.dir}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP Client component
--->
-
-<project name="JP Client component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="client" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-# $Header$
-module.version=1.2.1
-module.age=1
+++ /dev/null
-#include <stdlib.h>
-#include <errno.h>
-#include <assert.h>
-#include <stdarg.h>
-#include <string.h>
-
-#include "jp_client.h"
-#include "jpcl_ctx_int.h"
-#include "jpimporter.h"
-
-
-int glite_jpcl_InitContext(glite_jpcl_context_t *ctx)
-{
- glite_jpcl_context_t out = (glite_jpcl_context_t) malloc(sizeof(*out));
- if (!out) return ENOMEM;
- memset(out, 0, sizeof(*out));
- assert(out->errDesc == NULL);
-
- *ctx = out;
- return 0;
-}
-
-void glite_jpcl_FreeContext(glite_jpcl_context_t ctx)
-{
- free(ctx->jpps);
- free(ctx->lbmd_dir);
-}
-
-int glite_jpcl_SetParam(glite_jpcl_context_t ctx, int param, ...)
-{
- va_list ap;
-
- va_start(ap, param);
- switch ( param ) {
- case GLITE_JPCL_PARAM_JPPS:
- if ( ctx->jpps ) free(ctx->jpps);
- ctx->jpps = va_arg(ap, char *);
- ctx->jpps = strdup(ctx->jpps);
- break;
- case GLITE_JPCL_PARAM_LBMAILDIR:
- if ( ctx->lbmd_dir ) free(ctx->lbmd_dir);
- ctx->lbmd_dir = strdup(va_arg(ap, char *));
- break;
- default:
- return glite_jpcl_SetError(ctx, EINVAL, "unknown parameter");
- }
-
- return 0;
-}
-
-int glite_jpcl_Error( glite_jpcl_context_t ctx, char **errt, char **errd)
-{
- if ( errt ) *errt = strdup(strerror(ctx->errCode));
- if ( errd ) *errd = (ctx->errDesc)? strdup(ctx->errDesc): NULL;
- return ctx->errCode;
-}
-
-int glite_jpcl_SetError(glite_jpcl_context_t ctx, int code, const char *desc)
-{
- glite_jpcl_ResetError(ctx);
- if ( code ) {
- ctx->errCode = code;
- if ( desc ) ctx->errDesc = (char *) strdup(desc);
- }
-
- return ctx->errCode;
-}
-
-int glite_jpcl_ResetError(glite_jpcl_context_t ctx)
-{
- if ( ctx->errDesc ) free(ctx->errDesc);
- ctx->errDesc = NULL;
- ctx->errCode = 0;
-
- return ctx->errCode;
-}
+++ /dev/null
-#include <sys/types.h>
-#include <unistd.h>
-#include <time.h>
-#include <errno.h>
-#include <assert.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-#define COMPILE_WITH_LIBTAR
-#ifdef COMPILE_WITH_LIBTAR
-# include <libtar.h>
-#endif
-
-#include "glite/lbu/maildir.h"
-
-#include "jp_client.h"
-#include "jpimporter.h"
-#include "jpcl_ctx_int.h"
-
-#define TEMP_FILE_PREFIX "/tmp/jpimporter"
-
-int glite_jpimporter_upload_files(
- glite_jpcl_context_t ctx,
- const char *jobid,
- const char **files,
- const char *proxy)
-{
-#ifdef COMPILE_WITH_LIBTAR
- TAR *t = NULL;
-#endif
- char *msg = NULL,
- *errs = NULL;
- char archive[PATH_MAX];
- int fd = -1,
- rv = 0,
- i;
-
-
- assert((files != NULL) && (files[0] != NULL));
- assert(jobid != NULL);
- /* TODO: get the user proxy if it is not specified and find its location */
- assert(proxy != NULL);
-
- if ( glite_lbu_MaildirInit(ctx->lbmd_dir) ) {
- asprintf(&errs, "glite_lbu_MaildirInit(): %s", lbm_errdesc);
- glite_jpcl_SetError(ctx, errno, errs);
- free(errs);
- return -1;
- }
-
- i = 0;
- do {
- if ( ++i > 10 ) {
- glite_jpcl_SetError(ctx, ECANCELED, "Can't create temporary tar file");
- return -1;
- }
- snprintf(archive, PATH_MAX, "%s_%d_%ld.tar",
- TEMP_FILE_PREFIX, getpid(), time(NULL));
- if ( (fd = open(archive, O_CREAT|O_EXCL|O_WRONLY, 00600)) < 0 ) {
- if ( errno == EEXIST ) { sleep(2); continue; }
- asprintf(&errs, "Can't create tar file %s", archive);
- glite_jpcl_SetError(ctx, ECANCELED, errs);
- free(errs);
- return -1;
- }
- } while ( fd < 0 );
-
-#ifdef COMPILE_WITH_LIBTAR
- if ( tar_fdopen(&t, fd, archive, NULL, O_WRONLY, 0, TAR_GNU) < 0 ) {
- asprintf(&errs, "Can't create tar archive %s", archive);
- glite_jpcl_SetError(ctx, errno, errs);
- rv = -1;
- goto cleanup;
- }
-
- for ( i = 0; files[i]; i++ ) {
- char *s = (char *)files[i];
- if ( tar_append_file(t, s, (s[0]=='/')? s+1: s) < 0 ) {
- asprintf(&errs, "Can't append file into tar archive %s", archive);
- glite_jpcl_SetError(ctx, errno, errs);
- rv = -1;
- goto cleanup;
- }
- }
-#endif
-
- if ( ctx->jpps )
- asprintf(&msg, "jobid\t%s\nfile\t%s\nproxy\t%s\njpps\t%s\n",
- jobid, archive, proxy, ctx->jpps);
- else
- asprintf(&msg, "jobid\t%s\nfile\t%s\nproxy\t%s\n",
- jobid, archive, proxy);
-
- if ( glite_lbu_MaildirStoreMsg(ctx->lbmd_dir, "localhost", msg) ) {
- asprintf(&errs, "glite_lbu_MaildirStoreMsg(): %s", lbm_errdesc);
- glite_jpcl_SetError(ctx, errno, errs);
- rv = -1;
- goto cleanup;
- }
-
-
-cleanup:
-#ifdef COMPILE_WITH_LIBTAR
- if ( t ) tar_close(t);
- else close(fd);
-#else
- close(fd);
-#endif
- if ( rv ) unlink(archive);
- free(errs);
- free(msg);
-
- return rv;
-}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <signal.h>
-#include <string.h>
-#include <assert.h>
-#include <linux/limits.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <syslog.h>
-#include <fcntl.h>
-#include <libgen.h>
-#include <ctype.h>
-
-#include "glite/lbu/maildir.h"
-
-#include "jpps_H.h"
-#include "jpps_.nsmap"
-
-#include "jptype_map.h"
-#include "glite/security/glite_gsplugin.h"
-#include "glite/security/glite_gscompat.h"
-#include "glite/jp/known_attr.h"
-
-#include "globus_ftp_client.h"
-#include "jp_client.h"
-#include "jpimporter.h"
-
-#if GSOAP_VERSION <= 20602
-#define soap_call___jpsrv__RegisterJob soap_call___ns1__RegisterJob
-#endif
-
-
-typedef struct {
- char *key;
- char *val;
-} msg_pattern_t;
-
-#ifndef dprintf
-#define dprintf(FMT, ARGS...) { if (debug) printf(FMT, ##ARGS); }
-#endif
-
-#define check_soap_fault(SOAP, ERR) glite_jp_clientCheckFault((SOAP), (ERR), name, 1)
-
-#ifndef GLITE_JPIMPORTER_PIDFILE
-#define GLITE_JPIMPORTER_PIDFILE "/var/run/glite-jpimporter.pid"
-#endif
-
-#ifndef GLITE_JPPS
-#define GLITE_JPPS "http://localhost:8901"
-#endif
-
-#define MAX_REG_CONNS 500
-#define JPPS_NO_RESPONSE_TIMEOUT 120
-#define JPREG_REPEAT_TIMEOUT 300
-#define JPREG_GIVUP_TIMEOUT 3000
-#define JP_REPEAT_TIMEOUT 360
-#define JP_GIVUP_TIMEOUT 3600
-#define PID_POOL_SIZE 20
-#define DEFAULT_DUMP_SLAVES_NUMBER 1
-
-
-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 char *store = NULL;
-static struct soap *soap;
-
-static time_t cert_mtime = 0;
-static char *server_cert = NULL,
- *server_key = NULL,
- *cadir = NULL;
-static edg_wll_GssCred mycred = NULL;
-#ifdef JP_PERF
-typedef struct {
- char *id, *name;
- long int count, limit;
- double start, end;
-} perf_t;
-
-int sink = 0;
-perf_t perf = {name:NULL,};
-#endif
-static int gftp_initialized = 0;
-static globus_ftp_client_handle_t hnd;
-
-
-static struct option opts[] = {
- { "help", 0, NULL, 'h'},
- { "cert", 1, NULL, 'c'},
- { "key", 1, NULL, 'k'},
- { "CAdir", 1, NULL, 'C'},
- { "debug", 0, NULL, 'g'},
- { "jpps", 1, NULL, 'p'},
- { "reg-mdir", 1, NULL, 'r'},
- { "dump-mdir", 1, NULL, 'd'},
- { "dump-slaves", 1, NULL, 'D'},
- { "sandbox-mdir",1, NULL, 's'},
- { "pidfile", 1, NULL, 'i'},
- { "poll", 1, NULL, 't'},
- { "store", 1, NULL, 'S'},
- { "store", 1, NULL, 'S'},
-#ifdef JP_PERF
- { "perf-sink", 1, NULL, 'K'},
-#endif
- { NULL, 0, NULL, 0}
-};
-
-static const char *get_opt_string = "hgp:r:d:D:s:i:t:c:k:C:"
-#ifdef JP_PERF
- "K:"
-#endif
-;
-
-#include "glite/jp/ws_fault.c"
-
-#ifdef JP_PERF
-static void stats_init(perf_t *perf, const char *name);
-static void stats_set_jobid(perf_t *perf, const char *jobid);
-static void stats_get_limit(perf_t *perf, const char *name);
-static void stats_done(perf_t *perf);
-#endif
-
-static void usage(char *me)
-{
- fprintf(stderr,"usage: %s [option]\n"
- "\t-h, --help displays this screen\n"
- "\t-k, --key private key file\n"
- "\t-c, --cert certificate file\n"
- "\t-C, --CAdir trusted certificates directory\n"
- "\t-g, --debug don't run as daemon, additional diagnostics\n"
- "\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-D, --dump-slaves number of slaves processing 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"
-#ifdef JP_PERF
- "\t-K, --perf-sink 1=stats, 2=without WS calls, 3=stats+without WS\n"
-#endif
- , me);
-}
-
-static void catchsig(int sig)
-{
- die = sig;
-}
-
-static void catch_chld(int sig __attribute__((unused)))
-{
- child_died = 1;
-}
-
-
-static int slave(int (*)(void), const char *);
-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);
-static int refresh_connection(struct soap *soap);
-
-
-int main(int argc, char *argv[])
-{
- edg_wll_GssStatus gss_code;
- struct sigaction sa;
- sigset_t sset;
- FILE *fpid;
- pid_t reg_pid, sandbox_pid;
- pid_t dump_pids[PID_POOL_SIZE];
- int dump_slaves = DEFAULT_DUMP_SLAVES_NUMBER, i;
- int opt;
- char *name,
- pidfile[PATH_MAX] = GLITE_JPIMPORTER_PIDFILE;
- glite_gsplugin_Context plugin_ctx;
-
- name = strrchr(argv[0],'/');
- if (name) name++; else name = argv[0];
-
- if ( geteuid() )
- snprintf(pidfile, sizeof pidfile, "%s/glite_jpimporter.pid", getenv("HOME"));
-
- while ( (opt = getopt_long(argc, argv, get_opt_string, opts, NULL)) != EOF )
- switch ( opt ) {
- case 'g': debug = 1; break;
- case 'h': usage(name); return 0;
- case 'c': server_cert = optarg; break;
- case 'k': server_key = optarg; break;
- 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 'D': dump_slaves = atoi(optarg); break;
- case 's': strcpy(sandbox_mdir, optarg); break;
- case 'i': strcpy(pidfile, optarg); break;
-#ifdef JP_PERF
- case 'K': sink = atoi(optarg); break;
-#endif
- case '?': usage(name); return 1;
- }
- if ( optind < argc ) { usage(name); return 1; }
-
- if (dump_slaves > PID_POOL_SIZE) {
- fprintf(stderr,"Maximum number of dump slaves is %d\n", PID_POOL_SIZE);
- return(1);
- }
-
- memset(&dump_pids,0,sizeof(dump_pids));
-
- setlinebuf(stdout);
- setlinebuf(stderr);
-
- fpid = fopen(pidfile,"r");
- if ( fpid ) {
- int opid = -1;
-
- if ( fscanf(fpid,"%d",&opid) == 1 ) {
- if ( !kill(opid,0) ) {
- fprintf(stderr,"%s: another instance running, pid = %d\n",argv[0],opid);
- return 1;
- }
- else if (errno != ESRCH) { perror("kill()"); return 1; }
- }
- fclose(fpid);
- } else if (errno != ENOENT) { perror(pidfile); return 1; }
- fpid = fopen(pidfile, "w");
- if ( !fpid ) { perror(pidfile); return 1; }
- fprintf(fpid, "%d", getpid());
- fclose(fpid);
-
- glite_lbu_MaildirInit(reg_mdir);
- glite_lbu_MaildirInit(dump_mdir);
- glite_lbu_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); }
-
- fpid = fopen(pidfile,"w");
- if ( !fpid ) { perror(pidfile); return 1; }
- fprintf(fpid, "%d", getpid());
- fclose(fpid);
- openlog(name, LOG_PID, LOG_DAEMON);
- } else { setpgid(0, getpid()); }
-
- dprintf("Master pid %d\n", getpid());
-
- if ( globus_module_activate(GLOBUS_FTP_CLIENT_MODULE) != GLOBUS_SUCCESS ) {
- dprintf("[master] Could not activate ftp client module\n");
- if (!debug) syslog(LOG_INFO, "Could not activate ftp client module\n");
- exit(1);
- } else dprintf("[master] Ftp client module activated\n");
-
- if ( !server_cert || !server_key )
- fprintf(stderr, "%s: key or certificate file not specified"
- " - unable to watch them for changes!\n", argv[0]);
- if ( cadir ) setenv("X509_CERT_DIR", cadir, 1);
- edg_wll_gss_watch_creds(server_cert, &cert_mtime);
- if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &mycred, &gss_code) ) {
- dprintf("[master] Server identity: %s\n", mycred->name);
- } else {
- char *errmsg;
- edg_wll_gss_get_error(&gss_code, "edg_wll_gss_acquire_cred_gsi()", &errmsg);
- dprintf("[master] %s\n", errmsg);
- free(errmsg);
- dprintf("[master] Running unauthenticated\n");
- }
-
- memset(&sa, 0, sizeof(sa)); assert(sa.sa_handler == NULL);
- sa.sa_handler = catchsig;
- sigaction(SIGINT, &sa, NULL);
- sigaction(SIGTERM, &sa, NULL);
-
- sa.sa_handler = catch_chld;
- sigaction(SIGCHLD, &sa, NULL);
-
- sa.sa_handler = SIG_IGN;
- sigaction(SIGUSR1, &sa, NULL);
-
- sigemptyset(&sset);
- sigaddset(&sset, SIGCHLD);
- sigaddset(&sset, SIGTERM);
- sigaddset(&sset, SIGINT);
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- soap = calloc(1, sizeof *soap);
- soap_init2(soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);
- soap_set_omode(soap, SOAP_IO_BUFFER);
- soap_set_namespaces(soap, jpps__namespaces);
-
- glite_gsplugin_init_context(&plugin_ctx);
- glite_gsplugin_set_credential(plugin_ctx, mycred);
- soap_register_plugin_arg(soap, glite_gsplugin,plugin_ctx);
-
- if ( (reg_pid = slave(reg_importer, "reg-imp")) < 0 ) {
- perror("starting reg importer slave");
- exit(1);
- }
- for (i=0; i < dump_slaves; i++) {
- if ( (dump_pids[i] = slave(dump_importer, "dump-imp")) < 0 ) {
- 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 ) {
-
- sigprocmask(SIG_UNBLOCK, &sset, NULL);
- sleep(5);
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- if ( child_died ) {
- int pid;
-
- while ( (pid = waitpid(-1, NULL, WNOHANG)) > 0 ) {
- if ( !die ) {
- if ( pid == reg_pid ) {
- dprintf("[master] reg importer slave died [%d]\n", pid);
- if (!debug) syslog(LOG_INFO, "reg importer slave died [%d]\n", die);
- if ( (reg_pid = slave(reg_importer, "reg-imp")) < 0 ) {
- perror("starting reg importer slave");
- kill(0, SIGINT);
- exit(1);
- }
- dprintf("[master] reg importer slave restarted [%d]\n", reg_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);
- } else /* must be in dump_pids */ {
- dprintf("[master] dump importer slave died [%d]\n", pid);
- if (!debug) syslog(LOG_INFO, "dump importer slave died [%d]\n", die);
- for (i=0; (i < dump_slaves) && (pid != dump_pids[i]); i++);
- assert(i < dump_slaves); // pid should be in pool
-
- if ( (dump_pids[i] = slave(dump_importer, "dump-imp")) < 0 ) {
- perror("starting dump importer slave");
- kill(0, SIGINT);
- exit(1);
- }
- dprintf("[master] dump importer slave restarted [%d]\n", dump_pids[i]);
-
- }
-
- }
- }
- child_died = 0;
- continue;
- }
- }
-
- dprintf("[master] Terminating on signal %d\n", die);
- if (!debug) syslog(LOG_INFO, "Terminating on signal %d\n", die);
- kill(0, die);
-
- globus_module_deactivate_all();
- unlink(pidfile);
-
- return 0;
-}
-
-static int slave(int (*fn)(void), const char *nm)
-{
- struct sigaction sa;
- sigset_t sset;
- int pid,
- conn_cnt = 0;
-
-
- if ( (pid = fork()) ) return pid;
-
- asprintf(&name,"%s %d",nm,getpid());
- memset(&sa, 0, sizeof(sa)); assert(sa.sa_handler == NULL);
- sa.sa_handler = catchsig;
- sigaction(SIGUSR1, &sa, NULL);
-
- sigemptyset(&sset);
- sigaddset(&sset, SIGTERM);
- sigaddset(&sset, SIGINT);
- sigaddset(&sset, SIGUSR1);
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- dprintf("[%s] slave started - pid [%d]\n", name, getpid());
-
-#ifdef JP_PERF
- while ( !die && (conn_cnt < MAX_REG_CONNS || (sink & 1)) ) {
-#else
- while ( !die && (conn_cnt < MAX_REG_CONNS) ) {
-#endif
- int ret = fn();
-
- if ( ret > 0 ) conn_cnt++;
- else if ( ret < 0 ) exit(1);
- else if ( ret == 0 ) {
- sigprocmask(SIG_UNBLOCK, &sset, NULL);
- sleep(poll);
- sigprocmask(SIG_BLOCK, &sset, NULL);
- }
- }
-
- if ( die ) {
- dprintf("[%s] %d: Terminating on signal %d\n", name, getpid(), die);
- if ( !debug ) syslog(LOG_INFO, "Terminating on signal %d", die);
- }
- dprintf("[%s] Terminating after %d connections\n", name, conn_cnt);
- if ( !debug ) syslog(LOG_INFO, "Terminating after %d connections", conn_cnt);
-
- if (gftp_initialized--)
- globus_ftp_client_handle_destroy(&hnd);
-
- exit(0);
-}
-
-
-static int reg_importer(void)
-{
- struct _jpelem__RegisterJob in;
- struct _jpelem__RegisterJobResponse empty;
- int ret;
- static int readnew = 1;
- char *msg = NULL,
- *fname = NULL,
- *aux;
-
- if ( readnew ) ret = glite_lbu_MaildirTransStart(reg_mdir, &msg, &fname);
- else ret = glite_lbu_MaildirRetryTransStart(reg_mdir, (time_t)JPREG_REPEAT_TIMEOUT, (time_t)JPREG_GIVUP_TIMEOUT, &msg, &fname);
- if ( !ret ) {
- readnew = !readnew;
- if ( readnew ) ret = glite_lbu_MaildirTransStart(reg_mdir, &msg, &fname);
- else ret = glite_lbu_MaildirRetryTransStart(reg_mdir, (time_t)JPREG_REPEAT_TIMEOUT, (time_t)JPREG_GIVUP_TIMEOUT, &msg, &fname);
- if ( !ret ) {
- readnew = !readnew;
- return 0;
- }
- }
-
- if ( ret < 0 ) {
- dprintf("[%s] glite_lbu_MaildirTransStart: %s (%s)\n", name, strerror(errno), lbm_errdesc);
- if ( !debug ) syslog(LOG_ERR, "glite_lbu_MaildirTransStart: %s (%s)", strerror(errno), lbm_errdesc);
- return -1;
- } else if ( ret > 0 ) {
- dprintf("[%s] JP registration request received\n", name);
- if ( !debug ) syslog(LOG_INFO, "JP registration request received\n");
-
- ret = 0;
- if ( !(aux = strchr(msg, '\n')) ) {
- dprintf("[%s] Wrong format of message!\n", name);
- if ( !debug ) syslog(LOG_ERR, "Wrong format of message\n");
- ret = 0;
- } else do {
- *aux++ = '\0';
- in.job = msg;
- in.owner = aux;
- dprintf("[%s] Registering '%s'\n", name, msg);
- if ( !debug ) syslog(LOG_INFO, "Registering '%s'\n", msg);
-#ifdef JP_PERF
- if ((sink & 1)) {
- if (strncasecmp(msg, PERF_JOBID_START_PREFIX, sizeof(PERF_JOBID_START_PREFIX) - 1) == 0) {
- stats_init(&perf, name);
- stats_set_jobid(&perf, msg);
- }
- if (perf.name && !perf.limit) stats_get_limit(&perf, name);
- }
- if (!(sink & 2)) {
-#endif
- refresh_connection(soap);
- ret = soap_call___jpsrv__RegisterJob(soap, jpps, "", &in, &empty);
- if ( (ret = check_soap_fault(soap, ret)) ) break;
-#ifdef JP_PERF
- } else ret = 0;
- if (perf.name && ret == 0) {
- perf.count++;
- if (perf.limit) {
- dprintf("[%s statistics] done %ld/%ld\n", name, perf.count, perf.limit);
- if (perf.count >= perf.limit) stats_done(&perf);
- } else
- dprintf("[%s statistics] done %ld/no limit\n", name, perf.count);
- }
-#endif
- } while (0);
- glite_lbu_MaildirTransEnd(reg_mdir, fname, ret? LBMD_TRANS_FAILED_RETRY: LBMD_TRANS_OK);
- free(fname);
- free(msg);
- return 1;
- }
-
- return 0;
-}
-
-static int dump_importer(void)
-{
- struct _jpelem__StartUpload su_in;
- struct _jpelem__StartUploadResponse su_out;
- struct _jpelem__CommitUpload cu_in;
- struct _jpelem__CommitUploadResponse empty;
- struct _jpelem__RegisterJob rj_in;
- struct _jpelem__RegisterJobResponse rj_empty;
- struct _jpelem__GetJobAttributes gja_in;
- struct _jpelem__GetJobAttributesResponse gja_out;
- static int readnew = 1;
- char *msg = NULL,
- *fname = NULL,
- *bname;
- char fspec[PATH_MAX];
- int ret, retry_upload, jperrno;
- 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 = glite_lbu_MaildirTransStart(dump_mdir, &msg, &fname);
- else ret = glite_lbu_MaildirRetryTransStart(dump_mdir, (time_t)JP_REPEAT_TIMEOUT, (time_t)JP_GIVUP_TIMEOUT, &msg, &fname);
- if ( !ret ) {
- readnew = !readnew;
- if ( readnew ) ret = glite_lbu_MaildirTransStart(dump_mdir, &msg, &fname);
- else ret = glite_lbu_MaildirRetryTransStart(dump_mdir, (time_t)JP_REPEAT_TIMEOUT, (time_t)JP_GIVUP_TIMEOUT, &msg, &fname);
- if ( !ret ) {
- readnew = !readnew;
- return 0;
- }
- }
-
- if ( ret < 0 ) {
- dprintf("[%s] glite_lbu_MaildirTransStart: %s (%s)\n", name, strerror(errno), lbm_errdesc);
- if ( !debug ) syslog(LOG_ERR, "glite_lbu_MaildirTransStart: %s (%s)", strerror(errno), lbm_errdesc);
- return -1;
- }
-
- dprintf("[%s] dump JP import request received\n", name);
- if ( !debug ) syslog(LOG_INFO, "dump JP import request received");
-
- soap_begin(soap);
-
- 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;
- su_in.class_ = "urn:org.glite.jp.primary:lb";
- su_in.name = NULL;
- su_in.commitBefore = 1000 + time(NULL);
- su_in.contentType = "text/lb";
-#ifdef JP_PERF
- if ((sink & 1)) {
- /* statistics started by file, ended by count limit (from the appropriate result fikle) */
- FILE *f;
- char item[200];
-
- /* starter */
- if (!perf.name) {
- f = fopen(PERF_START_FILE, "rt");
- if (f) {
- stats_init(&perf, name);
- fscanf(f, "%s", item);
- fclose(f);
- unlink(PERF_START_FILE);
- stats_set_jobid(&perf, item);
- } else
- dprintf("[%s statistics]: not started/too much dumps: %s\n", name, strerror(errno));
- }
- if (perf.name && !perf.limit) stats_get_limit(&perf, name);
- }
- if (!(sink & 2)) {
-#endif
- retry_upload = 2;
- do {
- dprintf("[%s] Importing LB dump file '%s'\n", name, tab[_file].val);
- if ( !debug ) syslog(LOG_INFO, "Importing LB dump file '%s'\n", msg);
- refresh_connection(soap);
- ret = soap_call___jpsrv__StartUpload(soap, tab[_jpps].val?:jpps, "", &su_in, &su_out);
- if ( (ret = check_soap_fault(soap, ret)) ) {
- /* unsuccessful dump, register job */
- refresh_connection(soap);
- /* check job existence */
- memset(&gja_in, 0, sizeof gja_in);
- memset(&gja_out, 0, sizeof gja_out);
- gja_in.jobid = su_in.job;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, &gja_in, attributes, struct _jpelem__GetJobAttributes, 1);
- GLITE_SECURITY_GSOAP_LIST_GET(gja_in.attributes, 0) = GLITE_JP_ATTR_REGTIME;
- ret = soap_call___jpsrv__GetJobAttributes(soap, jpps, "", &gja_in, &gja_out);
- jperrno = glite_jp_clientGetErrno(soap, ret);
- /* no error ==> some application fault from JP */
- if (jperrno == 0) {
- dprintf("[%s] Dump failed when job %s exists\n", name, su_in.job);
- ret = -1;
- break;
- }
- /* other then "job not found" error ==> other problem, don't register */
- if (jperrno != ENOENT && jperrno != -2) {
- ret = check_soap_fault(soap, ret);
- break;
- }
- GLITE_SECURITY_GSOAP_LIST_GET(gja_in.attributes, 0) = NULL;
- /* "job not found" error ==> register job */
- refresh_connection(soap);
- rj_in.job = su_in.job;
- rj_in.owner = mycred->name;
- dprintf("[%s] Failsafe registration\n", name);
- dprintf("[%s] \tjobid: %s\n[%s] \towner: %s\n", name, rj_in.job, name, rj_in.owner);
- if ( !debug ) syslog(LOG_INFO, "Failsafe registration '%s'\n",rj_in.job);
- ret = soap_call___jpsrv__RegisterJob(soap, tab[_jpps].val?:jpps, "", &rj_in, &rj_empty);
- if ( (ret = check_soap_fault(soap, ret)) ) break;
- retry_upload--;
- ret = 1;
- }
- } while (ret != 0 && retry_upload > 0);
- if (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");
- ret = 1;
- break;
- }
-
- if ( (fhnd = open(tab[_file].val, O_RDONLY)) < 0 ) {
- dprintf("[%s] Can't open dump file: %s\n", name, tab[_file].val);
- if ( !debug ) syslog(LOG_ERR, "Can't open dump file: %s", tab[_file].val);
- ret = 1;
- break;
- }
- 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;
- refresh_connection(soap);
- 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);
-#ifdef JP_PERF
- } else ret = 0;
- if (perf.name && ret == 0) {
- perf.count++;
- if (perf.limit) {
- dprintf("[%s statistics] done %ld/%ld\n", name, perf.count, perf.limit);
- if (perf.count >= perf.limit) stats_done(&perf);
- } else
- dprintf("[%s statistics] done %ld/no limit\n", name, perf.count);
- }
-#endif
- 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);
- }
- } while (0);
- soap_end(soap);
-
- glite_lbu_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;
- 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 = glite_lbu_MaildirTransStart(sandbox_mdir, &msg, &fname);
- else ret = glite_lbu_MaildirRetryTransStart(sandbox_mdir, (time_t)JP_REPEAT_TIMEOUT, (time_t)JP_GIVUP_TIMEOUT ,&msg, &fname);
- if ( !ret ) {
- readnew = !readnew;
- if ( readnew ) ret = glite_lbu_MaildirTransStart(sandbox_mdir, &msg, &fname);
- else ret = glite_lbu_MaildirRetryTransStart(sandbox_mdir, (time_t)JP_REPEAT_TIMEOUT, (time_t)JP_GIVUP_TIMEOUT ,&msg, &fname);
- if ( !ret ) {
- readnew = !readnew;
- return 0;
- }
- }
-
- if ( ret < 0 ) {
- dprintf("[%s] glite_lbu_MaildirTransStart: %s (%s)\n", name, strerror(errno), lbm_errdesc);
- if ( !debug ) syslog(LOG_ERR, "glite_lbu_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);
-#ifdef JP_PERF
- if (!(sink & 2)) {
-#endif
- refresh_connection(soap);
- 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 ( (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;
- refresh_connection(soap);
- 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);
-#ifdef JP_PERF
- } else ret = 0;
-#endif
- } while (0);
-
- glite_lbu_MaildirTransEnd(sandbox_mdir, fname, ret? LBMD_TRANS_FAILED_RETRY: LBMD_TRANS_OK);
- free(fname);
- free(msg);
-
- return 1;
-}
-
-
-/** Parses every line looking for pattern string and stores the value into
- * the given variable
- *
- * line format is: key[space(s)]+val
- */
-int parse_msg(char *msg, msg_pattern_t tab[])
-{
- char *eol = msg,
- *key, *val;
-
- while ( eol && *eol != '\0' ) {
- int i;
-
- key = eol;
- if ( (eol = strchr(key, '\n')) ) *eol++ = '\0';
- while ( isblank(*key) ) key++;
- if ( *key == '\0' ) continue;
- val = key;
- while ( !isblank(*val) ) val++;
- if ( *val == '\0' ) return -1;
- *val++ = '\0';
- while ( isblank(*val) ) val++;
- if ( *val == '\0' ) return -1;
-
- for ( i = 0; tab[i].key; i++ ) {
- if ( !strcmp(tab[i].key, key) ) {
- tab[i].val = val;
- break;
- }
- }
- }
-
- return 0;
-}
-
-
-#define BUFSZ 1024
-
-static globus_mutex_t gLock;
-static globus_cond_t gCond;
-static globus_bool_t gDone;
-static globus_bool_t gError = GLOBUS_FALSE;
-static globus_byte_t gBuffer[BUFSZ];
-static int gOffset;
-
-
-static void gftp_done_cb(
- void *user_arg,
- globus_ftp_client_handle_t *handle,
- globus_object_t *err)
-{
- if ( err != GLOBUS_SUCCESS ) {
- char *tmp = globus_object_printable_to_string(err);
- dprintf("[%s] Error in callback: %s\n", name, tmp);
- if ( !debug ) syslog(LOG_ERR, "Error in callback: %s", tmp);
- gError = GLOBUS_TRUE;
- globus_libc_free(tmp);
- }
- globus_mutex_lock(&gLock);
- gDone = GLOBUS_TRUE;
- globus_cond_signal(&gCond);
- globus_mutex_unlock(&gLock);
-}
-
-static void gftp_data_cb(
- void *user_arg,
- globus_ftp_client_handle_t *handle,
- globus_object_t *error,
- globus_byte_t *buffer,
- globus_size_t length,
- globus_off_t offset,
- globus_bool_t eof)
-{
- if ( !eof ) {
- int rc;
- globus_mutex_lock(&gLock);
- if ( (rc = read(*((int *)user_arg), gBuffer, BUFSZ)) < 0 ) {
- dprintf("[%s] Error reading dump file\n", name);
- if ( !debug ) syslog(LOG_ERR, "Error reading dump file");
- gDone = GLOBUS_TRUE;
- gError = GLOBUS_TRUE;
- globus_cond_signal(&gCond);
- } else {
- globus_ftp_client_register_write(
- handle, gBuffer, rc, gOffset, rc == 0, gftp_data_cb, user_arg);
- gOffset += rc;
- }
- globus_mutex_unlock(&gLock);
- }
-}
-
-static int gftp_put_file(const char *url, int fhnd)
-{
- static globus_ftp_client_operationattr_t op_attr;
- static globus_ftp_client_handleattr_t hnd_attr;
- int gftp_retried = 0;
-
- globus_mutex_init(&gLock, GLOBUS_NULL);
- globus_cond_init(&gCond, GLOBUS_NULL);
-
- /* one lost connection survival cycle */
- do {
-
- if (!gftp_initialized++) {
-#define put_file_err(errs) { \
- dprintf("[%s] %s\n", name, errs); \
- if ( !debug ) syslog(LOG_ERR, errs); \
- return 1; \
-}
- if ( globus_ftp_client_handleattr_init(&hnd_attr) != GLOBUS_SUCCESS )
- put_file_err("Could not initialise handle attributes");
-
- if ( globus_ftp_client_handleattr_set_cache_all(&hnd_attr, GLOBUS_TRUE) != GLOBUS_SUCCESS)
- put_file_err("Could not set connection caching");
-
- if ( globus_ftp_client_operationattr_init(&op_attr) != GLOBUS_SUCCESS )
- put_file_err("Could not initialise operation attributes");
-
- if ( globus_ftp_client_handle_init(&hnd, &hnd_attr) != GLOBUS_SUCCESS )
- put_file_err("Could not initialise ftp client handle");
- }
- if ( globus_ftp_client_operationattr_set_authorization(
- &op_attr, server_cert? mycred->gss_cred: GSS_C_NO_CREDENTIAL,
- NULL, "", 0, NULL) != GLOBUS_SUCCESS )
- put_file_err("Could not set authorization procedure");
-#undef put_file_err
-
- gDone = GLOBUS_FALSE;
- gError = GLOBUS_FALSE;
-
- /* do the op */
- if ( globus_ftp_client_put(
- &hnd, url, &op_attr,
- GLOBUS_NULL, gftp_done_cb, (void *)&fhnd) != GLOBUS_SUCCESS) {
- dprintf("[%s] Could not start file put\n", name);
- if ( !debug ) syslog(LOG_ERR, "Could not start file put");
- gError = GLOBUS_TRUE;
- gDone = GLOBUS_TRUE;
- } else {
- int rc;
- globus_mutex_lock(&gLock);
- if ( (rc = read(fhnd, gBuffer, BUFSZ)) < 0 ) {
- dprintf("[%s] Error reading dump file\n", name);
- if ( !debug ) syslog(LOG_ERR, "Error reading dump file");
- gDone = GLOBUS_TRUE;
- gError = GLOBUS_TRUE;
- globus_cond_signal(&gCond);
- } else {
- globus_ftp_client_register_write(&hnd,
- gBuffer, rc, gOffset, rc == 0, gftp_data_cb, (void *)&fhnd);
- gOffset += rc;
- }
- globus_mutex_unlock(&gLock);
- }
-
- globus_mutex_lock(&gLock);
- while ( !gDone ) globus_cond_wait(&gCond, &gLock);
- globus_mutex_unlock(&gLock);
-
- if (gError == GLOBUS_TRUE) {
- gftp_retried++;
- gftp_initialized = 0;
- globus_ftp_client_handle_destroy(&hnd);
- dprintf("[%s] %s: FTP upload failed\n", name, gftp_retried <= 1 ? "Warning" : "Error");
- }
- } while (gError == GLOBUS_TRUE && gftp_retried <= 1);
-
- return (gError == GLOBUS_TRUE)? 1: 0;
-}
-
-
-static int refresh_connection(struct soap *soap) {
- struct timeval to = {JPPS_NO_RESPONSE_TIMEOUT, 0};
- edg_wll_GssCred newcred;
- edg_wll_GssStatus gss_code;
- glite_gsplugin_Context gp_ctx;
-
- gp_ctx = glite_gsplugin_get_context(soap);
- glite_gsplugin_set_timeout(gp_ctx, &to);
-
- switch ( edg_wll_gss_watch_creds(server_cert, &cert_mtime) ) {
- case 0: break;
- case 1:
- if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &newcred, &gss_code) ) {
- dprintf("[%s] reloading credentials successful\n", name);
- edg_wll_gss_release_cred(&mycred, &gss_code);
- mycred = newcred;
- glite_gsplugin_set_credential(gp_ctx, newcred);
- } else { dprintf("[%s] reloading credentials failed, using old ones\n", name); }
- break;
- case -1: dprintf("[%s] edg_wll_gss_watch_creds failed\n", name); break;
- }
-
- return 0;
-}
-
-
-#ifdef JP_PERF
-static void stats_init(perf_t *perf, const char *name) {
- struct timeval tv;
-
- memset(perf, 0, sizeof *perf);
- perf->count = 0;
- perf->name = strdup(name);
- gettimeofday(&tv, NULL);
- perf->start = tv.tv_sec + (double)tv.tv_usec / 1000000.0;
- dprintf("[%s statistics] start detected\n", name);
-}
-
-static void stats_set_jobid(perf_t *perf, const char *jobid) {
- perf->id = strdup(jobid + sizeof(PERF_JOBID_START_PREFIX) - 1);
- dprintf("[%s statistics] ID %s\n", perf->name, perf->id);
-}
-
-static void stats_get_limit(perf_t *perf, const char *name) {
- FILE *f;
- char *fn, item[200];
- int count;
-
- /* stopper */
- asprintf(&fn, PERF_STOP_FILE_FORMAT, perf->id);
- f = fopen(fn, "rt");
- free(fn);
- if (f) {
- fscanf(f, "%s\t%d", item, &count);
- if (strcasecmp(item, name) != 0) fscanf(f, "%s\t%d", item, &count);
- dprintf("[%s statistics] expected %d %s\n", name, count, item);
- fclose(f);
- perf->limit = count;
- }
-}
-
-static void stats_done(perf_t *perf) {
- struct timeval tv;
-
- gettimeofday(&tv, NULL);
- perf->end = tv.tv_sec + (double)tv.tv_usec / 1000000.0;
- dprintf("[%s statistics] %s\n", perf->name, perf->id);
- dprintf("[%s statistics] start: %lf\n", perf->name, perf->start);
- dprintf("[%s statistics] stop: %lf\n", perf->name, perf->end);
- dprintf("[%s statistics] count: %ld (%lf job/day)\n", perf->name, perf->count, 86400.0 * perf->count / (perf->end - perf->start));
- free(perf->id);
- free(perf->name);
- memset(perf, 0, sizeof *perf);
-}
-#endif
-
-/* XXX: we don't use it */
-SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} };
-
+++ /dev/null
-#include "soap_version.h"
-
-#if GSOAP_VERSION >= 20700
-#define INPUT_SANDBOX jptype__UploadClass__INPUT_SANDBOX
-#define OUTPUT_SANDBOX jptype__UploadClass__OUTPUT_SANDBOX
-#define JOB_LOG jptype__UploadClass__JOB_LOG
-
-#define OWNER jptype__AttributeType__OWNER
-#define TIME jptype__AttributeType__TIME
-#define TAG jptype__AttributeType__TAG
-
-#define EQUAL jptype__queryOp__EQUAL
-#define UNEQUAL jptype__queryOp__UNEQUAL
-#define LESS jptype__queryOp__LESS
-#define GREATER jptype__queryOp__GREATER
-#define WITHIN jptype__queryOp__WITHIN
-#endif
-
+++ /dev/null
-jpsrv = http://glite.org/wsdl/services/jp
-jptype = http://glite.org/wsdl/types/jp
-jpelem = http://glite.org/wsdl/elements/jp
+++ /dev/null
-# defaults
-top_srcdir=.
-builddir=build
-top_builddir=${top_srcdir}/${builddir}
-stagedir=.
-globalprefix=glite
-jpprefix=jp
-package=glite-jp-common
-version=0.0.0
-PREFIX=/opt/glite
-
-globus_prefix=/opt/globus
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-expat_prefix=/opt/expat
-gsoap_prefix=/software/gsoap-2.6
-
-CC=gcc
-
--include Makefile.inc
-
-
-VPATH=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/project:${jpproject}
-
-DEBUG:=-g -O0 -W -Wno-sign-compare
-CFLAGS:=${DEBUG} -D_GNU_SOURCE -I. -I${top_srcdir}/interface -I${stagedir}/include
-
-offset=0
-version_info:=-version-info ${shell \
- perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' }
-
-
-LINK:=libtool --mode=link ${CC} ${LDFLAGS} -rpath ${stagedir}/lib ${version_info}
-LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-COMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-
-HDRS:=types.h context.h attr.h known_attr.h backend.h builtin_plugins.h file_plugin.h indexdb.h type_plugin.h
-
-SRCS:=context.c attr.c utils.c indexdb.c
-OBJS:=${SRCS:.c=.lo}
-THROBJS:=${OBJS:.o=.thr.lo}
-LIBS:=-L${stagedir}/lib -lglite_jobid -lglite_lbu_db
-THRLIBS:=${LIBS}
-
-commonlib:= libglite_jp_common_${nothrflavour}.la
-commonlib_thr:= libglite_jp_common_${thrflavour}.la
-
-TEST_LIBS:=-L${cppunit}/lib -lcppunit -ldl
-TEST_INC:=-I${cppunit}/include
-
-
-default all: compile
-
-compile: ${commonlib} ${commonlib_thr}
-
-${commonlib}: ${OBJS}
- ${LINK} -o $@ ${OBJS} ${LIBS}
-
-${commonlib_thr}: ${THROBJS}
- ${LINK} -o $@ ${THROBJS} ${THRLIBS}
-
-check: type_test
- ./type_test type_test.xml
-
-type_test: %: %.cpp compile
- ${CXX} -c ${CFLAGS} ${TEST_INC} $<
- ${LINKXX} -o $@ $@.o ${commonlib} ${TEST_LIBS}
-
-doc:
-
-stage: compile
- $(MAKE) install PREFIX=${stagedir}
-
-install:
- -mkdir -p ${PREFIX}/include/${globalprefix}/${jpprefix}
- cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${jpprefix}
- -mkdir -p ${PREFIX}/lib
- ${INSTALL} -m 755 ${commonlib} ${commonlib_thr} ${PREFIX}/lib
-
-clean:
- rm -rvf *.o *.lo .libs lib*
- rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
- rm -f glite jp
-
-%.thr.lo: %.c
- ${COMPILE} -o $@ -c $<
-
-%.lo: %.c
- ${COMPILE} -o $@ -c $<
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the GLite JP Common module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/11/22 13:36:42 dimeglio
- First version of this file
-
- Revision 1.1.1.1 2004/10/15 09:49:02 akrenek
--->
-
-<project name="common" default="dist">
-
- <!-- =========================================
- Builds the GLite JP Primary Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#ifndef GLITE_JP_ATTR_H
-#define GLITE_JP_ATTR_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void glite_jp_attrval_free(glite_jp_attrval_t *,int);
-void glite_jp_attrval_copy(glite_jp_attrval_t *,const glite_jp_attrval_t *);
-
-/* Search through registered type plugins and call appropriate plugin method.
- * See type_plugin.h for detailed description.
- */
-
-int glite_jp_attrval_cmp(glite_jp_context_t ctx,const glite_jp_attrval_t *a,const glite_jp_attrval_t *b,int *result);
-
-char *glite_jp_attrval_to_db_full(glite_jp_context_t ctx,const glite_jp_attrval_t *attr);
-char *glite_jp_attrval_to_db_index(glite_jp_context_t ctx,const glite_jp_attrval_t *attr,int len);
-
-int glite_jp_attrval_from_db(glite_jp_context_t ctx,const char *str,glite_jp_attrval_t *attr);
-const char *glite_jp_attrval_db_type_full(glite_jp_context_t ctx,const char *attr);
-const char *glite_jp_attrval_db_type_index(glite_jp_context_t ctx,const char *attr,int len);
-
-time_t glite_jp_attr2time(const char *);
-char * glite_jp_time2attr(time_t);
-
-#ifdef __cplusplus
-};
-#endif
-
-
-#endif /* GLITE_JP_ATTR_H */
+++ /dev/null
-#ifndef GLITE_JP_BACKEND_H
-#define GLITE_JP_BACKEND_H
-
-/* do we need it?
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int glite_jppsbe_get_names(
- glite_jp_context_t ctx,
- const char *job,
- const char * /* class */,
- char ***names_out
-);
-
-int glite_jppsbe_destination_info(
- glite_jp_context_t ctx,
- const char *destination,
- char **job_out,
- char **class_out,
- char **name_out
-);
-
-int glite_jppsbe_get_job_url(
- glite_jp_context_t ctx,
- const char *job,
- const char * /* class */,
- const char *name, /* optional within class */
- char **url_out
-);
-
-int glite_jppsbe_open_file(
- glite_jp_context_t ctx,
- const char *job,
- const char * /* class */,
- const char *name, /* optional within class */
- int mode,
- void **handle_out
-);
-
-int glite_jppsbe_close_file(
- glite_jp_context_t ctx,
- void *handle
-);
-
-int glite_jppsbe_file_attrs(
- glite_jp_context_t ctx,
- void *handle,
- struct stat *buf
-);
-
-int glite_jppsbe_pread(
- glite_jp_context_t ctx,
- void *handle,
- void *buf,
- size_t nbytes,
- off_t offset,
- ssize_t *nbytes_ret
-);
-
-int glite_jppsbe_pwrite(
- glite_jp_context_t ctx,
- void *handle,
- void *buf,
- size_t nbytes,
- off_t offset
-);
-
-int glite_jppsbe_append(
- glite_jp_context_t ctx,
- void *handle,
- void *buf,
- size_t nbytes
-);
-
-int glite_jppsbe_is_metadata(
- glite_jp_context_t ctx,
- const char *attr
-);
-
-int glite_jppsbe_get_job_metadata(
- glite_jp_context_t ctx,
- const char *job,
- glite_jp_attrval_t attrs_inout[]
-);
-
-int glite_jppsbe_query(
- glite_jp_context_t ctx,
- const glite_jp_query_rec_t query[],
- char *attrs[],
- void *arg,
- int (*callback)(
- glite_jp_context_t ctx,
- const char *job,
- const glite_jp_attrval_t metadata[],
- void *arg
- )
-);
-
-char* glite_jpps_get_namespace(
- const char* attr
-);
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* GLITE_JP_BACKEND_H */
-
+++ /dev/null
-
-#define GLITE_JP_FILETYPE_TAGS "urn:org.glite.jp.primary:tags"
-#define GLITE_JP_FILETYPE_LB "urn:org.glite.jp.primary:lb"
-#define GLITE_JP_FILETYPE_CLASSAD "urn:org.glite.jp.primary:classad"
-#define GLITE_JP_FILETYPE_ISB "urn:org.glite.jp.primary:isb"
-#define GLITE_JP_FILETYPE_OSB "urn:org.glite.jp.primary:osb"
-
-#define GLITE_JP_FPLUG_TAGS_APPEND 0
+++ /dev/null
-#ifndef GLITE_JP_CONTEXT_H
-#define GLITE_JP_CONTEXT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int glite_jp_init_context(glite_jp_context_t *);
-void glite_jp_free_context(glite_jp_context_t);
-void glite_jp_free_query_rec(glite_jp_query_rec_t *);
-
-char *glite_jp_peer_name(glite_jp_context_t);
-char *glite_jp_error_chain(glite_jp_context_t);
-
-int glite_jp_stack_error(glite_jp_context_t, const glite_jp_error_t *);
-int glite_jp_clear_error(glite_jp_context_t);
-
-int glite_jp_add_deferred(glite_jp_context_t,int (*)(glite_jp_context_t,void *),void *);
-int glite_jp_run_deferred(glite_jp_context_t);
-
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* GLITE_JP_CONTEXT_H */
+++ /dev/null
-#ifndef GLITE_JP_FILEPLUGIN_H
-#define GLITE_JP_FILEPLUGIN_H
-
-/** Methods of the file plugin. */
-
-typedef struct _glite_jpps_fplug_op_t {
-
-/** Open a file.
-\param[in] fpctx Context of the plugin, returned by its init.
-\param[in] bhandle Handle of the file via JPPS backend.
-\param[in] uri URI (type) of the opened file.
-\param[out] handle Handle to the opened file structure, to be passed to other plugin functions.
-*/
- int (*open)(void *fpctx,void *bhandle,const char *uri,void **handle);
-/** Open from a string.
-\param[in] fpctx Context of the plugin, returned by its init.
-\param[in] str The string to use.
-\param[in] uri URI (type) of the string
-\param[in] ns namespace to handle
-\param[out] handle Handle to the opened file structure, to be passed to other plugin functions.
-*/
-
- int (*open_str)(void *fpctx,const char *str,const char *uri,const char *ns,void **handle);
-
-/** Close the file. Free data associated to a handle */
- int (*close)(void *fpctx,void *handle);
-
-/** "Preprocess" the file -- this function is called once after the file is commited */
- int (*filecom)(void *fpctx,void *handle);
-
-/** Retrieve value(s) of an attribute.
-\param[in] fpctx Plugin context.
-\param[in] handle Handle of the opened file.
-\param[in] ns Namespace of queried attribute.
-\param[in] attr Queried attribute.
-\param[out] attrval GLITE_JP_ATTR_UNDEF-terminated list of value(s) of the attribute.
- If there are more and there is an interpretation of their order
- they must be sorted, eg. current value of tag is the last one.
-\retval 0 success
-\retval ENOSYS this attribute is not defined by this type of file
-\retval ENOENT no value is present
-*/
- int (*attr)(void *fpctx,void *handle, const char *attr,glite_jp_attrval_t **attrval);
-
-/** File type specific operation.
-\param[in] fpctx Plugin context.
-\param[in] handle Handle of the opened file.
-\param[in] oper Code of the operation, specific for a concrete plugin.
-*/
- int (*generic)(void *fpctx,void *handle,int oper,...);
-
-} glite_jpps_fplug_op_t;
-
-/** Data describing a plugin. */
-typedef struct _glite_jpps_fplug_data_t {
- void *fpctx; /**< Context passed to plugin operations. */
- char **uris; /**< NULL-terminated list of file types (URIs)
- handled by the plugin. */
- char **classes; /**< The same as uris but filesystem-friendly
- (can be used to construct file names).*/
- char **namespaces; /**< Which attribute namespaces this plugin handles. */
-
- glite_jpps_fplug_op_t ops; /**< Plugin operations. */
-} glite_jpps_fplug_data_t;
-
-/** Initialisation function of the plugin.
- Called after dlopen(), must be named "init".
-\param[in] ctx JPPS context
-\param[out] data filled-in plugin data
-*/
-
-typedef int (*glite_jpps_fplug_init_t)(
- glite_jp_context_t ctx,
- glite_jpps_fplug_data_t *plugin_data
-);
-
-
-
-
-/* XXX: not really public interface follows */
-
-int glite_jpps_fplug_load(glite_jp_context_t ctx,int argc,char **argv);
-int glite_jpps_fplug_lookup(glite_jp_context_t ctx,const char *uri, glite_jpps_fplug_data_t ***plugin_data);
-int glite_jpps_fplug_lookup_byclass(glite_jp_context_t, const char *class,glite_jpps_fplug_data_t ***plugin_data);
-
-#endif /* GLITE_JP_FILEPLUGIN_H */
+++ /dev/null
-#ifndef GLITE_JP_INDEXDB_H
-#define GLITE_JP_INDEXDB_H
-
-/**
- * \file indexdb.h
- * \brief Helper functions for accessing Job Provenance Index Server database.
- */
-
-#include "glite/lbu/db.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#ifdef GLITE_JP_INDEX_COMPILE
-
-/**
- * For generating table names.
- */
-#define GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "attr_"
-
-#endif
-
-
-/**
- * Returns internal id from attribute name.
- *
- * The attribute id is used in some places in the database schema. Because of the future possible changes in the schema, you should rather use other functions to get SQL commands (table names and where conditions).
- *
- * \param[in] name attribute name
- * \return attribute id string
- */
-char *glite_jp_indexdb_attr2id(const char *name);
-
-/**
- * Get parts of the SQL SELECT command to the given attribute:
- *
- * SELECT column, full_value_column FROM table WHERE where;
- *
- * This is quick version requiring additional information about indexing of the attribute.
- */
-int glite_jp_indexdb_attr2select_from_index(const char *name, int indexed, char **column, char **full_value_column, char **table, char **where);
-
-/**
- * Get parts of the SQL SELECT command to the given attribute:
- *
- * SELECT column, full_value_column FROM table WHERE where;
- *
- * This is the most portable way - it will peep to the DB for information about indexing.
- */
-int glite_jp_indexdb_attr2select_from_db(const char *name, glite_lbu_DBContext dbctx, char **column, char **full_value_column, char **table, char **where);
-
-#ifdef __cplusplus
-};
-#endif
-
-
-#endif /* GLITE_JP_INDEXDB_H */
+++ /dev/null
-#ifndef GLITE_JP_KNOWN_ATTR_H
-#define GLITE_JP_KNOWN_ATTR_H
-
-/** 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"
-
-/** JobId */
-#define GLITE_JP_ATTR_JOBID GLITE_JP_SYSTEM_NS ":jobId"
-
-/** Timestamp of job registration in JP.
- * 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 */
-
-/** Namespace for LB user tags, schemaless, all values are strings */
-#define GLITE_JP_LBTAG_NS "http://egee.cesnet.cz/en/WSDL/jp-lbtag"
-#define GLITE_JP_JDL_NS "http://jdl"
-
-/** Namespace for Sandboxes */
-#define GLITE_JP_ISB_NS "http://egee.cesnet.cz/en/Schema/JP/ISB"
-#define GLITE_JP_OSB_NS "http://egee.cesnet.cz/en/Schema/JP/OSB"
-
-/** Namespace for file names listed from tar */
-#define GLITE_JP_ATTR_ISB_FILENAME GLITE_JP_ISB_NS ":filename"
-#define GLITE_JP_ATTR_OSB_FILENAME GLITE_JP_OSB_NS ":filename"
-
-/** Namespace for filenames to be unpacked from sanbox tar */
-#define GLITE_JP_ISB_CONTENT_NS GLITE_JP_ISB_NS ":content"
-#define GLITE_JP_OSB_CONTENT_NS GLITE_JP_OSB_NS ":content"
-
-#endif /* GLITE_JP_KNOWN_ATTR_H */
+++ /dev/null
-#ifndef GLITE_JP_TYPEPLUGIN_H
-#define GLITE_JP_TYPEPLUGIN_H
-
-typedef struct _glite_jp_tplug_data_t {
-
- char *namespace;
- void *pctx;
-
-/** Compare attribute values.
- * \param[in] a value to compare
- * \param[in] b value to compare
- * \param[out] result like strcmp()
- * \param[out] err set if the values cannot be compared
- * \retval 0 OK
- * \retval other error
- */
- int (*cmp)(
- void *ctx,
- const glite_jp_attrval_t *a,
- const glite_jp_attrval_t *b,
- int *result);
-
-/** Convert to database string representation.
- * It is guaranteed the returned value can be converted back with
- * from_db().
- * The resulting value may not be suitable for indexing with db engine.
- *
- * \param[in] attr the attribute value to convert
- * \retval NULL can't be converted
- * \retval other the string representation.
- * */
- char * (*to_db_full)(void *ctx,const glite_jp_attrval_t *attr);
-
-/** Convert to a database string representation suitable for indexing.
- * The function is non-decreasing (wrt. cmp() above and strcmp()), however it
- * is not guaranteed to be one-to-one.
- *
- * \param[in] attr the value to convert
- * \param[in] len maximum length of the converted value.
- * \retval NULL can't be converted
- * \retval other the string representation
- */
- char * (*to_db_index)(void *ctx,const glite_jp_attrval_t *attr,int len);
-
-/** Convert from the database format.
- * \param[in] str the string value
- * \param[inout] attr name contains the name of the attribute to be converted
- * the rest of attr is filled in.
- */
- int (*from_db)(void *ctx,const char *str,glite_jp_attrval_t *attr);
-
-/** Query for database types suitable to store values returned by
- * to_db_full() and to_db_index().
- * Useful for db column dynamic creation etc.
- * Return pointer to internal static data, non-reentrant.
- */
- const char * (*db_type_full)(void *ctx,const char *attr);
- const char * (*db_type_index)(void *ctx,const char *attr,int len);
-
-} glite_jp_tplug_data_t;
-
-/** Plugin init function.
- Must be called init, supposed to be called as many times as required
- for different param's (e.g. xsd files).
- Registers the plugin in ctx.
- */
-
-typedef int (*glite_jp_tplug_init_t)(
- glite_jp_context_t ctx,
- const char *param,
- glite_jp_tplug_data_t *plugin_data
-);
-
-#endif /* GLITE_JP_TYPEPLUGIN_H */
+++ /dev/null
-#ifndef GLITE_JP_TYPES_H
-#define GLITE_JP_TYPES_H
-
-#include <sys/time.h>
-
-typedef struct _glite_jp_error_t {
- int code;
- const char *desc;
- const char *source;
- struct _glite_jp_error_t *reason;
-} glite_jp_error_t;
-
-typedef struct _glite_jp_context {
- glite_jp_error_t *error;
- int (**deferred_func)(struct _glite_jp_context *,void *);
- void **deferred_arg;
- void *feeds;
- struct soap *other_soap;
- char *peer;
- void **plugins;
- void **type_plugins;
- void *dbhandle;
- char **trusted_peers;
- char *myURL;
- int noauth;
-} *glite_jp_context_t;
-
-typedef enum {
- GLITE_JP_ATTR_ORIG_ANY, /**< for queries: don't care about origin */
- GLITE_JP_ATTR_ORIG_SYSTEM, /**< JP internal, e.g. job owner */
- GLITE_JP_ATTR_ORIG_USER, /**< inserted by user explicitely */
- GLITE_JP_ATTR_ORIG_FILE /**< coming from uploaded file */
-} glite_jp_attr_orig_t;
-
-typedef struct {
- char *name; /**< including namespace */
- char *value;
- int binary; /**< value is binary */
- size_t size; /**< in case of binary value */
- glite_jp_attr_orig_t origin;
- char *origin_detail; /**< where it came from, i.e. file URI:name */
- time_t timestamp;
-} glite_jp_attrval_t;
-
-
-typedef enum {
- GLITE_JP_QUERYOP_UNDEF,
- GLITE_JP_QUERYOP_EQUAL,
- GLITE_JP_QUERYOP_UNEQUAL,
- GLITE_JP_QUERYOP_LESS,
- GLITE_JP_QUERYOP_GREATER,
- GLITE_JP_QUERYOP_WITHIN,
- GLITE_JP_QUERYOP_EXISTS,
- GLITE_JP_QUERYOP__LAST,
-} glite_jp_queryop_t;
-
-typedef struct {
- char *attr;
- glite_jp_queryop_t op;
- char *value, *value2;
- int binary;
- size_t size,size2;
- glite_jp_attr_orig_t origin;
-} glite_jp_query_rec_t;
-
-#endif /* GLITE_JP_TYPES_H */
+++ /dev/null
-#Mon Jan 16 06:46:39 CET 2006
-module.build=39
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Configuration options for the gLite JP Common module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3.4.1 2005/11/03 17:46:52 mmulac
- ares to c-ares migration
- - use dynamic library of c-ares, instead of ares static lib
- - ares clean up (now should be mentioned only in modules that really need it)
- - patch for security.gsoap-plugin not yet in CVS (sent to interation list)
- I do not know what will happen when one try to mix ares with c-ares libs
- => weird things may arise!
-
- Revision 1.3 2004/12/01 18:45:38 zsalvet
- *** empty log message ***
-
- Revision 1.2 2004/11/22 13:36:42 dimeglio
- First version of this file
-
- Revision 1.1.1.1 2004/10/15 09:49:02 akrenek
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="JP Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-jpprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-gsoap_prefix=${with.gsoap.prefix}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-cppunit=${with.cppunit.prefix}
-jpproject=${subsystem.project.dir}
-project=${component.project.dir}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP Common component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/10/15 09:49:02 akrenek
--->
-
-<project name="JP Common component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="common" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-module.version=1.3.0
-module.age=1
+++ /dev/null
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "glite/jobid/strmd5.h"
-#include "types.h"
-#include "attr.h"
-#include "type_plugin.h"
-#include "context.h"
-
-void glite_jp_attrval_free(glite_jp_attrval_t *a,int f)
-{
- free(a->name);
- free(a->value);
- free(a->origin_detail);
- memset(a,0,sizeof *a);
- if (f) free(a);
-}
-
-void glite_jp_attrval_copy(glite_jp_attrval_t *dst,const glite_jp_attrval_t *src)
-{
- dst->name = strdup(src->name);
- dst->origin = src->origin;
- dst->size = src->size;
- dst->timestamp = src->timestamp;
- dst->origin_detail = src->origin_detail ?
- strdup(src->origin_detail) : NULL;
- if ((dst->binary = src->binary)) {
- dst->value = malloc(src->size);
- memcpy(dst->value,src->value,src->size);
- }
- else dst->value = strdup(src->value);
-}
-
-
-#define min(x,y) ((x) > (y) ? (y) : (x))
-
-static int fb_cmp(void *ctx,const glite_jp_attrval_t *a,const glite_jp_attrval_t *b,int *result)
-{
- if (a->binary != b->binary) return EINVAL;
- if (a->binary) {
- *result = memcmp(a->value,b->value,min(a->size,b->size));
- if (!*result && a->size != b->size)
- *result = a->size > b->size ? 1 : -1;
- }
- else *result = strcmp(a->value,b->value);
- return 0;
-}
-
-/* XXX: depends on specific definition of glite_jp_attr_orig_t */
-static char orig_char[] = "ASUF";
-
-/* XXX: don't allocate memory, don't grow more than twice */
-static int escape_colon(const char *in, char *out)
-{
- int i,o;
-
- for (i=o=0; in[i]; i++) switch (in[i]) {
- case ':': out[o++] = '\\'; out[o++] = ':'; break;
- case '\\': out[o++] = '\\'; out[o++] = '\\'; break;
- default: out[o++] = in[i]; break;
- }
- out[o] = 0;
- return o;
-}
-
-/* XXX: read until unescaped colon is found
- * allocates output */
-static char * unescape_colon(const char *in,int *rd)
-{
- int i,o;
- char *out;
-
- for (i=o=0; in[i] && in[i] != ':'; i++,o++)
- if (in[i] == '\\') i++;
-
- out = malloc(o+1);
-
- for (i=o=0; in[i] && in[i] != ':'; i++)
- if (in[i] == '\\') out[o++] = in[++i];
- else out[o++] = in[i];
-
- out[o] = 0;
- *rd = i;
- return out;
-}
-
-static char * fb_to_db_full(void *ctx,const glite_jp_attrval_t *attr)
-{
-
- int vsize = attr->binary ? attr->size * 4/3 + 6 : strlen(attr->value)+1,
- len;
-
- /* 4x: + \0 + ASUF + BS + %12d */
- char *db = malloc(19 + (attr->origin_detail ? 2*strlen(attr->origin_detail) : 0) + vsize);
-
- if (attr->origin < 0 || attr->origin > GLITE_JP_ATTR_ORIG_FILE) {
- free(db); return NULL;
- }
- len = sprintf(db,"%c:%d:%c:",attr->binary ? 'B' : 'S',
- attr->timestamp,orig_char[attr->origin]);
-
- if (attr->origin_detail) len += escape_colon(attr->origin_detail,db+len);
- db[len++] = ':';
-
- if (attr->binary) {
- vsize = base64_encode(attr->value,attr->size,db+len,vsize-1);
- if (vsize < 0) { free(db); return NULL; }
- db[len+vsize] = 0;
- }
- else strcpy(db+len,attr->value);
-
- return db;
-}
-
-static char * fb_to_db_index(void *ctx,const glite_jp_attrval_t *attr,int len)
-{
- char *s;
-
-/* XXX: binary values not really handled. Though the formal semantics is not broken */
- if (attr->binary) return strdup("XXX");
-
- s = strdup(attr->value);
- if (len < strlen(s)) s[len] = 0;
- return s;
-}
-
-static int fb_from_db(void *ctx,const char *str,glite_jp_attrval_t *attr)
-{
- int p = 2;
- char *colon,*cp;
-
- if (str[0] != 'B' && str[0] != 'S') return EINVAL;
- attr->binary = str[0] == 'B';
- cp = attr->value = strdup(str);
-
- colon = strchr(cp+p,':');
- if (!colon) return EINVAL;
-
- *colon++ = 0;
- attr->timestamp = (time_t) atol(cp+p);
- p = colon-cp;
-
- for (attr->origin = GLITE_JP_ATTR_ORIG_ANY; orig_char[attr->origin] && orig_char[attr->origin] != cp[p]; attr->origin++);
- if (!orig_char[attr->origin]) return EINVAL;
-
- p += 2;
- if (cp[p] == ':') attr->origin_detail = NULL;
- else {
- int r;
- attr->origin_detail = unescape_colon(cp+p,&r);
- p += r;
- }
- if (cp[p++] != ':') return EINVAL;
-
- if (attr->binary) {
- attr->size = base64_decode(str+p,attr->value,strlen(str));
- if (attr->size < 0) return EINVAL;
- }
- else strcpy(attr->value,str+p);
-
- return 0;
-}
-
-static const char * fb_type_full(void *ctx,const char *attr)
-{
- return "mediumblob";
-}
-
-static const char * fb_type_index(void *ctx,const char *attr,int len)
-{
- static char tbuf[100];
- sprintf(tbuf,"varchar(%d)",len);
- return tbuf;
-}
-
-
-
-static glite_jp_tplug_data_t fallback_plugin = {
- "",
- NULL,
- fb_cmp,
- fb_to_db_full,
- fb_to_db_index,
- fb_from_db,
- fb_type_full,
- fb_type_index,
-};
-
-static glite_jp_tplug_data_t *get_plugin(glite_jp_context_t ctx,const char *aname)
-{
- void **cp = ctx->type_plugins;
- char *colon,*ns;
-
- if (!cp) return &fallback_plugin;
- glite_jp_clear_error(ctx);
- ns = strdup(aname);
- colon = strrchr(ns,':');
- if (colon) *colon = 0; else *ns = 0;
-
- while (*cp) {
- glite_jp_tplug_data_t *p = *cp;
- if (!strcmp(ns,p->namespace)) {
- free(ns);
- return p;
- }
- cp++;
- }
- free(ns);
- return &fallback_plugin; /* XXX: is it always desirable? */
-}
-
-int glite_jp_attrval_cmp(glite_jp_context_t ctx,const glite_jp_attrval_t *a,const glite_jp_attrval_t *b,int *result)
-{
- glite_jp_tplug_data_t *ap = get_plugin(ctx,a->name);
- glite_jp_error_t err;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- glite_jp_clear_error(ctx);
-
- if (strcmp(a->name,b->name)) {
- err.code = EINVAL;
- err.desc = "Can't compare different attributes";
- return glite_jp_stack_error(ctx,&err);
- }
-
- return ap->cmp ? ap->cmp(ap->pctx,a,b,result) : fb_cmp(ap->pctx,a,b,result);
-}
-
-char *glite_jp_attrval_to_db_full(glite_jp_context_t ctx,const glite_jp_attrval_t *attr)
-{
- glite_jp_tplug_data_t *ap = get_plugin(ctx,attr->name);
-
- glite_jp_clear_error(ctx);
- return ap->to_db_full ? ap->to_db_full(ap->pctx,attr) : fb_to_db_full(ap->pctx,attr);
-}
-
-char *glite_jp_attrval_to_db_index(glite_jp_context_t ctx,const glite_jp_attrval_t *attr,int len)
-{
- glite_jp_tplug_data_t *ap = get_plugin(ctx,attr->name);
-
- glite_jp_clear_error(ctx);
- return ap->to_db_index ? ap->to_db_index(ap->pctx,attr,len) : fb_to_db_index(ap->pctx,attr,len);
-}
-
-
-int glite_jp_attrval_from_db(glite_jp_context_t ctx,const char *str,glite_jp_attrval_t *attr)
-{
- glite_jp_tplug_data_t *ap = get_plugin(ctx,attr->name);
-
- glite_jp_clear_error(ctx);
- return ap->from_db ? ap->from_db(ap->pctx,str,attr) : fb_from_db(ap->pctx,str,attr);
-}
-
-const char *glite_jp_attrval_db_type_full(glite_jp_context_t ctx,const char *attr)
-{
- glite_jp_tplug_data_t *ap = get_plugin(ctx,attr);
-
- glite_jp_clear_error(ctx);
- return ap->db_type_full ? ap->db_type_full(ap->pctx,attr) : fb_type_full(ap->pctx,attr);
-}
-
-const char *glite_jp_attrval_db_type_index(glite_jp_context_t ctx,const char *attr,int len)
-{
- glite_jp_tplug_data_t *ap = get_plugin(ctx,attr);
-
- glite_jp_clear_error(ctx);
- return ap->db_type_index ? ap->db_type_index(ap->pctx,attr,len) : fb_type_index(ap->pctx,attr,len);
-}
-
-/* XXX: UNIX time, should be ISO blahblah */
-time_t glite_jp_attr2time(const char *a)
-{
- long t;
-
- sscanf(a,"%ld",&t);
- return t;
-}
-
-/* XXX: UNIX time, should be ISO blahblah */
-char * glite_jp_time2attr(time_t t)
-{
- char *r;
-
- asprintf(&r,"%ld",(long) t);
- return r;
-}
-
+++ /dev/null
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "types.h"
-#include "context.h"
-
-int glite_jp_init_context(glite_jp_context_t *ctx)
-{
- return (*ctx = calloc(1,sizeof **ctx)) != NULL;
-}
-
-void glite_jp_free_context(glite_jp_context_t ctx)
-{
- glite_jp_clear_error(ctx);
- free(ctx);
-}
-
-char *glite_jp_peer_name(glite_jp_context_t ctx)
-{
- return strdup(ctx->peer ? ctx->peer : "unknown");
-}
-
-char *glite_jp_error_chain(glite_jp_context_t ctx)
-{
- char *ret = NULL,indent[300] = "";
- int len = 0,add;
- char buf[2000];
-
- glite_jp_error_t *ep = ctx->error;
-
- do {
- add = snprintf(buf,sizeof buf,"%s%s: %s (%s)\n",
- indent,
- ep->source,
- strerror(ep->code),
- ep->desc ? ep->desc : "");
- ret = realloc(ret,len + add + 1);
- strncpy(ret + len,buf,add); ret[len += add] = 0;
- strcat(indent," ");
- } while ((ep = ep->reason));
-
- return ret;
-}
-
-int glite_jp_stack_error(glite_jp_context_t ctx, const glite_jp_error_t *err)
-{
- glite_jp_error_t *reason = ctx->error;
-
- ctx->error = calloc(1,sizeof *ctx->error);
- ctx->error->code = err->code;
- ctx->error->desc = err->desc ? strdup(err->desc) : NULL;
- ctx->error->source = err->source ? strdup(err->source) : NULL;
- ctx->error->reason = reason;
-
- return err->code;
-}
-
-int glite_jp_clear_error(glite_jp_context_t ctx)
-{
- glite_jp_error_t *e = ctx->error, *r;
-
- while (e) {
- r = e->reason;
- free((char *) e->source);
- free((char *) e->desc);
- free(e);
- e = r;
- }
- ctx->error = NULL;
- return 0;
-}
-
-
-void glite_jp_free_query_rec(glite_jp_query_rec_t *q)
-{
- free(q->attr);
- free(q->value);
- free(q->value2);
- memset(q,0,sizeof *q);
-}
-
-int glite_jp_queryrec_copy(glite_jp_query_rec_t *dst, const glite_jp_query_rec_t *src)
-{
- memcpy(dst,src,sizeof *src);
- if (src->attr) dst->attr = strdup(src->attr);
- if (src->value) dst->value = strdup(src->value);
- if (src->value2) dst->value2 = strdup(src->value2);
- return 0;
-}
-
-int glite_jp_run_deferred(glite_jp_context_t ctx)
-{
- int i,cnt,ret;
-
- if (!ctx->deferred_func) return 0;
-
- glite_jp_clear_error(ctx);
- for (cnt=0;ctx->deferred_func[cnt];cnt++);
- for (i=0; i<cnt; i++) {
- if ((ret = (*ctx->deferred_func)(ctx,*ctx->deferred_arg))) {
- glite_jp_error_t err;
- char desc[100];
-
- sprintf(desc,"calling func #%d, %p",i,*ctx->deferred_func);
- err.code = ret;
- err.desc = desc;
- err.source = "glite_jp_run_deferred()";
-
- glite_jp_stack_error(ctx,&err);
- return ret;
- }
- else {
- memmove(ctx->deferred_func,ctx->deferred_func+1,
- (cnt-i) * sizeof *ctx->deferred_func);
- memmove(ctx->deferred_arg,ctx->deferred_arg+1,
- (cnt-i) * sizeof *ctx->deferred_arg);
- }
- }
- free(ctx->deferred_func); ctx->deferred_func = NULL;
- free(ctx->deferred_arg); ctx->deferred_arg = NULL;
- return 0;
-}
-
-int glite_jp_add_deferred(
- glite_jp_context_t ctx,
- int (*func)(glite_jp_context_t, void *),
- void *arg
-)
-{
- int (**v)(glite_jp_context_t, void *) = ctx->deferred_func;
- int i;
-
- for (i=0; v && v[i]; i++);
-
- ctx->deferred_func = realloc(ctx->deferred_func, (i+2) * sizeof *ctx->deferred_func);
- ctx->deferred_func[i] = func;
- ctx->deferred_func[i+1] = NULL;
-
- ctx->deferred_arg = realloc(ctx->deferred_arg,(i+2) * sizeof *ctx->deferred_arg);
- ctx->deferred_arg[i] = arg;
- ctx->deferred_arg[i+1] = NULL;
-
- return 0;
-}
+++ /dev/null
-#ident "$Header:"
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#include <glite/jobid/strmd5.h>
-#include <glite/lbu/db.h>
-#include <glite/lbu/trio.h>
-
-#define GLITE_JP_INDEX_COMPILE 1
-
-#include "indexdb.h"
-
-char *glite_jp_indexdb_attr2id(const char *name) {
- size_t i, len;
- char *lname, *id;
-
- len = strlen(name);
- lname = malloc(len + 1);
- for (i = 0; i < len + 1; i++) lname[i] = tolower(name[i]);
- id = str2md5(lname);
- free(lname);
-
- return id;
-}
-
-
-int glite_jp_indexdb_attr2select_from_index(const char *name, int indexed __attribute__((unused)), char **column, char **full_value_column, char **table, char **where) {
- char *id;
-
- if (column) *column = strdup("value");
- if (full_value_column) *full_value_column = strdup("full_value");
- if (table) {
- id = glite_jp_indexdb_attr2id(name);
- asprintf(table, GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "%s", id);
- free(id);
- }
- if (where) *where = strdup("");
-
- return 0;
-}
-
-
-int glite_jp_indexdb_attr2select_from_db(const char *name, glite_lbu_DBContext dbctx, char **column, char **full_value_column, char **table, char **where) {
- char *sql, *id;
- glite_lbu_Statement stmt;
- int ret;
-
- if (table) {
- trio_asprintf(&sql, "SELECT attrid FROM attrs WHERE name='%|Ss'", name);
- ret = glite_lbu_ExecSQL(dbctx, sql, &stmt);
- free(sql);
- switch (ret) {
- case -1: return glite_lbu_DBError(dbctx, NULL, NULL);
- case 1: break;
- default: return EINVAL;
- }
- if (glite_lbu_FetchRow(stmt, 1, NULL, &id) < 0) return glite_lbu_DBError(dbctx, NULL, NULL);
- asprintf(table, GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "%s", id);
- free(id);
- glite_lbu_FreeStmt(&stmt);
- }
- if (column) *column = strdup("value");
- if (full_value_column) *full_value_column = strdup("full_value");
- if (where) *where = strdup("");
-
- return 0;
-}
+++ /dev/null
-#include <getopt.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <limits.h>
-#include <dirent.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "glite/jobid/strmd5.h"
-#include "types.h"
-#include "context.h"
-#include "known_attr.h"
-#include "attr.h"
-
-/*
-#include "feed.h"
-#include "tags.h"
-*/
-
-#include "backend.h"
-
-
-typedef struct _rl_buffer_t {
- char *buf;
- size_t pos, size;
- off_t offset;
-} rl_buffer_t;
-
-/*
- * realloc the line to double size if needed
- *
- * \return 0 if failed, did nothing
- * \return 1 if success
- */
-int check_realloc_line(char **line, size_t *maxlen, size_t len) {
- void *tmp;
-
- if (len > *maxlen) {
- *maxlen <<= 1;
- tmp = realloc(*line, *maxlen);
- if (!tmp) return 0;
- *line = tmp;
- }
-
- return 1;
-}
-
-
-char* glite_jpps_get_namespace(const char* attr){
- char* namespace = strdup(attr);
- char* colon = strrchr(namespace, ':');
- if (colon)
- namespace[strrchr(namespace, ':') - namespace] = 0;
- else
- namespace[0] = 0;
- return namespace;
-}
-
+++ /dev/null
-#include <assert.h>
-#include <fstream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/XmlOutputter.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-
-#include "types.h"
-#include "attr.h"
-#include "context.h"
-#include "backend.h"
-
-
-class TypePluginTest: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE(TypePluginTest);
- CPPUNIT_TEST(simple);
- CPPUNIT_TEST(binary);
- CPPUNIT_TEST(origin);
- CPPUNIT_TEST(origin2);
- CPPUNIT_TEST(index);
- CPPUNIT_TEST_SUITE_END();
-public:
- void simple();
- void binary();
- void origin();
- void origin2();
- void index();
-};
-
-void TypePluginTest::simple()
-{
- glite_jp_context_t ctx;
-
- glite_jp_attrval_t attr = {
- "myattr",
- "short string",
- 0,0,
- GLITE_JP_ATTR_ORIG_USER,
- NULL,
- 0
- },attr2;
-
- char *db;
-
- glite_jp_init_context(&ctx);
- attr.timestamp = time(NULL);
-
- db = glite_jp_attrval_to_db_full(ctx,&attr);
-
- CPPUNIT_ASSERT_MESSAGE(std::string("glite_jp_attrval_to_db_full()"),db);
- std::cerr << db << std::endl;
-
- glite_jp_attrval_from_db(ctx,db,&attr2);
- CPPUNIT_ASSERT_MESSAGE(std::string("value"),!strcmp(attr.value,attr2.value));
- CPPUNIT_ASSERT_MESSAGE(std::string("origin"),attr.origin == attr2.origin);
- CPPUNIT_ASSERT_MESSAGE(std::string("timestamp"),attr.timestamp == attr2.timestamp);
-}
-
-void TypePluginTest::binary()
-{
- glite_jp_context_t ctx;
-
- glite_jp_attrval_t attr = {
- "myattr",
- NULL,
- 1,1000,
- GLITE_JP_ATTR_ORIG_USER,
- NULL,
- 0
- },attr2;
-
- char *db;
-
- glite_jp_init_context(&ctx);
- attr.timestamp = time(NULL);
- attr.value = (char *) malloc(attr.size);
-
- db = glite_jp_attrval_to_db_full(ctx,&attr);
-
- CPPUNIT_ASSERT_MESSAGE(std::string("glite_jp_attrval_to_db_full()"),db);
- std::cerr << db << std::endl;
-
- glite_jp_attrval_from_db(ctx,db,&attr2);
- CPPUNIT_ASSERT_MESSAGE(std::string("size"),attr.size == attr2.size);
- CPPUNIT_ASSERT_MESSAGE(std::string("value"),!memcmp(attr.value,attr2.value,attr.size));
-}
-
-void TypePluginTest::origin()
-{
- glite_jp_context_t ctx;
-
- glite_jp_attrval_t attr = {
- "myattr",
- NULL,
- 0,0,
- GLITE_JP_ATTR_ORIG_USER,
- NULL,
- 0
- },attr2;
-
- char *db;
-
- glite_jp_init_context(&ctx);
- attr.timestamp = time(NULL);
- attr.value = "origin test";
- attr.origin_detail = "simple origin";
-
- db = glite_jp_attrval_to_db_full(ctx,&attr);
-
- CPPUNIT_ASSERT_MESSAGE(std::string("glite_jp_attrval_to_db_full()"),db);
- std::cerr << db << std::endl;
-
- glite_jp_attrval_from_db(ctx,db,&attr2);
- CPPUNIT_ASSERT_MESSAGE(std::string("origin detail"),!strcmp(attr.origin_detail,attr2.origin_detail));
-}
-
-void TypePluginTest::origin2()
-{
- glite_jp_context_t ctx;
-
- glite_jp_attrval_t attr = {
- "myattr",
- NULL,
- 0,0,
- GLITE_JP_ATTR_ORIG_USER,
- NULL,
- 0
- },attr2;
-
- char *db;
-
- glite_jp_init_context(&ctx);
- attr.timestamp = time(NULL);
- attr.value = "origin:test";
- attr.origin_detail = "ftp://some.server:1234/ugly \\file";
-
- db = glite_jp_attrval_to_db_full(ctx,&attr);
-
- CPPUNIT_ASSERT_MESSAGE(std::string("glite_jp_attrval_to_db_full()"),db);
- std::cerr << db << std::endl;
-
- glite_jp_attrval_from_db(ctx,db,&attr2);
- CPPUNIT_ASSERT_MESSAGE(std::string("origin detail"),!strcmp(attr.origin_detail,attr2.origin_detail));
- CPPUNIT_ASSERT_MESSAGE(std::string("value"),!strcmp(attr.value,attr2.value));
-}
-
-void TypePluginTest::index()
-{
- /* TODO: check monotonity */
-}
-
-CPPUNIT_TEST_SUITE_REGISTRATION(TypePluginTest);
-
-
-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 ;
-}
-
-
-
-
-/* fake to link */
-int glite_jppsbe_pread(
- glite_jp_context_t ctx,
- void *handle,
- void *buf,
- size_t nbytes,
- off_t offset,
- ssize_t *nbytes_ret
-)
-{
- abort();
-}
-
-
+++ /dev/null
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
+++ /dev/null
-# Default values
-top_srcdir=.
-stagedir=.
-globalprefix=glite
-lbprefix=lb
-package=glite-jp-doc
-version=0.0.0
-PREFIX=/opt/glite
-
--include Makefile.inc
-
-VPATH = ${top_srcdir}/src
-KPATH = TEXINPUTS=".:$(VPATH)//:"
-KPATHBIB = BIBINPUTS=".:$(VPATH)//:"
-
-LATEX = $(KPATH) latex
-PDFLATEX = $(KPATH) pdflatex
-BIBTEX = $(KPATHBIB) bibtex
-DVIPS = $(KPATH) dvips
-AT3=${stagedir}/sbin/glite-lb-at3
-INSTALL=install
-
-default all: generate JPUG.pdf JPAG.pdf JPDG.pdf
-
-generate:
-
-# %.dvi: %.tex
-# $(LATEX) $<
-# $(BIBTEX) `basename $< .tex`
-# $(LATEX) $<
-# $(LATEX) $<
-#
-# %.ps: %.dvi
-# $(DVIPS) -ta4 -o $@ $<
-
-%.pdf: %.tex
- $(PDFLATEX) $<
- $(BIBTEX) `basename $< .tex`
- $(PDFLATEX) $<
- $(PDFLATEX) $<
-
-%.tex: %.tex.T
- rm -f $@
- ${AT3} $< >$@ || rm -f $@
- chmod -w $@ >/dev/null
-
-install:
- -mkdir -p ${PREFIX}/share/doc/${package}-${version}
- $(INSTALL) -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
- $(INSTALL) -m 644 ${top_srcdir}/src/README ${PREFIX}/share/doc/${package}-${version}
- $(INSTALL) -m 644 JPUG.pdf ${PREFIX}/share/doc/${package}-${version}
- $(INSTALL) -m 644 JPAG.pdf ${PREFIX}/share/doc/${package}-${version}
- $(INSTALL) -m 644 JPDG.pdf ${PREFIX}/share/doc/${package}-${version}
-
-clean:
- rm -rvf JPUG* JPAG* JPDG*
- rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
-
-
-# dependencies:
-
-JPUG.pdf: JPUG.tex \
- JPUG-Introduction.tex \
- JPUG-Tools.tex glite-jpis-client.tex jpimporter.tex gui.tex \
- JPUG-UseCases.tex
-
-JPAG.pdf: JPAG.tex \
- JPAG-Introduction.tex LB-JP-interaction.tex \
- JPAG-Installation.tex \
- JPAG-Configuration.tex \
- JPAG-Running.tex \
- JPAG-Testing.tex \
- JPAG-Troubleshooting.tex
-
-JPDG.pdf: JPDG.tex \
- JPDG-Introduction.tex \
- JPDG-WS.tex
-
-.PHONY: all clean
+++ /dev/null
-\section{Configuration}
-\TODO{}
-
-\subsection{JPPS}
-\subsubsection{Setting up the MySQL database}
-
-
-\subsection{JPIS}
-
-\begin{alltt}
-The JP-IS server daemon assume prior creation of its database. Simple tool
- for database creation is org.glite.jp.index/config/dbsetup.sh
-
-customize startup script /etc/init.d/glite-jp-indexd (see below)
- and set up service startup using this script
-
-
-Currently, configuration is done by command line options, and
-some hard-coded options.
-
-
-The index server takes the following options:
-
-./glite-jp-indexd [option]
- -d, --debug don't run as daemon, additional diagnostics
- -q, --query-type hist/cont/both (default history)
- -n, --noauth don't check user identity with result owner
- -m, --mysql database connect string
- -p, --port port to listen
- -i, --pidfile file to store master pid
- -o, --logfile file to store logs
- -x, --config file with server configuration
-
-The config file parameter is required. There is the example configuration in
-$GLITE_LOCATION/etc/glite-jpis-config.xml.
-\end{alltt}
+++ /dev/null
-\section{Installation}
-\TODO{Import the content of \texttt{glite\_installation\_guide\_\[LB\|JP\].doc}.}
-
-\subsection{Complete RPMs description}
-
-\subsection{Daemons description}
-
-\subsection{CLI tools description}
-% admin (sbin) tools
+++ /dev/null
-\section{Introduction}
-\TODO{Do a reasonable merge with the JPUG-Introduction, do not duplicate text...}
-
-
-\subsection{Job Provenance service overview}
-The information about jobs submitted to gLite Workload Management
-System is collected by the Logging and Bookkeeping (LB) service.
-LB tracks jobs in terms of events and processes them in
-a~real time to give overall view on the actual job state. The user may
-query the bookkeeping server to obtain either the raw events or the
-computed job state, she may also register for receiving notifications
-on particular job state changes.
-
-While the LB is intended to keep track of jobs during its lifetime, it
-is not supposed to be used for long term archival of such data. The
-Job Provenance (JP) service is designed to provide long-term storage
-of all data related to job life and allow the end user to perform
-data-mining in this data.
-The JP is supposed to provide the permanent storage of
-the job related information as stored within the \LB, to couple it with
-the input sandboxes and other system oriented information necessary to
-reproduce the environment where a~particular job run.
-
-\subsubsection{Gathering data into Job Provenance}
-Fig.~\ref{fig:psinter} depicts basic gLite middleware components and
-their interaction with the Job Provenance.
-
-\begin{figure}[htpb]
- \centering
- \includegraphics[scale=0.7]{JP-interactions}
- \caption{Data flow into gLite Job Provenance}
- \label{fig:psinter}
-\end{figure}
-
-JP is formed of two classes of services: permanent \emph{Primary
-Storage} (JPPS) accepts and stores job data while possibly volatile
-and configurable \emph{Index Servers} (JPIS) provide an optimized
-querying and data-mining interface to the end-users. The only direct
-data retrieval scenario supported by JPPS is the case when user know exact ID
-of jobs in the interest.
-
-\subsubsection{Getting data from Job Provenance}
-
-The role of \emph{Index Servers} (JPIS) is processing and re-arranging the data
-from Primary Storage(s) into a~form suitable for frequent and complex user
-queries. A user query part of JP is shown in Fig.~\ref{fig:query}.
-
-\begin{figure}[htpb]
- \centering
- \includegraphics[scale=0.8]{JP-query}
- \caption{Index Server interactions}
- \label{fig:query}
-\end{figure}
-
-Index Servers are created, configured, and populated semi-dynamically
-according to particular user community needs. It is responsibility of
-its administrator to setup the JPIS with appropriate configuration. There
-is no prescribed relationship between Primary Storage and Index Server
-installations. An Index Server may retrieve data from multiple
-Primary Storages and vice versa.
-
-% TODO: update
-% 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.
-
-
-% LB-JP-interaction
-\input{LB-JP-interaction}
-
-%
-\subsection{Deployment scenarios}
-
+++ /dev/null
-\section{Running and stopping the services}
-\TODO{}
-
-
-\subsection{JPPS}
-
-
-\subsection{JPIS}
-
-\begin{alltt}
-Preferred way of starting the daemon is using start-up script
-(config/startup). It loads glite.conf file (personal version may be stored
-in ~/.glite.conf) where many variables may be set to configure the daemon.
-The script takes following variables:
-
-GLITE_JPIS_CONFIG - server config file specification
- (default is $GLITE_LOCATION//etc/glite-jpis-config.xml)
-GLITE_JPIS_DEBUG - setting to '-d' forces the daemon not to daemonize
-GLITE_JPIS_QT - defines query type
- 'hist' ... history query
- 'cont' ... continuous query
- 'both' ... combination of previous types
-GLITE_JPIS_AUTH - setting to '-n' forces the daemon not to check
- authorisation
-GLITE_JPIS_PORT - used port (default 8902)
-GLITE_JPIS_DB - database connection string
- (default jpis/@localhost:jpis)
-GLITE_JPIS_LOGFILE - log file
- (default is $GLITE_LOCATION_VAR/log/glite-jp-indexd.log)
-GLITE_JPIS_PIDFILE - pid file
- (default is $GLITE_LOCATION_VAR/run/glite-jp-indexd.log)
-
-\end{alltt}
+++ /dev/null
-\section{Testing JP functionality}
-% AKA Testplan
-
-\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: }}
-
-
-\subsection{JPPS standalone tests}
-
-\subsubsection{Job registration}
-
-\paragraph{Basic functionality}
-\label{regjob}
-\req\ Running JPPS
-
-\how
-\begin{itemize}
-\item call RegisterJob operation:
-\begin{verbatim}
-$ jpps-test RegisterJob JOBID OWNER
-\end{verbatim}
-where JOBID and OWNER should be replaced with real values, JOBID should not have
-been registered with JP before.
-
-\item call GetJobAttributes to verify:
-\begin{verbatim}
-$ jpps-test GetJobAttr JOBID http://egee.cesnet.cz/en/Schema/JP/System:owner
-\end{verbatim}
-\end{itemize}
-\result Should print the OWNER value supplied.
-
-\paragraph{AuthZ check}
-\req\ JPPS running, a~job registered with the procedure in~\ref{regjob}
-
-\how\
-Call GetJobAttributes using different user credentials
-
-\result\
-Should fail with ``Permission denied'' error
-
-\subsubsection{Tag recording}
-\label{tagreg}
-
-\paragraph{Basic functionality}
-\req\
-JPPS running, a~job registered with the procedure in~\ref{regjob}
-
-\how
-\begin{itemize}
-\item Call RecordTag operation:
-\begin{verbatim}
-$ jpps-test RecordTag JOBID TAGNAME STRINGVALUE
-\end{verbatim}
-\item Call GetJobAttributes to verify
-\begin{verbatim}
-$ jpps-test GetJobAttr JOBID TAGNAME
-\end{verbatim}
-\end{itemize}
-\result
-The recorded value should be returned.
-
-\how\ Record another values(s) of the same tag by repeating the RecordTag call
-
-\result\ GetJobAttr should return all the recorded values
-
-
-\paragraph{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{File upload}
-
-
-\paragraph{Basic functionality}
-\req\ JPPS running, my certificate subject amont JPPS trusted peers,
-\verb'globus-url-copy' in PATH
-
-\how
-Run the aggregate test script from \verb'org.glite.jp.primary/build'
-
-\begin{verbatim}
-$ ../examples/jpps_store_test -o 'OWNER' -d ../examples/job_template
-\end{verbatim}
-(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
-
-\paragraph{Phase checks}
-\TODO{salvet}
-% soubor nelze zapsat pred otevrenim operaci StartUpload
-% nelze cist pred Commitem
-% nelze zapsat po Commitu
-
-\paragraph{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
-
-
-\paragraph{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
-
-\subsection{\LB\ plugin}
-%\TODO{honik}
-\LB\ plugin is a component integrating the \LB\ functionality into JP.
-
-
-\subsubsection{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{Integrated tests}
-\req JPPS running with the \texttt{-P/path/to/the/glite\_lb\_plugin.so}
-
-\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
-\end{verbatim}
-\end{itemize}
-
-\result Should print the corresponding LB attributes
-
-\subsection{JPPS-JPIS interaction (feeds)}
-
-
-%set of queries (how many?) with different "triggering conditions":
-%- on job registration
-%- on LB file upload
-%- on RecordTag
-
-%corresponding sets of jobs to each query, each containing jobs which match
-%and which don't
-
-%- initial IS release -- single query, so just one set of jobs
-%- due to 3.2 no point in pre-loading PS database, use 1.3.1
-
-\subsubsection{Batch feed}
-%- upload jobs to PS
-%- start feed
-%* check IS contents (jobs and expected attr values)
-
-\req\ Clean JP-PS and JP-IS database.
-
-\how\
-\begin{enumerate}
- \item \emph{Start JP primary server}
- \item \emph{Register job to PS}
- \begin{alltt}
- for j in `seq 1 10`;
- do
- for i in glite-jp-primary-sample_job*.lb;
- do
- ./glite-jp-primary-store-test -o \emph{CERT_DN}
- -t "my_tag=car" -s https://localhost:8901 -d $i;
- done;
- done
- \end{alltt}
- You should see something like:
- \begin{alltt}
- ** ./glite-jp-primary-test -s https://localhost:8901 RegisterJob
- https://nonexistent.test.server/jpps_store_test_7199
- /O=CESNET/O=Masaryk University/CN=Milos Mulac
- OK
- ** ./glite-jp-primary-test -s https://localhost:8901 GetJobAttr
- https://nonexistent.test.server/jpps_store_test_7199
- http://egee.cesnet.cz/en/Schema/JP/System:owner
- OK
- Attribute values: /O=CESNET/O=Masaryk University/CN=Milos Mulac
- SYSTEM Thu Feb 16 14:40:02 2006
- ....
- Attribute values:
- car FILE Thu Feb 16 14:40:02 2006
- \end{alltt}
- \item \emph{Start JP index server, using history query}\\
- \item \emph{Check content of IS database}\\
- \begin{alltt}
- mysql -u jpis -e "select * from jobs;" jpis
- \end{alltt}
- You should get 50 results, similar to:
- \begin{alltt}
-| jobid | dg_jobid
-| ownerid | aclid | ps
-+----------------------------------+---------------------------------+
-| 7bd73b18b33410ba605fba99dbdd803f | https://nonexistent.test.server/jpps_store_test_5993
-| 5864429d57da18e4ecf9ea366c6b2c9c | NULL | https://localhost:18950 |
-...
-50 rows in set (0.00 sec)
- \end{alltt}
-\end{enumerate}
-\result{} Expected results in the IS database content check (last step).
-
-
-\subsubsection{Incremental feed - simple tests}
-%- register feed
-%- upload job to PS
-%* check PS and IS output
-
-\req\ Clean JP-PS and JP-IS database.
-
-\how\
-\begin{enumerate}
- \item \emph{Start JP primary server}
- \item \emph{Start JP index server, using continuous query}
- \item \emph{Registerjob}
- \begin{alltt}
- ./jpps-test -s https://localhost:18950 RegisterJob
- https://nonexistent.test.server/jpps_store_test_6880 "/O=CESNET/O=Masaryk
- University/CN=Milos Mulac"
- OK
- \end{alltt}
- \jpps\
- \begin{alltt}
- [22004] client DN: /O=CESNET/O=Masaryk University/CN=Milos Mulac
- __jpsrv__RegisterJob https://nonexistent.test.server/jpps_store_test_6881
- /O=CESNET/O=Masaryk University/CN=Milos Mulac
- feed to https://scientific.civ.zcu.cz:8902, job https://nonexistent.test.server/
- jpps_store_test_6881
- \end{alltt}
- \jpis\
- \begin{alltt}
- ...
- [21984] incoming request
- __jpsrv__UpdateJobs
- ...
- glite_jpis_lazyInsertJob: owner '/O=CESNET/O=Masaryk University/CN=Milos Mulac'
- found
- glite_jpis_insertAttrVal: (http://egee.cesnet.cz/en/Schema/JP/System:owner)
- sql=INSERT INTO attr_52942b8c70bab8491ab5d3b9713d79f5 (jobid, value, full_value,
- origin) VALUES (
- '6e436919404778b75cd27eef266190bb',
- 'S:/O=CESNET/O=Masaryk University/CN=Milos Mulac',
- 'S:/O=CESNET/O=Masaryk University/CN=Milos Mulac',
- '1'
-)
- glite_jpis_insertAttrVal: (http://egee.cesnet.cz/en/Schema/JP/System:regtime) ...
- ...
- \end{alltt}
-
- \item \emph{Start upload}
- \begin{alltt}
- ./jpps-test -s https://localhost:18950 StartUpload
- https://nonexistent.test.server/jpps_store_test_6880
- urn:org.glite.jp.primary:lb 1234 text/plain
- OK
- Destination: gsiftp://scientific.civ.zcu.cz:8960//home/mulac/jp/internal/
- data/5864429d57da18e4ecf9ea366c6b2c9c/1889/jpps_store_test_6880/lb
- Commit before: Sat Mar 17 10:12:48 2007
- \end{alltt}
- \jpps\
- \begin{alltt}
- [22004] client DN: /O=CESNET/O=Masaryk University/CN=Milos Mulac
- data_basename: (null)
- \end{alltt}
- \jpis\
- nothing
- \item \emph{globus-url-copy}
- \begin{alltt}
- globus-url-copy file:/home/mulac/src/ORG/org.glite.jp.primary/build/job.6880
- gsiftp://scientific.civ.zcu.cz:8960//home/mulac/jp/internal/
- data/5864429d57da18e4ecf9ea366c6b2c9c/1889/jpps_store_test_6880/lb
- \end{alltt}
- \jpps\
- nothing \\
- \jpis\
- nothing \\
- \noindent\textbf{Other:}
- File specified in gsiftp URL should be created.
- \item \emph{Commit upload}
- \begin{alltt}
- ./jpps-test -s https://localhost:18950 CommitUpload
- gsiftp://scientific.civ.zcu.cz:8960//home/mulac/jp/internal/data/
- 5864429d57da18e4ecf9ea366c6b2c9c/1889/jpps_store_test_6880/lb
- OK
- \end{alltt}
- \jpps\
- \begin{alltt}
- [22004] client DN: /O=CESNET/O=Masaryk University/CN=Milos Mulac
- glite_jpps_match_file: https://nonexistent.test.server/jpps_store_test_6880 lb (null)
- lb_plugin: opened 8 events
- lb_plugin: close OK
- feed to https://scientific.civ.zcu.cz:8902, job https://nonexistent.test.server/
- jpps_store_test_6880
- \end{alltt}
- \jpis\
- \begin{alltt}
- ...
- __jpsrv__UpdateJobs
- ...
- glite_jpis_insertAttrVal: (http://egee.cesnet.cz/en/Schema/LB/Attributes:CE)
- sql=INSERT INTO attr_c47f78255056386d2b3da6d506d1f244 (jobid, value,
- full_value, origin) VALUES (
- '39a0a14f4fc084fbb466728986e5ea2f',
- 'S:destination CE/queue',
- 'S:destination CE/queue',
- '3'
- )
- ...
- \end{alltt}
- \end{enumerate}
-
-\result{} Expected results in logs.
-
-
-\subsubsection{Incremental feed}
-%- register feed
-%- upload jobs to PS one by one
-%* check IS contents (matching jobs should turn up, others not)
-
-\req\ Clean JP-PS and JP-IS database.
-
-\how\
-\begin{enumerate}
- \item \emph{Start JP primary server}
- \item \emph{Start JP index server, using continuous query}
- \item \emph{Register job to PS}
- The same as in previous test case.
-
- \item \emph{Check output of IS}\\
- You should see incomming connection logs, and among them
- several times something like:
- \begin{alltt}
-
- INSERT INTO attr_52942b8c70bab8491ab5d3b9713d79f5 (jobid, value,
- full_value, origin) VALUES (
- '6f4866f3e4f8204c269449e6924d73c0',
- 'S:/O=CESNET/O=Masaryk University/CN=Milos Mulac',
- 'S:/O=CESNET/O=Masaryk University/CN=Milos Mulac',
- '1')
- ....
- \end{alltt}
- \item \emph{Check content of IS database}\\
- Do the same test as in previous test case. It must give you the same
- result. You can also look whether the insert from previous step was
- successful:
- \begin{alltt}
- mysql -u jpis -e "select * from
- attr_52942b8c70bab8491ab5d3b9713d79f5;" jpis
- \end{alltt}
- should return:
- \begin{alltt}
-| jobid | value
-| full_value | origin |
-+----------------------------------+-----------------------------------+
-| 76698aabbf5d60dfa5b42c279e1f0e8c | S:/O=CESNET/O=Masaryk University/CN=Milos
-Mulac
-| S:/O=CESNET/O=Masaryk University/CN=Milos Mulac | 1 |
- \end{alltt}
-\end{enumerate}
-\result{} Expected database INSERTs in the JP-IS (last two steps).
-
-\subsubsection{Multiple feeds at time}
-\TODO{TBD}
-
-\subsubsection{Advanced feed features (to be implemented)}
-- remove (not implemented in PS yet)
-- splitted info about one job (check that the PS doesn't duplicate
- attribute values) - probably covered in 3.2
-
-
-\subsubsection{PS-IS AuthZ}
-\TODO{Not implemented yet}
-
-\subsection{IS queries}
-
-
-%TBD: insert job sets via JP-IS interaction or directly?
-% - better to populate database directly, independent on previous chain
-%
-%All basic tests:
-%- clear IS database
-%- insert prepared job set
-%- ask queries and check answers
-%- clear database
-%
-%TBD: Is one job set enough?
-% - better to have one complete set
-%
-
-A majority of test from this chapter is automated by shell
-script. The script is located in \texttt{org.glite.jp.index} module
-under \texttt{example/query-tests} directory and called \texttt{run-test.sh}.
-It is available as a part of JP index server RPM package.
-
-\begin{hints}
-The testing shell script is highly configurable via
-environmental varibles. Please, run the script (run-test.sh) with
-'-?' option to get list of all variables and their meaning, if you are
-not satisfied with default setting.
-\end{hints}
-
-\subsubsection{Simple query}
-This test starts new index server instance, creates testing DB
-and populate it with prepared data sample. Then simple query is given
-to server, answer is checked with supposed return output and
-cleanup is done.
-
-
-\how\ Run \texttt{run-test.sh}
-
-\begin{hints}
-The query is in file test/simple\_query.in and has following
- form: (status=Ready)
-\end{hints}
-
-\subsubsection{Complex query test}
-This is similar to simple query test, only tested query is more complicated.
-
-\how\ Run \texttt{run-test.sh}
-
-\begin{hints}
-The query is in file test/complex\_query.in and has followhing
- form: (status=Done OR status=READY) AND (user!=God)
-\end{hints}
-
-\subsubsection{Feed \& query test}
-This test starts testing index server, feeds it by
-mimicing bahaviour of primary storage server by sending data
-via soap call, and then asks the index server using a complex
-query. After that it checks the responce and does cleanup.
-
-More precise description of steps:
-\begin{enumerate}
- \item Simulation of response from a primary storage, making appropriate
- changes in JP-IS database (inserts feedid).
- \item Invocation of updateJobs wsdl call, normally invoked by JP-PS, and
- sending this way some data to the JP-IS which stores them in its database.
- \item Invocation of queryJobs wsdl call, normally called by user
- program, obtaining previously inserted data. Test query used here has form
- (status=Done OR status=Ready) AND (user!=God).
-\end{enumerate}
-
-\how\ Run \texttt{run-test.sh}
-
-\subsubsection{AuthZ checks}
-This test verifies that qeury responses are properly restricted by
-authorization checks. Currently only implicit ACLs are implemented
-inside JP-IS server, so explicit ACLs and its evaluation is to be implemented.
-
-There are 3 scenarios to be verified:
-\begin{itemize}
- \item Authorization (checking ownership) is swithed off (IS with -n
- option). This scenario is tested by simple query test described above.
- \item Only user jobs are returned and jobs not owned by the user posing
- the query are not covered by the query response. This scenario is
- covered by Feed \& query test described above.
- \item Check that queries to jobs not owned by the IS user are
- returning empty response. The same behaviour as simple query test
- described above but with user credential not matching job
- owner. This test is implemented by \texttt{run-test.sh} under AuthZ
- check part.
-\end{itemize}
-
-\subsubsection{Another supposed tests not implemented yet}
-
-\begin{itemize}
- \item Check "origin" behaviour -- queries with origin tag
- \item IS CLI tests -- use prepared config files and command line parameters
- and check expected QueryJobs contents
-\end{itemize}
-
-
-\subsection{IS standalone advanced features}
-\TODO{Not implemented yet}
-
-\subsubsection{Server startup}
-
-\paragraph{Reboot persistency / configuration vs. database content}
- situations handling
-- prepared config files
-- checking behaviour (how?) after reboot with different config file
-
-\paragraph{Registration of PS feeds}
-! already covered by 3
-- prepared config files
-- checking appropriate FeedIndex calls
-
-\subsubsection{Admin interface}
-\TODO{Admin interface not implemented yet}
-
-\subsubsection{Type plugin}
-\TODO{type plugin tests -- to be designed, future type plugin implementation}
-
-\subsection{Deployment}
-\TODO{tests on JP deployment process}
-\TODO{TBD}
-
+++ /dev/null
-\section{Troubleshooting}
-\TODO{}
-
-\subsection{Debugging}
-\subsection{Fine tuning the performance}
-
+++ /dev/null
-\documentclass{egee}
-%\usepackage{doxygen}
-
-\input{definitions}
-
-\title{Job Provenance}
-\Subtitle{Administrator's Guide}
-\author{CESNET EGEE II JRA1 team}
-\DocIdentifier{EGEE-II....}
-\Date{\today}
-\Activity{JRA1: Middleware Engineering and Integration}
-\DocStatus{DRAFT}
-\Dissemination{PUBLIC}
-\DocumentLink{http://...}
-
-\Abstract{ This administrator's guide explains how to administer the Job
-Provenance (\JP) service. Several deployment scenarios are described together
-with the installation, configuration, running and troubleshooting steps. }
-
-\begin{document}
-
-\input{frontmatter}
-\newpage
-\tableofcontents
-
-\newpage
-\input{JPAG-Introduction}
-
-\newpage
-\input{JPAG-Installation}
-
-\newpage
-\input{JPAG-Configuration}
-
-\newpage
-\input{JPAG-Running}
-
-\newpage
-\input{JPAG-Testing}
-
-\newpage
-\input{JPAG-Troubleshooting}
-
-\nocite{jgc}
-\bibliographystyle{unsrt}
-\bibliography{lbjp}
-
-\end{document}
+++ /dev/null
-\section{Introduction}
-
-\TODO{Best practices :)}
-
+++ /dev/null
-\section{Web Service Interface}
-
-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
-}
-
-\TODO{Add more info about the Web Service Interface...}
-
-% JPWS reference:
-{
-\parindent0pt
-\def\chapter#1{}
-\def\section#1{\subsection{#1}}
-\def\subsection#1{\par\medskip\textbf{#1}\par}
-
-\let\odesc=\description
-\let\oedesc=\enddescription
-\renewenvironment{description}{\odesc\itemindent=1em
-\listparindent=2em
-}{\oedesc}
-%\renewenvironment{description}{\list{}{\labelwidth 5cm\leftmargin 5cm}}
-%{\endlist}
-
-\let\null=\relax
-
-% this file was manually generated using db2latex (http://db2latex.sourceforge.net)
-% from org.glite.jp.ws-interface/build/doc-html.xml
-% TODO: generate it automatically here in Makefile
-
-\input{jpws}
-}
-
+++ /dev/null
-\documentclass{egee}
-
-\input{definitions}
-
-\title{Job Provenance}
-\Subtitle{Developer's Guide}
-\author{CESNET EGEE II JRA1 team}
-\DocIdentifier{EGEE-II....}
-\Date{\today}
-\Activity{JRA1: Middleware Engineering and Integration}
-\DocStatus{DRAFT}
-\Dissemination{PUBLIC}
-\DocumentLink{http://...}
-
-\Abstract{This developer's guide explains how to use the Job Provenance (\JP)
-service API, namely the Web Services Interface is described in details together with
-programing examples. }
-
-\begin{document}
-
-\input{frontmatter}
-\tableofcontents
-
-\newpage
-\input{JPDG-Introduction}
-
-\newpage
-\input{JPDG-WS}
-
-\newpage
-\nocite{jgc}
-\bibliographystyle{unsrt}
-\bibliography{lbjp}
-
-\end{document}
-
+++ /dev/null
-\section{Introduction}
-
-The Job Provenance (\JP) service is primarily designed to provide a permanent
-storage and advanced querying interface to the data about Grid jobs and
-the environment they were run in. This information is to be used for
-statistical purposes, lookup for patterns in the Grid behavior and also
-for job re-submission.
-
-The Job Provenance extends the data model specified by the \LB service
-with additional information about each job---most specifically the input
-and output data files---and also information about the run time
-environment.
-
-The Job Provenance must fulfill rather contradictory requirements. It
-must keep detailed information about each job, the environment the job
-run in and the affected files, as possible. On the other hand, being a
-permanent service, the job records must be kept reasonably small
-to fit into reasonable sized storage system. Given the expected number of
-jobs on large scale Grids---\eg the EGEE already
-reports\footnote{\url{http://egee-jra2.web.cern.ch/EGEE-JRA2/QoS/JobsMetrics/JobMetrics.htm}}
-20k jobs per day, that is 7.5M jobs per year, a number of jobs before the
-large experiments will be deployed---the \JP must also support very
-efficient searching and querying features. Another problem is associated
-with the long life span of the \JP service. It must be expected that the
-data formats will change over the time, while the \JP is expected to deal
-with old and new data formats in a uniform way. They can be achieved via
-extensibility of the JP data model.
-
-As the data collection serviced by the JP will extensively grow, it is
-impossible to rely only on the primary data when navigating through it.
-Users must be able to add annotations to individual job records and these
-annotations serve two primary purposes---to help in organizing the \JP
-data and to be a source of additional information, not provided directly
-by the automated collection of primary data. Even annotations must follow
-the WORM (write once read many times) semantics, as they are always added
-on top of the already stored data, never re-writing the old annotations.
-Work with the most recent set of annotations as well as ability to
-inspect the history of annotations must be supported.
-
-Fig.~\ref{fig:psinter} depicts interaction between Job Provenance and
-other Grid middleware components (on the example of the gLite
-infrastructure).
-\begin{figure}[ht]
- \centering
- \includegraphics[scale=0.5]{images/JP-interactions}
- \caption{Data flow into gLite Job Provenance}
- \label{fig:psinter}
-\end{figure}
-
-\subsection{Concepts}
-\ludek{\TODO{Obrazky moc nezapadaji do soucasne struktury textu :-(}}
-
-\subsubsection{Data gathering}%
-\label{data}
-%\begin{comment}
-%\todo{job record, job attributes} \todo{open design, scalable}
-%\todo{we have very small persistent record (jobid, owner, timescale),
-% set of associated files and we maintain corresponding plugins (by what?) to
-% interpret them; metadata are mined, indexed and provided on demand}
-%\todo{attribute namespaces---a glue to source of metadata}
-%\end{comment}
-
-The primary data organization in \JP is on a per job basis, a concept
-taken from the \LB data organization. Every data item stored in JP is
-associated to a~particular Grid job. As the overall storage capacity
-requirements may become enormous, we store only volatile data which are
-neither stored reliably elsewhere nor are reproducible by the job.
-The data gathered from the gLite middleware fall into the following categories:
-\begin{itemize}
-\item job inputs, directly required for job re-running
-\begin{itemize}
-\item complete job description (JDL) as submitted to WMS
-\item miscellaneous input files (gLite WMS input sandbox) provided by the user
-(but job input files from remote storage \emph{are not} copied to JP)
-\end{itemize}
-\item job execution track, witnessing the environment of job execution
-\begin{itemize}
-\item complete \LB data, for example when and where the job was
- planned and executed, how many times and for what reasons it was
- resubmitted etc.
-\item ``measurements'' on computing elements, \eg versions of installed
-software, environment settings etc.
-\end{itemize}
-\end{itemize}
-In addition, the service allows the user to add arbitrary annotations to
-a~job in a form of ``name = value'' pairs.
-These annotations can be recorded either during the job execution or at any time
-afterward.
-Besides providing information on the job (\eg it was a~production-phase
-job of a particular experiment) these annotations may carry
-information on relationships between the job and other entities
-like external datasets, forming the desired data provenance record.
-
-%\TODO{zduraznit WORM semantiku + citace na IPAW}
-Once a~piece of data is recorded for a~job, it can be never updated or
-replaced.
-New values can be recorded%
-\footnote{It seems to make sense only for the annotations, not the
-middleware data, and the current implementation makes this restriction.
-However, it can be relaxed without principal impact.}
-but the old values are always preserved.
-Consequently the recorded history cannot be lost.
-
-
-\subsubsection{Data representation}%
-\label{attrib}
-
-The \JP concept distinguishes between two views on the processed data.
-The data are stored in the \JP in the \emph{raw representation}.
-Two input modes are assumed, depending mainly on the size
-and structure of the data:
-\begin{itemize}
-\item Small size \emph{tags} in a form of ``name = value'' pairs,
-enter the system via its primary interface (as a~web service operation
-in the current implementation).
-``Value'' is assumed to be a literal, without any structure that \JP should
-be aware of.
-
-\item \emph{Bulk files}, \eg the complete dump of \LB data or the job input
-sandbox, are uploaded via a~suitable transfer protocol%
-\footnote{The current implementation supports \texttt{gsiftp://} only but
-other protocols can be easily added.}.
-Files are supposed to be structured.
-However, they are stored ``as is'', and upon upload they are annotated with
-format identification, including version of the format.
-JP allows installing plugins that handle particular file formats (see bellow),
-understanding the file structure and extracting required information.
-\end{itemize}
-
-Most data manipulation is done using the \emph{logical view}.
-Any piece of information stored in JP is represented
-as a~value of a particular named \emph{attribute}. Tags (user
-annotations) map to attributes in a~straightforward way, name and value
-of the tags becoming name and value of an attribute. An uploaded file is
-usually a~source of multiple attributes, which are automatically extracted
-via \emph{plugins}. JP defines a~\emph{file-type plugin interface API}. The
-task of the plugin is parsing a~particular file type and providing calls
-to retrieve attribute values.
-
-To avoid naming conflicts even with future attributes,
-an attribute name always falls into a~namespace.
-Currently we declare three different namespaces: for JP system attributes
-(\eg job owner or
-registration time), attributes inherited from \LB, and unqualified user tags.
-
-\ludek{
-This representation unifies the user annotations, the ``system''
-middleware data and information extracted from uploaded files into
-a~single view.}
-
-\iffalse
-An attribute value must be always representable in the form of a~printable
-string.
-If it is not the case for a~native attribute type,
-converting rules must be provided by a~plugin (dynamically loadable library)
-implementing a~specified API.
-\fi
-
-We keep the scheme symmetric, which means that none of the currently declared attribute
-namespaces is privileged in any sense.
-However, it may present a~vulnerability\Dash a~malicious user may try
-to override a~\JP system attribute using the user annotation interface.
-Therefore each attribute value carries a~further \emph{origin classification}:
-currently \emph{system}, \emph{user} (recorded as tag), and
-\emph{file} (found in an uploaded file).
-
-Finally, as JP does not support updating data intentionally
-(see Sect~\ref{data}), multiple values of an attribute are allowed.
-The order in which the values were recorded can be reconstructed from
-timestamps attached to each value, getting the ``attribute update'' semantics
-if it is required.
-
-Attributes, representing the logical view, is the only way to specify queries on JP.
-However, once the user knows an~actual jobid, bulk files can be retrieved
-in the raw form, too (assumed to be useful in the case of input sandboxes
-reused for job re-execution).
-
-\subsubsection{Layered architecture}%
-\label{layered}
-\JP is formed of two classes of services: the permanent \emph{Primary Storage}
-(JPPS) accepts and stores job data
-while possibly volatile and configurable \emph{Index Servers} (JPIS)
-provide an optimized querying and data-mining interface to the end-users.
-
-The expected large amount of stored data yields a requirement on
-maximal compactness of the storage.
-The raw data should be compressed,
-and the set of metadata kept with each job must be minimal.
-\JP defines a~set of \emph{primary attributes} which are maintained
-by JPPS for each job.
-Jobid is the only mandatory primary attribute,
-other suggested ones are the job owner, submission time,
-and the virtual organization.
-All other attributes are retrieved from the raw data only when requested.
-
-The restricted set of primary attributes prohibits user queries to be served
-by the JPPS directly (with the only exception of the known jobid).
-Due to the expected low selectivity of primary attributes such queries
-would result in processing large number of job records, overloading
-the server when the queries became frequent.
-
-These contradictory requirements (compactness vs. performance) had to be
-resolved at another component layer.
-The main idea is preprocessing the huge \JP dataset with several queries,
-each of them covering a~superset of one expected class of user queries
-(\eg jobs of particular VO, submitted in certain period).
-If these super-queries are chosen carefully, they retrieve only a~small
-fraction of the primary data. Their results can thus be stored (or cached)
-in a~richer form, including various indices, hence being suitable
-for fast response to user queries.
-Querying JPPS in this way and maintaining the cache of the query result
-is the task of Index Servers in the \JP architecture.
-
-Relationship of JPPS and JPIS is a many-to-many---a~single JPIS can query
-multiple JPPS's and vice versa, a~single JPPS is ready to feed multiple JPIS's.
-
-The query conditions restrict the dataset in terms of the matching job records.
-Similarly, the query specifies a~set of attributes to retrieve,
-reducing also considerably the amount of retrieved data per each matching job.
-
-Index Servers query JPPS in two modes: in \emph{batch mode} JPIS is populated
-with all JPPS content matching the query. In this way JPIS can be created
-from scratch, despite the ope-ration is rather heavy for JPPS.
-On the other hand, the \emph{incremental mode} allows JPIS to subscribe with
-JPPS to receive new matching records as well as updates to already stored
-records whenever new data arrive to JPPS.
-This mode allows existing JPIS to be kept up to date while it is
-still lightweight for JPPS.
-
-Finally, the described layer of JPIS's needn't be the only one.
-The architecture (despite not the current implementation) allows
-building another layer of JPIS's with many-to-many relationship with
-the previous layer instances, combining their data, providing support
-for other specific user queries etc.
-
-\subsection{Prototype implementation}
-
-The \JP prototype implementation%
-\footnote{a part of the gLite middleware 3.x}
-follows the described architecture.
-
-\subsubsection{Primary Storage}%
-\label{primary}
-\iffalse
-The JP \emph{Primary Storage} (JPPS) is a~permanent service responsible
-for gathering the job data and their long-term archival.
-The primary data are kept in as compact form as possible, and
-only minimal metadata (jobid and owner, registration time) are maintained
-and indexed.
-\fi
-
-A~single instance of JPPS, shown in Fig.~\ref{fig:psinter},
-is formed by a~front-end, exposing
-its operations via a~web-service interface%
-\footnote{Described in detail in ``EGEE Middleware
-Design'',\\ \url{https://edms.cern.ch/document/487871/},
-documented web service definitions can be found at \\
-\url{http://egee.cesnet.cz/en/WSDL/}}%
-, and a~back-end, responsible
-for actual data storage and providing the bulk file transfer interface.
-The front-end metadata (the primary attributes for each job,
-authorization information, and JPIS subscription data)
-are stored in a~relational database (currently MySQL).
-
-The back-end uses Globus \texttt{gridftp} server enriched with authorization
-callbacks accessing the same database to check whether a~user
-is allowed to upload or retrieve a~given file.
-Both the front- and back-ends share a~filesystem so that the file-type plugins
-linked into the front-end access their files via POSIX~I/O.
-
-JPPS operations fall into the following categories:
-\begin{itemize}
-\item\emph{Job registration.}
-Each job has to be explicitly registered with JP.
-Currently the registration is done transparently by the \LB server
-upon job submission (in parallel with the job registration in \LB,
-though not blocking the job submission).
-
-\item\emph{Tag recording.}
-Add user tags (annotations) in the ``name = value'' form to JP job records.
-
-\item\emph{Bulk file upload.}
-File properties (type, optional name etc.)
-are specified via the front-end interface, the upload itself goes
-directly to the back-end (using \texttt{gridftp} transfer).
-
-\item\emph{Index Server feed} allows JPIS to ask for batch feed
-as well as register for incremental updates.
-
-\item\emph{Data retrieval.}
-The only direct data retrieval supported by JPPS is keyed by
-the jobid.
-Both individual attributes and the whole files can be retrieved.
-\end{itemize}
-
-Primary Storage covers the first set of requirements specified
-for a Job Provenance (see Sect.~\ref{jp:req}), \ie storing a~compact job
-record, allowing the user to add annotations, and providing elementary
-access to the data.
-
-\subsubsection{Index Server}
-Index Servers are created, configured, and populated semi-dynamically
-according to particular user community needs.
-The configuration is formed by:
-\begin{itemize}
-\item one or more Primary Storages to contact,
-\item conditions (expressed in terms of \JP attributes)
-on jobs that should be retrieved,
-\item list of attributes to be retrieved,
-\item list of attributes to be indexed\Dash a~user query must refer
-to at least one of these for performance reasons.
-\end{itemize}
-The set of attributes and the conditions specify the set of data that
-is retrieved from JPPS, and they reflect the assumed pattern
-of user queries.
-
-The current JPIS implementation keeps the data also in a~MySQL database.
-Its schema is flexible, reflecting the server configuration
-(columns are created to hold particular attribute value, as well as indices).
-
-The JPIS interface operations fall into the following categories:
-\begin{itemize}
-\item\emph{Responses to user queries.}
-A~query specifies a~set of attributes to retrieve and
-conditions determining the set of matching jobs.
-The structure of the query language is identical to~\LB---%
-it allows two-level nesting of comparisons of an attribute
-with a~constant value.
-
-\item\emph{JPIS-JPPS communication} implements the data flow from JPPS to JPIS.
-
-\item\emph{Administrative} calls to change JPIS configuration
-without interfering with its normal operation.
-\end{itemize}
-
-
-\iffalse % puvodni text, pouzity jen jako zdroj materialu v predchozim
-
-The role of \emph{Index Servers} (JPIS) is processing and re-arranging the data
-from Primary Storage(s) into a~form suitable for frequent and complex user
-queries.
-
-We can divide implemented operation into three categories:
-\begin{description}
-\item[Responses to user queries.]
-The main purpose of JPIS is to enable user complex queries.
-
-\begin{itemize}
-\item The \texttt{QueryJobs} operation enables to ask the user query and
-specify which attributes of matched jobs are returned.
-\end{itemize}
-
-\item[JPIS-JPPS communication.] Internal call enabling data exchange between.
-JPIS and JPPS.
-\begin{itemize}
-\item The \texttt{UpdateJobs} Called by JPPS as a response to \texttt{FeedIndex}
-request. Updates information on jobs in JPIS, according to what JPPS
-currently knows.
-\end{itemize}
-
-\item[Administration.] Admin calls for changing configuration on the fly.
-\begin{itemize}
-\item The \texttt{AddFeed} Called by JPIS admin tool to ask new primary storage server to feed it. Updates information on JPPS in index server, according to what JPPS currently knows.
-\item The \texttt{GetFeedIDs} Called by JPIS admin tool to find out its open feeds.
-\item The \texttt{DeleteFeed} Called by JPIS admin tool to remove one feed session.
-\end{itemize}
-
-\end{description}
-
-
-\subsubsection{Index Server}
-\label{index}
-%\begin{wrapfigure}{r}{.5\hsize}
-\begin{figure}
- \centering
- \includegraphics[scale=0.5]{images/JP-query}
- \caption{Index Server interactions}
- \label{fig:query}
-\end{figure}
-%\end{wrapfigure}
-
-
-
-A~typical interaction is shown in Fig.~\ref{fig:query}.%\\[-8mm]
-
-\begin{enumerate}
-\item The user queries one or more JPIS, receiving a~list of ID's
-of matching jobs.
-\item JPPS is directly queried for additional job attributes or URL's of
-stored files.
-\item The required files are retrieved.
-\end{enumerate}
-
-The current format of the user query is a~list of lists of conditions.
-A~condition is comparison (less, greater, equal) of an attribute
-\wrt\ a~constant. Items of an~inner list must refer to the same attribute
-and they are logically or-ed.
-Finally the inner lists are logically and-ed.
-According to our experience with the \LB\ service,
-this query language is powerful enough to satisfy user needs
-while simple enough to allow efficient implementation.
-
-Index Servers are created, configured, and populated semi-dynamically
-according to particular user community needs.
-The configuration is formed by:
-\begin{itemize}
-\item one or more Primary Storages to contact,
-\item conditions on jobs that should be retrieved,
-\item list of attributes to be retrieved,
-\item list of attributes to be indexed\Dash a~user query must refer
-to at least one of these for performance reasons.
-\end{itemize}
-The set of attributes and the conditions specify the set of data that
-is retrieved from JPPS, and it reflects the assumed pattern
-of user queries.
-The amount of data fed into a~single JPIS instance is assumed to be
-only a~fraction of data in JPPS,
-both regarding the number of jobs, and the number of distinct attributes.
-
-Communication between JPIS and JPPS involves two
-complementary web-service operations:
-JPIS calls the \texttt{FeedIndex} operation of JPPS,
-specifying the list of attributes and conditions.
-Unlike the user queries, the query on JPPS is a~single and-ed list,
-allowing less complex processing on JPPS where significantly larger
-data set are involved.
-JPPS responds by calling the \texttt{UpdateJobs} operation of JPIS
-(repeatedly to split up large dataset).
-
-The following flags in the \texttt{FeedIndex} call specify the query mode:
-\begin{itemize}
-\item \emph{history}\Dash JPPS should process all its stored data,
-giving the user the guaranty that if
-her query is a~logical restriction of the JPIS configuration,
-it returns a~complete result.
-This type of query is usually necessary to populate JPIS but it imposes
-rather high load on JPPS.
-\item \emph{continuous}\Dash JPIS registers with JPPS for receiving
-\emph{future updates} when data matching the query arrive.
-This type of query allows JPIS to be kept up to date while imposing minimal
-load on JPPS.
-\end{itemize}
-
-The current JPIS implementation keeps the data also in a~MySQL database.
-Its schema is flexible, reflecting the Server configuration
-(columns are created to hold particular attribute value, as well as indices).
-There is no prescribed relationship between Primary Storage and Index Server
-installations.
-An Index Server may retrieve data from multiple Primary Storages
-and vice versa.
-
-\fi % konec materialu
-
-\subsubsection{Scalability and deployment}
-Having evaluated a~random sample of \LB data on approx. 1000 jobs,
-we claim that the usual size of a~complete \LB data dump varies
-from 2\,kB to 100\,kB, with very rare exceptions (less than 1\,\%)
-of sizes up to 5\,MB.
-However, these plain text files contain repeating patterns and they can
-be compressed with the ratio of 1:4--1:20 in the typical cases
-and even higher for the large files.
-Therefore the assumption of 10\,kB compressed \LB dump per job is a~fairly
-safe upper limit.
-Unfortunately, we were not able to do a~similar assessment for job sandbox
-sizes. Expecting the sandboxes to contain only miscellaneous input files
-we work with the hypothesis of 100\,kB--1\,MB sandbox size.
-
-The current statistics for the entire infrastructure of the EGEE project
-report the rate of 20,000 jobs per day, while the middleware
-performance challenges aim at one million jobs per day.
-
-\begin{table}
-\begin{tabular}{r|c|c|c}
-\textbf{job rate $\backslash$ size} & \textbf{10\,kB \LB} & \textbf{100\,kB sandbox} & \textbf{1\,MB sandbox} \\
-\hline
-current 20\,k/day & 73\,GB/year & 730\,GB/year & 7.3\,TB/year \\
-challenge 1\,M/day & 3.6\,TB/year & (36\,TB/year) & (360\,TB/year)
-\end{tabular}
-\caption{Expected aggregate storage size (whole EGEE)}
-\label{t:jpsize}
-\end{table}
-
-\begin{table}
-\begin{tabular}{r|c|c|c}
-\textbf{job rate $\backslash$ size} & \textbf{10\,kB \LB} & \textbf{100\,kB sandbox} & \textbf{1\,MB sandbox} \\
-\hline
-current 20\,k/day & 2.3\,kB/s & 23\,kB/s & 230\,kB/s \\
-challenge 1\,M/day & 115\,kB/s & (1.15\,MB/s) & (11.5\,MB/s)
-\end{tabular}
-\caption{Expected aggregate incoming data rate (whole EGEE)}
-\label{t:jprate}
-\end{table}
-
-
-Tables~\ref{t:jpsize} and \ref{t:jprate} use the discussed numbers to derive
-the per-year storage size and per-second incoming data rate requirements on Job
-Provenance.
-The sandbox numbers for the 1\,M job challenge are shown in parentheses
-because of being rather hypothetical\Dash
-in order to achieve the required job throughput at WMS side,
-the jobs must be submitted in fairly large \emph{collections}
-(chunks of approx. 100--10,000 individual jobs) that share a~single input
-sandbox%
-\footnote{This statement is based on informal discussions with WMS developers.
-The targeted WMS instance throughput at the time of this manuscript preparation
-was 1 sandbox-less job per second, \ie\ 84.6\,k such jobs per day (achieving
-the 1\,M job rate with WMS clustering only),
-while the sandbox handling overhead is considered
-to be unsustainable at this rate.}.
-Therefore the real aggregate storage and throughput requirements on \JP can be
-reduced by the factor of at least 100.
-
-Despite these figures are aggregate for the whole huge EGEE infrastructure,
-they clearly show that the requirements could be met even with a~single
-reasonably sized server.
-
-JP is designed to support many-to-many relationship of JPPS and JPIS
-instances. Therefore there are no strict design requirements on the
-number and structure of installations.
-However, for practical reasons (some emerge from Sect.~\ref{jpusage}),
-it is desirable to keep just small number of well known
-JPPS's permanent services.
-Typical setup can be one \JP per a~larger virtual organization, or even
-one \JP shared by several smaller ones.
-The outlined numbers show that this approach should not face technical
-limits.
-On the other hand, JPIS's are expected to be set up and configured
-semi-dynamically, according to the varying needs of even small user
-communities.
-
-
-\iffalse
-Only limited number of JPPS installations must be deployed even on
-a~large Grid to concentrate the provenance data. At most one JPPS per
-a~virtual organization is envisaged for the EGEE environment.
-This mean each JPPS must be able to deal with data on millions of jobs. The
-typical size of an \LB\ dump is around 10\,kB per compressed record,
-and gLite users are encouraged not to use large job sandboxes, too.
-Consequently, the back-end storage requirements are at the order of 10-100\,GB.
-JPPS metadata are formed by a~single tuple for
-each job and for each file, with unique indices on jobid and file name.
-The used MySQL database engine is capable to handle millions of such records.
-\fi
-
-
-\subsection{Use patterns}%
-\label{jpusage}
-
-\subsubsection{Storing data}
-Propagation of data from other middleware components to \JP is done
-transparently.
-The user may affect it indirectly by
-specifying the destination JPPS and gathered data extent
-(\eg whether to store the job to \JP at all, or which sandbox files to keep)
-via parameters in the job description. These settings
-may be overridden by the WMS or CE policies.
-
-The user stores data to \JP directly when recording annotations
-(Sects.~\ref{data} and~\ref{primary}). \ludek{JPPS instance which stores
-the information on the job must be known, see bellow.}
-
-\subsubsection{Single job processing}
-When full information on a~particular job is required (\eg for the
-job re-execution),
-the JPPS instance which keeps the job data must be contacted.
-If it is known (\eg the only JPPS serving particular VO), the data retrieval
-is straightforward using JPPS interfaces, as the jobid is the primary
-key to access JPPS data.
-
-However, if JPPS for the job is not known, it must be looked up
-using JPIS query.
-Depending on the amount of the user's knowledge of the job details
-\wrt\ JPIS configurations (\eg JPIS configured to request information
-on jobs submitted in a~certain time interval is aware of the user's
-job only if its submission time falls into this interval)
-it may be necessary to query multiple JPIS's to find the particular job.
-
-\subsubsection{Job information retrieval}
-Besides preserving the job data
-the principal purpose of the \JP is to provide job information
-according to some criteria,
-freeing the user of the burden to keep complete records on her jobs.
-
-As discussed in Sect.~\ref{layered} the searches cannot be served
-directly by the JPPS.
-Therefore, the search must be done with querying a~particular JPIS
-which configuration matches the user query:
-\begin{itemize}
-\item The user query criteria overlap with the JPIS configuration.
-\Eg it makes little sense to look for
-jobs submitted in May 2005 at a~JPIS restricted to be fed with data on
-jobs submitted in 2006 only.
-
-\item The criteria trigger a~configured index at JPIS, avoiding
-full scan through its data.
-\end{itemize}
-Again, it may be necessary to query multiple JPIS's and concatenate
-the partial results.
-Currently we do not address the potentially non-trivial problem of finding
-suitable JPIS's.
-It falls out of the scope of the \JP level, and should be preferably
-solved at the service discovery level.
-
-\iffalse
-Such a~search would result in scanning through all data stored in JP
-which are expected to be huge, being unacceptable for frequent user queries.
-Instead we define an architecture that allows
-batch pre-processing of configurable queries.
-The result of such query, a~superset of certain user query type, is further
-indexed in order to provide fast response to concrete user queries.
-
-
-We foreseen the following typical user queries:
-\begin{itemize}
-\item The user knows a jobid, job isn't longer in the \LB. He will ask the
- JPPS to get all or selected attributes of job.
-\item The user knows a jobid, job is in a terminal state. The user wants
- all files (LB event dump, sandbox) stored by JP for further processing.
-\item The user is looking for jobs with specific properties. In this case
- (no jobid 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.
- The user should know the proper JPIS to use for its particular
- needs.
-\item The user wants to add a user tag (annotation) to a job. He must know
- the jobid(s).
-\end{itemize}
-\fi
-
-
-\subsection{Security}
-
-The data stored in the \JP are in fact potentially more
-sensitive as they also include information about the inputs and are kept
-for eternity. All the interaction between components is
-authenticated and only encrypted channels are used to transfer data. The
-basic security model is inherited from the \LB, thus user and server
-certificates are used for encryption and TLS is used for channel
-encryption.
-
-The data in JPPS and JPIS are not encrypted as this would create a
-problem with permanent depository of encryption keys. We also cannot use
-users' public keys to encrypt the data as this would complicate sharing
-and also endanger the data in case of private key loss. Instead, with a
-very limited number of JPPS's deployed, we trust the \JP servers. Each
-JPPS keeps list of authorized components (\LB, Resource Brokers,~\ldots)
-that are allowed to upload data to the \JP server.
-
-The sensitive nature of data requires also strong authorization support.
-While currently only implicit ACLs (only the job owner has access to
-the data) are supported, we plan to use the VOMS
-based authorization service to provide a fine grained (at the user/group
-level) of authorization control. In the same way as in the \LB, users
-will be able to specify who is authorized to access the data stored in
-the \JP. In the current model, we plan to support read-only sharing, the
-annotations should be always stored by the job owner only. However, a~way
-to transfer ownership of the data to another person must be also
-developed, to cover employees leave and even a death.
-
-\iffalse
-\subsubsection{Internal and external interactions}
-
-Fig.~\ref{fig:psinter} shows interaction of \JP with other gLite components,
-Fig.~\ref{fig:query} shows internal data flow in \JP as well as interaction
-with the end-user (JP client).
-In this section we discuss the involved operations and data transfers.
-Unless specified otherwise, the communication occurs as web-service calls
-over SSL-authenticated connections.
-The interfaces are described in detail in~document ``EGEE Middleware Design''
-\footnote{https://edms.cern.ch/document/487871/},
-documented web service definitions can be found at \url{http://egee.cesnet.cz/en/WSDL/}.
-
-\emph{Search for jobs.}
-The user does not known actual jobid's and searches for a~set of
-jobs matching particular conditions (see Sect.~\ref{user}).
-Such query cannot be served directly by \JP Primary Storage due to performance
-reasons\Dash it would typically require sweep through a~large set of primary data.
-On the contrary, the query must be directed to an Index Server that was
-already populated with jobs matching a~broader condition.
-By calling
-the Index Server \texttt{QueryJobs} operation, the user
-retrieves
-a~set of jobid's with addresses of Primary Storage
-where the data on the jobs are stored.
-
-
-\subsubsection{Scalability and extensibility}
-\todo{configuration, describe index server administrator role}
-\todo{modularity (plug-ins), type plugin IS?}
-\todo{najit kompromis pro rozdeleni informaci sem a do Service and
- administrators view dole, nebo jedno zrusit}
-\fi
-
+++ /dev/null
-\section{Tools description}
-
-In this section we give a description of the tools that are installed
-together with the \verb'glite-jp-client'. These are the only \JP\ tools that a
-regular grid user may need to use.
-
-
-% This file was manually generated using db2latex (http://db2latex.sourceforge.net)
-% from org.glite.jp.index/doc/glite-jpis-client.sgml
-% TODO: update the original file
-% TODO: generate it automatically here in Makefile
-{
-\parindent0pt
-\def\section#1{\subsection{#1}}
-\newcommand{\dbz}{}
-\newcommand{\docbooktolatexpipe}{\ensuremath{|}}
-\newskip\docbooktolatexoldparskip
-\input{glite-jpis-client}
-}
-
-
-\input{jpimporter}
-
-
-\input{gui}
+++ /dev/null
-\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.
-
-% TODO: update
-% 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}
-
-\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.
-
+++ /dev/null
-\documentclass{egee}
-
-\input{definitions}
-
-\title{Job Provenance}
-\Subtitle{User's Guide}
-\author{CESNET EGEE II JRA1 team}
-\DocIdentifier{EGEE-II....}
-\Date{\today}
-\Activity{JRA1: Middleware Engineering and Integration}
-\DocStatus{DRAFT}
-\Dissemination{PUBLIC}
-\DocumentLink{http://...}
-
-\Abstract{This user's guide explains how to use the Job Provenance (\JP)
-service from the user's point of view. The service architecture is described
-thoroughly. Examples on using \JP\ are given... }
-
-\begin{document}
-
-\input{frontmatter}
-\tableofcontents
-
-\newpage
-\input{JPUG-Introduction}
-
-\newpage
-\input{JPUG-Tools}
-
-\newpage
-\input{JPUG-UseCases}
-
-%\appendix
-%\newpage
-%\input{JPUG-Appendix}
-
-\newpage
-\nocite{jgc}
-\bibliographystyle{unsrt}
-\bibliography{lbjp}
-
-\end{document}
-
+++ /dev/null
-\subsection{Interaction with Logging and Bookeeping (\LB)}
-
-In this section we describe the interaction of JP with Logging and Bookkeeping
-(\LB) service. The data flows between LB and JP services are displayed in
-Figure~\ref{fig:LB-JP-interactions}. These flows are numbered and one 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|p{3cm}|l|p{9cm}|}
- \hline
- &spool directory&initiated by&description\\
- \hline
- \hline
- 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.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
- 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.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
- controlled by lb.export.dump.keep.
- \item LB exporter is not a deamon, it's periodic invocation is
- provided by cron deamon.
-\end{itemize}
-
+++ /dev/null
-This is the official documentation for Job Provenance Service.
-It consists of the following documents:
-
-JPUG.pdf - Job Provenance User's Guide
-JPAG.pdf - Job Provenance Admin's Guide
-JPDG.pdf - Job Provenance Developer's Guide
-
-Please, report all bugs to EU EGEE Bug Tracking System located at
-https://savannah.cern.ch/bugs/?func=additem&group=jra1mdw
-
-Feel free to send us your non-bugs comments to email
-egee-jra1@lindir.ics.muni.cz
+++ /dev/null
-% Taken from:
-% https://twiki.cern.ch/twiki/bin/view/EGEE/EGEEgLiteSoftwareLicense
-%
-\vfill{}
-
-{\bf
-Copyright} \copyright\ {\bf Members of the EGEE Collaboration. 2004. See
-\href{http://www.eu-egee.org/partners/}{http://www.eu-egee.org/partners/} for
-details on the copyright holders.
-
-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
-
-\begin{center}
-\href{http://www.apache.org/licenses/LICENSE-2.0}{http://www.apache.org/licenses/LICENSE-2.0}
-\end{center}
-
-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.
-}
-
+++ /dev/null
-\usepackage{xspace}
-%\usepackage{doxygen}
-\usepackage{alltt}
-\usepackage{comment}
-
-\def\LB{L\&B\xspace}
-\def\JP{JP\xspace}
-%\def\eg{e.\,g.}
-\def\eg{for example\xspace}
-\def\Eg{For example\xspace}
-%\def\ie{i.\,e.}
-\def\ie{that is\xspace}
-\def\wrt{with respect to\xspace}
-\def\Dash{---\penalty-1000}
-
-\long\def\TODO#1{\par\noindent\textbf{TODO:} {\sl#1}\par}
-\long\def\ludek#1{}
-
-\def\path#1{{\normalfont\textsf{#1}}}
-\def\code#1{\texttt{#1}}
-
-\specialcomment{hints}{\par\noindent\textbf{Hints: }\begingroup\slshape}{\endgroup}
-
-\hyphenation{plug-in}
+++ /dev/null
-% egee.cls:
-%
-% $Id$
-%
-% $Log$
-% Revision 1.1.1.1 2007/11/13 17:42:10 jpospi
-% initial import
-%
-% Revision 1.13 2004/08/31 19:24:27 szamsu
-% Fixing overfull problem in page headers. Saving the logo and reusing it later, instead of loading in again.
-%
-% Revision 1.12 2004/08/09 14:03:54 szamsu
-% proper IST number
-%
-% Revision 1.11 2004/08/03 17:02:21 szamsu
-% Information Society Infrastrcutures logo replacing the old IST logo
-%
-% Revision 1.10 2004/08/03 13:34:37 szamsu
-% Removed 'compat2' option on geometry, because it has also specified
-% 'scale{0.8,0.9}' for page size, which we define otherwise. Added the
-% 'centering' and 'includeheadfoot' options, which were defined in
-% 'compat2'.
-%
-% Revision 1.9 2004/07/09 16:06:52 leanne
-% Removed the Lead partner which is not used in egee
-%
-% Revision 1.8 2004/06/03 09:56:11 leanne
-% removed lead partner
-
-% Revision 1.8 2004/06/03 09:56:11 diana
-% updated the front page
-%
-% Revision 1.7 2004/05/26 09:38:55 leanne
-% Removed DocumentLink in pdfinfo - it was causing errors
-%
-% Revision 1.6 2004/05/26 08:36:58 leanne
-% Updated IST number in template
-%
-% Revision 1.5 2004/05/24 13:25:04 diana
-% added template for egee latex documents
-%
-% Revision 1.4 2004/05/17 10:56:51 diana
-% added compat2 option to geometry and hypertex option to hyperref to get logo and links back on the page
-%
-% Revision 1.3 2004/02/18 18:08:48 leanne
-% Modified Document identifiers to mauch the EGEE Word templates
-%
-% Revision 1.2 2004/02/18 17:23:21 leanne
-% Changed Work Package to Activity. Included definition of Document Link.
-%
-% Revision 1.1.1.1 2004/02/18 11:17:44 leanne
-% Initial version of EGGE LaTeX Style files based on the EDG LaTeX Style
-%
-%
-% Revision 1.0 2004/02/17 leanne
-% Took the datagrid.cls file and modified it for the EGEE project
-% Original Authors:
-% Frohner Akos <Akos.Frohner@cern.ch>
-% Diana Bosio <diana.bosio@cern.ch>
-% Paul Millar <paulm@physics.gla.ac.uk>
-% Thanks are due to Norman Gray
-%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{egee}[2002/06/20 EGEE LaTeX Class]
-\typeout{EGEE LaTeX class -- 2002/06/13 Rock Lobster!}
-%
-%% Notes: This class file tries, as largely as possible, to copy the Microsoft
-%% Word template document EDMS 2098656 v2.2. Differences and notes are listed
-%% below:
-%% o The Word Template uses 11pt for the main body, but 12 point
-%% occasionally. Any such occurrence of 12pt is mapped into 11pt in this
-%% class-file.
-%% o This class inherits 11pt article. In that class Huge=30pt and
-%% LARGE=22pt, which matches the required point-size for the title page.
-%% o The parskip in the Word doc is exactly 1.4mm (0.7mm above and below).
-%% Here we've taken the liberty of adding some glue to make things fit
-%% better.
-%% o The Word Template shows all the (sub)sections on the contents page in
-%% capitals and subsubsections in italics. The LateX class doesn't.
-
-%% Interface - example of an option, should we want to use these later.
-%\newif\ifmonotitle\monotitlefalse
-
-%\DeclareOption{mono}{\monotitletrue}
-
-\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
-\ProcessOptions
-
-
-% Inherit!
-\LoadClass[11pt]{article}
-
-% Necessary packages:
-\RequirePackage{lastpage}
-\RequirePackage{tabularx}
-\RequirePackage{pslatex}
-\RequirePackage{times}
-\RequirePackage{verbatim}
-\RequirePackage{geometry}
-\RequirePackage{url}
-
-\usepackage[hang,bf,small]{caption}
-
-%
-% We now define a new \if command to test for PDF being enabled.
-% It is important because loading graphicx overrides the definition
-% of \pdfoutput and sets it to true even when PDF is not enabled.
-% Use \ifpdf instead of \ifx\pdfoutput\undefined hereafter.
-%
-
-\newif\ifpdf
-\ifx\pdfoutput\undefined
- \pdffalse
- % \typeout{PDF _not_ defined}
-\else
- \pdfoutput=1
- \pdftrue
- % \typeout{PDF _is_ defined}
-\fi
-
-\ifpdf
- \usepackage[pdftex,
- pdfpagemode={UseOutlines},bookmarks=true,bookmarksopen=true,
- bookmarksopenlevel=0,bookmarksnumbered=true,
- hypertexnames=false,colorlinks,linkcolor={blue},
- citecolor={blue},urlcolor={red},
- pdfstartview={FitV}]{hyperref}
-\else
- \usepackage[hypertex]{hyperref}
-\fi
-
-\ifpdf
- \usepackage[pdftex]{graphicx}
- \pdfcompresslevel 9
- \pdfadjustspacing 1
-\else
- \usepackage[dvips]{graphicx}
-\fi
-
-\usepackage{color}
-
-\def\footsize{5mm}
-
-%%
-%% PAGE GEOMETRY DEFINITIONS
-%%
-% From Template file
-\geometry{centering,includeheadfoot}
-\geometry{a4paper,top=12.5mm,headheight=12.5mm,headsep=5mm,foot=\footsize,footskip=13.3mm,bottom=12.5mm}
-\geometry{right=25mm,left=25mm}
-
-
-% APM -- I don't think these are right, my impression is above is correct
-%\geometry{a4paper,margin=0.98in,headheight=0.72in}
-
-
-%%
-%% PAGE COLOUR DEFINITIONS
-%%
-\definecolor{blue}{rgb}{0.1,0.1,0.5}
-\definecolor{lightgrey}{gray}{0.65}
-
-
-% paulm's prefered name ...
-\def\bibname{References}
-
-\setlength{\parindent}{0pt}
-\setlength{\parskip}{1.4mm plus 0.4mm minus 0.2mm}
-
-\def\@defaultfooter{
- \def\@oddfoot{\vbox to \footsize {%
- {\color{blue}\hrule width \textwidth height 1pt depth 0pt}%
- \vfil
- \small\hbox to \textwidth{\ISTNumber%
- \hfil
- \hbox{\colorbox{yellow}{\MakeUppercase{\@Dissemination}}}%
- \hfil
- \hbox{\thepage/\pageref{LastPage}}}%
- }%
- }%
-}
-
-
-\def\ps@title{%
- \@defaultfooter
- \def\@oddhead{\hbox to \textwidth{\LargeEGEELogo\hfil\ISTLogo}}
-}
-
-\def\ps@headings{%
- \@defaultfooter
- \def\@oddhead{\vbox to \headheight{%
-%\hrule width \textwidth height 1pt\relax
- \vbox to 0.75\headheight{%
- \hbox to \textwidth{%
- \hbox to 0pt{\EGEELogo\hss}%
- \hfil
- \hbox to 8cm{%
- \vbox to 0.75\headheight{%
- \vfil
- \parbox{8cm}{%
- \centering\color{blue}%
- \textbf{\MakeUppercase{\@title}}%
-\ifx\@Subtitle\@empty\else
- \par\textbf{\scriptsize\@Subtitle}%
-\fi
- }%
- \vfil
- }%
- \hss}%
- \hfil
-%\hbox to 0pt{\vrule width 1pt height 10pt depth 0pt \hss}%
-%% {\scriptsize\setlength{\parskip}{0pt}\setlength{\topsep}{0pt}%
-%% % \vbox to 0.75\headheight{%
-%% \parbox{4cm}{x%
-%% \begin{flushright}%
-%% \textit{Doc. Identifier}:\\
-%% \textbf{\@DocIdentifier}\\
-%% \vfil
-%% \textit{Date}: \textbf{\@Date}
-%% \end{flushright}%
-%% }%
-%% % }%
-%% }%
-\hbox to 0pt{\hss\vbox to 0.75\headheight{%\hrule
-\tiny%\scriptsize
-\parfillskip0pt
-\leftskip 0pt plus 1fil
-\parskip0ex
-\textit{Doc.\ Identifier}:
-\par
-\textbf{\@DocIdentifier}
-\vfil
-\textit{Date}: \textbf{\@Date}
-%\hrule
-}}%
-% \hbox to 4cm{\scriptsize
-% \vbox to 0.75\headheight{%
-% \parbox{4cm}{
-% \halign{\hfill####\cr
-% \textit{Doc. Identifier}:\cr
-% \textbf{\@DocIdentifier}\cr
-% % \noalign{\vfil}
-% \textit{Date}: \textbf{\@Date}\cr
-% }}%
-% \vfil
-% }%
-% }%
- }%
- }%
-%\hrule width \textwidth height 1pt\relax
- \vfil\vskip 2.5mm\relax
- {\color{blue}\hrule width \textwidth height 1pt depth 0pt}%
- }%
- }%
-}
-
-\pagestyle{headings}
-
-\setlength{\captionmargin}{1cm}
-
-% image file extensions respective to the output format
-\ifpdf
- \DeclareGraphicsExtensions{.jpg,.pdf,.png}
- \pdfcompresslevel=9
-% \pdfinfo{ /Title (\@DocumentLink) }
- \pdfinfo{ /Title (EGEE) }
-\else
- \DeclareGraphicsExtensions{.eps}
-\fi
-
-\def\frontboxwidth{10.6cm}%
-
-
-
-%%
-%% Define our title page
-%%
-\AtBeginDocument{
-\pagestyle{title}%
-\hbox{}% Force top of page
-\vfill
-{\centering
- \Huge\bf\textsf{\textcolor{blue}{EGEE}}\\[20mm]%
- \LARGE\sc\textsf{\bf \@title}\\[5mm]%
- \ifx\@Subtitle\@empty\else
- \normalsize\textsf{\@Subtitle}\\[10mm]%
- \fi
- \ifx\@DeliverableId\@empty\else
- \LARGE\sc\textsf{\bf \@DeliverableId}\\[5mm]%
- \fi
-}%
-\vfill
-\hbox to \textwidth{
- \hfil
- \vbox{
- {\color{blue}\hrule width \frontboxwidth height 1mm depth 0pt}
- \hbox to \frontboxwidth{\sf
- \begin{tabularx}{\frontboxwidth}{l>{\raggedright\arraybackslash}X}
- Document identifier: & \textbf{\@DocIdentifier}\\[3mm]
- Date: & \textbf{\@Date}\\[3mm]
- Activity:& \textbf{\@Activity}\\[3mm]
- Document status: & \textbf{\@DocStatus}\\[3mm]
- Document link:& \textbf{\@DocumentLink}\\[3mm]
- \end{tabularx}
- }
- {\color{blue}\hrule width \frontboxwidth height 1mm depth 0pt}
- }
-}
-\vfill
-{\sf\underline{Abstract}: \@Abstract}
-\vfill
-\newpage % end of the first page
-\pagestyle{headings}
-\setcounter{tocdepth}{3}
-} % End of AtBeginningDocument
-
-
-%
-% EGEE style small-capital section titles.
-%
-% The numbering is aligned with the WinWord style,
-% although it is not common in the english typography...
-%
-\newcommand{\sectionbreak}{\newpage}
-\renewcommand{\thesection}{\arabic{section}.}
-\renewcommand{\thesubsection}{\thesection\arabic{subsection}.}
-\renewcommand{\thesubsubsection}{\thesubsection\arabic{subsubsection}.}
-
-\renewcommand\section{\@startsection {section}{1}{\z@}%
- {-3.5ex \@plus -1ex \@minus -.2ex}%
- {2.3ex \@plus.2ex}%
- {\normalfont\Large\bfseries\sffamily\scshape}}
-
-\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
- {-3.25ex\@plus -1ex \@minus -.2ex}%
- {1.5ex \@plus .2ex}%
- {\normalfont\large\bfseries\sffamily\scshape}}
-\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
- {-3.25ex\@plus -1ex \@minus -.2ex}%
- {1.5ex \@plus .2ex}%
- {\normalfont\normalsize\bfseries\sffamily\scshape}}
-
-
-
-%% APM NEED TO REDEFINE section
-%\titleformat{\section}{\Large\bfseries\sffamily\scshape}{\thesection}{1em}{}
-%\titlecontents{section} [2em] {\vspace*{4pt}}
-% {\large \sc \bfseries \contentslabel{2em}}
-% {\large \sc \bfseries \hspace*{-2em}}
-% {\large \textbf{\titlerule*[1ex]{.}\contentspage}} [\vspace*{4pt}]
-
-%\titleformat{\subsection}{\large\bfseries\sffamily\scshape}{\thesubsection}{1em}{}
-%\titlecontents{subsection} [5em] {}
-% {\sc \contentslabel{3em}}
-% {\sc \hspace*{-3em}}
-% {\titlerule*[1ex]{.}\contentspage}
-
-
-%
-% common constants
-%
-\def\ISTNumber{INFSO-RI-508833}
-\newsavebox{\@EGEELogo}
-\savebox{\@EGEELogo}{\includegraphics[height=0.75\headheight]{egee}}
-\def\EGEELogo{\usebox{\@EGEELogo}}
-\def\LargeEGEELogo{\includegraphics[height=\headheight]{egee}}
-\def\ISTLogo{\includegraphics[height=\headheight]{isi}}
-
-%
-% parameters to be supplied by the author
-%
-\def\Subtitle#1{\gdef\@Subtitle{#1}}
-\gdef\@Subtitle{\@latex@warning@no@line{No \noexpand\Subtitle given}}
-
-\def\DeliverableId#1{\gdef\@DeliverableId{#1}}
-\gdef\@DeliverableId{\@latex@warning@no@line{No \noexpand\DeliverableId given}}
-
-\def\DocIdentifier#1{\gdef\@DocIdentifier{#1}}
-\gdef\@DocIdentifier{\@latex@warning@no@line{No \noexpand\DocIdentifier given %
- (e.g. EGEE-JRA1-TEC-edmsId-v0-1)}}
-
-\def\Date#1{\gdef\@Date{#1}}
-\gdef\@Date{\@latex@warning@no@line{No \noexpand\Date given %
- (e.g. 01/01/2004)}}
-
-\def\Activity#1{\gdef\@Activity{#1}}
-\gdef\@Activity{\@latex@warning@no@line{No \noexpand\Activity given %
- (e.g. JRA1 Middleware Engineering and Integration )}}
-
-\def\DocStatus#1{\gdef\@DocStatus{#1}}
-\gdef\@DocStatus{\@latex@warning@no@line{No \noexpand\DocStatus given %
- (e.g. DRAFT, WORKING, DELIVERED)}}
-
-\def\Dissemination#1{\gdef\@Dissemination{#1}}
-\gdef\@Dissemination{\@latex@warning@no@line{No \noexpand\Dissemination given %
- (e.g. PUBLIC, INTERNAL, ...)}}
-
-\def\DocumentLink#1{\gdef\@DocumentLink{#1}}
-\gdef\@DocumentLink{\@latex@warning@no@line{No \noexpand\DocumentLink given %
- (e.g. http://cern.ch)}}
-
-\long\def\Abstract#1{\gdef\@Abstract{#1}}
-\gdef\@Abstract{\@latex@warning@no@line{No \noexpand\Abstract given}}
-
-%%
-%% Define the abstract using an environment abstract
-
-%
-% This will produce the mailto link in the PDF file
-%
-%
-% We use the URL package, which does this nicely. The old way (\HTTP) was
-% a bit buggy as it had problems with '~'s and '_'s
-%
-\urlstyle{sf}
-\ifpdf
- \newcommand{\Email}[1]{\href{mailto:#1}{<{#1}>}}
- \newcommand{\HTTP}[1]{\href{#1}{\url{#1}}}
-\else
- \newcommand{\Email}[1]{\textsf{<{#1}>}}
- \newcommand{\HTTP}[1]{\url{#1}}
-\fi
-
-
-%
-% We now redifine \part and \section so that the table of contents
-% has the sections/parts in upper case.
-%
-% Note: need to use \uppercase because \MakeUppercase is not robust
-%
-\def\@part[#1]#2{%
- \ifnum \c@secnumdepth >\m@ne
- \refstepcounter{part}%
- \addcontentsline{toc}{part}{\thepart\hspace{1em}\uppercase{#1}}%
- \else
- \addcontentsline{toc}{part}{\uppercase{#1}}%
- \fi
- {\parindent \z@ \raggedright
- \interlinepenalty \@M
- \normalfont
- \ifnum \c@secnumdepth >\m@ne
- \Large\bfseries \partname\nobreakspace\thepart
- \par\nobreak
- \fi
- \huge \bfseries #2%
- \markboth{}{}\par}%
- \nobreak
- \vskip 3ex
- \@afterheading}
-
-\def\@sect#1#2#3#4#5#6[#7]#8{%
- \ifnum #2>\c@secnumdepth
- \let\@svsec\@empty
- \else
- \refstepcounter{#1}%
- \protected@edef\@svsec{\@seccntformat{#1}\relax}%
- \fi
- \@tempskipa #5\relax
- \ifdim \@tempskipa>\z@
- \begingroup
- #6{%
- \@hangfrom{\hskip #3\relax\@svsec}%
- \interlinepenalty \@M #8\@@par}%
- \endgroup
- \csname #1mark\endcsname{\uppercase{#7}}%
- \addcontentsline{toc}{#1}{%
- \ifnum #2>\c@secnumdepth \else
- \protect\numberline{\csname the#1\endcsname}%
- \fi
- \texorpdfstring{\uppercase{#7}}{#7}}%
- \else
- \def\@svsechd{%
- #6{\hskip #3\relax
- \@svsec #8}%
- \csname #1mark\endcsname{\uppercase{#7}}%
- \addcontentsline{toc}{#1}{%
- \ifnum #2>\c@secnumdepth \else
- \protect\numberline{\csname the#1\endcsname}%
- \fi
- \texorpdfstring{\uppercase{#7}}{#7}}}%
- \fi
- \@xsect{#5}}
-
-% \addcontentsline{toc} expands to \contentsline{NAME}
-% which in turn expands to \l@NAME. So, to specify
-% the table of contents, we must define \l@chapter, \l@section,
-% \l@subsection, ... ; to specify the list of figures, we must define
-% \l@figure; and so on. Most of these can be defined with the
-% \@dottedtocline command, which produces a contents line with dots
-% between the title and the page number. It works as follows:
-%
-% \@dottedtocline{LEVEL}{INDENT}{NUMWIDTH}
-% LEVEL : An entry is produced only if LEVEL < or = value of
-% 'tocdepth' counter. Note, \chapter is level 0, \section
-% is level 1, etc.
-% INDENT : The indentation from the outer left margin of the start of
-% the contents line.
-% NUMWIDTH : The width of a box in which the section number is to go,
-% if TITLE includes a \numberline command.
-%
-
-\def\l@part{\@dottedtocline{1}{4em}{2.0em}}
-\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
-\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}}
-\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}}
-\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}}
-
+++ /dev/null
-\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} & & & & \\
-\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
-
-\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}
-\clearpage
+++ /dev/null
-%
-% -------------------------------------------------------------
-% Refentry
-% -------------------------------------------------------------
-\section{glite-jpis-client}
-\label{glitejpisclient}\hypertarget{glitejpisclient}{}%
-\label{name}
-
-%\section*{Nom}
-glite-jpis-client --- client interface for JP IS\label{synopsis}
-\subsection*{Synopsis}
-\label{id2455104}
-\begin{list}{}{\setlength{\itemindent}{-\leftmargin}\setlength{\parsep}{0mm}}
-\item\raggedright\texttt{glite-jpis-client [ -h | --help ] [ -i | --index-server \textit{JPIS:PORT}] [ -q | --query-file \textit{IN\_FILE.XML}] [ -t | --test-file \textit{IN\_FILE.XML}] [ -e | --example-file \textit{OUT\_FILE.XML}] [ -f | --format {xml | human}]}
-\end{list}
-
-\subsection*{DESCRIPTION}
-\label{id2417458}
-
-{\bfseries{glite-jpis-client}} is command line interface for querying the Job Provenance Index Server. It takes the XML input, process the QueryJobs operation and returns the result in specified format.
-
-\subsection*{OPTIONS}
-\label{id2417597}
-
-With no options you get simple usage message as with {\texttt{{-h}}}.
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\texttt{{-h}}}\docbooktolatexpipe{}{\texttt{{--help}}}}]\null{}
-Displays usage message.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\texttt{{-i}}}\docbooktolatexpipe{}{\texttt{{--index-server}}}}]\null{}
-Specifies Job Provenance Index Server as {\ttfamily\itshape{{HOST:PORT}}}.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\texttt{{-q}}}\docbooktolatexpipe{}{\texttt{{--query-file}}}}]\null{}
-Process the QueryJobs operation. Requires input data in file {\ttfamily\itshape{{IN\_FILE.XML}}}, for using stdin specify {\texttt{{-}}}.
-
-The input and output data are in XML format with XSD schema, which can be found in {\texttt{{JobProvenanceISClient.\dbz{}xsd}}} (element QueryJobs for input and QueryJobsResponse for output).
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\texttt{{-t}}}\docbooktolatexpipe{}{\texttt{{--test-file}}}}]\null{}
-Test the input data from {\ttfamily\itshape{{IN\_FILE.XML}}} (or from stdin if {\texttt{{-}}} is specified) and prints the found content.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\texttt{{-e}}}\docbooktolatexpipe{}{\texttt{{--example-file}}}}]\null{}
-Write the example input data to file {\ttfamily\itshape{{OUT\_FILE.XML}}} (or to stdout if {\texttt{{-}}} is specified). The XML is valid against XSD schema in {\texttt{{JobProvananceISClient.\dbz{}xsd}}}, formating may vary according to used gsoap version.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\texttt{{-f}}}\docbooktolatexpipe{}{\texttt{{--format}}}}]\null{}
-Use {\ttfamily\itshape{{FORMAT}}} as output format type. You can specify {\texttt{{xml}}} for interchangeable XML output or {\texttt{{human}}} for nice looking human readable output.
-\end{description}
-\noindent
-\subsection*{RETURN VALUE}
-\label{id2417767}
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{0}]\null{}
-Success.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{-1}]\null{}
-Communication error or error from the remote server.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{EINVAL}]\null{}
-In most cases XML parsing error.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{other error}]\null{}
-Other error from errno.
-\end{description}
-\noindent
-\subsection*{EXAMPLES}
-\label{id2417822}
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\bfseries{glite-jpis-client --example-file query.xml}}}]\null{}
-Save the example query parameters to file {\texttt{{query.\dbz{}xml}}}.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\bfseries{glite-jpis-client --query-file query.xml}}}]\null{}
-Queries the local index server running on default port with the query parameters specified in the file {\texttt{{query.\dbz{}xml}}}.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\bfseries{glite-jpis-client -i localhost:8902 -q - -f human}}}]\null{}
-Queries the index server running on local host on the port 8902 with the query parameters from stdin and show results in non-XML form.
-\end{description}
-\noindent
-
-
-\subsection*{SEE ALSO}
-\label{id2418102}
-
-glite-jp-indexd(8)
-
-\subsection*{AUTHOR}
-\label{id2418112}
-
-EU DataGrid Work Package 1, CESNET group.
+++ /dev/null
-\subsection{GUI}
-
-\TODO{GUI description}
+++ /dev/null
-\subsection{glite-jp-importer}
-
-\TODO{glite-jp-importer description}
-
+++ /dev/null
-
-% -------------------------------------------------------------
-% Chapter Job Provenance
-% -------------------------------------------------------------
-\chapter{Job Provenance}
-\label{id271738}\hypertarget{id271738}{}%
-
-% ------------------------
-% Section
-\section{Primary Storage -- Overview}
-\label{id271094}\hypertarget{id271094}{}%
-
-The Job Provenance (JP) Primary Storage Service is responsible to keep the JP data (definition of submitted jobs, execution conditions and environment, and important points of the job life cycle) in a compact and economic form.
-
-The JP Primary storage, as described in section 8.4 of the Architecture deliverable DJRA1.1 {\textless}\url{https://edms.cern.ch/document/594698/}{\textgreater} provides public interfaces for data storing, retrieval based on basic metadata, and registration of Index servers for incremental feed.
-
-Command interface to JP is completely covered by the WS interface covered here. Bulk file transfers are done via specialised protocols, currently gsiftp only.
-
-% ------------------------
-% Section
-\section{Primary Storage -- Operations}
-\label{id271756}\hypertarget{id271756}{}%
-
-{
-\let\dollar=\$
-\catcode`\$=\active
-\let$=\dollar
-\em{CVS revision: $Header$}}
-\subsection{CommitUpload}
-\label{op:CommitUpload}\hypertarget{op:CommitUpload}{}%
-
-Confirm a successfully finished file apload.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{destination}}}}]\null{}
-Destination URL returned by StartUpload before.
-\end{description}
-\noindent
-
-Outputs: N/A
-\subsection{FeedIndex}
-\label{op:FeedIndex}\hypertarget{op:FeedIndex}{}%
-
-Request for feeding a JP Index server (issued by this server).
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{destination}}}}]\null{}
-Endpoint of the listening index server.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of xsd:string{\ttfamily\itshape{{attributes}}}}]\null{}
-Which attributes of jobs is the index server interested in.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:primaryQuery}{primaryQuery}{\ttfamily\itshape{{conditions}}}}]\null{}
-Which jobs is the server interested in.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:boolean{\ttfamily\itshape{{history}}}}]\null{}
-Data on jobs stored at PS in the past are required.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:boolean{\ttfamily\itshape{{continuous}}}}]\null{}
-Data on jobs that will arrive in future are required.
-\end{description}
-\noindent
-
-Outputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{feedId}}}}]\null{}
-Unique ID of the created feed session.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:dateTime{\ttfamily\itshape{{feedExpires}}}}]\null{}
-When the session expires.
-\end{description}
-\noindent
-\subsection{FeedIndexRefresh}
-\label{op:FeedIndexRefresh}\hypertarget{op:FeedIndexRefresh}{}%
-
-Refresh an existing feed session.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{feedId}}}}]\null{}
-Existing feed session ID to be refreshed.
-\end{description}
-\noindent
-
-Outputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:dateTime{\ttfamily\itshape{{feedExpires}}}}]\null{}
-New session expiration time.
-\end{description}
-\noindent
-\subsection{GetJobAttributes}
-\label{op:GetJobAttributes}\hypertarget{op:GetJobAttributes}{}%
-
-Query concrete attributes of a given job.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{jobid}}}}]\null{}
-The job.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of xsd:string{\ttfamily\itshape{{attributes}}}}]\null{}
-Which attributes should be retrieved.
-\end{description}
-\noindent
-
-Outputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:attrValue}{attrValue}{\ttfamily\itshape{{attrValues}}}}]\null{}
-Values of the queried attributes.
-\end{description}
-\noindent
-\subsection{GetJobFiles}
-\label{op:GetJobFiles}\hypertarget{op:GetJobFiles}{}%
-
-Return URL's of files for a given single job.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{jobid}}}}]\null{}
-The job.
-\end{description}
-\noindent
-
-Outputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:jppsFile}{jppsFile}{\ttfamily\itshape{{files}}}}]\null{}
-List of the stored files.
-\end{description}
-\noindent
-\subsection{RecordTag}
-\label{op:RecordTag}\hypertarget{op:RecordTag}{}%
-
-Record an additional user tag.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{jobid}}}}]\null{}
-Job to which the tag is added.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:tagValue}{tagValue}{\ttfamily\itshape{{tag}}}}]\null{}
-Name and value of the tag.
-\end{description}
-\noindent
-
-Outputs: N/A
-\subsection{RegisterJob}
-\label{op:RegisterJob}\hypertarget{op:RegisterJob}{}%
-
-Register job with the JP primary storage.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{job}}}}]\null{}
-Jobid of the registered job.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{owner}}}}]\null{}
-Owner of the job (DN of X509 certificate).
-\end{description}
-\noindent
-
-Outputs: N/A
-\subsection{StartUpload}
-\label{op:StartUpload}\hypertarget{op:StartUpload}{}%
-
-Start uploading a file.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{job}}}}]\null{}
-Jobid to which this file is related.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{class}}}}]\null{}
-Type of the file (URI). The server must have a plugin handing this type.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{name}}}}]\null{}
-Name of the file (used to distinguish among more files of the same type).
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:dateTime{\ttfamily\itshape{{commitBefore}}}}]\null{}
-The client promisses to finish the upload before this time.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{contentType}}}}]\null{}
-MIME type of the file.
-\end{description}
-\noindent
-
-Outputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{destination}}}}]\null{}
-URL where the client should upload the file.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:dateTime{\ttfamily\itshape{{commitBefore}}}}]\null{}
-Server's view on when the upload must be finished.
-\end{description}
-\noindent
-
-% ------------------------
-% Section
-\section{Index Server -- Overview}
-\label{id214261}\hypertarget{id214261}{}%
-
-The Job Provenance (JP) Index Server is a volatile counterpart to the permanent JP Primary Storage. Index servers are populated with subsets of data from Primary storage(s) and indexed according to particular user needs.
-
-The interface to Index server contains three logical parts: administraive (control), system and user. The administrative part is used by run-time index server configuration tool, the system one allows Primary storage(s) to feed data into the Index server, and the user one is available to users for queries.
-
-% ------------------------
-% Section
-\section{Index Server -- Operations}
-\label{id214279}\hypertarget{id214279}{}%
-
-{
-\let\dollar=\$
-\catcode`\$=\active
-\let$=\dollar
-\em{CVS revision: $Header$}}
-\subsection{AddFeed}
-\label{op:AddFeed}\hypertarget{op:AddFeed}{}%
-
-Called by JP index serve admin tool to ask new primary storage server to feed it. Updates information on PS in index server, according to what JPPS currently knows.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:feedSession}{feedSession}{\ttfamily\itshape{{feed}}}}]\null{}
-New feed IS URL, filter and query type.
-\end{description}
-\noindent
-
-Outputs: N/A
-\subsection{DeleteFeed}
-\label{op:DeleteFeed}\hypertarget{op:DeleteFeed}{}%
-
-Called by JP index serve admin tool to remove one feed session.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{feedId}}}}]\null{}
-ID of feed to be removed.
-\end{description}
-\noindent
-
-Outputs: N/A
-\subsection{GetFeedIDs}
-\label{op:GetFeedIDs}\hypertarget{op:GetFeedIDs}{}%
-
-Called by JP index serve admin tool to find out IS open feeds
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:feedSession}{feedSession}{\ttfamily\itshape{{feeds}}}}]\null{}
-List of active feeds on IS.
-\end{description}
-\noindent
-
-Outputs: N/A
-\subsection{QueryJobs}
-\label{op:QueryJobs}\hypertarget{op:QueryJobs}{}%
-
-User query to index server.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:indexQuery}{indexQuery}{\ttfamily\itshape{{conditions}}}}]\null{}
-Query conditions, similar to LB.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of xsd:string{\ttfamily\itshape{{attributes}}}}]\null{}
-Set of attributes to be retrieved directly from index server (if any).
-\end{description}
-\noindent
-
-Outputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:jobRecord}{jobRecord}{\ttfamily\itshape{{jobs}}}}]\null{}
-List of jobs matching the query.
-\end{description}
-\noindent
-\subsection{UpdateJobs}
-\label{op:UpdateJobs}\hypertarget{op:UpdateJobs}{}%
-
-Called by JP primary storage as a response to FeedIndex request. Updates information on jobs in index server, according to what JPPS currently knows.
-
-Inputs:
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string{\ttfamily\itshape{{feedId}}}}]\null{}
-Id of the feed, as returned by JPPS FeedIndex operation.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:boolean{\ttfamily\itshape{{feedDone}}}}]\null{}
-Flag of completed batch feed.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:jobRecord}{jobRecord}{\ttfamily\itshape{{jobAttributes}}}}]\null{}
-Attributes per job.
-\end{description}
-\noindent
-
-Outputs: N/A
-
-% ------------------------
-% Section
-\section{JP Common Types}
-\label{id214548}\hypertarget{id214548}{}%
-
-{
-\let\dollar=\$
-\catcode`\$=\active
-\let$=\dollar
-\em{CVS revision: $Header$}}
-\subsection{attrOrig}
-\label{type:attrOrig}\hypertarget{type:attrOrig}{}%
-
-Specification of attribute origin.
-
-{\em{Enumeration}} (restriction of xsd:string in WSDL), exactly one of the values must be specified.
-
-Values:
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{SYSTEM}}}}]\null{}
-JP system value, e.g. job owner.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{USER}}}}]\null{}
-Explicitely stored by the user via RecordTag operation.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{FILE}}}}]\null{}
-Coming from uploaded file.
-\end{description}
-\noindent \subsection{attrValue}
-\label{type:attrValue}\hypertarget{type:attrValue}{}%
-
-Single value of an attribute.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{name}}}}]\null{}
-Name of the attribute, including namespace.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:stringOrBlob}{stringOrBlob} {\ttfamily\itshape{{value}}}}]\null{}
-(optional) String value.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:dateTime {\ttfamily\itshape{{timestamp}}}}]\null{}
-When this value was recorded.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:attrOrig}{attrOrig} {\ttfamily\itshape{{origin}}}}]\null{}
-Where this value came from.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{originDetail}}}}]\null{}
-(optional)
-\end{description}
-\noindent \subsection{feedSession}
-\label{type:feedSession}\hypertarget{type:feedSession}{}%
-
-One session between IS and PS (aka feed) charactetristics.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{primaryServer}}}}]\null{}
-URL of primary server.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:primaryQuery}{primaryQuery} {\ttfamily\itshape{{condition}}}}]\null{}
-Filter conditions.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:int {\ttfamily\itshape{{history}}}}]\null{}
-Query type.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:int {\ttfamily\itshape{{continuous}}}}]\null{}
-Query type
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{feedId}}}}]\null{}
-(optional) Unique ID of the feed session.
-\end{description}
-\noindent \subsection{genericFault}
-\label{type:genericFault}\hypertarget{type:genericFault}{}%
-
-
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{source}}}}]\null{}
-
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:int {\ttfamily\itshape{{code}}}}]\null{}
-
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{text}}}}]\null{}
-
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{description}}}}]\null{}
-(optional)
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:genericFault}{genericFault} {\ttfamily\itshape{{reason}}}}]\null{}
-(optional)
-\end{description}
-\noindent \subsection{indexQuery}
-\label{type:indexQuery}\hypertarget{type:indexQuery}{}%
-
-Single query condition on a job. Similarly to LB, these outer conditions are logically ANDed.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{attr}}}}]\null{}
-Which attribute the condition refers to.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:attrOrig}{attrOrig} {\ttfamily\itshape{{origin}}}}]\null{}
-(optional) Specific attribute origin (if we do care).
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:indexQueryRecord}{indexQueryRecord} {\ttfamily\itshape{{record}}}}]\null{}
-List of conditions on attribute attr. These conditions are logically ORed.
-\end{description}
-\noindent \subsection{indexQueryRecord}
-\label{type:indexQueryRecord}\hypertarget{type:indexQueryRecord}{}%
-
-Single condition on an attribute.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:queryOp}{queryOp} {\ttfamily\itshape{{op}}}}]\null{}
-Query operation.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:stringOrBlob}{stringOrBlob} {\ttfamily\itshape{{value}}}}]\null{}
-(optional) Value to compare attribute with.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:stringOrBlob}{stringOrBlob} {\ttfamily\itshape{{value2}}}}]\null{}
-(optional) Value to compare attribute with.
-\end{description}
-\noindent \subsection{jobRecord}
-\label{type:jobRecord}\hypertarget{type:jobRecord}{}%
-
-Information on a single job. Used for both feeding JP index server from primary storage and to answer user queries on index server.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{jobid}}}}]\null{}
-ID of the job.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{owner}}}}]\null{}
-Job owner.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of \hyperlink{type:attrValue}{attrValue} {\ttfamily\itshape{{attributes}}}}]\null{}
-(optional) Attribute values, required by query/feed and available right now.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{list of xsd:string {\ttfamily\itshape{{primaryStorage}}}}]\null{}
-(optional) User query only: which primary storage(s) have data on this job.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:boolean {\ttfamily\itshape{{remove}}}}]\null{}
-(optional) UpdateJobs only: this job no longer belongs to the feed. Attribute values are those which caused the change.
-\end{description}
-\noindent \subsection{jppsFile}
-\label{type:jppsFile}\hypertarget{type:jppsFile}{}%
-
-JP primary storage file identification.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{class}}}}]\null{}
-Type of the file (as set on StartUpload).
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{name}}}}]\null{}
-Name of the file (if there are more of the same type per job).
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{url}}}}]\null{}
-Where the file is stored on JP primary storage.
-\end{description}
-\noindent \subsection{primaryQuery}
-\label{type:primaryQuery}\hypertarget{type:primaryQuery}{}%
-
-A single condition on job.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{attr}}}}]\null{}
-Attribute name to query.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:queryOp}{queryOp} {\ttfamily\itshape{{op}}}}]\null{}
-Operation.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:attrOrig}{attrOrig} {\ttfamily\itshape{{origin}}}}]\null{}
-(optional) Where the attribute value came from.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:stringOrBlob}{stringOrBlob} {\ttfamily\itshape{{value}}}}]\null{}
-Value to compare the job attribute with.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:stringOrBlob}{stringOrBlob} {\ttfamily\itshape{{value2}}}}]\null{}
-(optional) Another value (for op = WITHIN).
-\end{description}
-\noindent \subsection{queryOp}
-\label{type:queryOp}\hypertarget{type:queryOp}{}%
-
-Operators used in queries. Most are self-explanatory.
-
-{\em{Enumeration}} (restriction of xsd:string in WSDL), exactly one of the values must be specified.
-
-Values:
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{EQUAL}}}}]\null{}
-
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{UNEQUAL}}}}]\null{}
-
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{LESS}}}}]\null{}
-
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{GREATER}}}}]\null{}
-
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{WITHIN}}}}]\null{}
-The attribute is between two specified values.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{{\frenchspacing\texttt{{EXISTS}}}}]\null{}
-The attribute exists (even having a NULL value).
-\end{description}
-\noindent \subsection{stringOrBlob}
-\label{type:stringOrBlob}\hypertarget{type:stringOrBlob}{}%
-
-
-
-{\em{Union}} (choice complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{string}}}}]\null{}
-String value.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:base64Binary {\ttfamily\itshape{{blob}}}}]\null{}
-Binary value.
-\end{description}
-\noindent \subsection{tagValue}
-\label{type:tagValue}\hypertarget{type:tagValue}{}%
-
-A single user-recorded value for a job attribute.
-
-{\em{Structure}} (sequence complex type in WSDL)
-
-Fields: ( type{\ttfamily\itshape{{name}}} description )
-
-\begin{description}
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{xsd:string {\ttfamily\itshape{{name}}}}]\null{}
-Name of the attribute, including namespace.
-% \null and \mbox are tricks to induce different typesetting decisions
-\item[{\hyperlink{type:stringOrBlob}{stringOrBlob} {\ttfamily\itshape{{value}}}}]\null{}
-(optional) Value.
-\end{description}
-\noindent
+++ /dev/null
-
-@InProceedings{ condor,
- author = "Michael Litzkow and Miron Livny and Matthew Mutka",
- title = "{C}ondor - A Hunter of Idle Workstations",
- booktitle = "Proceedings of the 8th International Conference of
- Distributed Computing Systems",
- year = "1988",
- month = "June"
-}
-
-@InProceedings{ gram,
- author = "K. Czajkowski and I. Foster and N. Karonis and C.
- Kesselman and Martin S. Smith and S. Tuecke",
- title = "A resource management architecture for metacomputing
- systems.",
- booktitle = "Proceedings of the IPPS/SPDP Workshop on Job Scheduling
- Strategies for Parallel Processing",
- year = "1988",
- pages = "62-82"
-}
-
-@InProceedings{ lsf,
- author = "S. Zhou",
- title = "LSF: Load sharing in large-scale heterogenous distributed
- systems",
- booktitle = "Proceedings of the Workshop on Cluster Computing",
- year = "1992"
-}
-
-@Misc{ dce,
- author = "Open Group CAE Specification",
- title = "DCE: Remote Procedure Call",
- howpublished = "ISBN 1-85912-041-5",
- year = "1994"
-}
-
-@Misc{ pbs,
- author = "Henderson, R. and Tweten, D",
- title = "Portable Batch System: External reference Specification",
- howpublished = "NASA, Ames Research Center",
- year = "1996"
-}
-
-@Article{ globus,
- author = "I. Foster and C. Kesselman",
- title = "Globus: a metacomputing infrastructure toolkit.",
- journal = "International Journal of Supercomputer Applications",
- year = "1997",
- volume = "11",
- number = "2",
- pages = "115-128"
-}
-
-@Misc{ ulm,
- author = "J. Abela and T. Debeaupuis",
- title = "Universal Format for Logger Messages",
- howpublished = "IETF Internet Draft",
- year = "1997"
-}
-
-@InProceedings{ autopilot,
- author = "R.L. Ribler and J.S. Vetter and H. Simitci and D.A. Reed",
- title = "Autopilot: adaptive control of distributed applications",
- booktitle = "Proceedings of the Seventh IEEE Symposium on
- High-Performance Distributed Computing",
- year = "1998",
- pages = "172-179"
-}
-
-@InProceedings{ gsi,
- author = "I. Foster and C. Kesselman and G. Tsudik and S. Tuecke",
- title = "{A Security Architecture for Computational Grids}",
- booktitle = "Proceedings of the 5th ACM Conference on Computer and
- Communications Security Conference",
- year = 1998,
- pages = "83-92"
-}
-
-@InProceedings{ classad,
- author = "Rajesh Raman and Miron Livny and Marvin Solomon",
- title = "Matchmaking: Distributed Resource Management for High
- Throughput Computing",
- booktitle = "Proceedings of the Seventh IEEE International Symposium on
- High Performance Distributed Computing",
- year = "1998"
-}
-
-@Article{ nws,
- author = "R.Wolski and N. Spring and J. Hayes",
- title = "The network weather service: a distributed resource
- performance forecasting service for metacomputing",
- journal = "J. Future Generation Comput. Syst.",
- year = "1999",
- volume = "15",
- number = "(5/6)",
- pages = "757-768"
-}
-
-@Misc{ tls,
- author = "T. Dierks and C. Allen",
- title = "The {TLS} {P}rotocol {V}ersion 1.0",
- howpublished = "IETF RFC 2246 (Standards Track)",
- year = 1999,
- month = "January"
-}
-
-@Misc{ gssapi,
- author = "{J. Linn}",
- title = "{Generic Security Service Application Program Interface
- Version 2, Update 1}",
- howpublished = "IETF RFC 2743",
- year = "2000",
- month = "January"
-}
-
-@TechReport{ lbdraft,
- author = {M. Ruda and A. Krenek and L. Matyska and J. Pospisil and
- M. Vocu and J. Sitera},
- title = {Logging and bookkeeping architecture},
- institution = {EU DataGrid},
- year = {2001},
- note = {Part of Deliverable D1.1 WP1 Report on current
- technology}
-}
-
-@InProceedings{ mds2,
- author = "K. Czajkowski and S. Fitzgerald and I. Foster and C.
- Kesselman.",
- title = "Grid Information Services for Distributed Resource
- Sharing.",
- booktitle = " Proceedings of the Tenth IEEE International Symposium on
- High-Performance Distributed Computing (HPDC-10)",
- year = "2001",
- month = "August",
- publisher = "IEEE Press"
-}
-
-@Misc{ gma,
- author = "B. Tierney and R. Aydt and D. Gunter and W. Smith and
- Valerie Taylor and R. Wolski and M. Swany.",
- title = "A Grid Monitoring Service Architecture.",
- howpublished = "Global Grid Forum Performance Working Group",
- year = "2001"
-}
-
-@Misc{ rgma,
- author = "S. Fisher",
- title = "Relational Model for Information and Monitoring",
- howpublished = "Technical Report GWD-Perf-7-1, GGF",
- year = "2001"
-}
-
-@InProceedings{ mercury,
- author = "Zoltan Balaton and Peter Kacsuk and Norbert Podhorszki and
- Ferenc Vajda.",
- title = "From Cluster Monitoring to Grid Monitoring Based on GRM",
- booktitle = "In proceedings 7th EuroPar2001 Parallel Processings,
- Manchester, UK.",
- year = "2001",
- pages = "874-881"
-}
-
-@Article{ siena,
- author = "Antonio Carzaniga and others",
- title = "Design and evaluation of a wide-area event notification
- service",
- journal = "ACM Transactions on Computer Systems",
- year = "2001",
- volume = "19",
- number = "3",
- pages = "332-383"
-}
-
-@InProceedings{ maui,
- author = "D. Jackson and Q. Snell and M. Clement",
- title = "Core algorithms of the Maui scheduler",
- booktitle = "Proceedings of the 7th Workshop on Job Scheduling
- Strategies for Parallel Processing",
- year = "2001"
-}
-
-@Misc{ ggfxml,
- author = "W. Smith and D. Gunther and D. Quesnel",
- title = "A simple xml producer-consumer protocol",
- howpublished = "Grid Working Document GWD-Perf-8-2, Global Grid Forum,
- Performance Working Group",
- year = "2001"
-}
-
-@TechReport{ lbdraft2,
- author = {M. Ruda and A. Krenek and L. Matyska and J. Pospisil and
- M. Vocu and J. Sitera},
- title = {Logging and bookkeeping architecture for {D}ata{G}rid
- {R}elease 2},
- institution = {EU DataGrid},
- year = {2002},
- note = {Part of Deliverable D1.2 Definition of architecture,
- technical plan and evaluation criteria for scheduling,
- resource management, security and job description}
-}
-
-@InProceedings{ code,
- author = "W. Smith",
- title = "A System for Monitoring and Management of Computational
- Grids.",
- booktitle = "In Proceedings of the 2002 International Conference on
- Parallel Processing",
- year = "2002"
-}
-
-@Misc{ hawkeye,
- title = "HawkEye: A Monitoring and Management Tool for Distributed
- Systems",
- howpublished = "\url{http://www.cs.wisc.edu/condor/hawkeye}",
- year = "2002"
-}
-
-@InProceedings{ chep03,
- author = {G. Avellino et.al.},
- title = {{The first deployment of workload management services on
- the EU DataGrid testbed: feedback on design and
- implementation}},
- booktitle = {Computing in High Energy and Nuclear Physics (CHEP03)},
- year = {2003},
- note = {La Jolla, Ca, USA, March 2003},
- fauthor = {G. Avellino, S. Beco, B. Cantalupo, F. Pacini, A.
- Terracina, A. Maraschini, D. Colling, S. Monforte, M.
- Pappalardo, L. Salconi, F. Giacomini, E. Ronchieri, D.
- Kouril, A. Krenek, L. Matyska, M. Mulac, J. Pospisil, M.
- Ruda, Z. Salvet, J. Sitera, M. Vocu, M. Mezzadri, F. Prelz,
- A. Gianelle, R. Peluso, M. Sgaravatto, S. Barale, A.
- Guarise, A. Werbrouck}
-}
-
-@Article{ alien,
- author = "P. Saiz and others",
- title = "{AliEn - ALICE environment on the GRID}",
- journal = "{Nuclear Instruments and Methods in Physics Research,
- Section A}",
- year = "2003",
- volume = "502",
- number = "2-3",
- pages = "437-440",
- fauthor = { P. Saiz, L. Aphecetche, P. Buncic, R. Piskac, J.E.
- Revsbech, V. Sego}
-}
-
-@InProceedings{ rgma2,
- author = "A. Cooke and others",
- title = "R-GMA: An information integration system for grid
- monitoring",
- booktitle = "Proc. of the 11th International Conference on Cooperative
- Information Systems",
- year = "2003"
-}
-
-@InProceedings{ netlogger,
- author = "B. Tierney and D. Gunter",
- title = "NetLogger: a toolkit for distributed system performance
- tuning and debugging",
- booktitle = "Proceedings of the IFIP/IEEE Eighth International
- Symposium on Integrated Network Management (IM 2003)",
- year = "2003",
- pages = "97-100",
- publisher = "Kluwer",
- bolume = "246 of IFIP Conference Proceedings"
-}
-
-@InProceedings{ monalisa,
- author = "H.B. Newman and I.C. Legrand and P. Galvez and R. Voicu
- and C. Cirstoiu",
- title = "MonALISA: a distributed monitoring service architecture",
- booktitle = "Computing in High Energy and Nuclear Physics (CHEP03), La
- Jolla, CA",
- year = "2003"
-}
-
-@InProceedings{ gridrm,
- author = "M.A. Baker and G.C. Smith",
- title = "GridRM: an extensible resource monitoring system",
- booktitle = "Proceedings of the IEEE International Cluster Computing
- Conference",
- year = "2003",
- pages = "207-214"
-}
-
-@InProceedings{ gridlab,
- author = "Zoltan Balaton and Gabor Gombas",
- title = "Resource and Job Monitoring in the Grid",
- booktitle = "Proc. of the Euro-Par 2003 International Conference,
- Klagenfurt",
- year = 2003
-}
-
-@Misc{ rgmacms,
- author = "D. Bonacorsi and D. Colling and L. Field and S. Fisher and
- C. Grandi and P. R. Hobson and P. Kyberd and B. MacEvoy and
- J. J. Nebrensky and H. Tallini and S. Traylen",
- title = "Scalability Tests of R-GMA Based Grid Job Monitoring
- System for CMS Monte Carlo Data Production",
- howpublished = "IEEE NSS Conference, Oregon, USA",
- year = "2003",
- month = "21-24 October"
-}
-
-@Misc{ xacml,
- author = "{OASIS Standard}",
- title = "{eXtensible Access Control Markup Language (XACML),
- Version 1.0}",
- year = 2003,
- month = "February"
-}
-
-@InProceedings{ gacl1,
- author = "L. Cornwall and J. Jensen and D. Kelsey and A. McNab",
- title = "{EU DataGrid and GridPP authorization and access control}",
- booktitle = "Proceedings of the UK e-Science All Hands Meeting",
- year = "2003",
- pages = "382--384"
-}
-
-@Misc{ glue,
- author = "S. Andreozzi and M. Sgaravatto and C. Vistoli",
- title = "Sharing a conceptual model of Grid resources and services",
- howpublished = "Proceedings of the Conference for Computing in High Energy
- and Nuclear Physics (CHEP03)",
- year = "2003"
-}
-
-@InProceedings{ perf,
- author = "Xuehai Zhang and Jeffrey L. Freschl and Jennifer M.
- Schopf",
- title = "A Performance Study of Monitoring and Information Services
- for Distributed Systems",
- booktitle = "12th IEEE International Symposium on High Performance
- Distributed Computing (HPDC-12 '03)",
- year = "2003"
-}
-
-@InProceedings{ glite,
- author = "E. Laure and F. Hemmer and F. Prelz and S. Beco and S.
- Fisher and M. Livny and L. Guy and M. Barroso and P. Buncic
- and P. Kunszt and A. {Di Meglio} and A. Aimar and A. Edlund
- and D. Groep and F. Pacini and M. Sgaravatto and O. Mulmo",
- title = "Middleware for the next generation Grid infrastructure",
- booktitle = "Computing in High Energy Physics and Nuclear Physics (CHEP
- 2004)",
- year = 2004
-}
-
-@Article{ jgc,
- author = {G. Avellino and others},
- title = {{The DataGrid Workload Management System: Challenges and
- Results}},
- journal = {Journal of Grid Computing},
- year = {Dec 2004},
- volume = {2},
- number = {4},
- pages = {353--367},
- fauthor = { G. Avellino, S. Beco, B. Cantalupo, A. Maraschini, F.
- Pacini, M. Sottilaro, A. Terracina, D. Colling, F.
- Giacomini, E. Ronchieri, A. Gianelle, M. Mazzucato, R.
- Peluso, M. Sgaravatto, A. Guarise, R. Piro, A. Werbrouck,
- D. Kouøil, A. Køenek, L. Matyska, M. Mulaè, J. Pospí¹il, M.
- Ruda, Z. Salvet, J. Sitera, J. ©krabal, M. Vocù, M.
- Mezzadri, F. Prelz, S. Monforte, M. Pappalardo}
-}
-
-@Misc{ apart,
- author = "M. Gerndt and others",
- title = "Performance Tools for the {Grid}: State of the Art and
- Future",
- howpublished = "Tech. Rep. Lehrstuhl fuer Rechnertechnik und
- Rechnerorganisation, Technische Universitaet Muenchen
- (LRR-TUM).
- \url{http://www.lpds.sztaki.hu/~zsnemeth/apart/}",
- year = "2004"
-}
-
-@InProceedings{ ahm04194,
- author = {Shrija Rajbhandari and David W. Walker},
- title = "{Support for Provenance in a Service-based Computing
- Grid}",
- booktitle = "{Proceedings of the third UK e-Science All Hands Meeting,
- Nottingham, UK}",
- year = {2004}
-}
-
-@TechReport{ gro04,
- author = {Paul T. Groth},
- title = "{Recording provenance in service-oriented architectures}",
- institution = "{University of Southampton; Faculty of Engineering,
- Science and Mathematics; School of Electronics and Computer
- Science}",
- year = {2004}
-}
-
-@InProceedings{ glm04b,
- author = {Paul Groth and Michael Luck and Luc Moreau},
- title = "{A protocol for recording provenance in service-oriented
- grids}",
- booktitle = "{Proceedings of the 8th International Conference on
- Principles of Distributed Systems (OPODIS04)}",
- year = {2004}
-}
-
-@Article{ ganglia,
- author = "M.L. Massie and B.N. Chun and D.E. Culler",
- title = "Ganglia Distributed Monitoring System: Design,
- Implementation, and Experience",
- journal = "Parallel Computing",
- year = "2004",
- volume = "30",
- pages = "817-840"
-}
-
-@Misc{ gae,
- author = "Arshad Ali and Ashiq Anjum and Julian Bunn and Richard
- Cavanaugh and Frank van Lingen and Richard McClatchey and
- Harvey Newman and Waqas ur Rehman and Conrad Steenberg and
- Michael Thomas and Ian Willers",
- title = "Job Monitoring in an Interactive Grid Analysis
- Environment",
- howpublished = "Computing in High Energy Physics 2004",
- year = "2004"
-}
-
-@InProceedings{ voms1,
- author = "R. Alfieri and R. Cecchini and V. Ciaschini and L.
- dell'Agnello and \'{A}. Frohner and A. Gianoli and K.
- L\H{o}rentey and F. Spataro",
- title = "{VOMS}, an {A}uthorization {S}ystem for {V}irtual
- {O}rganizations",
- booktitle = "Grid Computing: First European Across Grids Conference",
- year = "2004"
-}
-
-@InProceedings{ delegation,
- author = "V. Welch and I. Foster and C. Kesselman and O. Mulmo and
- L. Pearlman and S. Tuecke and J. Gawor and S. Meder and F.
- Siebenlist",
- title = "{X.509 Proxy Certificates for Dynamic Delegation}",
- booktitle = "Proceedings of the 3rd Annual PKI R\&D Workshop",
- year = 2004,
- month = "April"
-}
-
-@Misc{ proxycert,
- author = "S. Tuecke and V. Welch and D. Engert and L. Pearlman and
- M. Thompson",
- title = "Internet {X}.509 {P}ublic {K}ey {I}nfrastructure ({PKI})
- proxy certificate profile",
- howpublished = "IETF RFC 3820",
- year = 2004,
- month = "June"
-}
-
-@InProceedings{ chep,
- author = "D. Kouøil and others",
- title = "Distributed Tracking, Storage, and Re-use of Job State
- Information on the Grid",
- booktitle = "Computing in High Energy and Nuclear Physics (CHEP04)",
- year = "2004"
-}
-
-@Misc{ genericlb,
- author = "{CESNET JRA1 team}",
- title = "Current and Foreseen {\LB}\ Design",
- howpublished = "3rd EGEE Conference, Athens,
- \url{http://indico.cern.ch/contributionDisplay.py?contribId=201&sessionId=73&confId=0513}"
- ,
- year = 2005
-}
-
-@InProceedings{ eup1,
- author = "Liming Chen and Victor Tan and Fenglian Xu and Alexis
- Biller and Paul Groth and Simon Miles and John Ibbotson and
- Michael Luck and Luc Moreau",
- title = "{A proof of concept: Provenance in a Service Oriented
- Architecture}",
- booktitle = "{Proceedings of the fourth UK e-Science All Hands Meeting,
- Nottingham, UK}",
- year = {2005}
-}
-
-@InProceedings{ tgx05,
- author = {Paul Townend and Paul Groth and Jie Xu},
- title = "{A provenance-aware weighted fault tolerance scheme for
- service-based applications}",
- booktitle = "{Proceedings of the $8^{th}$ IEEE International Symposium
- on Object-oriented Real-time distributed Computing (ISORC
- 2005)}",
- year = {2005}
-}
-
-@InProceedings{ mygrid,
- author = "M. Nedim Alpdemir and Arijit Mukherjee and Norman W. Paton
- and Alvaro A.A. Fernandes and Paul Watson and Kevin Glover
- and Chris Greenhalgh and Tom Oinn and Hannah Tipney",
- title = "Contextualised Workflow Execution in myGrid",
- booktitle = " Proc European Grid Conference , Springer-Verlag LNCS
- 3470",
- year = 2005,
- pages = "444-453"
-}
-
-@Article{ condor2,
- author = "Douglas Thain and Todd Tannenbaum and Miron Livny",
- title = "Distributed computing in practice: the Condor experience.",
- journal = "Concurrency - Practice and Experience",
- year = "2005",
- volume = "17",
- number = "2-4",
- pages = "323-356"
-}
-
-@InProceedings{ globus4,
- author = "I. Foster",
- title = "Globus Toolkit Version 4: Software for Service-Oriented
- Systems.",
- booktitle = "IFIP International Conference on Network and Parallel
- Computing, Springer-Verlag LNCS 3779,",
- year = "2005",
- pages = "2-13"
-}
-
-@InProceedings{ cgmapisa,
- author = "Andrea Ceccanti and Ond\v{r}ej Kraj\'{\i}\v{c}ek and
- Ale\v{s} K\v{r}enek and Lud\v{e}k Matyska and Miroslav
- Ruda.",
- title = "Towards Scalable and Interoperable Grid Monitoring
- Infrastructure.",
- booktitle = "Proceedings of the first CoreGRID Integration Workshop",
- year = "2005",
- pages = "10-18"
-}
-
-@InProceedings{ cgma,
- author = "Ondøej Krajíèek and Ale¹ Køenek and Ludìk Matyska and
- Miroslav Ruda and Jiøí Sitera",
- title = "Capability Languages in C-GMA",
- booktitle = "Proceedings of Cracow Grid Workshop (CGW05)",
- year = "2005"
-}
-
-@Article{ taxonomy,
- author = {Serafeim Zanikolas and Rizos Sakellariou},
- title = {A taxonomy of grid monitoring systems},
- journal = {Future Gener. Comput. Syst.},
- year = {2005},
- volume = {21},
- number = {1},
- pages = {163--188},
- issn = {0167-739X},
- doi = {http://dx.doi.org/10.1016/j.future.2004.07.002},
- publisher = {Elsevier Science Publishers B. V.},
- address = {Amsterdam, The Netherlands, The Netherlands}
-}
-
-@Article{ unicore,
- author = "Achim Streit and Dietmar Erwin and Thomas Lippert and
- Daniel Mallmann and Roger Menday and Michael Rambadt and
- Morris Riedel and Mathilde Romberg and Bernd Schuller and
- Philipp Wieder",
- title = "UNICORE - From Project Results to Production Grids",
- journal = "Grid Computing : New Frontiers of High Performance
- Computing",
- year = "2005",
- pages = "357 - 376"
-}
-
-@Article{ voms2,
- author = "R. Alfieri and R. Cecchini and V. Ciaschini and L.
- dell'Agnello and \'{A}. Frohner and K. L\H{o}rentey and F.
- Spataro",
- title = "{From gridmap-file to VOMS: managing authorization in a
- Grid environment}",
- journal = "Future Generation Computer Systems",
- year = "2005",
- pages = "549-558",
- month = "April"
-}
-
-@InProceedings{ cgw05,
- author = "F. Dvoøák and D. Kouøil and A. Køenek and L. Matyska and
- M. Mulaè and J.Pospi¹il and M. Ruda and Z. Salvet and J.
- Sitera and J. ©krabal and M. Vocù ",
- title = "Services for Tracking and Archival of Grid Job
- Information",
- booktitle = "Proceeding of Cracow Grid Workshop",
- year = "2005"
-}
-
-@Misc{ rfc4122,
- author = "P. Leach and M. Mealling and R. Salz",
- title = "A Universally Unique IDentifier (UUID) URN Namespace",
- howpublished = "IETF RFC 4122",
- year = "2005"
-}
-
-@Misc{ euprovenance,
- title = "{EU FP6 Programme Enabling and Supporting Provenance in
- Grids for Complex Problems}",
- howpublished = "\url{http://twiki.gridprovenance.org/bin/view/Provenance/ProjectInformation}"
- ,
- year = 2006
-}
-
-@Misc{ atlas,
- author = "TODO - predelat na neco poradneho",
- title = "{The ATLAS Experiment}",
- howpublished = "\url{http://atlas.ch/}",
- year = 2006
-}
-
-@Misc{ ami,
- author = "TODO - predelat na neco poradneho",
- title = "{The Atlas Metadata Interface}",
- howpublished = "\url{https://atlastagcollector.in2p3.fr:8443/AMI/}",
- year = 2006
-}
-
-@Misc{ alice,
- author = "TODO - predelat na neco poradneho",
- title = "{A Large Ion Collider Experiment}",
- howpublished = "\url{http://aliceinfo.cern.ch/Public}",
- year = 2006
-}
-
-@Misc{ sam,
- author = "TODO - predelat na neco poradneho",
- title = "{SAM (Sequential data Access via Meta-data)}",
- howpublished = "\url{http://d0db.fnal.gov/sam/}",
- year = 2006
-}
-
-@InProceedings{ gacl2,
- author = "A. McNab and S. Kaushal",
- title = "Web services with gridsite and C/C++/scripts",
- booktitle = "Computing in High Energy and Nuclear Physics (CHEP 2006)",
- year = "2006"
-}
-
-@Misc{ crossgrid,
- author = "CrossGrid",
- title = "{CrossGrid Project}",
- howpublished = "\url{http://www.crossgrid.org}"
-}
-
-@Misc{ dgas,
- author = "DGAS",
- title = "{The Distributed Grid Accounting System}",
- howpublished = "\url{http://www.to.infn.it/grid/accounting/main.html}"
-}
-
-@Misc{ egee,
- author = "EGEE",
- title = "{Enabling Grids for E-sciencE (EGEE) Project}",
- howpublished = "\url{http://lcg.web.cern.ch/LCG/}"
-}
-
-@Misc{ gridice,
- author = "EGEE",
- title = "{GridIce, the eyes of the Grid}",
- howpublished = "\url{http://gridice2.cnaf.infn.it:50080/gridice/}"
-}
-
-@Misc{ djra1.2,
- author = {{EGEE JRA1}},
- title = {{EGEE Middleware Design---Release 1}},
- howpublished = {\url{https://edms.cern.ch/document/487871/}}
-}
-
-@Misc{ djra1.3,
- author = {{EGEE JRA1}},
- title = {{EGEE Middleware Release 1}},
- howpublished = {\url{https://edms.cern.ch/document/567624/}}
-}
-
-@Misc{ djra1.4,
- author = {{EGEE JRA1}},
- title = {{EGEE Middleware Architecture---Release 2}},
- howpublished = {\url{https://edms.cern.ch/document/594698/}}
-}
-
-@Misc{ jra2jobmetrics,
- author = "EGEE JRA2",
- title = "{Job Metrics}",
- howpublished = "\url{http://egee-jra2.web.cern.ch/EGEE-JRA2/QoS/JobsMetrics/JobMetrics.htm}"
-
-}
-
-@Misc{ lbug,
- author = "A. K\v{r}enek and others",
- title = "{L\&B Users Guide}",
- howpublished = "\url{https://edms.cern.ch/file/571273/1/LB-guide.pdf}"
-}
-
-@Misc{ lcg,
- author = "LCG",
- title = "{LHC Computing Project (LCG)}",
- howpublished = "\url{http://lcg.web.cern.ch/LCG/}"
-}
-
-@Misc{ pasoa,
- title = "{PASOA: Provenance Aware Service Oriented Architecture}",
- howpublished = "\url{http://twiki.pasoa.ecs.soton.ac.uk/bin/view/PASOA/AboutPasoa}"
-
-}
+++ /dev/null
-# defaults
-top_srcdir=.
-builddir=build
-top_builddir=${top_srcdir}/${builddir}
-stagedir=.
-distdir=.
-globalprefix=glite
-jpprefix=jp
-package=glite-jp-index
-version=0.0.0
-PREFIX=/opt/glite
-
-glite_location=/opt/glite
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-gsoap_prefix=/software/gsoap-2.6
-
-CC=gcc
-
--include Makefile.inc
-
-
-VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/project:${top_srcdir}/doc:${jpproject}:${stagedir}/interface
-
-DEBUG:=-W -Wall -g -O0
-CPPFLAGS:=-DDEBUG -D_GNU_SOURCE -I. -I${top_srcdir}/interface -I${top_srcdir}/src -I${gsoap_prefix}/include -I${gsoap_prefix} -I${stagedir}/include -I${gsoap_prefix}/include
-CFLAGS:=${DEBUG} ${CFLAGS}
-LDFLAGS:=-L${stagedir}/lib
-
-dotless_soap_ver:=${shell echo ${gsoap_version} | tr -d . }
-GSOAPLIB:=-L${stagedir}/lib -lglite_security_gsoap_plugin_${dotless_soap_ver}_${nothrflavour}
-
-gsoap_bin_prefix:=${shell if [ -x ${gsoap_prefix}/bin/soapcpp2 ]; then echo ${gsoap_prefix}/bin; else echo ${gsoap_prefix}; fi }
-
-
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-
-daemon:=glite-jp-indexd
-examples:=glite-jpis-test glite-jpis-client
-test:=run-test.sh
-test_files:=dump1.sql simple_query.in simple_query.out complex_query.in complex_query.out authz.out jobid_query.in jobid_query.out origin_query.in origin_query.out exists_query.in exists_query.out within_query.in within_query.out
-
-MANS1:=glite-jpis-client.1
-MANS8:=glite-jp-indexd.8
-MANS:=${MANS1} ${MANS8}
-HTMLS:=glite-jpis-client.html glite-jp-indexd.html
-ws_prefix:=jp_
-is_prefix:=${ws_prefix}
-ps_prefix:=${ws_prefix}
-
-SRCS:= conf.c bones_server.c soap_ops.c soap_ps_calls.c common.c \
- ${is_prefix}Server.c ${ps_prefix}Client.c ${ws_prefix}C.c \
- ws_ps_typeref.c ws_is_typeref.c db_ops.c context.c type_plugin.c
-
-EXA_TEST_SRCS:=jpis-test.c ${is_prefix}Client.c ${is_prefix}C.c context.c db_ops.c conf.c ws_is_typeref.c common.c
-EXA_DB_SRCS:=jpis-db-internal.c db_ops.c conf.c context.c ws_is_typeref.c common.c
-EXA_CLIENT_SRCS:=jpis-client.c ${is_prefix}Client.c ${is_prefix}C.c common.c
-
-OBJS:=${SRCS:.c=.o}
-EXA_TEST_OBJS:=${EXA_TEST_SRCS:.c=.o}
-EXA_DB_OBJS:=${EXA_DB_SRCS:.c=.o}
-EXA_CLIENT_OBJS:=${EXA_CLIENT_SRCS:.c=.o}
-
-
-COMMONLIB:=-lglite_jp_common_${nothrflavour}
-SRVCOMMONLIB:=-lglite_jp_server_common
-BONESLIB:=-lglite_lbu_server_bones
-TRIOLIB:=-lglite_lbu_trio
-GSSLIB:=-lglite_security_gss_${nothrflavour}
-
-default all: compile doc
-
-compile: ${daemon} ${examples}
-
-${daemon}: ${OBJS}
- ${LINK} -o $@ -export-dynamic ${OBJS} ${BONESLIB} ${TRIOLIB} ${COMMONLIB} ${GSOAPLIB} ${SRVCOMMONLIB} ${GSSLIB}
-
-glite-jpis-test: ${EXA_TEST_OBJS}
- ${LINK} -o $@ $+ ${GSOAPLIB} ${COMMONLIB} ${TRIOLIB} ${SRVCOMMONLIB}
-
-jpis-db-internal: ${EXA_DB_OBJS}
- ${LINK} -o $@ $+ ${COMMONLIB} ${SRVCOMMONLIB}
-
-glite-jpis-client: ${EXA_CLIENT_OBJS}
- ${LINK} -o $@ $+ ${GSOAPLIB} ${COMMONLIB} ${TRIOLIB}
-
-${ws_prefix}Client.c ${ws_prefix}Server.c \
-${ws_prefix}C.c ${ws_prefix}H.h ${ws_prefix}Stub.h: JobProvenance.xh
- ${gsoap_bin_prefix}/soapcpp2 -n -w -c -p ${ws_prefix} $<
-
-JobProvenance.xh: jpdev.wsdl
- cp ${stagedir}/interface/JobProvenanceTypes.wsdl .
- ${gsoap_bin_prefix}/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o $@ $<
- rm -f JobProvenanceTypes.wsdl
-
-check:
- # ../test/run-test.sh
-
-doc: ${MANS} ${HTMLS}
-
-stage: compile doc
- ${MAKE} PREFIX=${stagedir} DOSTAGE=yes install
-
-install:
- -mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/etc/init.d
- -mkdir -p ${PREFIX}/share/doc/${package}-${version}
- -mkdir -p ${PREFIX}/examples ${PREFIX}/examples/query-tests
- -mkdir -p ${PREFIX}/interface
- -mkdir -p ${PREFIX}/share/man/man1
- -mkdir -p ${PREFIX}/share/man/man8
- ${INSTALL} -m 755 ${daemon} ${PREFIX}/bin
- ${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 755 ${top_srcdir}/config/glite-jpis-test-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
- ${INSTALL} -m 755 ../examples/query-tests/${test} ${PREFIX}/examples/query-tests
- for i in ${test_files}; do \
- ${INSTALL} -m 644 ../examples/query-tests/$$i ${PREFIX}/examples/query-tests; \
- done
- ${INSTALL} -m 644 ${top_srcdir}/interface/JobProvenanceISClient.xsd ${PREFIX}/interface
- -mkdir -p ${PREFIX}/yaim/functions/
- -mkdir -p ${PREFIX}/yaim/node-info.d
- -mkdir -p ${PREFIX}/yaim/defaults
- -mkdir -m 0700 -p ${PREFIX}/yaim/examples/siteinfo/services
- ${INSTALL} -m 0644 ${top_srcdir}/config/functions/config* ${PREFIX}/yaim/functions
- ${INSTALL} -m 0644 ${top_srcdir}/config/node-info.d/glite* ${PREFIX}/yaim/node-info.d
- ${INSTALL} -m 0644 ${top_srcdir}/config/defaults/glite* ${PREFIX}/yaim/defaults
- ${INSTALL} -m 0600 ${top_srcdir}/config/site-info.def.example ${PREFIX}/yaim/examples/siteinfo/services/glite_jpis
-
-clean:
- rm -rvf *.c *.h *.ch *.xh *.xml *.nsmap *.o *.lo .libs glite-jp*
- rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
-
-soap_ops.o bones_server.o simple_server.o: ${is_prefix}H.h ${ps_prefix}H.h
-
-soap_ops.o bones_server.o: soap_version.h
-
-soap_version.h:
- ${gsoap_bin_prefix}/soapcpp2 /dev/null
- perl -ne '$$. == 2 && /.*([0-9])\.([0-9])\.([0-9]).*/ && printf "#define GSOAP_VERSION %d%02d%02d\n",$$1,$$2,$$3' soapH.h >$@
- -rm soapC.cpp soapH.h soapStub.h soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp
-
-db_ops.h: context.h
-context.h: conf.h
-db_ops.o: db_ops.c conf.h context.h db_ops.h
-context.o: context.c conf.h context.h
-soap_ps_calls.o: soap_ps_calls.c ${ps_prefix}H.h ${ps_prefix}.nsmap soap_version.h conf.h db_ops.h ws_ps_typeref.h context.h
-soap_ops.o: soap_ops.c jp_H.h ${is_prefix}.nsmap soap_version.h db_ops.h ws_ps_typeref.h ws_is_typeref.h context.h
-ws_ps_typeref.o: ws_ps_typeref.c ${ps_prefix}H.h ws_typemap.h ws_ps_typeref.h soap_version.h
-ws_is_typeref.o: ws_is_typeref.c ${is_prefix}H.h ws_typemap.h ws_is_typeref.h soap_version.h
-jpis-client.o: jpis-client.c ${is_prefix}H.h soap_version.h
-jpis-test.o: jpis-client.c ${is_prefix}H.h soap_version.h
-conf.o: conf.c ${is_prefix}H.h soap_version.h
-common.o: common.h common.c
-
-${ws_prefix}C.o: ${ws_prefix}C.c
- $(CC) -c $(CPPFLAGS) $(CFLAGS) -Wno-unused-parameter $<
-
-%.1: %.sgml
- docbook2man $<
-
-%.8: %.sgml
- docbook2man $<
-
-%.html: %.sgml
- docbook2html $< --nochunks
-
-.PHONY: default all compile check doc stage dist distsrc distbin install clean
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the gLite JP Index module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/11/22 14:00:37 dimeglio
- Updated to use standard files
- Fixed names (was using common instead of real module name)
-
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
-<project name="index" default="dist">
-
- <!-- =========================================
- Builds the GLite JP Index Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#! /bin/sh
-
-#
-# Shell example of preparing the database for JP Index Server
-#
-
-# database
-mysqladmin -u root -p create jpis
-
-# user
-mysql -u root -p -e 'GRANT ALL on jpis.* to jpis@localhost'
-
-# tables
-mysql -u jpis jpis < `dirname $0`/glite-jp-index-dbsetup.sql
+++ /dev/null
-### Default values to some glite-JPIS variables
-GLITE_USER=glite
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : config_jpis
-#
-# DESCRIPTION : This function configures Job Provenance Index Server.
-#
-# AUTHORS : LB/JP team, heavily based on glite-yaim-lb
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-jpis
-#
-##############################################################################
-
-
-function config_glite_jpis_check(){
- requires MYSQL_PASSWORD
-}
-
-function config_glite_jpis_setenv(){
-
- yaimgridenv_set GLITE_LOCATION ${INSTALL_ROOT:-opt}/glite
- yaimgridenv_set GLITE_LOCATION_VAR ${GLITE_LOCATION_VAR:-/var/glite}
- yaimgridenv_set GLITE_USER ${GLITE_USER:-glite}
- yaimgridenv_set GLITE_HOST_CERT ${GLITE_USER_HOME:-/home/glite}/.certs/hostcert.pem
- yaimgridenv_set GLITE_HOST_KEY ${GLITE_USER_HOME:-/home/glite}/.certs/hostkey.pem
- yaimgridenv_set X509_CERT_DIR /etc/grid-security/certificates
- yaimgridenv_set GLITE_JPIS_PIDFILE ${GLITE_JPIS_PIDFILE:-$GLITE_LOCATION_VAR/glite-jp-indexd.pid}
- yaimgridenv_set GLITE_JPIS_LOGFILE ${GLITE_JPIS_LOGFILE:-$GLITE_LOCATION_VAR/glite-jp-indexd.log}
- yaimgridenv_set GLITE_JPIS_CONFIG ${GLITE_JPIS_CONFIG:-$GLITE_LOCATION/etc/glite-jpis-config.xml}
- yaimgridenv_set GLITE_JPIS_PORT ${GLITE_JPIS_PORT:-8902}
- yaimgridenv_set GLITE_JPIS_DB ${GLITE_JPIS_DB:-jpis/@localhost:jpis}
- yaimgridenv_set GLITE_JPIS_QT ${GLITE_JPIS_QT:-both}
- yaimgridenv_set GLITE_JPIS_AUTH ${GLITE_JPIS_AUTH}
- yaimgridenv_set GLITE_JPIS_DEBUG ${GLITE_JPIS_DEBUG}
-
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/glite/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/globus/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/c-ares/lib
-}
-
-function config_glite_jpis() {
-
- #################################################
- # Job Provenance Index Server configuration #
- #################################################
-
- HOSTNAME=`hostname -f`
-
- chmod og+rx /var/lib/mysql/
- chown mysql:mysql /var/run/mysqld/
-
- # add option --max_allowed_packet=17M
- if [ ! -f /etc/my.cnf ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- else
- grep "^[mysqld]" /etc/my.cnf > /dev/null
- if [ ! $? = 0 ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- fi
- fi
-
- /sbin/chkconfig mysqld on
- ps ax | grep -v grep |grep mysqld_safe > /dev/null 2>&1
- if [ ! $? = 0 ] ; then
- /etc/init.d/mysqld start
- sleep 1
- fi
-
- ls /tmp/mysql.sock > /dev/null 2>&1
- if [ ! $? = 0 ]; then
- ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
- fi
-
- # set mysql password
- set_mysql_passwd || return 1 # the function uses $MYSQL_PASSWORD
-
- # Check if database exist
- mysqlshow --password="$MYSQL_PASSWORD" | grep "jpis" > /dev/null 2>&1
-
- if [ ! $? = 0 ]; then
- mysql -u root --password="$MYSQL_PASSWORD" -e "CREATE DATABASE jpis"
- mysql --password="$MYSQL_PASSWORD" jpis < ${INSTALL_ROOT}/glite/etc/glite-jp-index-dbsetup.sql
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on jpis.* to jpis IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on jpis.* to jpis@'$HOSTNAME' IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on jpis.* to jpis@localhost IDENTIFIED BY '' WITH GRANT OPTION;"
- else
- yaimlog "Database jpis already exists"
- fi
-
- . /opt/glite/etc/profile.d/grid-env.sh
- mkdir -p $GLITE_LOCATION_VAR # Needed to store PID of JP IS server
- chown $GLITE_USER:$GLITE_USER $GLITE_LOCATION_VAR
- chmod 0755 $GLITE_LOCATION_VAR
-
- mkdir -p $GLITE_USER_HOME/.certs
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs
- chmod 0755 $GLITE_USER_HOME/.certs
- cp -f /etc/grid-security/hostcert.pem /etc/grid-security/hostkey.pem $GLITE_USER_HOME/.certs/
- if [ ! $? = 0 ] ; then
- echo "Please copy host certificate and key into /etc/grid-security and"
- echo " $GLITE_USER_HOME/.certs/, change the owner of the ones in"
- echo " $GLITE_USER_HOME/.certs/ to $GLITE_USER"
- fi
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs/hostcert.pem $GLITE_USER_HOME/.certs/hostkey.pem
- chmod 0644 $GLITE_USER_HOME/.certs/hostcert.pem
- chmod 0400 $GLITE_USER_HOME/.certs/hostkey.pem
-
- # Start services
- if [ ! -f ${GLITE_LOCATION}/etc/gLiteservices ] ; then
- touch ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- grep glite-jp-indexd ${GLITE_LOCATION}/etc/gLiteservices > /dev/null
- if [ ! $? = 0 ] ; then
- echo "${GLITE_LOCATION}/etc/init.d/glite-jp-indexd" >> ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- ${GLITE_LOCATION}/etc/init.d/glite-jp-indexd stop
- ${GLITE_LOCATION}/etc/init.d/glite-jp-indexd start
-
- if [ ! $? = 0 ] ; then
- yaimlog ABORT "Service glite-jp-indexd failed to start!"
- return 1
- fi
-
- return 0
-
-}
+++ /dev/null
-create table jobs (
- `jobid` char(32) binary not null,
- `dg_jobid` varchar(255) binary not null,
- `ownerid` char(32) binary not null,
- `aclid` char(32) binary null,
- `ps` varchar(255) not null,
-
- primary key (jobid),
- unique (dg_jobid),
- index (jobid),
- index (dg_jobid)
-) character set utf8 collate utf8_bin engine=innodb;
-
-create table attrs (
- `attrid` char(32) binary not null,
- `name` varchar(255) binary not null,
- `indexed` int not null,
- `type` char(32) binary null,
-
- primary key (attrid),
- index (attrid),
- index (name)
-) character set utf8 collate utf8_bin engine=innodb;
-
-create table feeds (
- `uniqueid` int auto_increment not null,
- `feedid` char(32) binary unique,
- `state` int not null,
- `locked` int not null,
- `source` varchar(255) not null,
- `expires` datetime,
- `condition` mediumblob null,
-
- primary key (uniqueid),
- index (uniqueid),
- index (feedid),
- index (state)
-) character set utf8 collate utf8_bin engine=innodb;
-
-create table acls (
- `aclid` char(32) binary not null,
- `value` mediumblob not null,
- `refcnt` int not null,
-
- primary key (aclid)
-) character set utf8 collate utf8_bin engine=innodb;
-
-create table users (
- `userid` char(32) binary not null,
- `cert_subj` varchar(255) binary not null,
-
- primary key (userid),
- unique (cert_subj)
-) character set utf8 collate utf8_bin engine=innodb;
-
-# data tables - created one for each configured and indexed attribute,
-# in future values of the non-indexed attributes will be stored in attr_values
-#
-#create table attr_<attrid> (
-# `jobid` char(32) binary not null,
-# `value` varchar(255) binary not null,
-# `full_value` mediumblob not null,
-# `origin` int not null,
-#
-# index (jobid),
-# index (value)
-#) character set utf8 collate utf8_bin engine=innodb;
-
-
-# ---- future schema improvements ----
-
-#create table attr_values (
-# `jobid` char(32),
-# `attrid` char(32) binary not null,
-# `value` varchar(255) binary not null,
-# `full_value` mediumblob not null,
-# `origin` int not null,
-## `is_multival` int,
-#
-## primary key (jobid, attrid)
-# index (jobid),
-# index (attrid),
-# index (value)
-#) character set utf8 collate utf8_bin engine=innodb;
-
-#create table attr_multivalues (
-# `jobid` char(32),
-# `attrid` char(32) binary not null,
-# `value` varchar(255) binary not null,
-# `full_value` mediumblob not null,
-# `origin` int not null,
-#
-# index (jobid),
-# index (attrid)
-# index (value)
-#) character set utf8 collate utf8_bin engine=innodb;
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:ServerConfiguration xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <!-- List of attributes IS want to receive from PS's -->
- <attrs>http://egee.cesnet.cz/en/Schema/JP/System:owner</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/JP/System:regtime</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:LBserver</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:parent</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:VO</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:aTag</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:rQType</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:eDuration</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:eNodes</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:eProc</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:RB</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:host</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:UIHost</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:CPUTime</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:NProc</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDate</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusReason</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:LRMSDoneStatus</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:LRMSDoneStatusReason</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:retryCount</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:additionalReason</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:jobType</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:nsubjobs</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:subjobs</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:lastStatusHistory</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:fullStatusHistory</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:JDL</attrs>
-
- <!-- List of attributes IS will index -->
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/JP/System:owner</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/JP/System:jobId</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:VO</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</indexedAttrs>
-
- <!-- List of type plugins -->
- <plugins></plugins>
-
- <!-- List of feeds IS wants to receive from PS's-->
- <feeds>
- <primaryServer>https://localhost:8901</primaryServer>
- <!-- List of conditions triggering attrs sending -->
- <condition>
- <attr>http://egee.cesnet.cz/en/Schema/JP/System:owner</attr>
- <op>EQUAL</op>
- <value>
- <string>/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Milos Mulac</string>
- </value>
- </condition>
- <history>1</history>
- <continuous>1</continuous>
- </feeds>
-</jpelem:ServerConfiguration>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:ServerConfiguration xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <!-- List of attributes IS want to receive from PS's -->
- <attrs>http://egee.cesnet.cz/en/Schema/JP/System:owner</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/JP/System:regtime</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:aTag</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:eNodes</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:RB</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:UIHost</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:CPUTime</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:NProc</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDate</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:retryCount</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:jobType</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:nsubjobs</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:lastStatusHistory</attrs>
- <attrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:fullStatusHistory</attrs>
-
-
- <!-- List of attributes IS will index -->
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/JP/System:owner</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/JP/System:jobId</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</indexedAttrs>
- <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</indexedAttrs>
-
- <!-- List of type plugins -->
- <plugins></plugins>
-</jpelem:ServerConfiguration>
+++ /dev/null
-JPIS_FUNCTIONS="
-config_add_pool_env
-config_crl
-config_host_certs
-config_edgusers
-config_globus_clients
-config_glite_jpis
-config_glite_initd"
+++ /dev/null
-#
-# site-info.def example, part for org.glite.jp.index
-#
-# options configured by YAIM can be overriden by:
-# - /etc/glite.conf
-# - $GLITE_LOCATION/etc/glite-wms.conf
-# - $HOME/.glite.conf # of root user
-#
-
-
-#
-# required minimum set of YAIM options given from
-# /opt/glite/yaim/examples/siteinfo/site-info.def
-#
-YAIM_LOGGING_LEVEL=INFO
-MY_DOMAIN=civ.zcu.cz
-INSTALL_ROOT=/opt
-CRON_DIR=/etc/cron.d
-GLOBUS_TCP_PORT_RANGE="20000,25000"
-MYSQL_PASSWORD=set_this_to_a_good_password
-
-
-#
-# default values of basic options
-#
-
-#GLITE_LOCATION=${INSTALL_ROOT:-opt}/glite
-#GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
-#GLITE_USER=${GLITE_USER:-glite}
-#GLITE_HOST_CERT=${GLITE_USER_HOME:-/home/glite}/.certs/hostcert.pem
-#GLITE_HOST_KEY=${GLITE_USER_HOME:-/home/glite}/.certs/hostkey.pem
-#X509_CERT_DIR=/etc/grid-security/certificates
-
-
-#
-# required external options
-#
-
-#GLOBUS_LOCATION=/opt/globus
-
-
-#
-# JPIS configuration default values
-#
-
-# pidfile
-#GLITE_JPIS_PIDFILE=$GLITE_LOCATION_VAR/glite-jp-indexd.pid
-
-# logfile
-#GLITE_JPIS_LOGFILE=$GLITE_LOCATION_VAR/glite-jp-indexd.log
-
-# configuration file
-#
-# Before launching YAIM you should configure there:
-# - feeds (data streams) - contains primary storage and filter
-# - attribute set
-# - indices set
-#
-#GLITE_JPIS_CONFIG=$GLITE_LOCATION/etc/glite-jpis-config.xml
-
-# port
-#GLITE_JPIS_PORT=8902
-
-# connection string to database (USER/PASSWORD@HOST:DBNAME)
-# If the default is changed, the database has to be created manually !
-#GLITE_JPIS_DB=jpis/@localhost:jpis
-
-# used types of feeds
-#GLITE_JPIS_QT="both"
-
-# Index server returns only jobs owned by given user.
-# Use '-n' value to force indexd not to check authentization.
-#GLITE_JPIS_AUTH=""
-
-# Can have '-d' value to force indexd not to deamonize.
-# Never use it here.
-#GLITE_JPIS_DEBUG=""
+++ /dev/null
-#! /bin/sh
-
-#
-# startup script for JP index server
-#
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-[ -f $GLITE_LOCATION/etc/jpis.conf ] && . $GLITE_LOCATION/etc/jpis.conf
-[ -f $GLITE_LOCATION_VAR/etc/jpis.conf ] && . $GLITE_LOCATION_VAR/etc/jpis.conf
-
-[ -n "$GLITE_JPIS_PIDFILE" ] || export GLITE_JPIS_PIDFILE=$GLITE_LOCATION_VAR/glite-jp-indexd.pid
-[ -n "$GLITE_JPIS_LOGFILE" ] || export GLITE_JPIS_LOGFILE=$GLITE_LOCATION_VAR/glite-jp-indexd.log
-pidfile="$GLITE_JPIS_PIDFILE"
-
-test -n "$GLITE_JPIS_CONFIG" || GLITE_JPIS_CONFIG="$GLITE_LOCATION/etc/glite-jpis-config.xml"
-test -n "$GLITE_JPIS_PORT" || GLITE_JPIS_PORT=8902
-test -n "$GLITE_JPIS_DB" || GLITE_JPIS_DB=jpis/@localhost:jpis
-test -n "$GLITE_JPIS_QT" || GLITE_JPIS_QT="both"
-#GLITE_JPIS_AUTH can have '-n' value to force indexd not to check auth
-#GLITE_JPIS_DEBUG can have '-d' value to force indexd not to deamonize
-
-unset creds port
-
-start()
-{
- if test -z "$GLITE_USER" ;then
- echo 'Error: GLITE_USER is not set'
- echo FAILED
- return 1
- fi
- if test -z "$GLOBUS_LOCATION" ;then
- echo 'Error: GLOBUS_LOCATION is not set'
- echo FAILED
- return 1
- fi
- if [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] ;then
- creds="-c '$GLITE_HOST_CERT' -k '$GLITE_HOST_KEY'"
- X509_USER_CERT="$GLITE_HOST_CERT"
- X509_USER_KEY="$GLITE_HOST_KEY"
- fi
- if test -z "$creds"; then
- if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
- echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
- creds="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
- X509_USER_CERT=/etc/grid-security/hostcert.pem
- X509_USER_KEY=/etc/grid-security/hostkey.pem
- fi
- fi
-
-
- [ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
-
- if [ ! -d "`dirname $GLITE_JPIS_PIDFILE`" ]
- then
- echo "Directory `dirname $GLITE_JPIS_PIDFILE` does not exist!"
- exit 1
- fi
- if [ ! -d "`dirname $GLITE_JPIS_LOGFILE`" ]
- then
- echo "Directory `dirname $GLITE_JPIS_LOGFILE` does not exist!"
- exit 1
- fi
-
-
- echo -n Starting glite-jp-indexd ...
- #su " $GLITE_LOCATION/bin/glite-jp-indexd \
- su - $GLITE_USER -c " $GLITE_LOCATION/bin/glite-jp-indexd \
- $GLITE_JPIS_DEBUG \
- -q $GLITE_JPIS_QT $creds $GLITE_JPIS_AUTH \
- -m $GLITE_JPIS_DB -p $GLITE_JPIS_PORT \
- -i $GLITE_JPIS_PIDFILE -o $GLITE_JPIS_LOGFILE \
- -x $GLITE_JPIS_CONFIG
- " && echo " done" || echo " FAILED"
-}
-
-stop()
-{
- if [ -f $pidfile ]; then
- pid=`cat $pidfile`
- kill $pid
- echo -n Stopping glite-jp-indexd \($pid\) ...
- try=0
- while ps p $pid >/dev/null 2>&1; do
- sleep 1;
- try=`expr $try + 1`
- if [ $try = 20 ]; then
- echo " giving up after $try retries"
- return 1
- fi
- done
- echo " done"
- rm -f $pidfile
- else
- echo $pidfile does not exist - glite-jp-indexd not running? >&2
- return 1
- fi
-
- return 0
-}
-
-status()
-{
-# if [ -f $pidfile ]; then
-# pid=`cat $pidfile`
-# if ps p $pid >/dev/null 2>&1; then
-# echo glite-jp-indexd running as $pid
-# return 0
-# fi
-# fi
-
- retval=0
- if netstat -an --inet | grep "^tcp .* 0.0.0.0:${GLITE_JPIS_PORT} .*LISTEN" >/dev/null 2>&1 ;then
- echo glite-jp-indexd running
- else
- echo glite-jp-indexd not running
- retval=1
- fi
-
- return $retval
-}
-
-case x$1 in
- xstart) start;;
- xstop) stop;;
- xrestart) stop; start;;
- xstatus) status;;
- x*) echo usage: $0 start,stop,restart,status >&2
- exit 1;;
-esac
+++ /dev/null
-Job Provenance Index Server README
-==================================
-
-JPIS is ...
-
-For comprehensive documentation about JP see org.glite.jp.doc.
-
-Source code, executables, dependences
--------------------------------------
-
-JP-IS CVS module name is org.glite.jp.index. It depends on common JP libraries
-(module org.glite.jp.common, org.glite.jp.server-common) and implements
-interfaces defined in org.glite.jp.ws-interface. It is also based on
-org.glite.lb.server-bones.
-
-JP-IS consist from one stand-alone daemon (glite-jp-indexd) which is
-using MySQL database. Default db name is jpis, all access is granted to
-user jpis.
-
-JP-IS interactions:
-
-- JP primary storage - feedings data from primary storage to the IS according
- to particular IS instance administrator needs (expressed by IS configuration)
-
-- IS user query interface - implements IS service for end users
-
-- admin interface - intended for admin tools (management and
- on-the-fly configuration changes)
-
-
-Release notes
--------------
-
-- In this release configuration of JP-IS is rather limited. Parts of
- configuration are hard-coded (src/conf.c)
-
-- Debug outputs are on and directed to /opt/glite/var/log/glite-jp-index.log
- file.
-
-- No admin tools are implemented yet.
-
+++ /dev/null
-<?xml version="1.0"?>
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-targetNamespace="http://www.w3schools.com"
-xmlns="http://www.w3schools.com"
-elementFormDefault="qualified">
-
-
-<!-- Simple types -->
-<xs:element name="attr" type="xs:string"/>
-<xs:element name="string" type="xs:string"/>
-<xs:element name="blob" type="xs:base64Binary"/>
-
-
-<!-- Enumeration types -->
-<xs:element name="orig">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:enumeration value="SYSTEM"/>
- <xs:enumeration value="USER"/>
- </xs:restriction>
- </xs:simpleType>
-</xs:element>
-
-<xs:element name="op">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:enumeration value="EQUAL"/>
- <xs:enumeration value="UNEQUAL"/>
- <xs:enumeration value="LESS"/>
- <xs:enumeration value="GREATER"/>
- <xs:enumeration value="WITHIN"/>
- <xs:enumeration value="EXISTS"/>
- </xs:restriction>
- </xs:simpleType>
-</xs:element>
-
-
-<!-- Complex types -->
-<xs:element name="attrs">
- <xs:complexType>
- <xs:sequence>
- <xs:element ref="attr" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="value">
- <xs:complexType>
- <xs:choice>
- <xs:element ref="string" minOccurs="1" maxOccurs="1"/>
- <xs:element ref="blob" minOccurs="1" maxOccurs="1"/>
- </xs:choice>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="record">
- <xs:complexType mixed="true">
- <xs:sequence>
- <xs:element ref="op" minOccurs="1" maxOccurs="1"/>
- <xs:element ref="value" minOccurs="0" maxOccurs="2"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="query">
- <xs:complexType mixed="true">
- <xs:sequence>
- <xs:element ref="attr" minOccurs="1" maxOccurs="1"/>
- <xs:element ref="orig" minOccurs="0" maxOccurs="1"/>
- <xs:element ref="record" minOccurs="1" maxOccurs="1"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="jpis_client_config">
- <xs:complexType mixed="true">
- <xs:sequence>
- <xs:element ref="query" minOccurs="1" maxOccurs="1"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-</xs:schema>
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
-
-<refentry id='glitejpindexd'>
-
- <refmeta>
- <refentrytitle>glite-jp-indexd</refentrytitle>
- <manvolnum>8</manvolnum>
- <refmiscinfo>EU EGEE Project</refmiscinfo>
- </refmeta>
-
- <refnamediv id='name'>
- <refname>glite-jp-indexd</refname>
- <refpurpose>daemon providing subset of data from Job Provenance</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv id='synopsis'>
- <cmdsynopsis>
- <command>glite-jp-indexd</command>
-
- <arg><group choice='plain'>
- <arg>-h</arg>
- <arg>--help</arg>
- </group></arg>
-
- <arg>-d</arg>
-
- <arg><group choice='plain'>
- <arg>-q</arg>
- <arg>--query-type</arg>
- </group><group choice='plain'>
- <arg>hist</arg>
- <arg>cont</arg>
- <arg>both</arg>
- </group></arg>
-
- <arg><group choice='plain'>
- <arg>-k</arg>
- <arg>--key</arg>
- </group></arg>
-
- <arg><group choice='plain'>
- <arg>-c</arg>
- <arg>--cert</arg>
- </group></arg>
-
-<!-- <arg><group choice='plain'>
- <arg>-C</arg>
- <arg>CAdir</arg>
- </group></arg>
-
- <arg><group choice='plain'>
- <arg>-V</arg>
- <arg>VOMSdir</arg>
- </group></arg>-->
-
- <arg><group choice='plain'>
- <arg>-n</arg>
- <arg>--no-auth</arg>
- </group></arg>
-
- <arg><group choice='plain'>
- <arg>-m</arg>
- <arg>--mysql</arg>
- </group> <replaceable>USER/PASSWORD@HOST:DBNAME</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-p</arg>
- <arg>--port</arg>
- </group> <replaceable>PORT</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-i</arg>
- <arg>--pidfile</arg>
- </group> <replaceable>FILE.PID</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-o</arg>
- <arg>--logfile</arg>
- </group> <replaceable>FILE.LOG</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-x</arg>
- <arg>--config</arg>
- </group> <replaceable>CONFIG.XML</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-s</arg>
- <arg>--slaves</arg>
- </group> <replaceable>N</replaceable> </arg>
-
- <arg><group choice='plain'>
- <arg>-D</arg>
- <arg>--delete-db</arg>
- </group></arg>
-
- <arg><group choice='plain'>
- <arg>-f</arg>
- <arg>--feeding</arg>
- </group> <replaceable>FILE</replaceable> </arg>
-
- <arg><group choice='plain'>
- <arg>-F</arg>
- <arg>--force-feed</arg>
- </group></arg>
-
- </cmdsynopsis>
- </refsynopsisdiv>
-
- <refsect1>
- <title>DESCRIPTION</title>
- <para>
-<command>glite-jp-index</command> is stand-alone daemon which is using MySQL database. It provides subset of attributes and jobs from Job Provenance.
- </para>
- </refsect1>
-
- <refsect1>
- <title>OPTIONS</title>
-
- <para>
-With no options you get simple usage message as with <option>-h</option>.
- </para>
-
- <variablelist>
- <varlistentry>
- <term><option>-d</option>|<option>--debug</option></term>
- <listitem><para>
-Don't run as daemon, additional diagnostics.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-q</option>|<option>--query-type</option></term>
- <listitem><para>
-Type of query: <option>hist</option>, <option>cont</option> or <option>both</option> (default: <option>history</option>).
- </para>
- <variablelist>
- <varlistentry>
- <term>hist</term>
- <listitem><para>history query</para></listitem>
- </varlistentry>
- <varlistentry>
- <term>cont</term>
- <listitem><para>continuous query</para></listitem>
- </varlistentry>
- <varlistentry>
- <term>both</term>
- <listitem><para>combination of previous types</para></listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-k</option>|<option>--key</option></term>
- <listitem><para>
-Private key file.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-c</option>|<option>--cert</option></term>
- <listitem><para>
-Certification file.
- </para></listitem>
- </varlistentry>
-
-<!-- <varlistentry>
- <term><option>-C</option>|<option>CAdir</option></term>
- <listitem><para>
-Trusted certificates directory.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-V</option>|<option>VOMSdir</option></term>
- <listitem><para>
-Trusted VOMS servers certificates directory.
- </para></listitem>
- </varlistentry>-->
-
- <varlistentry>
- <term><option>-n</option>|<option>--no-auth</option></term>
- <listitem><para>
-Don't check user identity with result owner.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-m</option>|<option>--mysql</option></term>
- <listitem><para>
-Database connect string: <replaceable>USER/PASSWORD@HOST:DBNAME</replaceable> (default: <option>jpis/@localhost:jpis</option>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-p</option>|<option>--port</option></term>
- <listitem><para>
-Port to listen (default: <option>8902</option>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-i</option>|<option>--pidfile</option></term>
- <listitem><para>
-File to store master pid (default: <filename>/var/run/glite-jp-indexd.pid</filename> or <filename>$HOME/glite-jp-indexd.pid</filename>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-o</option>|<option>--logfile</option></term>
- <listitem><para>
-File to store logs (default: <filename>/var/run/glite-jp-indexd.log</filename> or <filename>$HOME/glite-jp-indexd.log</filename>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-x</option>|<option>--config</option></term>
- <listitem><para>
-Configuration file containing information about feeds, primary storages, ... Structure is defined in <filename>server_conf.xsd</filename> (default: <filename>$GLITE_LOCATION/etc/glite-jpis-config.xml</filename>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-s</option>|<option>--slaves</option></term>
- <listitem><para>
-Number of slave processes for responses (default: number of feeds, max. 20).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-D</option>|<option>--delete-db</option></term>
- <listitem><para>
-Delete and refetch the data in the database. You need use this parameter when feeds from primary storage are already expired.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-f</option>|<option>--feeding</option></term>
- <listitem><para>
-Feed the index server from the local file. Format of the file is job per line with attribute values using ";" separator. Attributes go in order according to server configuration file (possible attributes with jobid and owner in configuration file are ignored).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-F</option>|<option>--force-feed</option></term>
- <listitem><para>
-By default old feeds in the database are untouched when JP index server is restarted, and further used and refreshed. This option forces dropping and reloading feeds from the configuration file.
- </para></listitem>
- </varlistentry>
-
- </variablelist>
-
- </refsect1>
-
- <refsect1>
- <title>Starting the daemon</title>
- <para>
-Preferred way of starting the daemon is using start-up script (<filename>config/startup</filename>). It loads <filename>glite.conf</filename> file (personal version may be stored in <filename>~/.glite.conf</filename>) where many variables may be set to configure the daemon. The script takes following variables:
- </para>
-
- <variablelist>
- <varlistentry>
- <term>GLITE_JPIS_CONFIG</term>
- <listitem><para>
-Specifying config file. Default is <filename>$GLITE_LOCATION/etc/glite-jpis-config.xml</filename>
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>GLITE_JPIS_DEBUG</term>
- <listitem><para>
-Setting to '-d' forces the daemon not to daemonize.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>GLITE_JPIS_QT</term>
- <listitem><para>
-Defines query type (see <option>-q</option> parameter).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>GLITE_JPIS_AUTH</term>
- <listitem><para>
-Setting to '-n' forces the daemon not to check authorisation.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>GLITE_JPIS_PORT</term>
- <listitem><para>
-Used port (default is 8902).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>GLITE_JPIS_DB</term>
- <listitem><para>
-Database connection string, see <option>-m</option> parameter.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>GLITE_JPIS_LOGFILE</term>
- <listitem><para>
-Log file (default in startup script is <filename>$GLITE_LOCATION_VAR/log/glite-jp-indexd.log</filename>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>GLITE_JPIS_PIDFILE</term>
- <listitem><para>
-Pid file (default is in startup script is <filename>$GLITE_LOCATION_VAR/run/glite-jp-indexd.pid</filename>).
- </para></listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
-
- <refsect1>
- <title>RETURN VALUE</title>
- <variablelist>
- <varlistentry>
- <term>0</term>
- <listitem><para>Success start.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>1</term>
- <listitem><para>
-Error (database or network initialisation for example).
- </para></listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
-
- <refsect1>
- <title>EXAMPLES</title>
- <variablelist>
- <varlistentry>
- <term>configure file for startup script</term>
- <listitem><programlisting>GLITE_LOCATION_VAR=/opt/glite/var
-GLITE_JPIS_DB=jpis/@localhost:jpis
-GLITE_JPIS_PORT=8902
-GLITE_JPIS_LOGFILE=$GLITE_LOCATION_VAR/run/glite-jp-indexd.log
-GLITE_JPIS_PIDFILE=$GLITE_LOCATION_VAR/run/glite-jp-indexd.pid
-GLITE_JPIS_DEBUG=0
-GLITE_JPIS_PS=JPPS:8901
-GLITE_JPIS_QT=cont
-</programlisting></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>glite-jp-indexd -x /opt/glite/etc/glite-jpis-config-custom.xml -i $HOME/jpis.log -o $HOME/jpis.pid</command></term>
- <listitem><para>
-Manual run of the JP index server. Use local MySQL database, feeds from job provenances and attributes configured in <filename>/opt/glite/etc/glite-jpis-config-custom.xml</filename>, listen on default port, store logs and pid to given files.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
-
- <refsect1>
- <title>SEE ALSO</title>
- <para>glite-jpis-client(1)</para>
- </refsect1>
-
- <refsect1>
- <title>AUTHOR</title>
- <para>EU DataGrid Work Package 1, CESNET group.</para>
- </refsect1>
-
-</refentry>
+++ /dev/null
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
-
-<refentry id='glitejpisclient'>
-
- <refmeta>
- <refentrytitle>glite-jpis-client</refentrytitle>
- <manvolnum>1</manvolnum>
- <refmiscinfo>EU EGEE Project</refmiscinfo>
- </refmeta>
-
- <refnamediv id='name'>
- <refname>glite-jpis-client</refname>
- <refpurpose>client interface for JP IS</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv id='synopsis'>
- <cmdsynopsis>
- <command>glite-jpis-client</command>
-
- <arg><group choice='plain'>
- <arg>-h</arg>
- <arg>--help</arg>
- </group></arg>
-
- <arg><group choice='plain'>
- <arg>-i</arg>
- <arg>--index-server</arg>
- </group> <replaceable>JPIS:PORT</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-q</arg>
- <arg>--query-file</arg>
- </group> <replaceable>IN_FILE.XML</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-t</arg>
- <arg>--test-file</arg>
- </group> <replaceable>IN_FILE.XML</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-e</arg>
- <arg>--example-file</arg>
- </group> <replaceable>OUT_FILE.XML</replaceable></arg>
-
- <arg><group choice='plain'>
- <arg>-f</arg>
- <arg>--format</arg>
- </group> <group choice='req'>
- <arg>xml</arg>
- <arg>human</arg>
- </group></arg>
-
- </cmdsynopsis>
- </refsynopsisdiv>
-
- <refsect1>
- <title>DESCRIPTION</title>
- <para>
-<command>glite-jpis-client</command> is command line interface for querying
-the Job Provenance Index Server. It takes the XML input, process the QueryJobs
-operation and returns the result in specified format.
- </para>
- </refsect1>
-
- <refsect1>
- <title>OPTIONS</title>
-
- <para>
-With no options you get simple usage message as with <option>-h</option>.
- </para>
-
- <variablelist>
- <varlistentry>
- <term><option>-h</option>|<option>--help</option></term>
- <listitem><para>
-Displays usage message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-i</option>|<option>--index-server</option></term>
- <listitem><para>
-Specifies Job Provenance Index Server as <replaceable>HOST:PORT</replaceable>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-q</option>|<option>--query-file</option></term>
- <listitem><para>
-Process the QueryJobs operation. Requires input data in file
-<replaceable>IN_FILE.XML</replaceable>, for using stdin specify
-<option>-</option>.
- </para><para>
-The input and output data are in XML format with XSD schema, which can be found
-in <filename>JobProvenanceISClient.xsd</filename> (element QueryJobs for input
-and QueryJobsResponse for output).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-t</option>|<option>--test-file</option></term>
- <listitem><para>
-Test the input data from <replaceable>IN_FILE.XML</replaceable> (or from stdin
-if <option>-</option> is specified) and prints the found content.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-e</option>|<option>--example-file</option></term>
- <listitem><para>
-Write the example input data to file <replaceable>OUT_FILE.XML</replaceable>
-(or to stdout if <option>-</option> is specified). The XML is valid against XSD
-schema in <filename>JobProvananceISClient.xsd</filename>, formating may vary
-according to used gsoap version.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-f</option>|<option>--format</option></term>
- <listitem><para>
-Use <replaceable>FORMAT</replaceable> as output format type. You can specify
-<option>xml</option> for interchangeable XML output or <option>human</option>
-for nice looking human readable output.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
-
- <refsect1>
- <title>RETURN VALUE</title>
- <variablelist>
- <varlistentry>
- <term>0</term>
- <listitem><para>Success.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-1</term>
- <listitem><para>Communication error or error from the remote server.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>EINVAL</term>
- <listitem><para>In most cases XML parsing error.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>other error</term>
- <listitem><para>Other error from errno.</para></listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
-
- <refsect1>
- <title>EXAMPLES</title>
- <variablelist>
- <varlistentry>
- <term><command>glite-jpis-client --example-file query.xml</command></term>
- <listitem><para>
-Save the example query parameters to file <filename>query.xml</filename>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>glite-jpis-client --query-file query.xml</command></term>
- <listitem><para>
-Queries the local index server running on default port with the query
-parameters specified in the file <filename>query.xml</filename>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>glite-jpis-client -i localhost:8902 -q - -f human</command></term>
- <listitem><para>
-Queries the index server running on local host on the port 8902 with the query
-parameters from stdin and show results in non-XML form.
- </para></listitem>
- </varlistentry>
- </variablelist>
- <para></para>
- </refsect1>
-
- <refsect1>
- <title>SEE ALSO</title>
- <para>glite-jp-indexd(8)</para>
- </refsect1>
-
- <refsect1>
- <title>AUTHOR</title>
- <para>EU DataGrid Work Package 1, CESNET group.</para>
- </refsect1>
-
-</refentry>
+++ /dev/null
-<?xml version="1.0"?>
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-targetNamespace="http://www.w3schools.com"
-xmlns="http://www.w3schools.com"
-elementFormDefault="qualified">
-
-
-<!-- Simple types -->
-<xs:element name="attr" type="xs:string"/>
-<xs:element name="name" type="xs:string"/>
-<xs:element name="string" type="xs:string"/>
-<xs:element name="blob" type="xs:base64Binary"/>
-
-
-<!-- Enumeration types -->
-<xs:element name="orig">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:enumeration value="SYSTEM"/>
- <xs:enumeration value="USER"/>
- <xs:enumeration value="USER"/>
- </xs:restriction>
- </xs:simpleType>
-</xs:element>
-
-<xs:element name="op">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:enumeration value="EQUAL"/>
- <xs:enumeration value="UNEQUAL"/>
- <xs:enumeration value="LESS"/>
- <xs:enumeration value="GREATER"/>
- <xs:enumeration value="WITHIN"/>
- <xs:enumeration value="EXISTS"/>
- </xs:restriction>
- </xs:simpleType>
-</xs:element>
-
-
-<!-- Complex types -->
-<xs:element name="plugins">
- <xs:complexType>
- <xs:sequence>
- <xs:element ref="name" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="indexed_attrs">
- <xs:complexType>
- <xs:sequence>
- <xs:element ref="attr" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="attrs">
- <xs:complexType>
- <xs:sequence>
- <xs:element ref="attr" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="value">
- <xs:complexType>
- <xs:choice>
- <xs:element ref="string" minOccurs="1" maxOccurs="1"/>
- <xs:element ref="blob" minOccurs="1" maxOccurs="1"/>
- </xs:choice>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="query">
- <xs:complexType mixed="true">
- <xs:sequence>
- <xs:element ref="attr" minOccurs="1" maxOccurs="1"/>
- <xs:element ref="op" minOccurs="1" maxOccurs="1"/>
- <xs:element ref="orig" minOccurs="0" maxOccurs="1"/>
- <xs:element ref="value" minOccurs="0" maxOccurs="2"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-<xs:element name="jpis_client_config">
- <xs:complexType mixed="true">
- <xs:sequence>
- <xs:element ref="plugins" minOccurs="0" maxOccurs="1"/>
- <xs:element ref="indexed_attrs" minOccurs="0" maxOccurs="1"/>
- <xs:element ref="attrs" minOccurs="0" maxOccurs="1"/>
- <xs:element ref="query" minOccurs="1" maxOccurs="1"/>
- </xs:sequence>
- </xs:complexType>
-</xs:element>
-
-</xs:schema>
+++ /dev/null
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <time.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <stdlib.h>
-
-#include "soap_version.h"
-
-#include <stdsoap2.h>
-#include <glite/security/glite_gsplugin.h>
-#include <glite/security/glite_gscompat.h>
-
-#include "jp_.nsmap"
-#include "common.h"
-#define dprintf(FMT, ARGS...) fprintf(stderr, FMT, ##ARGS);
-#include <glite/jp/ws_fault.c>
-
-
-#define DEFAULT_JPIS "http://localhost:8902"
-#define USE_GMT 1
-
-
-static struct option opts[] = {
- {"index-server",required_argument, NULL, 'i'},
- {"example-file",required_argument, NULL, 'e'},
- {"query-file", required_argument, NULL, 'q'},
- {"test-file", required_argument, NULL, 't'},
- {"format", required_argument, NULL, 'f'},
- {NULL, 0, NULL, 0}
-};
-static const char *get_opt_string = "i:q:e:t:f:";
-
-#define NUMBER_OP 6
-struct {
- enum jptype__queryOp op;
- const char *name;
-} operations[] = {
- {jptype__queryOp__EQUAL, "=="},
- {jptype__queryOp__UNEQUAL, "<>"},
- {jptype__queryOp__LESS, "<"},
- {jptype__queryOp__GREATER, ">"},
- {jptype__queryOp__WITHIN, "WITHIN"},
- {jptype__queryOp__EXISTS, "EXISTS"},
- {0, "unknown"}
-};
-
-#define NUMBER_ORIG 3
-struct {
- enum jptype__attrOrig orig;
- const char *name;
-} origins[] = {
- {jptype__attrOrig__SYSTEM, "SYSTEM"},
- {jptype__attrOrig__USER, "USER"},
- {jptype__attrOrig__FILE_, "FILE"},
- {0, "unknown"}
-};
-
-typedef enum {FORMAT_XML, FORMAT_STRIPPEDXML, FORMAT_HR} format_t;
-
-
-/*
- * set the value
- */
-static void value_set(struct soap *soap, struct jptype__stringOrBlob **value, const char *str) {
- *value = soap_malloc(soap, sizeof(**value));
- memset(*value, 0, sizeof(*value));
- GSOAP_SETSTRING(*value, soap_strdup(soap, str));
-}
-
-
-/*
- * print the query data in the soap structre
- */
-static void value_print(FILE *out, const struct jptype__stringOrBlob *value) {
- int i, size, maxsize;
- unsigned char *ptr;
-
- if (value) {
- if (GSOAP_ISSTRING(value)) fprintf(out, "%s", GSOAP_STRING(value));
- else if (GSOAP_ISBLOB(value)) {
- fprintf(out, "BLOB(");
- ptr = GSOAP_BLOB(value)->__ptr;
- size = GSOAP_BLOB(value)->__size;
-
- maxsize = 10;
- if (ptr) {
- maxsize = size < 10 ? size : 10;
- for (i = 0; i < maxsize; i++) fprintf(out, "%02X ", ptr[i]);
- if (maxsize < size) fprintf(out, "...");
- } else fprintf(out, "NULL");
- fprintf(out, ")");
- }
- } else {
- fprintf(out, "-");
- }
-}
-
-
-/*
- * fill the query soap structure with some example data
- */
-static void query_example_fill(struct soap *soap, struct _jpelem__QueryJobs *in) {
- struct jptype__indexQuery *cond;
- struct jptype__indexQueryRecord *rec;
-
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, in, conditions, struct jptype__indexQuery, 2);
-
- // query status
- cond = GLITE_SECURITY_GSOAP_LIST_GET(in->conditions, 0);
- memset(cond, 0, sizeof(*cond));
- cond->attr = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus");
- cond->origin = soap_malloc(soap, sizeof(*(cond->origin)));
- *(cond->origin) = jptype__attrOrig__SYSTEM;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, cond, record, struct jptype__indexQueryRecord, 2);
-
- // equal to Done
- rec = GLITE_SECURITY_GSOAP_LIST_GET(cond->record, 0);
- memset(rec, 0, sizeof(*rec));
- rec->op = jptype__queryOp__EQUAL;
- value_set(soap, &rec->value, "Done");
-
- // OR equal to Ready
- rec = GLITE_SECURITY_GSOAP_LIST_GET(cond->record, 1);
- memset(rec, 0, sizeof(*rec));
- rec->op = jptype__queryOp__EQUAL;
- value_set(soap, &rec->value, "Ready");
-
-
- // AND
- // owner
- cond = GLITE_SECURITY_GSOAP_LIST_GET(in->conditions, 1);
- memset(cond, 0, sizeof(*cond));
- cond->attr = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:user");
- cond->origin = NULL;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, cond, record, struct jptype__indexQueryRecord, 1);
-
- // not equal to CertSubj
- rec = GLITE_SECURITY_GSOAP_LIST_GET(cond->record, 0);
- memset(rec, 0, sizeof(*rec));
- rec->op = jptype__queryOp__UNEQUAL;
- value_set(soap, &rec->value, "God");
-
-
- in->__sizeattributes = 4;
- in->attributes = soap_malloc(soap,
- in->__sizeattributes *
- sizeof(*(in->attributes)));
- in->attributes[0] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/JP/System:owner");
- in->attributes[1] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/JP/System:jobId");
- in->attributes[2] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus");
- in->attributes[3] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:user");
-
-}
-
-
-/*
- * read the XML query
- */
-static int query_recv(struct soap *soap, int fd, struct _jpelem__QueryJobs *qj) {
- int i;
-
- memset(qj, 0, sizeof(*qj));
-
- soap->recvfd = fd;
- soap_begin_recv(soap);
- soap_default__jpelem__QueryJobs(soap, qj);
- if (!soap_get__jpelem__QueryJobs(soap, qj, "jpelem:QueryJobs", NULL)) {
- soap_end_recv(soap);
- soap_end(soap);
- return EINVAL;
- }
- soap_end_recv(soap);
-
- /* strip white-space characters from attributes */
- for (i = 0; i < qj->__sizeattributes; i++)
- glite_jpis_trim(qj->attributes[i]);
- for (i = 0; i < qj->__sizeconditions; i++)
- glite_jpis_trim(GLITE_SECURITY_GSOAP_LIST_GET(qj->conditions, i)->attr);
-
- return 0;
-}
-
-
-/*
- * print info from the query soap structure
- */
-static void query_print(FILE *out, const struct _jpelem__QueryJobs *in) {
- struct jptype__indexQuery *cond;
- struct jptype__indexQueryRecord *rec;
- int i, j, k;
-
- fprintf(out, "Conditions:\n");
- for (i = 0; i < in->__sizeconditions; i++) {
- cond = GLITE_SECURITY_GSOAP_LIST_GET(in->conditions, i);
- fprintf(out, "\t%s\n", cond->attr);
- if (cond->origin) {
- for (k = 0; k <= NUMBER_ORIG; k++)
- if (origins[k].orig == *(cond->origin)) break;
- fprintf(out, "\t\torigin == %s\n", origins[k].name);
- } else {
- fprintf(out, "\t\torigin IS ANY\n");
- }
- for (j = 0; j < cond->__sizerecord; j++) {
- rec = GLITE_SECURITY_GSOAP_LIST_GET(cond->record, j);
- for (k = 0; k <= NUMBER_OP; k++)
- if (operations[k].op == rec->op) break;
- fprintf(out, "\t\tvalue %s", operations[k].name);
- if (rec->value) {
- fprintf(out, " ");
- value_print(out, rec->value);
- }
- if (rec->value2) {
- if (!rec->value) fprintf(out, "-");
- fprintf(out, " AND ");
- value_print(out, rec->value2);
- }
- fprintf(out, "\n");
- }
- }
- fprintf(out, "Attributes:\n");
- for (i = 0; i < in->__sizeattributes; i++)
- fprintf(out, "\t%s\n", in->attributes[i]);
-}
-
-
-/*
- * dump the XML query
- */
-static int query_dump(struct soap *soap, int fd, struct _jpelem__QueryJobs *qj) {
- int retval;
-
- soap->sendfd = fd;
- soap_begin_send(soap);
- soap_serialize__jpelem__QueryJobs(soap, qj);
- retval = soap_put__jpelem__QueryJobs(soap, qj, "jpelem:QueryJobs", NULL);
- soap_end_send(soap);
- write(fd, "\n", strlen("\n"));
-
- return retval;
-}
-
-
-static int query_format(struct soap *soap, format_t format, FILE *f, struct _jpelem__QueryJobs *qj) {
- switch (format) {
- case FORMAT_XML:
- case FORMAT_STRIPPEDXML:
- return query_dump(soap, fileno(f), qj);
- case FORMAT_HR: query_print(f, qj); return 0;
- default: return EINVAL;
- }
-}
-
-
-/*
- * dump the XML query with the example data
- */
-static int query_example_dump(struct soap *soap, int fd) {
- struct _jpelem__QueryJobs qj;
- int retval;
-
- memset(&qj, 0, sizeof(qj));
-
- soap_begin(soap);
- query_example_fill(soap, &qj);
- retval = query_dump(soap, fd, &qj);
- soap_end(soap);
-
- return retval;
-}
-
-
-/*
- * dump the data returned from JP IS
- */
-static int queryresult_dump(struct soap *soap, int fd, const struct _jpelem__QueryJobsResponse *qjr) {
- int retval;
-
- soap->sendfd = fd;
- soap_begin_send(soap);
- soap_serialize__jpelem__QueryJobsResponse(soap, qjr);
- retval = soap_put__jpelem__QueryJobsResponse(soap, qjr, "QueryJobsResponse", NULL);
- soap_end_send(soap);
- write(fd, "\n", strlen("\n"));
-
- return retval;
-}
-
-
-/*
- * print the data returned from JP IS
- */
-static void queryresult_print(FILE *out, const struct _jpelem__QueryJobsResponse *in) {
- struct jptype__jobRecord *job;
- struct jptype__attrValue *attr;
- int i, j, k;
-
-#if USE_GMT
- setenv("TZ","UTC",1); tzset();
-#endif
- fprintf(out, "Result %d jobs:\n", in->__sizejobs);
- for (j=0; j<in->__sizejobs; j++) {
- job = GLITE_SECURITY_GSOAP_LIST_GET(in->jobs, j);
- fprintf(out, "\tjobid = %s, owner = %s\n", job->jobid, job->owner);
- for (i=0; i<job->__sizeattributes; i++) {
- attr = GLITE_SECURITY_GSOAP_LIST_GET(job->attributes, i);
- fprintf(out, "\t\t%s\n", attr->name);
- fprintf(out, "\t\t\tvalue = ");
- value_print(out, attr->value);
- fprintf(out, "\n");
-
- for (k = 0; k <= NUMBER_ORIG; k++)
- if (origins[k].orig == attr->origin) break;
- fprintf(out, "\t\t\torigin = %s", origins[k].name);
- if (attr->originDetail) fprintf(out, ", %s\n", attr->originDetail);
- else fprintf(out, " (no detail)\n");
- if (attr->timestamp != (time_t)0)
- fprintf(out, "\t\t\ttime = %s", ctime(&attr->timestamp));
- }
- }
-}
-
-
-static int queryresult_format(struct soap *soap, format_t format, FILE *f, const struct _jpelem__QueryJobsResponse *qj) {
- switch (format) {
- case FORMAT_XML:
- case FORMAT_STRIPPEDXML:
- return queryresult_dump(soap, fileno(f), qj);
- case FORMAT_HR: queryresult_print(f, qj); return 0;
- default: return EINVAL;
- }
-}
-
-
-/*
- * help screen
- */
-static void usage(const char *prog_name) {
- fprintf(stderr, "Usage: %s OPTIONS\n", prog_name);
- fprintf(stderr, "Options:\n");
- fprintf(stderr, " -h|--help\n");
- fprintf(stderr, " -i|--index-server JPIS:PORT (default: " DEFAULT_JPIS ")\n");
- fprintf(stderr, " -q|--query-file IN_FILE.XML\n");
- fprintf(stderr, " -t|--test-file IN_FILE.XML\n");
- fprintf(stderr, " -e|--example-file OUT_FILE.XML\n");
- fprintf(stderr, " -f|--format xml | strippedxml | human\n");
-}
-
-
-/*
- * process the result after calling soap
- */
-#define check_fault(SOAP, ERR) glite_jp_clientCheckFault((SOAP), (ERR), NULL, 0)
-
-
-int main(int argc, char * const argv[]) {
- struct soap soap, soap_comm;
- struct _jpelem__QueryJobs qj;
- char *server, *example_file, *query_file, *test_file;
- const char *prog_name;
- int retval, opt, example_fd, query_fd, test_fd;
- format_t format = FORMAT_XML;
-
- prog_name = server = NULL;
- example_file = query_file = test_file = NULL;
- query_fd = example_fd = test_fd = -1;
- retval = 1;
-
- soap_init(&soap);
- soap_set_namespaces(&soap, jp__namespaces);
-
- /*
- * Soap with registered plugin can't be used for reading XML.
- * For communications with JP IS glite_gsplugin needs to be registered yet.
- */
- soap_init(&soap_comm);
- soap_set_namespaces(&soap_comm, jp__namespaces);
- soap_register_plugin(&soap_comm, glite_gsplugin);
-
- /* program name */
- prog_name = strrchr(argv[0], '/');
- if (prog_name) prog_name++;
- else prog_name = argv[0];
-
- if (argc <= 1) {
- usage(prog_name);
- goto cleanup;
- }
-
- /* handle arguments */
- while ((opt = getopt_long(argc, argv, get_opt_string, opts, NULL)) != EOF) switch (opt) {
- case 'i':
- free(server);
- server = strdup(optarg);
- break;
- case 'e':
- free(example_file);
- example_file = strdup(optarg);
- break;
- case 'q':
- free(query_file);
- query_file = strdup(optarg);
- break;
- case 't':
- free(test_file);
- test_file = strdup(optarg);
- break;
- case 'f':
- if (strcasecmp(optarg, "xml") == 0) format = FORMAT_XML;
- else if (strcasecmp(optarg, "strippedxml") == 0) format = FORMAT_STRIPPEDXML;
- else format = FORMAT_HR;
- break;
- default:
- usage(prog_name);
- goto cleanup;
- }
- if (optind < argc) {
- usage(prog_name);
- goto cleanup;
- }
- if (!server) server = strdup(DEFAULT_JPIS);
-#ifdef SOAP_XML_INDENT
- if (format != FORMAT_STRIPPEDXML) soap_omode(&soap, SOAP_XML_INDENT);
-#endif
-
-
- /* prepare steps according to the arguments */
- if (query_file) {
- if (strcmp(query_file, "-") == 0) query_fd = STDIN_FILENO;
- else if ((query_fd = open(query_file, 0)) < 0) {
- fprintf(stderr, "error opening %s: %s\n", query_file, strerror(errno));
- goto cleanup;
- }
- free(query_file);
- query_file = NULL;
- }
- if (example_file) {
- if (strcmp(example_file, "-") == 0) example_fd = STDOUT_FILENO;
- else if ((example_fd = creat(example_file, S_IREAD | S_IWRITE | S_IRGRP)) < 0) {
- fprintf(stderr, "error creating %s: %s\n", example_file, strerror(errno));
- goto cleanup;
- }
- free(example_file);
- example_file = NULL;
- }
- if (test_file) {
- if (strcmp(test_file, "-") == 0) test_fd = STDIN_FILENO;
- else if ((test_fd = open(test_file, 0)) < 0) {
- fprintf(stderr, "error opening %s: %s\n", test_file, strerror(errno));
- goto cleanup;
- }
- free(test_file);
- test_file = NULL;
- }
-
- /* the dump action */
- if (example_fd >= 0) {
- if (query_example_dump(&soap, example_fd) != 0) {
- fprintf(stderr, "Error dumping example query XML.\n");
- }
- }
-
- /* the test XML file action */
- if (test_fd >= 0) {
- soap_begin(&soap);
- if (query_recv(&soap, test_fd, &qj) != 0) {
- fprintf(stderr, "test: Error getting query XML\n");
- } else {
- query_format(&soap, format, stdout, &qj);
- }
- soap_end(&soap);
- }
-
- /* query action */
- if (query_fd >= 0) {
- struct _jpelem__QueryJobs in;
- struct _jpelem__QueryJobsResponse out;
- int ret;
-
- soap_begin(&soap);
- memset(&in, 0, sizeof(in));
- memset(&out, 0, sizeof(out));
- /*
- * Right way would be copy data from client query structure to IS query
- * structure. Just ugly retype to client here.
- */
- if (query_recv(&soap, query_fd, (struct _jpelem__QueryJobs *)&in) != 0) {
- fprintf(stderr, "query: Error getting query XML\n");
- } else {
- fprintf(stderr, "query: using JPIS %s\n\n", server);
- query_print(stderr, &in);
- fprintf(stderr, "\n");
- soap_begin(&soap_comm);
- ret = check_fault(&soap_comm, soap_call___jpsrv__QueryJobs(&soap_comm, server, "", &in, &out));
- if (ret == 0) {
- queryresult_format(&soap, format, stdout, (struct _jpelem__QueryJobsResponse *)&out);
- } else {
- soap_end(&soap_comm);
- soap_end(&soap);
- goto cleanup;
- }
- soap_end(&soap_comm);
- }
- soap_end(&soap);
- }
-
- retval = 0;
-
-cleanup:
- soap_done(&soap);
- soap_done(&soap_comm);
- if (example_fd > STDERR_FILENO) close(example_fd);
- if (query_fd > STDERR_FILENO) close(query_fd);
- if (test_fd > STDERR_FILENO) close(test_fd);
- free(server);
- free(example_file);
- free(query_file);
- free(test_file);
-
- return retval;
-}
+++ /dev/null
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <time.h>
-
-#include <glite/jp/db.h>
-
-#include "db_ops.h"
-
-
-static void print_err(glite_jp_context_t ctx) {
- glite_jp_error_t *e;
-
- e = ctx->error;
- while(e) {
- printf("%s (%s)\n", e->desc, e->source);
- e = e->reason;
- }
- printf("\n");
-}
-
-
-int glite_jpis_db_queries_serialize(void **blob, size_t *len, glite_jp_query_rec_t **queries);
-int glite_jpis_db_queries_deserialize(glite_jp_query_rec_t ***queries, void *blob, size_t blob_size);
-
-int main(int argc, char *argv[]) {
-#if 1
- glite_jp_context_t jpctx;
- glite_jp_is_conf *conf;
- glite_jpis_context_t isctx;
- int ret;
- long int uniqueid;
- char *ps, *feedid;
-
- jpctx = NULL;
- isctx = NULL;
- conf = NULL;
- glite_jp_init_context(&jpctx);
- if (glite_jp_get_conf(argc, argv, NULL, &conf) != 0) goto fail;
- if (glite_jpis_init_context(&isctx, jpctx, conf) != 0) goto fail;
- if (glite_jpis_init_db(isctx) != 0) goto fail;
-
- printf("dropping...\n");
- if (glite_jpis_dropDatabase(isctx) != 0) goto faildb;
-
- printf("initializing...\n");
- if (glite_jpis_initDatabase(isctx) != 0) goto faildb;
-
- printf("locking...\n");
- do {
- if ((ret = glite_jpis_lockUninitializedFeed(isctx, &uniqueid, &ps)) == ENOLCK) goto faildb;
- if (ret == 0) {
- printf("locked: uniqueid=%li, ps=%s\n", uniqueid, ps);
- free(ps);
-
- asprintf(&feedid, "feed://%lu", uniqueid + 3);
- if (glite_jpis_initFeed(isctx, uniqueid, feedid, (time_t)10000) != 0) {
- free(feedid);
- goto faildb;
- }
- free(feedid);
-
- if (glite_jpis_unlockFeed(isctx, uniqueid) != 0) goto faildb;
- }
- } while (ret == 0);
-
- if (glite_jpis_tryReconnectFeed(isctx, uniqueid, time(NULL) + 10) != 0) goto faildb;
-
- glite_jpis_free_db(isctx);
- glite_jpis_free_context(isctx);
- glite_jp_free_conf(conf);
- glite_jp_free_context(jpctx);
-
- return 0;
-
-faildb:
- glite_jpis_free_db(isctx);
-fail:
- printf("failed\n");
- glite_jpis_free_context(isctx);
- glite_jp_free_conf(conf);
- if (jpctx) {
- print_err(jpctx);
- glite_jp_free_context(jpctx);
- }
-
- return 1;
-#endif
-#if 0
- glite_jp_context_t ctx;
- glite_jp_is_conf *conf;
- void *blob;
- size_t len;
- int ret, i;
- glite_jp_query_rec_t **queries;
-
- ret = 0;
- glite_jp_init_context(&ctx);
-
- if (glite_jp_get_conf(argc, argv, NULL, &conf) != 0) goto fail_ctx;
- if ((ret = glite_jpis_db_queries_serialize(&blob, &len, conf->feeds[0]->query)) != 0) goto fail;
-
- if (write(1, blob, len) != len) {
- ret = errno;
- free(blob);
- goto fail;
- }
-
- if ((ret = glite_jpis_db_queries_deserialize(&queries, blob, len)) != 0) goto fail_blob;
- i = 0;
- while (queries[i] && queries[i]->attr) {
- printf("query: attr=%s, op=%d, value=%s, value2=%s, bin=%d\n", queries[i]->attr, queries[i]->op, queries[i]->value, queries[i]->value2, queries[i]->binary);
- free(queries[i]->attr);
- free(queries[i]->value);
- free(queries[i]->value2);
- free(queries[i]);
- i++;
- }
- free(queries);
-
- free(blob);
- glite_jp_free_context(ctx);
- return 0;
-
-fail_blob:
- free(blob);
-fail:
- fprintf(stderr, "fail: %s\n", strerror(ret));
-fail_ctx:
- glite_jp_free_context(ctx);
- return 1;
-#endif
-}
+++ /dev/null
-#include <stdio.h>
-#include <sysexits.h>
-#include <string.h>
-#include <assert.h>
-
-#include <glite/security/glite_gsplugin.h>
-#include <glite/security/glite_gss.h>
-#include "glite/jobid/strmd5.h"
-
-#include "jp_H.h"
-#include "jp_.nsmap"
-#include "db_ops.h"
-#include "conf.h"
-
-
-#include "soap_version.h"
-#if GSOAP_VERSION <= 20602
-#define soap_call___jpsrv__UpdateJobs soap_call___ns1__UpdateJobs
-#define soap_call___jpsrv__QueryJobs soap_call___ns1__QueryJobs
-#endif
-#define dprintf(FMT, ARGS...) fprintf(stderr, FMT, ##ARGS);
-#define check_fault(SOAP, ERR) glite_jp_clientCheckFault((SOAP), (ERR), NULL, 0)
-#include "glite/jp/ws_fault.c"
-
-
-/* insert simulating FeedIndex call */
-#define INSERT "insert into feeds value ('93', '12345', '8', '0' , 'http://localhost:8901', '2005-10-14 10:48:27', 'COND2');"
-#define DELETE "delete from feeds where feedid = '12345';"
-
-
-int main(int argc,char *argv[])
-{
- char *default_server = NULL;
- char server[512];
- struct soap *soap = soap_new();
-
- soap_init(soap);
- soap_set_namespaces(soap, jp__namespaces);
- soap_register_plugin(soap,glite_gsplugin);
-
-/*---------------------------------------------------------------------------*/
- // simulate FeedIndex PS response
- {
- glite_jp_context_t ctx;
- glite_jpis_context_t isctx = NULL;
- glite_jp_is_conf *conf;
-
-
- glite_jp_init_context(&ctx);
- glite_jp_get_conf(argc, argv, &conf);
- if (!conf) {
- fprintf(stderr, "Can't gather configuration\n");
- goto end;
- }
- 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);
-
- glite_jpis_init_context(&isctx, ctx, conf);
- if (glite_jpis_init_db(isctx) != 0) {
- fprintf(stderr, "Connect DB failed: %s (%s)\n",
- ctx->error->desc, ctx->error->source);
- goto end;
- }
-
- if (glite_jp_db_ExecSQL(ctx, DELETE, NULL) < 0) goto end;
- if (glite_jp_db_ExecSQL(ctx, INSERT, NULL) < 0) goto end;
- end:
- glite_jpis_free_context(isctx);
- glite_jp_free_context(ctx);
- glite_jp_free_conf(conf);
- }
-
-/*---------------------------------------------------------------------------*/
- // test calls of server functions
- // this call is issued by JPPS
- {
- struct jptype__jobRecord *rec;
- struct _jpelem__UpdateJobs in;
- struct _jpelem__UpdateJobsResponse out;
- struct jptype__attrValue *a;
-
- memset(&in, 0, sizeof(in));
- memset(&out, 0, sizeof(out));
-
- in.feedId = soap_strdup(soap, "12345");
- in.feedDone = GLITE_SECURITY_GSOAP_FALSE;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, &in, jobAttributes, struct jptype__jobRecord, 2);
- rec = GLITE_SECURITY_GSOAP_LIST_GET(in.jobAttributes, 0);
- {
- memset(rec, 0, sizeof(*rec));
- rec->jobid = soap_strdup(soap, "https://localhost:7846/pokus1");
- {
- edg_wll_GssCred cred = NULL;
- edg_wll_GssStatus gss_code;
-
- if ( edg_wll_gss_acquire_cred_gsi(NULL, NULL, &cred, &gss_code) ) {
- printf("Cannot obtain credentials - exiting.\n");
- return EINVAL;
- }
- rec->owner = soap_strdup(soap, cred->name);
- }
- rec->__sizeprimaryStorage = 0;
- rec->primaryStorage = NULL;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, rec, attributes, struct jptype__attrValue, 2);
- a = GLITE_SECURITY_GSOAP_LIST_GET(rec->attributes, 0);
- a->name = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:user");
- a->value = soap_malloc(soap, sizeof(*(a->value)));
- memset(a->value, 0, sizeof(a->value));
- GSOAP_SETSTRING(a->value, soap_strdup(soap, "CertSubj"));
- a->timestamp = 333;
- a->origin = jptype__attrOrig__SYSTEM;
- a->originDetail = NULL;
-
- a = GLITE_SECURITY_GSOAP_LIST_GET(rec->attributes, 1);
- a->name = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus");
- a->value = soap_malloc(soap, sizeof(*(a->value)));
- memset(a->value, 0, sizeof(a->value));
- GSOAP_SETSTRING(a->value, soap_strdup(soap, "Done"));
- a->timestamp = 333;
- a->origin = jptype__attrOrig__SYSTEM;
- a->originDetail = NULL;
-
- }
-
- rec = GLITE_SECURITY_GSOAP_LIST_GET(in.jobAttributes, 1);
- {
- memset(rec, 0, sizeof(*rec));
- rec->jobid = soap_strdup(soap, "https://localhost:7846/pokus2");
- rec->owner = soap_strdup(soap, "OwnerName");
- rec->__sizeprimaryStorage = 0;
- rec->primaryStorage = NULL;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, rec, attributes, struct jptype__jobRecord, 2);
- a = GLITE_SECURITY_GSOAP_LIST_GET(rec->attributes, 0);
- a->name = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:user");
- a->value = soap_malloc(soap, sizeof(*(a->value)));
- memset(a->value, 0, sizeof(a->value));
- GSOAP_SETSTRING(a->value, soap_strdup(soap, "CertSubj"));
- a->timestamp = 333;
- a->origin = jptype__attrOrig__USER;
- a->originDetail = NULL;
-
- a = GLITE_SECURITY_GSOAP_LIST_GET(rec->attributes, 1);
- a->name = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus");
- a->value = soap_malloc(soap, sizeof(*(a->value)));
- memset(a->value, 0, sizeof(a->value));
- GSOAP_SETSTRING(a->value, soap_strdup(soap, "Ready"));
- a->timestamp = 333;
- a->origin = jptype__attrOrig__SYSTEM;
- a->originDetail = NULL;
- }
-
- check_fault(soap,
- soap_call___jpsrv__UpdateJobs(soap,server,"",&in,&out));
- }
-
-/*---------------------------------------------------------------------------*/
- // this query call issued by user
- {
- struct _jpelem__QueryJobs in;
- struct jptype__indexQuery *cond;
- struct jptype__indexQueryRecord *rec;
- struct _jpelem__QueryJobsResponse out;
- struct jptype__jobRecord *job;
- struct jptype__attrValue *attr;
- int i, j;
-
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, &in, conditions, struct jptype__indexQuery, 2);
-
- // query status
- cond = GLITE_SECURITY_GSOAP_LIST_GET(in.conditions, 0);
- memset(cond, 0, sizeof(*cond));
- cond->attr = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus");
- cond->origin = NULL;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, cond, record, struct jptype__indexQueryRecord, 2);
-
- // equal to Done
- rec = GLITE_SECURITY_GSOAP_LIST_GET(cond->record, 0);
- memset(rec, 0, sizeof(*rec));
- rec->op = jptype__queryOp__EQUAL;
- rec->value = soap_malloc(soap, sizeof(*(rec->value)));
- memset(rec->value, 0, sizeof(*rec->value));
- GSOAP_SETSTRING(rec->value, soap_strdup(soap, "Done"));
-
- // OR equal to Ready
- rec = GLITE_SECURITY_GSOAP_LIST_GET(cond->record, 1);
- memset(rec, 0, sizeof(*rec));
- rec->op = jptype__queryOp__EQUAL;
- rec->value = soap_malloc(soap, sizeof(*(rec->value)));
- memset(rec->value, 0, sizeof(*rec->value));
- GSOAP_SETSTRING(rec->value, soap_strdup(soap, "Ready"));
-
-
- // AND
- // owner
- cond = GLITE_SECURITY_GSOAP_LIST_GET(in.conditions, 1);
- memset(cond, 0, sizeof(*cond));
- cond->attr = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:user");
- cond->origin = NULL;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, cond, record, struct jptype__indexQueryRecord, 1);
-
- // not equal to CertSubj
- rec = GLITE_SECURITY_GSOAP_LIST_GET(cond->record, 0);
- memset(rec, 0, sizeof(*rec));
- rec->op = jptype__queryOp__UNEQUAL;
- rec->value = soap_malloc(soap, sizeof(*(rec->value)));
- memset(rec->value, 0, sizeof(*rec->value));
- GSOAP_SETSTRING(rec->value, soap_strdup(soap, "God"));
-
-
- in.__sizeattributes = 4;
- in.attributes = soap_malloc(soap,
- in.__sizeattributes *
- sizeof(*(in.attributes)));
- in.attributes[0] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/JP/System:owner");
- in.attributes[1] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/JP/System:jobId");
- in.attributes[2] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus");
- in.attributes[3] = soap_strdup(soap, "http://egee.cesnet.cz/en/Schema/LB/Attributes:user");
-
- memset(&out, 0, sizeof(out));
-
- check_fault(soap,
- soap_call___jpsrv__QueryJobs(soap, server, "",&in,&out));
-
- for (j=0; j<out.__sizejobs; j++) {
- job = GLITE_SECURITY_GSOAP_LIST_GET(out.jobs, j);
- printf("jobid = %s\n",job->jobid);
- for (i=0; i<job->__sizeattributes; i++) {
- attr = GLITE_SECURITY_GSOAP_LIST_GET(job->attributes, i);
- printf("\t%s = %s\n",
- attr->name,
- GSOAP_ISSTRING(attr->value) ? GSOAP_STRING(attr->value) : "binary");
- }
- }
- }
-
- return 0;
-}
+++ /dev/null
-#
-# 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 $ps='https://skurut1.cesnet.cz:8901';
-our $is='https://scientific.civ.zcu.cz:8904';
-
-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 = (
-'<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:QueryJobs xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-',
-'</jpelem:QueryJobs>
-'
-);
-
-
-my @jobs;
-
-
-#
-# query to Job Provenance Index Server
-#
-sub isquery {
- my ($server, $queries, $attributes, $origin) = @_;
- 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 .= "<conditions>\n";
- $s .= "\t<attr>$query[0]</attr>\n";
- while ($i <= $#query) {
- my @record = @{$query[$i]};
- $s .= "\t<origin>$origin</origin>\n" if $origin;
- $s .= "\t<record>\n";
- $s .= "\t\t<op>$record[0]</op>\n";
- $s .= "\t\t<value>$record[1]</value>\n";
- $s .= "\t\t<value2>$record[2]</value2>\n" if ($record[2]);
- $s .= "\t</record>\n";
- $i++;
- }
- $s .= "</conditions>\n";
- }
-
- foreach my $attribute (@attributes) {
- $s .= "<attributes>$attribute</attributes>\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, $xmlorigin);
- my @values = ();
- my @origins = ();
- my %attribute = ();
- my $nvalues = 0;
-
- $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";
- if (exists $attribute{origin}) {
- @origins = @{$attribute{origin}};
- }
-#print " prev origins: ".Dumper(@origins)."\n";
- $xmlvalue = $xmlattribute->first_child('value');
- while ($xmlvalue) {
-#print " to add: ".$xmlvalue->text."\n";
- push @values, $xmlvalue->text;
- $xmlvalue = $xmlvalue->next_sibling('value');
- $nvalues = $nvalues + 1;
- }
- @{$attribute{value}} = @values;
-#print " new values: ".Dumper($attribute{value})."\n";
- $xmlorigin = $xmlattribute->first_child('origin');
- for ($nvalues..1) {
- if ($xmlorigin and $xmlorigin->text) { push @origins, $xmlorigin->text; }
- else { push @origins, undef; }
- }
- @{$attribute{origin}} = @origins;
-#print " new origins: ".Dumper($attribute{origin})."\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;
+++ /dev/null
-#! /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=$pch::ps;
-my $is=$pch::is;
-
-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', "<string>$output</string>"]],
-], ["$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";
-}
+++ /dev/null
-#! /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 [SOFTMEAN_PROGRAM] 2>/dev/null
-#
-
-use strict;
-use pch;
-use Data::Dumper;
-
-my $ps=$pch::ps;
-my $is=$pch::is;
-my %program_names = (softmean => 1);
-
-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 [PROGRAM]\n";
- exit 1
-}
-$output = $ARGV[0];
-if ($#ARGV + 1 > 1) {
- %program_names = ();
- foreach (split(/ */,$ARGV[1])) {
- $program_names{$_} = 1;
- }
-}
-
-# debug calls
-$pch::debug = 0;
-my $debug = 0;
-
-#
-# find out processes with given output
-#
-my @jobs = pch::isquery($is, [
- ["$pch::jplbtag:IPAW_OUTPUT", ['EQUAL', "<string>$output</string>"]],
-], ["$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 (exists $program_names{$program[0]}) {
- print "$jobid is $program[0], 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";
-}
+++ /dev/null
-#! /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=$pch::ps;
-my $is=$pch::is;
-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', "<string>$output</string>"]],
-], \@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', "<string>$jobid</string>"]]], \@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) {
- if ( $stage == 2 || $stage == 3) {
- 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;
- }
-}
+++ /dev/null
-#! /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 [PROGRAMS [PARAMS]] 2>/dev/null
-#
-
-use strict;
-use pch;
-use Data::Dumper;
-
-my $ps=$pch::ps;
-my $is=$pch::is;
-my %program_names=(align_warp => 1);
-my $program_params='-m 12';
-my $runday=3;
-#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;
-
-if ($#ARGV + 1 >= 1) {
- %program_names = ();
- foreach (split(/ */, $ARGV[0])) {
- $program_names{$_} = 1;
- }
-}
-if ($#ARGV + 1 >= 2) {
- $program_params=$ARGV[1];
-}
-
-
-#
-# find out processes with given name ant parameters
-#
-my @query_programs = ();
-foreach (keys %program_names) {
- my @qitem = ['EQUAL', "<string>$_</string>"];
- push @query_programs, @qitem;
-}
-my @jobs = pch::isquery($is, [
- ["$pch::jplbtag:IPAW_PROGRAM", @query_programs],
- ["$pch::jplbtag:IPAW_PARAM", ['EQUAL', "<string>$program_params</string>"]],
-], \@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, @timesep, @origin);
- my $itime;
-
- print "Handling $job{jobid} ($according_count.)\n" if ($debug);
-
- # search first regtime with origin USER,
- # be satisfied with first regime too if no value has USER origin
- @time = @{$job{attributes}{"$pch::jpsys:regtime"}{value}};
- @origin = @{$job{attributes}{"$pch::jpsys:regtime"}{origin}};
- @timesep = ();
- foreach $itime (0..$#time) {
-#print "check ".$time[$itime]." ".$origin[$itime]."\n";
- if ($origin[$itime] eq 'USER') {
- @timesep = gmtime($time[$itime]);
- last;
- }
- }
- if ($#timesep == -1) { @timesep = gmtime($time[0]); }
-#print join(',', @timesep)."\n";
-
- 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";
-}
+++ /dev/null
-#! /usr/bin/perl -W
-
-#
-# 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 [PROGRAMS] [END_PROGRAMS] [HEADER] 2>/dev/null
-#
-
-use strict;
-use pch;
-use Data::Dumper;
-
-my $ps=$pch::ps;
-my $is=$pch::is;
-my %program_names=(align_warp => 1);
-my %end_program_names=(convert => 1);
-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
-
-
-# debug calls
-$pch::debug = 0;
-my $debug = 0;
-
-if ($#ARGV + 1 >= 1) {
- %program_names = ();
- foreach (split(/ */, $ARGV[0])) {
- $program_names{$_} = 1;
- }
-}
-if ($#ARGV + 1 >= 2) {
- %end_program_names = ();
- foreach (split(/ */, $ARGV[1])) {
- $end_program_names{$_} = 1;
- }
-}
-if ($#ARGV + 1 >= 3) {
- $header = $ARGV[2];
-}
-
-
-#
-# find out processes with given name and parameters
-#
-my @query_programs = ();
-foreach (keys %program_names) {
- my @qitem = ['EQUAL', "<string>$_</string>"];
- push @query_programs, @qitem;
-}
-my @jobs = pch::isquery($is, [
- ["$pch::jplbtag:IPAW_PROGRAM", @query_programs],
- ["$pch::jplbtag:IPAW_HEADER", ['EQUAL', "<string>$header</string>"]],
-], \@pch::view_attributes);
-print STDERR Dumper(@jobs) if ($debug);
-die "...so exit on error" if ($pch::err);
-
-#
-# collect all jobs (tree browsing down)
-#
-foreach my $job (@jobs) {
- my %job = %$job;
- my $jobid = $job{jobid};
- my @succs;
- my $pname;
-
- $pname = $job{attributes}{"$pch::jplbtag:IPAW_PROGRAM"}{value}[0];
- print "Handling $jobid ($pname)\n" if ($debug);
-
- if (exists $end_program_names{$pname}) {
- print "It's $pname\n" if $debug;
- if (!exists $according_jobs{$jobid}) {
- $according_jobs{$jobid} = \%job;
- push @according_jobs, $jobid;
- print "Added $jobid to $#according_jobs\n" if ($debug);
- }
- else {
- print "Already existing $jobid\n" if ($debug);
- }
- next;
- }
-
- @succs = pch::isquery($is, [["$pch::jpwf:ancestor", ['EQUAL', "<string>$jobid</string>"]]], \@pch::view_attributes);
- die "...so exit on error" if ($pch::err);
- push @jobs, @succs;
-}
-
-
-#
-# 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";
-}
+++ /dev/null
-#! /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 [PROGRAMS [END_PROGRAMS] [PARAM] ]2>/dev/null
-#
-
-use strict;
-use pch;
-use Data::Dumper;
-
-my $ps=$pch::ps;
-my $is=$pch::is;
-my %program_names=(align_warp=>1);
-my $program_param='-m 12';
-my %end_program_names=(softmean=>1);
-
-#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;
-
-if ($#ARGV + 1 >= 1) {
- %program_names = ();
- foreach (split(/ */, $ARGV[0])) {
- $program_names{$_} = 1;
- }
-}
-if ($#ARGV + 1 >= 2) {
- %end_program_names = ();
- foreach (split(/ */, $ARGV[1])) {
- $end_program_names{$_} = 1;
- }
-}
-if ($#ARGV + 1 >= 3) {
- $program_param=$ARGV[2];
-}
-
-#
-# find out processes with given name and parameters
-#
-my @query_programs = ();
-foreach (keys %program_names) {
- my @qitem = ['EQUAL', "<string>$_</string>"];
- push @query_programs, @qitem;
-}
-my @jobs = pch::isquery($is, [
- ["$pch::jplbtag:IPAW_PROGRAM", @query_programs],
- ["$pch::jplbtag:IPAW_PARAM", ['EQUAL', "<string>$program_param</string>"]],
-], ["$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;
- my $pname;
-
- print "Handling $jobid (position $workflow_count)\n" if ($debug);
- print " progname: ".$workflow_jobs{$jobid}{attributes}{"$pch::jplbtag:IPAW_PROGRAM"}{value}[0]."\n" if ($debug);
-
- $pname = $workflow_jobs{$jobid}{attributes}{"$pch::jplbtag:IPAW_PROGRAM"}{value}[0];
- if (exists $end_program_names{$pname}) {
- print "It's $pname, adding\n" if $debug;
- $according_jobs{$jobid} = \%{$workflow_jobs{$jobid}};
- next;
- }
-
- @succs = pch::isquery($is, [["$pch::jpwf:ancestor", ['EQUAL', "<string>$jobid</string>"]]], \@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";
-}
+++ /dev/null
-query: using JPIS http://localhost:10000
-
-Conditions:
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- origin IS ANY
- value == Ready
-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
-
-OK
-Result 0 jobs:
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:QueryJobs xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <conditions>
- <attr>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attr>
- <record>
- <op>EQUAL</op>
- <value>
- <string>Done</string>
- </value>
- </record>
- <record>
- <op>EQUAL</op>
- <value>
- <string>Ready</string>
- </value>
- </record>
- </conditions>
-
- <conditions>
- <attr>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attr>
- <record>
- <op>UNEQUAL</op>
- <value>
- <string>God</string>
- </value>
- </record>
- </conditions>
-
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:owner</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attributes>
-
-</jpelem:QueryJobs>
-
+++ /dev/null
-query: using JPIS http://localhost:10000
-
-Conditions:
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- origin IS ANY
- value == Done
- value == Ready
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- origin IS ANY
- value <> God
-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
-
-OK
-Result 2 jobs:
- jobid = https://localhost:7846/pokus1, owner = /O=CESNET/O=Masaryk University/CN=Milos Mulac
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- value = Done
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- value = CertSubj
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- jobid = https://localhost:7846/pokus2, owner = OwnerName
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- value = Ready
- origin = SYSTEM (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- value = CertSubj
- origin = SYSTEM (no detail)
- time = Thu Jan 1 02:00:01 1970
+++ /dev/null
--- MySQL dump 10.8
---
--- Host: localhost Database: jpis1test
--- ------------------------------------------------------
--- Server version 4.1.7-max-log
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE="NO_AUTO_VALUE_ON_ZERO" */;
-
---
--- Current Database: `jpis1test`
---
-
-CREATE DATABASE /*!32312 IF NOT EXISTS*/ `jpis1test`;
-
-USE `jpis1test`;
-
---
--- Table structure for table `acls`
---
-
-DROP TABLE IF EXISTS `acls`;
-CREATE TABLE `acls` (
- `aclid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` mediumblob NOT NULL,
- `refcnt` int(11) NOT NULL default '0',
- PRIMARY KEY (`aclid`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `acls`
---
-
-
-/*!40000 ALTER TABLE `acls` DISABLE KEYS */;
-LOCK TABLES `acls` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `acls` ENABLE KEYS */;
-
---
--- Table structure for table `attr_ac7ea0b2cd17deedbc569733597059ae`
---
-
-DROP TABLE IF EXISTS `attr_ac7ea0b2cd17deedbc569733597059ae`;
-CREATE TABLE `attr_ac7ea0b2cd17deedbc569733597059ae` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_ac7ea0b2cd17deedbc569733597059ae`
---
-
-
-/*!40000 ALTER TABLE `attr_ac7ea0b2cd17deedbc569733597059ae` DISABLE KEYS */;
-LOCK TABLES `attr_ac7ea0b2cd17deedbc569733597059ae` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_ac7ea0b2cd17deedbc569733597059ae` ENABLE KEYS */;
-
---
--- Table structure for table `attr_5de12c1776c3130b9d27a7502a13e11c`
---
-
-DROP TABLE IF EXISTS `attr_5de12c1776c3130b9d27a7502a13e11c`;
-CREATE TABLE `attr_5de12c1776c3130b9d27a7502a13e11c` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_5de12c1776c3130b9d27a7502a13e11c`
---
-
-
-/*!40000 ALTER TABLE `attr_5de12c1776c3130b9d27a7502a13e11c` DISABLE KEYS */;
-LOCK TABLES `attr_5de12c1776c3130b9d27a7502a13e11c` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_5de12c1776c3130b9d27a7502a13e11c` ENABLE KEYS */;
-
---
--- Table structure for table `attr_f496f5d872a2d04ee626045477f340db`
---
-
-DROP TABLE IF EXISTS `attr_f496f5d872a2d04ee626045477f340db`;
-CREATE TABLE `attr_f496f5d872a2d04ee626045477f340db` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_f496f5d872a2d04ee626045477f340db`
---
-
-
-/*!40000 ALTER TABLE `attr_f496f5d872a2d04ee626045477f340db` DISABLE KEYS */;
-LOCK TABLES `attr_f496f5d872a2d04ee626045477f340db` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_f496f5d872a2d04ee626045477f340db` ENABLE KEYS */;
-
---
--- Table structure for table `attr_34d7a9e823c6948d525362d2709bdfcd`
---
-
-DROP TABLE IF EXISTS `attr_34d7a9e823c6948d525362d2709bdfcd`;
-CREATE TABLE `attr_34d7a9e823c6948d525362d2709bdfcd` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_34d7a9e823c6948d525362d2709bdfcd`
---
-
-
-/*!40000 ALTER TABLE `attr_34d7a9e823c6948d525362d2709bdfcd` DISABLE KEYS */;
-LOCK TABLES `attr_34d7a9e823c6948d525362d2709bdfcd` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_34d7a9e823c6948d525362d2709bdfcd` ENABLE KEYS */;
-
---
--- Table structure for table `attr_824794b00ee73be550f893b99ceaa643`
---
-
-DROP TABLE IF EXISTS `attr_824794b00ee73be550f893b99ceaa643`;
-CREATE TABLE `attr_824794b00ee73be550f893b99ceaa643` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_824794b00ee73be550f893b99ceaa643`
---
-
-
-/*!40000 ALTER TABLE `attr_824794b00ee73be550f893b99ceaa643` DISABLE KEYS */;
-LOCK TABLES `attr_824794b00ee73be550f893b99ceaa643` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_824794b00ee73be550f893b99ceaa643` ENABLE KEYS */;
-
---
--- Table structure for table `attr_ac1e0e146f3e1bee11d6e40d07e60abb`
---
-
-DROP TABLE IF EXISTS `attr_ac1e0e146f3e1bee11d6e40d07e60abb`;
-CREATE TABLE `attr_ac1e0e146f3e1bee11d6e40d07e60abb` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_ac1e0e146f3e1bee11d6e40d07e60abb`
---
-
-
-/*!40000 ALTER TABLE `attr_ac1e0e146f3e1bee11d6e40d07e60abb` DISABLE KEYS */;
-LOCK TABLES `attr_ac1e0e146f3e1bee11d6e40d07e60abb` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_ac1e0e146f3e1bee11d6e40d07e60abb` ENABLE KEYS */;
-
---
--- Table structure for table `attr_7636d6368c1cf53bc5511241cac9751f`
---
-
-DROP TABLE IF EXISTS `attr_7636d6368c1cf53bc5511241cac9751f`;
-CREATE TABLE `attr_7636d6368c1cf53bc5511241cac9751f` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_7636d6368c1cf53bc5511241cac9751f`
---
-
-
-/*!40000 ALTER TABLE `attr_7636d6368c1cf53bc5511241cac9751f` DISABLE KEYS */;
-LOCK TABLES `attr_7636d6368c1cf53bc5511241cac9751f` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_7636d6368c1cf53bc5511241cac9751f` ENABLE KEYS */;
-
---
--- Table structure for table `attr_64ea5318d74aca823630ba9ca38971e0`
---
-
-DROP TABLE IF EXISTS `attr_64ea5318d74aca823630ba9ca38971e0`;
-CREATE TABLE `attr_64ea5318d74aca823630ba9ca38971e0` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_64ea5318d74aca823630ba9ca38971e0`
---
-
-
-/*!40000 ALTER TABLE `attr_64ea5318d74aca823630ba9ca38971e0` DISABLE KEYS */;
-LOCK TABLES `attr_64ea5318d74aca823630ba9ca38971e0` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_64ea5318d74aca823630ba9ca38971e0` ENABLE KEYS */;
-
---
--- Table structure for table `attr_81a1d6b95da954e977f22f78417b98a8`
---
-
-DROP TABLE IF EXISTS `attr_81a1d6b95da954e977f22f78417b98a8`;
-CREATE TABLE `attr_81a1d6b95da954e977f22f78417b98a8` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_81a1d6b95da954e977f22f78417b98a8`
---
-
-
-/*!40000 ALTER TABLE `attr_81a1d6b95da954e977f22f78417b98a8` DISABLE KEYS */;
-LOCK TABLES `attr_81a1d6b95da954e977f22f78417b98a8` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_81a1d6b95da954e977f22f78417b98a8` ENABLE KEYS */;
-
---
--- Table structure for table `attr_e6c0fb3b99f16296db2623c02f0d5c6f`
---
-
-DROP TABLE IF EXISTS `attr_e6c0fb3b99f16296db2623c02f0d5c6f`;
-CREATE TABLE `attr_e6c0fb3b99f16296db2623c02f0d5c6f` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_e6c0fb3b99f16296db2623c02f0d5c6f`
---
-
-
-/*!40000 ALTER TABLE `attr_e6c0fb3b99f16296db2623c02f0d5c6f` DISABLE KEYS */;
-LOCK TABLES `attr_e6c0fb3b99f16296db2623c02f0d5c6f` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_e6c0fb3b99f16296db2623c02f0d5c6f` ENABLE KEYS */;
-
---
--- Table structure for table `attr_474e4207c49813e09915732c80c0e1cc`
---
-
-DROP TABLE IF EXISTS `attr_474e4207c49813e09915732c80c0e1cc`;
-CREATE TABLE `attr_474e4207c49813e09915732c80c0e1cc` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_474e4207c49813e09915732c80c0e1cc`
---
-
-
-/*!40000 ALTER TABLE `attr_474e4207c49813e09915732c80c0e1cc` DISABLE KEYS */;
-LOCK TABLES `attr_474e4207c49813e09915732c80c0e1cc` WRITE;
-INSERT INTO `attr_474e4207c49813e09915732c80c0e1cc` VALUES ('593e62a063231f8c623b74406b3e12b0','CertSubj','S:7201:F::CertSubj',3),('9276789a0093ad44457655ef03ade36a','CertSubj','S:7201:S::CertSubj',2);
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_474e4207c49813e09915732c80c0e1cc` ENABLE KEYS */;
-
---
--- Table structure for table `attr_e2d5742f6e917ea2e949d49b9fa0c1b3`
---
-
-DROP TABLE IF EXISTS `attr_e2d5742f6e917ea2e949d49b9fa0c1b3`;
-CREATE TABLE `attr_e2d5742f6e917ea2e949d49b9fa0c1b3` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_e2d5742f6e917ea2e949d49b9fa0c1b3`
---
-
-
-/*!40000 ALTER TABLE `attr_e2d5742f6e917ea2e949d49b9fa0c1b3` DISABLE KEYS */;
-LOCK TABLES `attr_e2d5742f6e917ea2e949d49b9fa0c1b3` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_e2d5742f6e917ea2e949d49b9fa0c1b3` ENABLE KEYS */;
-
---
--- Table structure for table `attr_941ae4f469950ed63ad19822dbcf5427`
---
-
-DROP TABLE IF EXISTS `attr_941ae4f469950ed63ad19822dbcf5427`;
-CREATE TABLE `attr_941ae4f469950ed63ad19822dbcf5427` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_941ae4f469950ed63ad19822dbcf5427`
---
-
-
-/*!40000 ALTER TABLE `attr_941ae4f469950ed63ad19822dbcf5427` DISABLE KEYS */;
-LOCK TABLES `attr_941ae4f469950ed63ad19822dbcf5427` WRITE;
-INSERT INTO `attr_941ae4f469950ed63ad19822dbcf5427` VALUES ('593e62a063231f8c623b74406b3e12b0','Done','S:7201:F::Done',3),('9276789a0093ad44457655ef03ade36a','Ready','S:7201:S::Ready',1);
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_941ae4f469950ed63ad19822dbcf5427` ENABLE KEYS */;
-
---
--- Table structure for table `attr_97b3c128ab54e621c806b9ffe5c45185`
---
-
-DROP TABLE IF EXISTS `attr_97b3c128ab54e621c806b9ffe5c45185`;
-CREATE TABLE `attr_97b3c128ab54e621c806b9ffe5c45185` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_97b3c128ab54e621c806b9ffe5c45185`
---
-
-
-/*!40000 ALTER TABLE `attr_97b3c128ab54e621c806b9ffe5c45185` DISABLE KEYS */;
-LOCK TABLES `attr_97b3c128ab54e621c806b9ffe5c45185` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_97b3c128ab54e621c806b9ffe5c45185` ENABLE KEYS */;
-
---
--- Table structure for table `attr_04ffb63c6978549209734fc02e8d688d`
---
-
-DROP TABLE IF EXISTS `attr_04ffb63c6978549209734fc02e8d688d`;
-CREATE TABLE `attr_04ffb63c6978549209734fc02e8d688d` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_04ffb63c6978549209734fc02e8d688d`
---
-
-
-/*!40000 ALTER TABLE `attr_04ffb63c6978549209734fc02e8d688d` DISABLE KEYS */;
-LOCK TABLES `attr_04ffb63c6978549209734fc02e8d688d` WRITE;
-INSERT INTO `attr_04ffb63c6978549209734fc02e8d688d` VALUES ('593e62a063231f8c623b74406b3e12b0','VOCE','S:7201:F::VOCE',3);
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_04ffb63c6978549209734fc02e8d688d` ENABLE KEYS */;
-
---
--- Table structure for table `attr_48f1a123884d6e24fe205c0f1c60c686`
---
-
-DROP TABLE IF EXISTS `attr_48f1a123884d6e24fe205c0f1c60c686`;
-CREATE TABLE `attr_48f1a123884d6e24fe205c0f1c60c686` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_48f1a123884d6e24fe205c0f1c60c686`
---
-
-
-/*!40000 ALTER TABLE `attr_48f1a123884d6e24fe205c0f1c60c686` DISABLE KEYS */;
-LOCK TABLES `attr_48f1a123884d6e24fe205c0f1c60c686` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_48f1a123884d6e24fe205c0f1c60c686` ENABLE KEYS */;
-
---
--- Table structure for table `attr_52df8110aad9f80fd33a96073bfe58e7`
---
-
-DROP TABLE IF EXISTS `attr_52df8110aad9f80fd33a96073bfe58e7`;
-CREATE TABLE `attr_52df8110aad9f80fd33a96073bfe58e7` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_52df8110aad9f80fd33a96073bfe58e7`
---
-
-
-/*!40000 ALTER TABLE `attr_52df8110aad9f80fd33a96073bfe58e7` DISABLE KEYS */;
-LOCK TABLES `attr_52df8110aad9f80fd33a96073bfe58e7` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_52df8110aad9f80fd33a96073bfe58e7` ENABLE KEYS */;
-
---
--- Table structure for table `attr_47a0c544b03cd51e37f3ad7f9e0a0a62`
---
-
-DROP TABLE IF EXISTS `attr_47a0c544b03cd51e37f3ad7f9e0a0a62`;
-CREATE TABLE `attr_47a0c544b03cd51e37f3ad7f9e0a0a62` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `value` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `full_value` mediumblob NOT NULL,
- `origin` int(11) NOT NULL default '0',
- KEY `jobid` (`jobid`),
- KEY `value` (`value`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attr_47a0c544b03cd51e37f3ad7f9e0a0a62`
---
-
-
-/*!40000 ALTER TABLE `attr_47a0c544b03cd51e37f3ad7f9e0a0a62` DISABLE KEYS */;
-LOCK TABLES `attr_47a0c544b03cd51e37f3ad7f9e0a0a62` WRITE;
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attr_47a0c544b03cd51e37f3ad7f9e0a0a62` ENABLE KEYS */;
-
---
--- Table structure for table `attrs`
---
-
-DROP TABLE IF EXISTS `attrs`;
-CREATE TABLE `attrs` (
- `attrid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `name` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `indexed` int(11) NOT NULL default '0',
- `type` varchar(32) character set latin1 collate latin1_bin default NULL,
- PRIMARY KEY (`attrid`),
- KEY `attrid` (`attrid`),
- KEY `name` (`name`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `attrs`
---
-
-
-/*!40000 ALTER TABLE `attrs` DISABLE KEYS */;
-LOCK TABLES `attrs` WRITE;
-INSERT INTO `attrs` VALUES ('824794b00ee73be550f893b99ceaa643','http://egee.cesnet.cz/en/Schema/JP/System:owner',1,'mediumblob'),('ac1e0e146f3e1bee11d6e40d07e60abb','http://egee.cesnet.cz/en/Schema/JP/System:jobId',1,'mediumblob'),('81a1d6b95da954e977f22f78417b98a8','http://egee.cesnet.cz/en/Schema/JP/System:regtime',0,'mediumblob'),('474e4207c49813e09915732c80c0e1cc','http://egee.cesnet.cz/en/Schema/LB/Attributes:user',1,'mediumblob'),('52df8110aad9f80fd33a96073bfe58e7','http://egee.cesnet.cz/en/Schema/LB/Attributes:aTag',0,'mediumblob'),('48f1a123884d6e24fe205c0f1c60c686','http://egee.cesnet.cz/en/Schema/LB/Attributes:eNodes',0,'mediumblob'),('34d7a9e823c6948d525362d2709bdfcd','http://egee.cesnet.cz/en/Schema/LB/Attributes:RB',1,'mediumblob'),('04ffb63c6978549209734fc02e8d688d','http://egee.cesnet.cz/en/Schema/LB/Attributes:CE',1,'mediumblob'),('f496f5d872a2d04ee626045477f340db','http://egee.cesnet.cz/en/Schema/LB/Attributes:UIHost',1,'mediumblob'),('97b3c128ab54e621c806b9ffe5c45185','http://egee.cesnet.cz/en/Schema/LB/Attributes:CPUTime',0,'mediumblob'),('5de12c1776c3130b9d27a7502a13e11c','http://egee.cesnet.cz/en/Schema/LB/Attributes:NProc',0,'mediumblob'),('941ae4f469950ed63ad19822dbcf5427','http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus',1,'mediumblob'),('7636d6368c1cf53bc5511241cac9751f','http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatusDate',0,'mediumblob'),('e2d5742f6e917ea2e949d49b9fa0c1b3','http://egee.cesnet.cz/en/Schema/LB/Attributes:retryCount',0,'mediumblob'),('47a0c544b03cd51e37f3ad7f9e0a0a62','http://egee.cesnet.cz/en/Schema/LB/Attributes:jobType',0,'mediumblob'),('ac7ea0b2cd17deedbc569733597059ae','http://egee.cesnet.cz/en/Schema/LB/Attributes:nsubjobs',0,'mediumblob'),('64ea5318d74aca823630ba9ca38971e0','http://egee.cesnet.cz/en/Schema/LB/Attributes:lastStatusHistory',0,'mediumblob'),('e6c0fb3b99f16296db2623c02f0d5c6f','http://egee.cesnet.cz/en/Schema/LB/Attributes:fullStatusHistory',0,'mediumblob');
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `attrs` ENABLE KEYS */;
-
---
--- Table structure for table `feeds`
---
-
-DROP TABLE IF EXISTS `feeds`;
-CREATE TABLE `feeds` (
- `uniqueid` int(11) NOT NULL auto_increment,
- `feedid` varchar(32) character set latin1 collate latin1_bin default NULL,
- `state` int(11) NOT NULL default '0',
- `locked` int(11) NOT NULL default '0',
- `source` varchar(255) NOT NULL default '',
- `expires` datetime default NULL,
- `condition` mediumblob,
- PRIMARY KEY (`uniqueid`),
- UNIQUE KEY `feedid` (`feedid`),
- KEY `uniqueid` (`uniqueid`),
- KEY `feedid_2` (`feedid`),
- KEY `state` (`state`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `feeds`
---
-
-
-/*!40000 ALTER TABLE `feeds` DISABLE KEYS */;
-LOCK TABLES `feeds` WRITE;
-INSERT INTO `feeds` VALUES (93,'12345',8,0,'http://localhost:8901','2005-10-14 10:48:27','COND2');
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `feeds` ENABLE KEYS */;
-
---
--- Table structure for table `jobs`
---
-
-DROP TABLE IF EXISTS `jobs`;
-CREATE TABLE `jobs` (
- `jobid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `dg_jobid` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- `ownerid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `aclid` varchar(32) character set latin1 collate latin1_bin default NULL,
- `ps` varchar(255) NOT NULL default '',
- PRIMARY KEY (`jobid`),
- UNIQUE KEY `dg_jobid` (`dg_jobid`),
- KEY `jobid` (`jobid`),
- KEY `dg_jobid_2` (`dg_jobid`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `jobs`
---
-
-
-/*!40000 ALTER TABLE `jobs` DISABLE KEYS */;
-LOCK TABLES `jobs` WRITE;
-INSERT INTO `jobs` VALUES ('593e62a063231f8c623b74406b3e12b0','https://localhost:7846/pokus1','5864429d57da18e4ecf9ea366c6b2c9c',NULL,'http://localhost:8901'),('9276789a0093ad44457655ef03ade36a','https://localhost:7846/pokus2','9996d295b9e10ce182983b258b280779',NULL,'http://localhost:8901');
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `jobs` ENABLE KEYS */;
-
---
--- Table structure for table `users`
---
-
-DROP TABLE IF EXISTS `users`;
-CREATE TABLE `users` (
- `userid` varchar(32) character set latin1 collate latin1_bin NOT NULL default '',
- `cert_subj` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
- PRIMARY KEY (`userid`),
- UNIQUE KEY `cert_subj` (`cert_subj`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
---
--- Dumping data for table `users`
---
-
-
-/*!40000 ALTER TABLE `users` DISABLE KEYS */;
-LOCK TABLES `users` WRITE;
-INSERT INTO `users` VALUES ('5864429d57da18e4ecf9ea366c6b2c9c','/O=CESNET/O=Masaryk University/CN=Milos Mulac'),('9996d295b9e10ce182983b258b280779','OwnerName');
-UNLOCK TABLES;
-/*!40000 ALTER TABLE `users` ENABLE KEYS */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:QueryJobs xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <conditions>
- <attr>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</attr>
- <record>
- <op>EXISTS</op>
- </record>
- </conditions>
-
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:owner</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</attributes>
-
-</jpelem:QueryJobs>
+++ /dev/null
-query: using JPIS http://localhost:10000
-
-Conditions:
- http://egee.cesnet.cz/en/Schema/LB/Attributes:CE
- origin IS ANY
- value EXISTS
-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/Schema/LB/Attributes:CE
-
-OK
-Result 1 jobs:
- jobid = https://localhost:7846/pokus1, owner = /O=CESNET/O=Masaryk University/CN=Milos Mulac
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- value = Done
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- value = CertSubj
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:CE
- value = VOCE
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:QueryJobs xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <conditions>
- <attr>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attr>
- <record>
- <op>EQUAL</op>
- <value>
- <string>https://localhost:7846/pokus1</string>
- </value>
- </record>
- </conditions>
-
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:owner</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attributes>
-
-</jpelem:QueryJobs>
+++ /dev/null
-query: using JPIS http://localhost:10000
-
-Conditions:
- http://egee.cesnet.cz/en/Schema/JP/System:jobId
- origin IS ANY
- value == https://localhost:7846/pokus1
-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
-
-OK
-Result 1 jobs:
- jobid = https://localhost:7846/pokus1, owner = /O=CESNET/O=Masaryk University/CN=Milos Mulac
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- value = Done
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- value = CertSubj
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:QueryJobs xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <conditions>
- <attr>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attr>
- <origin>FILE</origin>
- <record>
- <op>EQUAL</op>
- <value>
- <string>Done</string>
- </value>
- </record>
- </conditions>
-
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:owner</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attributes>
-
-</jpelem:QueryJobs>
+++ /dev/null
-query: using JPIS http://localhost:10000
-
-Conditions:
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- origin == FILE
- value == Done
-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
-
-OK
-Result 1 jobs:
- jobid = https://localhost:7846/pokus1, owner = /O=CESNET/O=Masaryk University/CN=Milos Mulac
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- value = Done
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- value = CertSubj
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
+++ /dev/null
-#! /bin/bash
-
-#
-# test script for the index server
-#
-# requires running mysql
-#
-
-LC_ALL=C
-
-usage() {
-cat <<EOF
-
- ./run-test.sh
-
- non-default configuration is possible via following env variables:
- GLITE_LOCATION..................path to glite SW
- GLOBUS_LOCATION.................path to globus SW
- GLITE_HOST_CERT.................path to host certificate
- GLITE_HOST_KEY..................path to host key
- GLITE_JPIS_TEST_PIDFILE.........pidfile (default \`pwd\`/glite-jp-indexd.pid)
- GLITE_JPIS_TEST_LOGFILE.........logfile (default \`pwd\`/glite-jp-indexd.log)
- GLITE_JPIS_TEST_CONFIG..........config file (default \$GLITE_LOCATION/etc/
- glite-jpis-test-config.xml)
- GLITE_JPIS_TEST_PORT............index server port
- GLITE_JPIS_TEST_DB..............connection string
- (default jpis/@localhost:jpis1test,
- autocreating the database when empty)
- GLITE_JPIS_TEST_ROOT_USER.......root user for mysqladmin (default empty)
- GLITE_JPIS_TEST_ROOT_PASSWORD...root password mysqladmin (default empty)
-
-EOF
-}
-
-init() {
- # get the configuration
- GLITE_LOCATION=${GLITE_LOCATION:-"/opt/glite"}
- [ -f /etc/glite.conf ] && . /etc/glite.conf
- [ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
- [ -f $GLITE_LOCATION/etc/jpis.conf ] && . $GLITE_LOCATION/etc/jpis.conf
-
- GLOBUS_LOCATION=${GLOBUS_LOCATION:-"/opt/globus"}
-
- if [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] ;then
- X509_USER_CERT="$GLITE_HOST_CERT"
- X509_USER_KEY="$GLITE_HOST_KEY"
- fi
-
- if [ -z "$X509_USER_CERT" -o -z "$X509_USER_KEY" ] ; then
- if [ -e "$GLOBUS_LOCATION/bin/grid-proxy-info" ] ; then
- timeleft=`$GLOBUS_LOCATION/bin/grid-proxy-info 2>&1| \
- grep timeleft| sed 's/^.* //'`
- if [ "$timeleft" = "0:00:00" -o -z "$timeleft" ]; then
- echo "No valid proxy cert found nor "\
- "GLITE_HOST_KEY/GLITE_HOST_KEY specified!"\
- " Aborting."
- exit 1
- fi
- else
- echo "Can't check proxy cert (grid-proxy-info not found). If you do not have valid proxy certificate, set GLITE_HOST_KEY/GLITE_HOST_KEY - otherwise tests will fail!"
- fi
- fi
-
- # handle the configuration
- ARGS="-u ${GLITE_JPIS_TEST_ROOT_USER:-root}"
- [ -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"}
- GLITE_JPIS_TEST_CONFIG=${GLITE_JPIS_TEST_CONFIG:-"$GLITE_LOCATION/etc/glite-jpis-test-config.xml"}
-
- if [ -z "$GLITE_JPIS_TEST_DB" ]; then
- GLITE_JPIS_TEST_DB="jpis/@localhost:jpis1test"
- need_new_db=1;
- fi
- DB_USER=`echo $GLITE_JPIS_TEST_DB| sed 's!/.*$!!'`
- DB_HOST=`echo $GLITE_JPIS_TEST_DB| sed 's!^.*@!!' | sed 's!:.*!!'`
- DB_NAME=`echo $GLITE_JPIS_TEST_DB| sed 's!^.*:!!'`
-
- GLITE_JPIS_DEBUG=0
-}
-
-create_db() {
- # create database when needed
- 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 -u $DB_USER $DB_NAME < $GLITE_LOCATION/etc/glite-jp-index-dbsetup.sql || exit 1
- db_created="1"
- fi
-}
-
-import_db() {
- # import database
- echo -n "D"
- cat $1 | sed "s/jpis1test/$DB_NAME/" | mysql -u $DB_USER -h $DB_HOST
- if [ x"$?" != x"0" ]; then
- echo "FAILED to import database."
- kill_is;
- drop_db;
- exit 1
- fi
- echo -n "B "
-}
-
-drop_db() {
- # drop databaze when created
- [ -z "$db_created" ] || mysqladmin -f $ARGS drop $DB_NAME >/dev/null
-
-}
-
-run_is() {
- # check
- if [ -f "${GLITE_JPIS_TEST_PIDFILE}" ]; then
- echo "Index server already running!"
- echo " pid $(cat ${GLITE_JPIS_TEST_PIDFILE})"
- echo " pidfile ${GLITE_JPIS_TEST_PIDFILE}"
- exit 1
- fi
-
- echo -n "I"
- # run index server
- #valgrind --tool=memcheck --trace-children=yes --num-callers=15 --suppressions=$HOME/egee.supp
- X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
- $GLITE_LOCATION/bin/glite-jp-indexd -m $GLITE_JPIS_TEST_DB -p $GLITE_JPIS_TEST_PORT \
- -i ${GLITE_JPIS_TEST_PIDFILE} -o ${GLITE_JPIS_TEST_LOGFILE} \
- -x ${GLITE_JPIS_TEST_CONFIG} $1\
- 2>/tmp/result
-
- if [ x"$?" != x"0" ]; then
- echo FAILED
- drop_db;
- exit 1
- fi
- i=0
- while [ ! -s "${GLITE_JPIS_TEST_PIDFILE}" -a $i -lt 20 ]; do
- sleep 0.1
- i=$(($i+1))
- done
- if [ ! -s "${GLITE_JPIS_TEST_PIDFILE}" ]; then
- echo "Can't startup index server."
- kill_is;
- drop_db;
- exit 1
- fi
-
- # wait for index server
- ret=1
- i=0
- while [ x"$ret" != x"0" -a $i -lt 20 ]; do
- netstat -tapn 2>/dev/null | grep "\<$GLITE_JPIS_TEST_PORT\>" > /dev/null
- ret=$?
- i=$(($i+1))
- sleep 0.1
- done
- if [ x"$ret" != x"0" ]; then
- echo "Index server not started."
- kill_is;
- drop_db;
- exit 1;
- fi
- echo -n "S "
- sleep 1
-}
-
-kill_is() {
- # kill the index server
- kill `cat ${GLITE_JPIS_TEST_PIDFILE}`;
- sleep 1;
- kill -9 `cat ${GLITE_JPIS_TEST_PIDFILE}` 2>/dev/null
- rm -f ${GLITE_JPIS_TEST_PIDFILE}
-}
-
-run_test_query() {
- echo -n "Q"
- X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
- $GLITE_LOCATION/examples/glite-jpis-client -f hr -q $1 \
- -i http://localhost:$GLITE_JPIS_TEST_PORT > /tmp/result 2>&1
- echo -n "R "
- DIFF=`diff -b -B --ignore-matching-lines="query: using JPIS" $2 /tmp/result`
- if [ -z "$DIFF" -a "$?" -eq "0" ] ; then
- echo "OK."
- rm /tmp/result
- else
- echo "FAILED!"
- echo
- 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
- fi
-}
-
-run_test_feed() {
- # run the example
- X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT}\
- $GLITE_LOCATION/examples/glite-jpis-test -p $GLITE_JPIS_TEST_PORT \
- -m $GLITE_JPIS_TEST_DB -x $GLITE_JPIS_TEST_CONFIG &>/tmp/result
- numok="$(cat /tmp/result | grep -c OK)"
- if [ "$numok" -eq "2" ]; then
- echo OK.
- else
- echo FAILED!
- echo ---------------------------------------------------------------------------------------------------
- echo
- echo "Obtained result (in /tmp/result):"
- echo ---------------------------------
- cat /tmp/result
- echo
- echo ---------------------------------------------------------------------------------------------------
- drop_db;
- kill_is;
- exit 1
- fi
-}
-
-
-##########################################################################
-#
-
-if [ "$1" ]; then usage; exit 1; fi
-init;
-
-echo
-
-echo -n "Simple query test.... "
-create_db;
-run_is "-n";
-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/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;
-
-echo -n "Feed & query test.... "
-create_db;
-run_is;
-run_test_feed;
-drop_db;
-kill_is;
-
-echo -n "Authz test........... "
-create_db;
-run_is;
-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;
-
-echo -n "Query jobId test..... "
-create_db;
-run_is "-n";
-import_db $GLITE_LOCATION/examples/query-tests/dump1.sql;
-run_test_query $GLITE_LOCATION/examples/query-tests/jobid_query.in $GLITE_LOCATION/examples/query-tests/jobid_query.out;
-drop_db;
-kill_is;
-
-echo -n "Origin test.......... "
-create_db;
-run_is "-n";
-import_db $GLITE_LOCATION/examples/query-tests/dump1.sql;
-run_test_query $GLITE_LOCATION/examples/query-tests/origin_query.in $GLITE_LOCATION/examples/query-tests/origin_query.out;
-drop_db;
-kill_is;
-
-echo -n "EXISTS test.......... "
-create_db;
-run_is "-n";
-import_db $GLITE_LOCATION/examples/query-tests/dump1.sql;
-run_test_query $GLITE_LOCATION/examples/query-tests/exists_query.in $GLITE_LOCATION/examples/query-tests/exists_query.out;
-drop_db;
-kill_is;
-
-echo -n "WITHIN test.......... "
-create_db;
-run_is "-n";
-import_db $GLITE_LOCATION/examples/query-tests/dump1.sql;
-run_test_query $GLITE_LOCATION/examples/query-tests/within_query.in $GLITE_LOCATION/examples/query-tests/within_query.out;
-drop_db;
-kill_is;
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:QueryJobs xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <conditions>
- <attr>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attr>
- <record>
- <op>EQUAL</op>
- <value>
- <string>Ready</string>
- </value>
- </record>
- </conditions>
-
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:owner</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attributes>
-
-</jpelem:QueryJobs>
+++ /dev/null
-query: using JPIS http://localhost:10000
-
-Conditions:
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- origin IS ANY
- value == Ready
-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
-
-OK
-Result 1 jobs:
- jobid = https://localhost:7846/pokus2, owner = OwnerName
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- value = Ready
- origin = SYSTEM (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- value = CertSubj
- origin = SYSTEM (no detail)
- time = Thu Jan 1 02:00:01 1970
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpelem:QueryJobs xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jptype="http://glite.org/wsdl/types/jp" xmlns:jpsrv="http://glite.org/wsdl/services/jp" xmlns:jpelem="http://glite.org/wsdl/elements/jp">
-
- <conditions>
- <attr>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</attr>
- <record>
- <op>WITHIN</op>
- <value><string>VOCA</string></value>
- <value2><string>VOCI</string></value2>
- </record>
- </conditions>
-
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:owner</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/JP/System:jobId</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</attributes>
- <attributes>http://egee.cesnet.cz/en/Schema/LB/Attributes:CE</attributes>
-
-</jpelem:QueryJobs>
+++ /dev/null
-query: using JPIS http://localhost:12002
-
-Conditions:
- http://egee.cesnet.cz/en/Schema/LB/Attributes:CE
- origin IS ANY
- value WITHIN VOCA AND VOCI
-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/Schema/LB/Attributes:CE
-
-OK
-Result 1 jobs:
- jobid = https://localhost:7846/pokus1, owner = /O=CESNET/O=Masaryk University/CN=Milos Mulac
- http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- value = Done
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- value = CertSubj
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
- http://egee.cesnet.cz/en/Schema/LB/Attributes:CE
- value = VOCE
- origin = FILE (no detail)
- time = Thu Jan 1 02:00:01 1970
+++ /dev/null
-<?xml version="1.0"?>
-
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:jpt="http://glite.org/wsdl/types/jp"
- targetNamespace="http://glite.org/xsd/types/jpisclient"
-elementFormDefault="unqualified" attributeFormDefault="unqualified">
-
-<xsd:import namespace="http://glite.org/wsdl/types/jp"
- schemaLocation="JobProvenanceTypes.xsd"/>
-
-<xsd:element name="QueryJobs">
- <xsd:complexType mixed="true">
- <xsd:sequence>
- <xsd:element name="conditions" type="jpt:indexQuery" minOccurs="1" maxOccurs="unbounded"/>
- <xsd:element name="attributes" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-</xsd:element>
-
-<xsd:element name="QueryJobsResponse">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element name="jobs" type="jpt:jobRecord" minOccurs="1" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-</xsd:element>
-
-</xsd:schema>
+++ /dev/null
-#Fri Oct 14 15:22:37 CEST 2005
-module.build=12
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Configuration options for the gLite JP Index module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- 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
- - ares clean up (now should be mentioned only in modules that really need it)
- - patch for security.gsoap-plugin not yet in CVS (sent to interation list)
- I do not know what will happen when one try to mix ares with c-ares libs
- => weird things may arise!
-
- Revision 1.5 2005/10/11 20:45:45 akrenek
- - detect gsoap stuff
- - install what should be installed
-
- Revision 1.4 2005/08/12 10:56:25 mmulac
- void IS server
- - seems compiling
-
- Revision 1.3 2004/12/01 18:45:38 zsalvet
- *** empty log message ***
-
- Revision 1.2 2004/11/22 14:00:37 dimeglio
- Updated to use standard files
- Fixed names (was using common instead of real module name)
-
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="JP Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-gsoap_prefix=${with.gsoap.prefix}
-gsoap_version=${ext.gsoap.version}
-mysql_prefix=${with.mysql.prefix}
-mysql_version=${ext.mysql.version}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-cppunit=${with.cppunit.prefix}
-jpproject=${subsystem.project.dir}
-project=${component.project.dir}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP Index component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
-<project name="JP Index component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="index" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-# $Header$
-module.version=1.3.1
-module.age=1
+++ /dev/null
-#include <stdio.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <unistd.h>
-#include <time.h>
-
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-
-#include <glite/lbu/srvbones.h>
-
-#include <stdsoap2.h>
-#include <glite/security/glite_gss.h>
-#include <glite/security/glite_gsplugin.h>
-
-#include "conf.h"
-#include "db_ops.h"
-#include "soap_ps_calls.h"
-#include "context.h"
-#include "common.h"
-
-#include "soap_version.h"
-#include "jp_H.h"
-#include "jp_.nsmap"
-
-#if GSOAP_VERSION <= 20602
-#define soap_call___jpsrv__FeedIndex soap_call___ns1__FeedIndex
-#define soap_call___jpsrv__FeedIndexRefresh soap_call___ns1__FeedIndexRefresh
-#endif
-
-#define CONN_QUEUE 20
-#define MAX_SLAVES_NUM 20 // max. of slaves to be spawned
-#define USER_QUERY_SLAVES_NUM 2 // # of slaves reserved for user queries if
- // # PS to conntact is << MAX_SLAVES_NUM
-
-#define RECONNECT_TIME 60*20 // when try reconnect to PS in case of error (in sec)
-#define RECONNECT_TIME_QUICK 1 // time between feed requests
-#define REACTION_TIME 60*2 // when try reconnect to PS in case of new feeds (in sec)
-#define LAUNCH_TIME 2 // wait (for starting slaves) before requesting feeds
-
-
-extern SOAP_NMAC struct Namespace jp__namespaces[],jpps__namespaces[];
-
-int newconn(int,struct timeval *,void *);
-int request(int,struct timeval *,void *);
-static int reject(int);
-static int disconn(int,struct timeval *,void *);
-int data_init(void **data);
-#ifndef ONETIME_FEEDS
-int feed_loop_slave(void);
-#endif
-
-
-static struct glite_srvbones_service stab = {
- "JP Index Server", -1, newconn, request, reject, disconn
-};
-
-static time_t cert_mtime;
-static char *server_cert, *server_key, *cadir;
-static edg_wll_GssCred mycred = NULL;
-
-static char *port = GLITE_JPIS_DEFAULT_PORT_STR;
-static int debug = 1;
-
-static glite_jp_context_t ctx;
-static glite_jp_is_conf *conf; // Let's make configuration visible to all slaves
-
-
-int main(int argc, char *argv[])
-{
- int one = 1, nfeeds;
- edg_wll_GssStatus gss_code;
- struct sockaddr_in a;
- glite_jpis_context_t isctx;
- int retval = 0;
- char *err;
- int i;
-
- glite_jp_init_context(&ctx);
-
- if (glite_jp_get_conf(argc, argv, &conf)) {
- glite_jp_free_context(ctx);
- exit(1);
- }
- glite_jpis_init_context(&isctx, ctx, conf);
-
- /* connect to DB */
- if (glite_jpis_init_db(isctx) != 0) {
- fprintf(stderr, "Connect DB failed: %s (%s)\n", ctx->error->desc, ctx->error->source);
- glite_jpis_free_context(isctx);
- glite_jp_free_context(ctx);
- glite_jp_free_conf(conf);
- return 1;
- }
-
- /* daemonize */
- if (!conf->debug) glite_srvbones_daemonize("glite-jp-indexd", conf->pidfile, conf->logfile);
-
- /* load plugins */
- for (i=0; conf->plugins[i]; i++)
- glite_jp_typeplugin_load(ctx,conf->plugins[i]);
-
- if (conf->delete_db) {
- if (glite_jpis_dropDatabase(isctx) != 0) {
- fprintf(stderr, "Drop DB failed: ");
- retval = 1;
- goto quit;
- }
- }
-
- if (glite_jpis_initDatabase(isctx) != 0) {
- fprintf(stderr, "Init DB failed: ");
- retval = 1;
- goto quit;
- }
-
- if (conf->delete_db || conf->force_feed) {
- if (glite_jpis_initDatabaseFeeds(isctx) != 0) {
- fprintf(stderr, "Init feeds failed: ");
- retval = 1;
- goto quit;
- }
- }
-
- server_cert = conf->server_cert;
- server_key = conf->server_key;
-
- if (!server_cert || !server_key)
- fprintf(stderr, "%s: WARNING: key or certificate file not specified, "
- "can't watch them for changes\n",
- argv[0]);
-
- if ( cadir ) setenv("X509_CERT_DIR", cadir, 1);
- edg_wll_gss_watch_creds(server_cert, &cert_mtime);
-
- if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &mycred, &gss_code))
- fprintf(stderr,"Server identity: %s\n",mycred ? mycred->name : "NULL");
- else fputs("WARNING: Running unauthenticated\n",stderr);
-
- if (conf->feeding) {
- fprintf(stderr, "%s: Feeding from '%s'\n", argv[0], conf->feeding);
- retval = glite_jpis_feeding(isctx, conf->feeding, mycred ? mycred->name : NULL);
- goto quit;
- }
-
- stab.conn = socket(PF_INET, SOCK_STREAM, 0);
- if (stab.conn < 0) {
- perror("socket");
- return 1;
- }
-
- setsockopt(stab.conn,SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-
- if (conf->port) port = conf->port;
- a.sin_family = AF_INET;
- a.sin_addr.s_addr = INADDR_ANY;
- a.sin_port = htons(atoi(port));
- if (bind(stab.conn,(struct sockaddr *) &a, sizeof(a)) ) {
- char buf[200];
-
- snprintf(buf,sizeof(buf),"bind(%d)",atoi(port));
- perror(buf);
- return 1;
- }
-
- if (listen(stab.conn,CONN_QUEUE)) {
- perror("listen()");
- return 1;
- }
-
- // XXX: more tests needed
- if (conf->feeds)
- for (nfeeds=0; conf->feeds[nfeeds]; nfeeds++);
- else nfeeds = 0;
- if (conf->slaves <= 0) {
- // add some slaves for user queries and PS responses
- conf->slaves = nfeeds + (USER_QUERY_SLAVES_NUM - 1);
- if (conf->slaves > MAX_SLAVES_NUM) conf->slaves = MAX_SLAVES_NUM;
- }
- //
- // SUM(PS, feeds(PS) - slaves(PS)) slaves would be blocked
- // when waited for all PS
- //
- // wild guess for slaves(PS) == 1 on all PS:
- // 1 + SUM(PS, feeds(PS) - 1) slaves is required,
- // SUM(PS, feeds(PS)) is enough.
- //
- if (conf->slaves < nfeeds) {
- fprintf(stderr, "WARNING: %d slaves can be too low for %d feeds\n", conf->slaves, nfeeds);
- }
- glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT, conf->slaves);
-#ifndef ONETIME_FEEDS
- if (feed_loop_slave() < 0) {
- fprintf(stderr, "forking feed_loop_slave failed!\n");
- } else
-#endif
- glite_srvbones_run(data_init,&stab,1 /* XXX: entries in stab */,debug);
-
-quit:
- if (isctx->jpctx->error) {
- err = glite_jp_error_chain(isctx->jpctx);
- fprintf(stderr, "%s: %s\n", argv[0], err);
- free(err);
- }
-
- glite_jpis_free_db(isctx);
- glite_jp_free_conf(conf);
- glite_jpis_free_context(isctx);
- glite_jp_free_context(ctx);
-
- return retval;
-}
-
-
-static int get_soap(struct soap *soap, glite_jpis_context_t ctx) {
- glite_gsplugin_Context plugin_ctx;
-
- glite_gsplugin_init_context(&plugin_ctx);
-
- soap_init(soap);
- soap_set_namespaces(soap, jp__namespaces);
- soap_set_omode(soap, SOAP_IO_BUFFER); // set buffered response
- // buffer set to SOAP_BUFLEN (default = 8k)
- if (soap_register_plugin_arg(soap,glite_gsplugin,plugin_ctx))
- return glite_jpis_stack_error(ctx->jpctx, EIO, "can't register gsoap plugin");
-
- return 0;
-}
-
-
-/* looking for some feed in DB */
-static int feed_caller(struct soap *soap, glite_jpis_context_t isctx) {
- char *PS_URL, *feedid, *errs;
- long int uniqueid;
- int i, ok, ret, status, initialized, result = 0;
-
- // dirty hack - try quicker several times first
- glite_jp_clear_error(isctx->jpctx);
-
- feedid = NULL;
- for (initialized = 0; initialized <= 1; initialized++) {
- switch (glite_jpis_lockSearchFeed(isctx,initialized,&uniqueid,&PS_URL,&status,&feedid)) {
- case 0:
- // some locked feeds found
- ok = 0;
- for (i = 0; i < 10; i++) {
- if (!initialized) {
- // contact PS server, ask for data, save
- // feedId and expiration to DB and unlock the feed
- ret = MyFeedIndex(soap, isctx, uniqueid, PS_URL);
- } else {
- ret = MyFeedRefresh(soap, isctx, uniqueid, PS_URL, status, feedid);
- }
- if (ret) {
- // error when connecting to PS
- errs = glite_jp_error_chain(isctx->jpctx);
- printf("[%d] %s: %s, reconnecting later\n", getpid(), __FUNCTION__, errs);
- free(errs);
- } else {
- lprintf("%s %s (%ld) ok\n", initialized ? "refresh" : "init", feedid, uniqueid);
- ok = 1;
- break;
- }
- }
- if (!ok) {
- // when unintialized feed: always reconnect
- // when not refreshed feed: reconnect only once and two times quicker
- if (!initialized || (status & GLITE_JP_IS_STATE_ERROR) == 0) {
- lprintf("reconnecting %s (%ld)\n", feedid, uniqueid);
- glite_jpis_tryReconnectFeed(isctx, uniqueid, time(NULL) + RECONNECT_TIME / (initialized + 1), status | GLITE_JP_IS_STATE_ERROR);
- } else {
- lprintf("destroying %s (%ld)\n", feedid, uniqueid);
- glite_jpis_destroyTryReconnectFeed(isctx, uniqueid, time(NULL) - 1);
- }
- }
- free(PS_URL); PS_URL = NULL;
- free(feedid); feedid = NULL;
-
- sleep(RECONNECT_TIME_QUICK);
-
- result = 1;
- break;
- case ENOENT:
- // no more feeds to initialize
- break;
- default:
- // error during locking
- printf("[%d] %s: Locking error: ", getpid(), __FUNCTION__);
- if (isctx->jpctx->error) {
- errs = glite_jp_error_chain(isctx->jpctx);
- printf("%s\n", errs);
- free(errs);
- } else printf("(no detail)\n");
- return -1;
- }
- }
-
- return result;
-}
-
-
-#ifndef ONETIME_FEEDS
-int feed_loop_slave(void) {
- pid_t pid;
- glite_jpis_context_t isctx;
- struct soap soap;
- char *errs;
-
- if ( (pid = fork()) ) return pid;
-
- glite_jpis_init_context(&isctx, ctx, conf);
- if (glite_jpis_init_db(isctx) != 0) {
- printf("[%d] %s: DB error: %s (%s)\n", getpid(), __FUNCTION__, ctx->error->desc, ctx->error->source);
- exit(1);
- }
-
- if (get_soap(&soap, isctx) != 0) {
- printf("[%d] %s: ", getpid(), __FUNCTION__);
- if (isctx->jpctx->error) {
- errs = glite_jp_error_chain(isctx->jpctx);
- printf("%s\n", errs);
- free(errs);
- } else printf("(no detail)\n");
- exit(1);
- }
-
- printf("[%d] %s: waiting before feed requests...\n", getpid(), __FUNCTION__);
- sleep(LAUNCH_TIME);
- printf("[%d] %s: feeder slave started\n", getpid(), __FUNCTION__);
- do {
- switch (feed_caller(&soap, isctx)) {
- case 1: break;
- case 0:
- sleep(REACTION_TIME);
- break;
- default:
- if (isctx->jpctx->error) {
- errs = glite_jp_error_chain(isctx->jpctx);
- printf("[%d] %s: %s\n", getpid(), __FUNCTION__, errs);
- free(errs);
- }
- printf("[%d] %s: feed locking error, slave terminated\n", getpid(), __FUNCTION__);
- exit(1);
- }
- } while (1);
-
- printf("[%d] %s: slave terminated\n", getpid(), __FUNCTION__);
- exit(0);
-}
-#endif
-
-
-/* slave's init comes here */
-int data_init(void **data)
-{
- slave_data_t *private;
-
- private = calloc(sizeof(*private), 1);
- glite_jpis_init_context(&private->ctx, ctx, conf);
- if (glite_jpis_init_db(private->ctx) != 0) {
- printf("[%d] slave_init(): DB error: %s (%s)\n",getpid(),ctx->error->desc,ctx->error->source);
- return -1;
- }
-
- printf("[%d] slave started\n",getpid());
- private->soap = soap_new();
-
-#if ONETIME_FEEDS
- if (get_soap(private->soap, ctx) != 0) {
- printf("[%d] %s: ", getpid(), __FUNCTION__);
- if (isctx->jpctx->error) {
- errs = glite_jp_error_chain(ctx->jpctx);
- printf("%s\n", errs);
- free(errs);
- } else printf("(no error)\n");
- exit(1);
- }
-
- /* ask PS server for data */
- do {
- switch (feed_caller(private->soap, private->ctx)) {
- case 1:
- // one feed handled
- break;
- case 0:
- // no more feeds to initialize
- *data = (void *) private;
- return 0;
- default:
- // error during locking
- glite_jpis_free_db(private->ctx);
- glite_jpis_free_context(private->ctx);
- return -1;
- }
- } while (1);
-#else
- *data = (void *) private;
- return 0;
-#endif
-}
-
-
-int newconn(int conn,struct timeval *to,void *data)
-{
- slave_data_t *private = (slave_data_t *)data;
- struct soap *soap = private->soap;
- glite_jp_context_t ctx = private->ctx->jpctx;
- glite_gsplugin_Context plugin_ctx;
-
- edg_wll_GssCred newcred = NULL;
- edg_wll_GssStatus gss_code;
- int ret = 0;
- edg_wll_GssPrincipal client = NULL;
- edg_wll_GssConnection connection;
-
-
- soap_init2(soap,SOAP_IO_KEEPALIVE,SOAP_IO_KEEPALIVE);
- soap_set_omode(soap, SOAP_IO_BUFFER); // set buffered response
- // buffer set to SOAP_BUFLEN (default = 8k)
- soap_set_namespaces(soap,jp__namespaces);
- soap->user = (void *) private;
-
- switch (edg_wll_gss_watch_creds(server_cert,&cert_mtime)) {
- case 0: break;
- case 1: if (!edg_wll_gss_acquire_cred_gsi(server_cert,server_key,
- &newcred,&gss_code))
- {
-
- printf("[%d] reloading credentials\n",getpid()); /* XXX: log */
- edg_wll_gss_release_cred(&mycred, NULL);
- mycred = newcred;
- }
- break;
- case -1:
- printf("[%d] edg_wll_gss_watch_creds failed\n", getpid()); /* XXX: log */
- break;
- }
-
- /* TODO: DNS paranoia etc. */
- memset(&connection, 0, sizeof(connection));
- if (edg_wll_gss_accept(mycred,conn,to,&connection,&gss_code)) {
- char *et;
-
- edg_wll_gss_get_error(&gss_code,"",&et);
-
- fprintf(stderr,"[%d] GSS connection accept failed: %s\nClosing connection.\n",getpid(),et);
- free(et);
- ret = 1;
- soap_end(soap);
- return 1;
- }
-
- ret = edg_wll_gss_get_client_conn(&connection, &client, NULL);
-
- if (ctx->peer) free(ctx->peer);
- if (ret || client->flags & EDG_WLL_GSS_FLAG_ANON) {
- printf("[%d] annonymous client\n",getpid());
- ctx->peer = NULL;
- }
- else {
- printf("[%d] client DN: %s\n",getpid(),client->name); /* XXX: log */
-
- ctx->peer = strdup(client->name);
- edg_wll_gss_free_princ(client);
- }
-
- glite_gsplugin_init_context(&plugin_ctx);
- glite_gsplugin_set_connection(plugin_ctx, &connection);
- soap_register_plugin_arg(soap,glite_gsplugin,plugin_ctx);
-
- return 0;
-}
-
-int request(int conn UNUSED,struct timeval *to,void *data)
-{
- slave_data_t *private = (slave_data_t *)data;
- struct soap *soap = private->soap;
- glite_jp_context_t ctx = private->ctx->jpctx;
-
- glite_gsplugin_set_timeout(glite_gsplugin_get_context(soap),to);
-
- soap->max_keep_alive = 1; /* XXX: prevent gsoap to close connection */
- soap_begin(soap);
- if (soap_begin_recv(soap)) {
- if (soap->error < SOAP_STOP) {
- soap_send_fault(soap);
- return EIO;
- }
- return ENOTCONN;
- }
-
- soap->keep_alive = 1;
- if (soap_envelope_begin_in(soap)
- || soap_recv_header(soap)
- || soap_body_begin_in(soap)
- || jp__serve_request(soap)
-#if GSOAP_VERSION >= 20700
- || (soap->fserveloop && soap->fserveloop(soap))
-#endif
- )
- {
- soap_send_fault(soap); // sets soap->keep_alive back to 0 :(
- // and closes connection
- if (ctx->error) {
- /* XXX: shall we die on some errors? */
- int err = ctx->error->code;
- glite_jp_clear_error(ctx);
- return err == EIO ? -err : err; /* EIO is fatal */
- }
-
- return ECANCELED; // let srv_bones know something is wrong
- }
-
- glite_jp_run_deferred(ctx);
- return ENOTCONN;
-}
-
-static int reject(int conn)
-{
- int flags = fcntl(conn, F_GETFL, 0);
-
- fcntl(conn,F_SETFL,flags | O_NONBLOCK);
- edg_wll_gss_reject(conn);
-
- return 0;
-}
-
-static int disconn(int conn UNUSED,struct timeval *to UNUSED,void *data)
-{
- slave_data_t *private = (slave_data_t *)data;
- struct soap *soap = private->soap;
-
-// XXX: belongs to "data_init complement"
-// glite_jpis_free_db(private->ctx);
-// glite_jpis_free_context(private->ctx);
- soap_end(soap); // clean up everything and close socket
-
- return 0;
-}
-
-
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdsoap2.h>
-
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-
-#include "common.h"
-
-#define WHITE_SPACE_SET "\n\r \t"
-
-
-void glite_jpis_trim(char *str) {
- size_t pos, len;
-
- if (!str) return;
-
- pos = strspn(str, WHITE_SPACE_SET);
- len = strcspn(str + pos, WHITE_SPACE_SET);
- if (pos) memmove(str, str + pos, len);
- str[len] = '\0';
-}
-
-
-int glite_jpis_stack_error_source(glite_jp_context_t ctx, int code, const char *func, int line, const char *descfmt, ...) {
- glite_jp_error_t err;
- char *source, *desc;
- va_list ap;
-
- va_start(ap, descfmt);
-
- asprintf(&source, "%s:%d", func, line);
- if (descfmt) vasprintf(&desc, descfmt, ap);
- else desc = NULL;
- memset(&err, 0, sizeof err);
- err.code = code;
- err.desc = desc;
- err.source = source;
- glite_jp_stack_error(ctx, &err);
- free(source);
- free(desc);
-
- va_end(ap);
- return code;
-}
-
-
-int glite_jpis_find_attr(char **attrs, const char *attr){
- size_t i;
-
- i = 0;
- while (attrs[i]) {
- if (strcasecmp(attr, attrs[i]) == 0) return 1;
- i++;
- }
- return 0;
-}
+++ /dev/null
-#ident "$Header$"
-
-#ifndef GLITE_JPIS_COMMON_H
-#define GLITE_JPIS_COMMON_H
-
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-
-void glite_jpis_trim(char *str);
-
-int glite_jpis_stack_error_source(glite_jp_context_t ctx, int code, const char *func, int line, const char *desc, ...);
-
-#define glite_jpis_stack_error(CTX, CODE, DESCFMT...) glite_jpis_stack_error_source((CTX), (CODE), __FUNCTION__, __LINE__, ##DESCFMT);
-
-int glite_jp_typeplugin_load(glite_jp_context_t ctx,const char *so);
-
-int glite_jpis_find_attr(char **attrs, const char *attr);
-
-#endif
+++ /dev/null
-/* Module for obtaining configuration for Index Server */
-
-#ident "$Header$"
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <getopt.h>
-#include <unistd.h>
-
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-#include "soap_version.h"
-#include <glite/security/glite_gscompat.h>
-
-#include "conf.h"
-#include "db_ops.h"
-#include "ws_is_typeref.h"
-
-#include <glite/jp/ws_fault.c>
-
-
-extern SOAP_NMAC struct Namespace jp__namespaces[];
-
-static const char *get_opt_string = "dq:c:k:C:V:nm:p:i:o:x:s:Df:F";
-
-static struct option opts[] = {
- {"debug", 0, NULL, 'd'},
- {"query-type", 1, NULL, 'q'},
- {"cert", 1, NULL, 'c'},
- {"key", 1, NULL, 'k'},
-// {"CAdir", 1, NULL, 'C'},
-// {"VOMSdir", 1, NULL, 'V'},
- {"noauth", 0, NULL, 'n'},
- {"mysql", 1, NULL, 'm'},
- {"port", 1, NULL, 'p'},
- {"pidfile", 1, NULL, 'i'},
- {"logfile", 1, NULL, 'o'},
- {"config", 1, NULL, 'x'},
- {"slaves", 1, NULL, 's'},
- {"delete-db", 0, NULL, 'D'},
- {"feeding", 1, NULL, 'f'},
- {"force-feed", 0, NULL, 'F'},
- {NULL, 0, NULL, 0}
-};
-
-static int read_conf(glite_jp_is_conf *conf, char *conf_file);
-#if 0
-static int dump_conf(void);
-#endif
-
-static void usage(char *me)
-{
- fprintf(stderr,"usage: %s [option]\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"
- "\t-c, --cert\t certificate file\n"
-// "\t-C, --CAdir\t trusted certificates directory\n"
-// "\t-V, --VOMSdir\t trusted VOMS servers certificates directory\n"
- "\t-n, --noauth\t don't check user identity with result owner\n"
- "\t-m, --mysql\t database connect string\n"
- "\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"
- "\t-s, --slaves\t number of slaves for responses\n"
- "\t-D, --delete-db\t delete and restore data in the database\n"
- "\t-f, --feeding\t feed index server from local file\n"
- "\t-F, --force-feed\t force reloading feeds from the config file\n"
- "\n"
- ,me);
-}
-
-
-int glite_jp_get_conf(int argc, char **argv, glite_jp_is_conf **configuration)
-{
- char *qt = NULL, *conf_file = NULL;
- int opt;
- glite_jp_is_conf *conf;
-
-
- conf = calloc(1, sizeof(*conf));
-
- while ((opt = getopt_long(argc,argv,get_opt_string,opts,NULL)) != EOF) switch (opt) {
- case 'd': conf->debug = 1; break;
- case 'q': qt = optarg; break;
- case 'c': conf->server_cert = optarg; break;
- case 'k': conf->server_key = optarg; break;
-// case 'C': cadir = optarg; break;
-// case 'V': vomsdir = optarg; break;
- case 'n': conf->no_auth = 1; break;
- case 'm': conf->cs = optarg; break;
- case 'p': conf->port = optarg; break;
- case 'i': conf->pidfile = optarg; break;
- case 'o': conf->logfile = optarg; break;
- case 'x': conf_file = optarg; break;
- case 's': conf->slaves = atoi(optarg); if (conf->slaves > 0) break;
- case 'D': conf->delete_db = 1; break;
- case 'f': conf->feeding = optarg; break;
- case 'F': conf->force_feed = 1; break;
- default : usage(argv[0]); exit(0); break;
- }
-
- if (!conf->cs) {
- fprintf(stderr,"DB contact string not specified! "\
- "Using build-in default: %s \n", GLITE_JP_IS_DEFAULTCS);
- }
- if (!conf->port) {
- fprintf(stderr,"JP IS port not specified! "\
- "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;
- }
- else {
- if (read_conf(conf, conf_file) != 0) return 1;
- }
-
- *configuration = conf;
-
- return 0;
-}
-
-
-void glite_jp_free_conf(glite_jp_is_conf *conf)
-{
- size_t i, j;
- glite_jp_is_feed *feed;
-
- if (!conf) return;
-
- if (conf->attrs) for (i = 0; conf->attrs[i]; i++) free(conf->attrs[i]);
- if (conf->indexed_attrs) for (i = 0; conf->indexed_attrs[i]; i++) free(conf->indexed_attrs[i]);
- if (conf->multival_attrs) for (i = 0; conf->multival_attrs[i]; i++) free(conf->multival_attrs[i]);
- if (conf->queriable_attrs) for (i = 0; conf->queriable_attrs[i]; i++) free(conf->queriable_attrs[i]);
- if (conf->feeds) for (i = 0; conf->feeds[i]; i++) {
- feed = conf->feeds[i];
- free(feed->PS_URL);
- for (j = 0; feed->query[j].attr; j++) glite_jp_free_query_rec(&feed->query[j]);
- free(feed->query);
- free(feed);
- }
- free(conf->attrs);
- free(conf->indexed_attrs);
- free(conf->multival_attrs);
- free(conf->queriable_attrs);
- free(conf->plugins);
- free(conf->feeds);
- free(conf);
-}
-
-
-void glite_jp_lprintf(const char *source, const char *fmt, ...) {
- va_list ap;
-
- printf("[%d] %s: ", getpid(), source);
- va_start(ap, 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, jp__namespaces);
-
- soap_begin(&soap);
- soap.recvfd = fd;
- soap_begin_recv(&soap);
- memset(&out, 0, sizeof(out));
-
- soap_default__jpelem__ServerConfigurationResponse(&soap, &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));
- conf->multival_attrs = calloc(1, sizeof(*conf->multival_attrs));
- conf->queriable_attrs = calloc(1, sizeof(*conf->queriable_attrs));
- int mva = 0;
- int qa = 0;
- for (i=0; i < out.__sizeattrs; i++) {
- struct jptype__attrType *attr;
- attr = GLITE_SECURITY_GSOAP_LIST_GET(out.attrs, i);
- conf->attrs[i] = strdup(attr->name);
- if (attr->multival == jptype__yesNo__YES){
- conf->multival_attrs = realloc(conf->multival_attrs, (mva+2)*sizeof(*conf->multival_attrs));
- conf->multival_attrs[mva] = strdup(attr->name);
- conf->multival_attrs[++mva] = NULL;
- }
- if (attr->queriable == jptype__yesNo__YES){
- conf->queriable_attrs = realloc(conf->queriable_attrs, (qa+2)*sizeof(*conf->queriable_attrs));
- conf->queriable_attrs[qa] = strdup(attr->name);
- conf->queriable_attrs[++qa] = NULL;
- }
- }
- }
- 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++) {
- struct jptype__feedSession *feed;
-
- feed = GLITE_SECURITY_GSOAP_LIST_GET(out.feeds, i);
- conf->feeds[i] = calloc(1, sizeof(*conf->feeds[i]));
- conf->feeds[i]->PS_URL=strdup(feed->primaryServer);
-
- if (glite_jpis_SoapToPrimaryQueryConds(feed->__sizecondition,
- feed->condition, &conf->feeds[i]->query)) return EINVAL;
-
- conf->feeds[i]->history = feed->history;
- conf->feeds[i]->continuous = feed->continuous;
- conf->feeds[i]->uniqueid = -1;
- }
- }
-
- soap_destroy(&soap);
- soap_end(&soap);
- soap_done(&soap);
-
- return 0;
-}
-
-#if 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;
- struct jptype__feedSession *feed;
- struct jptype__primaryQuery *cond;
-
- soap_init(&soap);
- soap_set_namespaces(&soap, jp__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");
-
- GLITE_SECURITY_GSOAP_LIST_CREATE(&soap, &out, feeds, struct jptype__feedSession, 1);
- feed = GLITE_SECURITY_GSOAP_LIST_GET(out.feeds, 0);
- feed->primaryServer = strdup("PrimaryServer");
- feed->__sizecondition = 1;
- GLITE_SECURITY_GSOAP_LIST_CREATE(&soap, feed, condition, struct jptype__primaryQuery, 1);
- cond = GLITE_SECURITY_GSOAP_LIST_GET(feed->condition, 0);
- cond->attr = strdup("queryAttr");
- cond->op = jptype__queryOp__EQUAL;
- cond->origin = jptype__attrOrig__SYSTEM;
- cond->value = calloc(1, sizeof(*(cond->value)));
- GSOAP_SETSTRING(cond->value, soap_strdup(&soap, "attrValue"));
- feed->history = 1;
- feed->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;
-}
-#endif
+++ /dev/null
-#ident "$Header$"
-
-#ifndef _CONF_H
-#define _CONF_H
-
-#include <glite/jp/types.h>
-
-#ifndef UNUSED
- #ifdef __GNUC__
- #define UNUSED __attribute__((unused))
- #else
- #define UNUSED
- #endif
-#endif
-
-#define GLITE_JPIS_DEFAULT_PORT_STR "8902"
-
-//#define lprintf
-#define lprintf(args...) glite_jp_lprintf(__FUNCTION__, ##args)
-#define llprintf(MODULE, args...) do { \
- if ((MODULE)) glite_jp_lprintf(__FUNCTION__, ##args); \
-} while(0)
-
-
-typedef struct _glite_jp_is_feed {
- char *PS_URL; //URLs of Primary Storage servers
- glite_jp_query_rec_t *query; // query to Primary Server (aka filter)
- int history, // type of query
- continuous;
- long int uniqueid; // internal ID
-} glite_jp_is_feed;
-
-typedef struct _glite_jp_is_conf {
- // all I need to get from comman line options and configuration file
-
- // arrays are zero-terminated
- char **attrs; // atributes to obtain
- char **indexed_attrs; // list of indexed atributes
- char **multival_attrs; // list of multivalue attributes
- char **queriable_attrs; // list of queriable attributes
- char **plugins; // list of plugin.so's
-
- glite_jp_is_feed **feeds; // null terminated list of feeds
-
- int debug;
- int no_auth; // set if you do not want authorization
- char *cs, // database contact string
- *port, // server port
- *pidfile,
- *logfile,
- *server_cert,
- *server_key;
- int slaves;
- int delete_db;
-
- char *feeding; // feed DB from local file
- int force_feed;
-} glite_jp_is_conf;
-
-
-
-// read commad line options and configuration file
-int glite_jp_get_conf(int argc, char **argv, glite_jp_is_conf **configuration);
-void glite_jp_free_conf(glite_jp_is_conf *conf);
-
-void glite_jp_lprintf(const char *source, const char *fmt, ...);
-
-#endif
+++ /dev/null
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-
-#include <glite/security/glite_gss.h>
-
-#include "conf.h"
-#include "context.h"
-
-
-int glite_jpis_init_context(glite_jpis_context_t *isctx, glite_jp_context_t jpctx, glite_jp_is_conf *conf) {
- char hname[512];
- char *op_args;
-
- if ((*isctx = calloc(sizeof(**isctx), 1)) != NULL) {
- (*isctx)->jpctx = jpctx;
- (*isctx)->conf = conf;
- edg_wll_gss_gethostname(hname, sizeof hname);
- asprintf(&(*isctx)->hname, "https://%s:%s", hname, (conf && conf->port) ? conf->port : GLITE_JPIS_DEFAULT_PORT_STR);
-
- op_args = (*isctx)->op_args;
- op_args[GLITE_JP_QUERYOP_WITHIN] = 2;
- op_args[GLITE_JP_QUERYOP_UNDEF] = 0;
- op_args[GLITE_JP_QUERYOP_EQUAL] = 1;
- op_args[GLITE_JP_QUERYOP_LESS] = 1;
- op_args[GLITE_JP_QUERYOP_GREATER] = 1;
- op_args[GLITE_JP_QUERYOP_EXISTS] = 0;
- return 0;
- } else return ENOMEM;
-}
-
-
-void glite_jpis_free_context(glite_jpis_context_t ctx) {
- if (!ctx) return;
- free(ctx->hname);
- free(ctx);
-}
+++ /dev/null
-#ifndef GLITE_JP_IS_CONTEXT_H
-#define GLITE_JP_IS_CONTEXT_H
-
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-#include <glite/jp/db.h>
-#include "conf.h"
-
-
-typedef struct _glite_jpis_context {
- glite_jp_context_t jpctx;
- glite_jp_is_conf *conf;
- glite_lbu_Statement select_unlocked_feed_stmt, lock_feed_stmt, init_feed_stmt, unlock_feed_stmt, select_info_feed_stmt, update_state_feed_stmt, select_info_attrs_indexed, select_jobid_stmt, select_user_stmt, insert_job_stmt, insert_user_stmt;
-
- char *hname;
-
- char op_args[GLITE_JP_QUERYOP__LAST];
-} *glite_jpis_context_t;
-
-typedef struct _slave_data_t{
- glite_jpis_context_t ctx;
- glite_jp_is_conf *conf;
- struct soap *soap;
-} slave_data_t;
-
-int glite_jpis_init_context(glite_jpis_context_t *isctx, glite_jp_context_t jpctx, glite_jp_is_conf *conf);
-void glite_jpis_free_context(glite_jpis_context_t ctx);
-#endif
+++ /dev/null
-#ident "$Header$"
-
-#include <time.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <inttypes.h>
-#include <string.h>
-#include <assert.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-
-#define GLITE_JP_INDEX_COMPILE 1
-
-#include <glite/lbu/trio.h>
-#include <glite/jobid/strmd5.h>
-#include <glite/jobid/cjobid.h>
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-#include <glite/jp/db.h>
-#include <glite/jp/attr.h>
-#include "glite/jp/known_attr.h"
-#include "glite/jp/indexdb.h"
-
-#include "conf.h"
-#include "context.h"
-#include "db_ops.h"
-#include "common.h"
-
-
-#ifndef LOG_SQL
-#define LOG_SQL 1
-#endif
-
-#define SQLCMD_DROP_DATA_TABLE "DROP TABLE " GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "%s"
-#define SQLCMD_CREATE_DATA_TABLE "CREATE TABLE " GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "%s (\n\
- `jobid` CHAR(32) NOT NULL,\n\
- `value` %s NOT NULL,\n\
- `full_value` %s NOT NULL,\n\
- `origin` INT NOT NULL,\n\
-\n\
- INDEX (jobid),\n\
- INDEX (value)\n\
-) CHARACTER SET utf8 COLLATE utf8_bin ENGINE=innodb;"
-
-#define SQLCMD_CREATE_JOBS_TABLE_BEGIN "CREATE TABLE jobs (\n\
- `jobid` char(32) NOT NULL,\n\
- `dg_jobid` varchar(255) NOT NULL,\n\
- `ownerid` char(32) NOT NULL,\n\
- `aclid` char(32) NOT NULL,\n\
- `ps` varchar(255) NOT NULL,\n"
-#define SQLCMD_CREATE_JOBS_TABLE_END "\
- primary key (jobid),\n\
- unique (dg_jobid),\n\
- index (jobid),\n\
- index (dg_jobid)\n\
-) character set utf8 collate utf8_bin engine=innodb;"
-
-#define SQLCMD_INSERT_ATTRVAL "INSERT INTO " GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "%|Ss (jobid, value, full_value, origin) VALUES (\n\
- '%|Ss',\n\
- '%|Ss',\n\
- '%|Ss',\n\
- '%ld'\n\
-)"
-#define SQL_CMD_INSERT_SINGLEATTRVAL "UPDATE jobs \n\
- SET attr_%s='%s' \n\
- WHERE dg_jobid='%s'"
-
-#define WORD_SWAP(X) ((((X) >> 8) & 0xFF) | (((X) & 0xFF) << 8))
-#define LONG_SWAP(X) (WORD_SWAP(((X) >> 16) & 0xFFFF) | ((WORD_SWAP(X) & 0xFFFF) << 16))
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-#define LONG_LE(X) (X)
-#else
-#define LONG_LE(X) LONG_SWAP(X)
-#endif
-
-#define COND_MAGIC 0x444E4F43
-
-
-static int glite_jpis_db_queries_deserialize(glite_jp_query_rec_t **queries, void *blob, size_t blob_size) UNUSED;
-
-
-static int is_indexed(glite_jp_is_conf *conf, const char *attr) {
- return glite_jpis_find_attr(conf->indexed_attrs, attr);
-}
-
-static int is_singleval(glite_jp_is_conf *conf, const char *attr) {
- return !glite_jpis_find_attr(conf->multival_attrs, attr);
-}
-
-static int is_queriable(glite_jp_is_conf *conf, const char *attr){
- return glite_jpis_find_attr(conf->queriable_attrs, attr);
-}
-
-static size_t db_arg1_length(glite_jpis_context_t isctx, glite_jp_query_rec_t *query) {
- size_t len;
-
- assert(query->op > GLITE_JP_QUERYOP_UNDEF && query->op <= GLITE_JP_QUERYOP__LAST);
- if (isctx->op_args[query->op] >= 1)
- len = query->binary ? query->size : (query->value ? strlen(query->value) + 1 : 0);
- else len = 0;
-
- return len;
-}
-
-static size_t db_arg2_length(glite_jpis_context_t isctx, glite_jp_query_rec_t *query) {
- size_t len;
-
- assert(query->op > GLITE_JP_QUERYOP_UNDEF && query->op <= GLITE_JP_QUERYOP__LAST);
- if (isctx->op_args[query->op] >= 1)
- len = query->binary ? query->size2 : (query->value2 ? strlen(query->value2) + 1 : 0);
- else len = 0;
-
- return len;
-}
-
-
-static int array_init(void **data, size_t *len, size_t *maxlen, size_t initial_len) {
- *len = 0;
- if ((*data = malloc(initial_len)) != NULL) {
- *maxlen = initial_len;
- return 0;
- } else {
- *maxlen = 0;
- return ENOMEM;
- }
-}
-
-
-static int array_add(void **data, size_t *len, size_t *maxlen, void *new_data, size_t new_data_len) {
- void *tmp;
- size_t ptr;
-
- ptr = *len;
- (*len) += new_data_len;
- if (*len > *maxlen) {
- do {
- (*maxlen) *= 2;
- } while (*len > *maxlen);
- if ((tmp = realloc(*data, *maxlen)) == NULL) return ENOMEM;
- *data = tmp;
- }
- memcpy(((char *)(*data)) + ptr, new_data, new_data_len);
-
- return 0;
-}
-
-
-static int array_add_long(void **data, size_t *len, size_t *maxlen, uint32_t l) {
- uint32_t lel;
-
- lel = LONG_LE(l);
- return array_add(data, len, maxlen, &lel, sizeof(uint32_t));
-}
-
-
-static uint32_t array_get_long(void **data) {
- uint32_t *lel;
-
- lel = (uint32_t *)*data;
- *data = ((char *)*data) + sizeof(uint32_t);
-
- return LONG_LE(*lel);
-}
-
-
-static void *array_get(void **data, size_t data_len) {
- void *res;
-
- res = *data;
- *data = ((char *)*data) + data_len;
-
- return res;
-}
-
-
-static int glite_jpis_db_queries_serialize(glite_jpis_context_t isctx, void **blob, size_t *len, glite_jp_query_rec_t *queries) {
- size_t maxlen;
- glite_jp_query_rec_t *query;
- int ret;
- size_t datalen;
-
- if ((ret = array_init(blob, len, &maxlen, 1024)) != 0) return ret;
- query = queries;
- while(query && query->attr) {
- if ((ret = array_add_long(blob, len, &maxlen, COND_MAGIC)) != 0) goto fail;
- datalen = strlen(query->attr) + 1;
- if ((ret = array_add_long(blob, len, &maxlen, datalen)) != 0) goto fail;
- if ((ret = array_add(blob, len, &maxlen, query->attr, datalen)) != 0) goto fail;
- if ((ret = array_add_long(blob, len, &maxlen, query->op)) != 0) goto fail;
- if ((ret = array_add_long(blob, len, &maxlen, query->binary ? 1 : 0)) != 0) goto fail;
-
- datalen = db_arg1_length(isctx, query);
- if ((ret = array_add_long(blob, len, &maxlen, datalen)) != 0) goto fail;
- if (datalen)
- if ((ret = array_add(blob, len, &maxlen, query->value, datalen)) != 0) goto fail;
-
- datalen = db_arg2_length(isctx, query);
- if ((ret = array_add_long(blob, len, &maxlen, datalen)) != 0) goto fail;
- if (datalen)
- if ((ret = array_add(blob, len, &maxlen, query->value2, datalen)) != 0) goto fail;
-
- query++;
- }
-
- return 0;
-fail:
- free(*blob);
- *len = 0;
- return ret;
-}
-
-
-static int glite_jpis_db_queries_deserialize(glite_jp_query_rec_t **queries, void *blob, size_t blob_size) {
- size_t maxlen, len, datalen;
- void *blob_ptr, *blob_end;
- int ret;
- uint32_t l;
- glite_jp_query_rec_t query;
- int i;
-
- if ((ret = array_init((void *)queries, &len, &maxlen, 512)) != 0) return ret;
- blob_ptr = blob;
- blob_end = (char *)blob + blob_size;
- while (blob_end > blob_ptr) {
- ret = ENOMEM;
- memset(&query, 0, sizeof query);
- l = array_get_long(&blob_ptr);
- if (l != COND_MAGIC) {
- lprintf("blob=%p, blob_ptr=%p, 0x%08" PRIX32 "\n", blob, blob_ptr, l);
- ret = EINVAL;
- goto fail_query;
- }
-
- datalen = array_get_long(&blob_ptr);
- if (datalen) {
- if ((query.attr = malloc(datalen)) == NULL) goto fail_query;
- memcpy(query.attr, array_get(&blob_ptr, datalen), datalen);
- } else query.attr = NULL;
-
- query.op = array_get_long(&blob_ptr);
- query.binary = array_get_long(&blob_ptr);
-
- datalen = array_get_long(&blob_ptr);
- if (datalen) {
- if ((query.value = malloc(datalen)) == NULL) goto fail_query;
- memcpy(query.value, array_get(&blob_ptr, datalen), datalen);
- } else query.value = NULL;
- query.size = datalen;
-
- datalen = array_get_long(&blob_ptr);
- if (datalen) {
- if ((query.value2 = malloc(datalen)) == NULL) goto fail_query;
- memcpy(query.value2, array_get(&blob_ptr, datalen), datalen);
- } else query.value2 = NULL;
- query.size2 = datalen;
-
- if ((ret = array_add((void *)queries, &len, &maxlen, &query, sizeof(query))) != 0) goto fail_query;
- }
- assert(blob_end == blob_ptr);
-
- memset(&query, 0, sizeof query);
- if ((ret = array_add((void *)queries, &len, &maxlen, &query, sizeof(query))) != 0) goto fail;
-
- return 0;
-
-fail_query:
-fail:
- i = 0;
- while ((*queries)[i].attr) {
- free((*queries)[i].attr);
- free((*queries)[i].value);
- free((*queries)[i].value2);
- i++;
- }
- free(*queries);
- return ret;
-}
-
-
-/* Init the database.
- *
- * \retval 0 OK
- * \retval non-zero JP error code
- */
-
-int glite_jpis_initDatabase(glite_jpis_context_t ctx) {
- char **attrs, *attrid, *num;
- const char *type_index, *type_full;
- size_t i;
- int indexed, nattrs;
- char sql[2048];
- glite_jp_context_t jpctx = ctx->jpctx;
- glite_lbu_Statement stmt = NULL;
-
- jpctx = ctx->jpctx;
-
- // check, if database was already created
- if (glite_jp_db_ExecSQL(jpctx, "SELECT COUNT(*) FROM attrs", &stmt) < 0) {
- glite_jpis_stack_error(ctx->jpctx, EIO, "error during counting attrs");
- goto fail;
- }
- if (glite_jp_db_FetchRow(jpctx, stmt, 1, NULL, &num) < 0) {
- glite_jpis_stack_error(ctx->jpctx, EIO, "error during fetching attrs");
- goto fail;
- }
- nattrs = atoi(num);
- llprintf(LOG_SQL, "found '%s' attributes in attrs table\n", num, nattrs);
- free(num);
- glite_jp_db_FreeStmt(&stmt);
- if (nattrs != 0) {
- lprintf("database with %d attributes kept (use -D for delete)\n", nattrs);
- return 0;
- }
-
- if (glite_jp_db_PrepareStmt(jpctx, "INSERT INTO attrs (attrid, name, indexed, type) VALUES (?, ?, ?, ?)", &stmt) != 0) {
- glite_jpis_stack_error(ctx->jpctx, EIO, "can't create insert attributes statement");
- goto fail;
- }
-
- // attrs table and attrid_* tables
- attrs = ctx->conf->attrs;
- i = 0;
- if (attrs) while (attrs[i]) {
- type_full = glite_jp_attrval_db_type_full(jpctx, attrs[i]);
- type_index = glite_jp_attrval_db_type_index(jpctx, attrs[i], GLITE_JPIS_INDEX_LENGTH);
-
- attrid = glite_jp_indexdb_attr2id(attrs[i]);
- indexed = is_indexed(ctx->conf, attrs[i]);
- if (glite_jp_db_ExecPreparedStmt(jpctx, stmt, 4,
- GLITE_LBU_DB_TYPE_VARCHAR, attrid,
- GLITE_LBU_DB_TYPE_VARCHAR, attrs[i],
- GLITE_LBU_DB_TYPE_INT, indexed,
- GLITE_LBU_DB_TYPE_VARCHAR, type_full) == -1) {
- glite_jpis_stack_error(ctx->jpctx, EIO, "can't create '%s' attribute", attrs[i]);
- goto fail;
- }
-
- // silently drop
- sql[sizeof(sql) - 1] = '\0';
- snprintf(sql, sizeof(sql), SQLCMD_DROP_DATA_TABLE, attrid);
- llprintf(LOG_SQL, "preventive dropping '%s' ==> '%s'\n", attrid, sql);
- glite_jp_db_ExecSQL(jpctx, sql, NULL);
- glite_jp_clear_error(ctx->jpctx);
-
- // create table
- sql[sizeof(sql) - 1] = '\0';
- snprintf(sql, sizeof(sql) - 1, SQLCMD_CREATE_DATA_TABLE, attrid, type_index, type_full);
- free(attrid);
- llprintf(LOG_SQL, "creating table: '%s'\n", sql);
- if ((glite_jp_db_ExecSQL(jpctx, sql, NULL)) == -1) {
- glite_jpis_stack_error(ctx->jpctx, EAGAIN, "if the atribute table already exists, restart may help");
- goto fail;
- }
-
- i++;
- }
- glite_jp_db_FreeStmt(&stmt);
-
- // create jobs table
- snprintf(sql, sizeof(sql) - 1, SQLCMD_CREATE_JOBS_TABLE_BEGIN);
- if (ctx->conf->attrs) for (i = 0; ctx->conf->attrs[i]; i++)
- if (is_singleval(ctx->conf, ctx->conf->attrs[i])
- && is_queriable(ctx->conf, ctx->conf->attrs[i])){
- snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql),
- " `attr_%s` %s NOT NULL,\n",
- glite_jp_indexdb_attr2id(ctx->conf->attrs[i]),
- glite_jp_attrval_db_type_index(jpctx, ctx->conf->attrs[i], GLITE_JPIS_INDEX_LENGTH));
-
- if (is_indexed(ctx->conf, ctx->conf->attrs[i]))
- snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql),
- " index (attr_%s), \n",
- glite_jp_indexdb_attr2id(ctx->conf->attrs[i]));
- }
- snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), SQLCMD_CREATE_JOBS_TABLE_END);
- llprintf(LOG_SQL, "sql=%s\n", sql);
- if ((glite_jp_db_ExecSQL(jpctx, sql, NULL)) == -1) {
- glite_jpis_stack_error(ctx->jpctx, EAGAIN, "Cannot create table 'jobs'!");
- goto fail;
- }
-
- return 0;
-
-fail:
- glite_jp_db_FreeStmt(&stmt);
- if (!jpctx->error) glite_jpis_stack_error(ctx->jpctx, EIO, "error during initial filling of the database");
- return jpctx->error->code;
-}
-
-
-int glite_jpis_initDatabaseFeeds(glite_jpis_context_t ctx) {
- glite_jp_context_t jpctx = ctx->jpctx;
- glite_lbu_Statement stmt = NULL;
- glite_jp_is_feed **feeds;
- size_t i;
- size_t conds_len;
- void *conds;
- int state, locked;
-
- if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM feeds", NULL) == -1) {
- glite_jpis_stack_error(ctx->jpctx, EIO, "can't delete feeds");
- goto fail;
- }
-
- // feeds table
- if (glite_jp_db_PrepareStmt(jpctx, "INSERT INTO feeds (`state`, `locked`, `source`, `condition`) VALUES (?, ?, ?, ?)", &stmt) != 0) {
- glite_jpis_stack_error(ctx->jpctx, EIO, "can't create insert feeds statement");
- goto fail;
- }
- feeds = ctx->conf->feeds;
- i = 0;
- if (feeds) while (feeds[i]) {
- state = (feeds[i]->history ? GLITE_JP_IS_STATE_HIST : 0) |
- (feeds[i]->continuous ? GLITE_JP_IS_STATE_CONT : 0);
- locked = 0;
- assert(glite_jpis_db_queries_serialize(ctx, &conds, &conds_len, feeds[i]->query) == 0);
- if (glite_jp_db_ExecPreparedStmt(jpctx, stmt, 4,
- GLITE_LBU_DB_TYPE_INT, state,
- GLITE_LBU_DB_TYPE_INT, locked,
- GLITE_LBU_DB_TYPE_VARCHAR, feeds[i]->PS_URL,
- GLITE_LBU_DB_TYPE_MEDIUMBLOB, conds, conds_len) == -1)
- goto fail_conds;
- free(conds);
- conds = NULL;
- feeds[i]->uniqueid = glite_lbu_Lastid(stmt);
-
- i++;
- }
- glite_jp_db_FreeStmt(&stmt);
- return 0;
-
-fail_conds:
- free(conds);
-fail:
- glite_jp_db_FreeStmt(&stmt);
- if (!jpctx->error) glite_jpis_stack_error(ctx->jpctx, EIO, "error during initial filling of the database");
- return jpctx->error->code;
-}
-
-
-/* Drop the whole database.
- *
- * \retval 0 OK
- * \retval non-zero JP error code
- */
-
-int glite_jpis_dropDatabase(glite_jpis_context_t ctx) {
- char *attrid, sql[256];
- unsigned long len;
- int ret;
- glite_jp_context_t jpctx = ctx->jpctx;
- glite_lbu_Statement stmt_tabs = NULL;
-
- // search data tables and drop them
- if (glite_jp_db_PrepareStmt(jpctx, "SELECT attrid FROM attrs", &stmt_tabs) != 0) goto fail;
- if (glite_jp_db_ExecPreparedStmt(jpctx, stmt_tabs, 0) == -1) goto fail;
- while ((ret = glite_jp_db_FetchRow(jpctx, stmt_tabs, 1, &len, &attrid)) > 0) {
- snprintf(sql, sizeof(sql), SQLCMD_DROP_DATA_TABLE, attrid);
- llprintf(LOG_SQL, "dropping '%s' ==> '%s'\n", attrid, sql);
- if (glite_jp_db_ExecSQL(jpctx, sql, NULL) == -1) printf("warning: can't drop table '" GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "%s': %s (%s)\n", attrid, jpctx->error->desc, jpctx->error->source);
- }
- if (ret != 0) goto fail;
- glite_jp_db_FreeStmt(&stmt_tabs);
- snprintf(sql, sizeof(sql)-1, "DROP TABLE jobs");
- llprintf(LOG_SQL, "dropping 'jobs'");
- if (glite_jp_db_ExecSQL(jpctx, sql, NULL) == -1) printf("warning: can't drop table 'jobs'\n");
-
- // drop feeds and atributes
- if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM attrs", NULL) == -1) goto fail;
- if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM feeds", NULL) == -1) goto fail;
- if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM users", NULL) == -1) goto fail;
- if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM acls", NULL) == -1) goto fail;
-
- return 0;
-
-fail:
- glite_jp_db_FreeStmt(&stmt_tabs);
- return jpctx->error->code;
-}
-
-
-int glite_jpis_init_db(glite_jpis_context_t isctx) {
- int ret, caps;
- const char *cs;
- glite_jp_context_t jpctx;
-
- jpctx = isctx->jpctx;
- if (glite_lbu_InitDBContext(((glite_lbu_DBContext *)&jpctx->dbhandle)) != 0) goto fail_db;
- if ((cs = isctx->conf->cs) == NULL) cs = GLITE_JP_IS_DEFAULTCS;
- if (glite_lbu_DBConnect(jpctx->dbhandle, cs) != 0) goto fail_db;
-
- // try transaction for feeding
- if (isctx->conf->feeding) {
- caps = glite_lbu_DBQueryCaps(jpctx->dbhandle);
- if (caps != -1) {
- glite_lbu_DBSetCaps(jpctx->dbhandle, caps);
- llprintf(LOG_SQL, "transactions %s\n", (caps & GLITE_LBU_DB_CAP_TRANSACTIONS) ? "supported" : "not supported");
- }
- }
-
- // sql command: lock the feed (via uniqueid)
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "UPDATE feeds SET locked=1 WHERE (locked = 0) AND (uniqueid = ?)", &isctx->lock_feed_stmt)) != 0) goto fail;
-
- // sql command: assign the feed (via uniqueid)
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "UPDATE feeds SET feedid=?, expires=?, state=? WHERE (uniqueid=?)", &isctx->init_feed_stmt)) != 0) goto fail;
-
- // sql command: unlock the feed (via uniqueid)
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "UPDATE feeds SET locked=0 WHERE (uniqueid=?)", &isctx->unlock_feed_stmt)) != 0) goto fail;
-
- // sql command: get info about the feed (via feedid)
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "SELECT uniqueid, state, source FROM feeds WHERE (feedid=?)", &isctx->select_info_feed_stmt)) != 0) goto fail;
-
- // sql command: update state of the feed (via uniqueid)
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "UPDATE feeds SET state=? WHERE (uniqueid=?)", &isctx->update_state_feed_stmt)) != 0) goto fail;
-
- // sql command: check for job with jobid
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "SELECT jobid FROM jobs WHERE jobid=?", &isctx->select_jobid_stmt)) != 0) goto fail;
-
- // sql command: insert the job
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "INSERT INTO jobs (jobid, dg_jobid, ownerid, ps) VALUES (?, ?, ?, ?)", &isctx->insert_job_stmt)) != 0) goto fail;
-
- // sql command: check the user
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "SELECT userid FROM users WHERE userid=?", &isctx->select_user_stmt)) != 0) goto fail;
-
- // sql command: insert the user
- if ((ret = glite_jp_db_PrepareStmt(jpctx, "INSERT INTO users (userid, cert_subj) VALUES (?, ?)", &isctx->insert_user_stmt)) != 0) goto fail;
-
- return 0;
-
-fail_db:
- ret = glite_jp_db_SetError(jpctx, __FUNCTION__);
-fail:
- glite_jpis_free_db(isctx);
- return ret;
-}
-
-
-void glite_jpis_free_db(glite_jpis_context_t ctx) {
- glite_jp_db_FreeStmt(&ctx->lock_feed_stmt);
- glite_jp_db_FreeStmt(&ctx->init_feed_stmt);
- glite_jp_db_FreeStmt(&ctx->unlock_feed_stmt);
- glite_jp_db_FreeStmt(&ctx->select_info_feed_stmt);
- glite_jp_db_FreeStmt(&ctx->update_state_feed_stmt);
- glite_jp_db_FreeStmt(&ctx->select_jobid_stmt);
- glite_jp_db_FreeStmt(&ctx->select_user_stmt);
- glite_jp_db_FreeStmt(&ctx->insert_job_stmt);
- glite_jp_db_FreeStmt(&ctx->insert_user_stmt);
- glite_lbu_DBClose(ctx->jpctx->dbhandle);
- glite_lbu_FreeDBContext(ctx->jpctx->dbhandle);
- ctx->jpctx->dbhandle = NULL;
-}
-
-
-/* Find first unitialized feed, lock it and return URL of corresponding PS
- *
- * Return value:
- * 0 - OK
- * ENOENT - no more feeds to initialize
- * ENOLCK - error during locking */
-
-int glite_jpis_lockSearchFeed(glite_jpis_context_t ctx, int initialized, long int *uniqueid, char **PS_URL, int *status, char **feedid)
-{
- int ret;
- static int uninit_msg = 1;
- char *sql, *res[4], *t, *ps;
- glite_lbu_Statement stmt;
-
- if (feedid) *feedid = NULL;
- do {
- glite_lbu_TimeToDB(time(NULL), &t);
- if (initialized) {
- trio_asprintf(&sql, "SELECT uniqueid, source, state, feedid FROM feeds WHERE (locked=0) AND (feedid IS NOT NULL) AND (expires <= %s)", t);
- } else
- trio_asprintf(&sql, "SELECT uniqueid, source, state, feedid FROM feeds WHERE (locked=0) AND (feedid IS NULL) AND ((state < " GLITE_JP_IS_STATE_ERROR_STR ") OR (expires <= %s))", t);
- free(t);
- //llprintf(LOG_SQL, "sql=%s\n", sql);
- ret = glite_jp_db_ExecSQL(ctx->jpctx, sql, &stmt);
- free(sql);
- switch (ret) {
- case -1:
- glite_jpis_stack_error(ctx->jpctx, ENOLCK, "error selecting unlocked feed");
- uninit_msg = 1;
- glite_jp_db_FreeStmt(&stmt);
- return ENOLCK;
- case 0:
- if (uninit_msg) {
- lprintf("no more %s feeds for now\n", initialized ? "not-refreshed" : "uninitialized");
- uninit_msg = 0;
- }
- glite_jp_db_FreeStmt(&stmt);
- return ENOENT;
- default: break;
- }
- uninit_msg = 1;
- if (glite_jp_db_FetchRow(ctx->jpctx, stmt, sizeof(res)/sizeof(res[0]), NULL, res) <= 0) {
- glite_jpis_stack_error(ctx->jpctx, ENOLCK, "error fetching unlocked feed");
- glite_jp_db_FreeStmt(&stmt);
- return ENOLCK;
- }
- glite_jp_db_FreeStmt(&stmt);
- lprintf("selected feed, uniqueid=%s\n", res[0]);
- *uniqueid = atol(res[0]); free(res[0]);
- ps = res[1];
- if (status) *status = atoi(res[2]); free(res[2]);
- if (feedid) {
- free(*feedid);
- *feedid = res[3];
- } else free(res[3]);
-
- ret = glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->lock_feed_stmt, 1, GLITE_LBU_DB_TYPE_INT, *uniqueid);
- lprintf("locked %d feeds (uniqueid=%ld)\n", ret, *uniqueid);
- } while (ret != 1);
-
- if (PS_URL) *PS_URL = ps;
- else free(ps);
-
- return 0;
-}
-
-
-/* Store feed ID and expiration time returned by PS for locked feed. */
-
-int glite_jpis_initFeed(glite_jpis_context_t ctx, long int uniqueid, const char *feedId, time_t feedExpires, int status)
-{
- int ret;
- time_t tnow, expires;
-
- tnow = time(NULL);
- expires = tnow + (feedExpires - tnow) / 2;
-
- ret = glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->init_feed_stmt, 4,
- GLITE_LBU_DB_TYPE_CHAR, feedId,
- GLITE_LBU_DB_TYPE_DATETIME, expires,
- GLITE_LBU_DB_TYPE_INT, status,
- GLITE_LBU_DB_TYPE_INT, uniqueid);
- lprintf("initializing feed, uniqueid=%ld, result=%d\n", uniqueid, ret);
-
- return ret == 1 ? 0 : ENOLCK;
-}
-
-
-/* Unlock given feed */
-
-int glite_jpis_unlockFeed(glite_jpis_context_t ctx, long int uniqueid) {
- int ret;
-
- ret = glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->unlock_feed_stmt, 1, GLITE_LBU_DB_TYPE_INT, uniqueid);
- lprintf("unlocking feed, uniqueid=%ld, result=%d\n", uniqueid, ret);
-
- return ret == 1 ? 0 : ENOLCK;
-}
-
-
-/* Saves TTL (when to reconnect if error occured) for given feed */
-
-int glite_jpis_tryReconnectFeed(glite_jpis_context_t ctx, long int uniqueid, time_t reconn_time, int state) {
- int ret;
- char *sql, *t;
-
- glite_lbu_TimeToDB(reconn_time, &t);
- lprintf("reconnect, un=%ld, %s\n", uniqueid, t);
- trio_asprintf(&sql, "UPDATE feeds SET state=%d, expires=%s WHERE (uniqueid=%ld)", state, t, uniqueid);
- free(t);
- if ((ret = glite_jp_db_ExecSQL(ctx->jpctx, sql, NULL)) != 1)
- glite_jpis_stack_error(ctx->jpctx, EIO, "can't update feed no. %ld in DB", uniqueid);
- free(sql);
- return ret == -1 ? ctx->jpctx->error->code : 0;
-}
-
-
-// TODO: could be merged with initFeed
-int glite_jpis_destroyTryReconnectFeed(glite_jpis_context_t ctx, long int uniqueid, time_t reconn_time) {
- int ret;
- char *sql, *t;
-
- glite_lbu_TimeToDB(reconn_time, &t);
- lprintf("destroy not refreshed feed, un=%ld, %s\n", uniqueid, t);
- trio_asprintf(&sql, "UPDATE feeds SET feedid=NULL, state=0, expires=%s WHERE (uniqueid=%ld)", t, uniqueid);
- free(t);
- if ((ret = glite_jp_db_ExecSQL(ctx->jpctx, sql, NULL)) != 1)
- glite_jpis_stack_error(ctx->jpctx, EIO, "can't destroy non-refreshable feed no. %ld in DB", uniqueid);
- free(sql);
- return ret == -1 ? ctx->jpctx->error->code : 0;
-}
-
-
-int glite_jpis_insertAttrVal(glite_jpis_context_t ctx, const char *jobid, glite_jp_attrval_t *av) {
- char *sql, *table, *value, *full_value, *md5_jobid;
- long int origin;
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx->jpctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- table = glite_jp_indexdb_attr2id(av->name);
- value = glite_jp_attrval_to_db_index(ctx->jpctx, av, GLITE_JPIS_INDEX_LENGTH);
- full_value = glite_jp_attrval_to_db_full(ctx->jpctx, av);
- md5_jobid = str2md5(jobid);
- origin = av->origin;
- trio_asprintf(&sql, SQLCMD_INSERT_ATTRVAL, table, md5_jobid, value, full_value, origin);
- llprintf(LOG_SQL, "(%s) sql=%s\n", av->name, sql);
-// if (ctx->conf->feeding) printf("FEED: %s\n", sql);
-// else
- if (glite_jp_db_ExecSQL(ctx->jpctx, sql, NULL) != 1){
- err.code = EIO;
- err.desc = "DB access failed";
- goto cleanup;
- }
- free(sql); sql=NULL;
-
- if (is_singleval(ctx->conf, av->name) && is_queriable(ctx->conf, av->name)){
- trio_asprintf(&sql, SQL_CMD_INSERT_SINGLEATTRVAL,
- glite_jp_indexdb_attr2id(av->name), value, jobid);
- llprintf(LOG_SQL, "(%s) sql=%s\n", av->name, sql);
- if (glite_jp_db_ExecSQL(ctx->jpctx, sql, NULL) != 1){
- err.code = EIO;
- err.desc = "DB access failed";
- goto cleanup;
- }
- free(sql);sql=NULL;
- }
-
-cleanup:
- free(md5_jobid);
- free(table);
- free(value);
- free(full_value);
-
- if (err.code) {
- return glite_jpis_stack_error(ctx->jpctx, err.code, err.desc);
- } else {
- return 0;
- }
-}
-
-
-int glite_jpis_lazyInsertJob(glite_jpis_context_t ctx, const char *ps, const char *jobid, const char *owner) {
- int ret;
- char *md5_jobid = NULL, *md5_cert = NULL;
-
- lprintf("\n");
-
- if (!jobid || !owner) {
- glite_jpis_stack_error(ctx->jpctx, EINVAL, "jobid and owner is mandatory (jobid=%s, owner=%s)!\n", jobid, owner);
- goto fail;
- }
- md5_jobid = str2md5(jobid);
- md5_cert = str2md5(owner);
- switch (ret = glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->select_jobid_stmt, 1, GLITE_LBU_DB_TYPE_CHAR, md5_jobid)) {
- case 1: lprintf("jobid '%s' found\n", jobid); goto ok0;
- case 0:
- lprintf("inserting jobid %s (%s)\n", jobid, md5_jobid);
- if (glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->insert_job_stmt, 4,
- GLITE_LBU_DB_TYPE_CHAR, md5_jobid,
- GLITE_LBU_DB_TYPE_VARCHAR, jobid,
- GLITE_LBU_DB_TYPE_CHAR, md5_cert,
- GLITE_LBU_DB_TYPE_CHAR, ps) != 1) goto fail;
- break;
- default: assert(ret != 1); break;
- }
-ok0:
-
- switch (ret = glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->select_user_stmt, 1, GLITE_LBU_DB_TYPE_CHAR, md5_cert)) {
- case 1: lprintf("owner '%s' found\n", owner); goto ok;
- case 0:
- lprintf("inserting user %s (%s)\n", owner, md5_cert);
- if (glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->insert_user_stmt, 2,
- GLITE_LBU_DB_TYPE_CHAR, md5_cert,
- GLITE_LBU_DB_TYPE_VARCHAR, owner) != 1) goto fail;
- break;
- default: assert(ret != 1); break;
- }
-
-ok:
- free(md5_jobid);
- free(md5_cert);
- return 0;
-fail:
- free(md5_jobid);
- free(md5_cert);
- return ctx->jpctx->error->code;
-}
-
-
-#define FEEDING_SEPARATORS ";"
-#define FEEDING_JOBID_BKSERVER "localhost-test"
-#define FEEDING_JOBID_PORT 0
-#define FEEDING_PRIMARY_STORAGE "localhost:8901"
-#define FEEDING_DEFAULT_OWNER "God"
-int glite_jpis_feeding(glite_jpis_context_t ctx, const char *fname, const char *dn) {
- FILE *f;
- char line[1024], *token, *lasts, *jobid = NULL;
- int nattrs, lno, i, iname, c;
- glite_jp_attrval_t *avs;
- glite_jobid_t j;
- const char *owner = dn ? dn : FEEDING_DEFAULT_OWNER;
-
- if ((f = fopen(fname, "rt")) == NULL) {
- glite_jpis_stack_error(ctx->jpctx, errno, "can't open csv dump file");
- return 1;
- }
-
- for (nattrs = 0; ctx->conf->attrs[nattrs]; nattrs++);
- avs = malloc(nattrs * sizeof avs[0]);
-
- lno = 0;
- while(fgets(line, sizeof line, f) != NULL) {
- if ((lno % 100) == 0) {
- if (lno) glite_jp_db_Commit(ctx->jpctx);
- glite_jp_db_Transaction(ctx->jpctx);
- }
- lno++;
- if (line[0]) {
- c = strlen(line) - 1;
- if (line[c] != '\r' && line[c] != '\n' && !feof(f)) {
- glite_jpis_stack_error(ctx->jpctx, E2BIG, "line too large at %d (max. %d)", lno, sizeof line);
- goto err;
- }
- while (c >= 0 && (line[c] == '\r' || line[c] == '\n')) c--;
- line[c + 1] = 0;
- }
-// printf("'%s'\n", line);
-
- memset(avs, 0, nattrs * sizeof avs[0]);
- i = 0;
- iname = 0;
- token = strtok_r(line, FEEDING_SEPARATORS, &lasts);
- while (token && iname < nattrs) {
-// printf("\t'%s'\n", token);
- do {
- avs[i].name = ctx->conf->attrs[iname];
- iname++;
- } while (strcasecmp(avs[i].name, GLITE_JP_ATTR_JOBID) == 0 || strcasecmp(avs[i].name, GLITE_JP_ATTR_OWNER) == 0);
- glite_jpis_trim(token);
- avs[i].value = token;
- avs[i].timestamp = time(NULL);
- avs[i].origin = GLITE_JP_ATTR_ORIG_FILE;
-// printf("\t %d: %s = '%s'\n", i, avs[i].name, avs[i].value);
- i++;
-
- token = strtok_r(NULL, FEEDING_SEPARATORS, &lasts);
- }
-
- if (glite_jobid_create(FEEDING_JOBID_BKSERVER, FEEDING_JOBID_PORT, &j) != 0) {
- glite_jpis_stack_error(ctx->jpctx, errno, "can't create jobid");
- goto err;
- }
- if ((jobid = glite_jobid_unparse(j)) == NULL) {
- glite_jobid_free(j);
- glite_jpis_stack_error(ctx->jpctx, ENOMEM, "can't unparse jobid");
- goto err;
- }
- glite_jobid_free(j);
- if (glite_jpis_lazyInsertJob(ctx, FEEDING_PRIMARY_STORAGE, jobid, owner)) goto err;
- for (i = 0; i < nattrs && avs[i].name; i++) {
- if (glite_jpis_insertAttrVal(ctx, jobid, &avs[i])) goto err;
- }
- free(jobid); jobid = NULL;
- }
- glite_jp_db_Commit(ctx->jpctx);
-
- fclose(f);
- free(avs);
- return 0;
-err:
- fclose(f);
- free(avs);
- free(jobid);
- glite_jp_db_Rollback(ctx->jpctx);
- return 1;
-}
+++ /dev/null
-#ident "$Header$"
-
-#ifndef _DB_OPS_H
-#define _DB_OPS_H
-
-
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-#include "context.h"
-
-
-#define GLITE_JP_IS_DEFAULTCS "jpis/@localhost:jpis"
-
-#define GLITE_JP_IS_STATE_HIST 1
-#define GLITE_JP_IS_STATE_CONT 2
-#define GLITE_JP_IS_STATE_DONE 4
-#define GLITE_JP_IS_STATE_ERROR 8
-#define GLITE_JP_IS_STATE_ERROR_STR "8"
-
-#define GLITE_JPIS_INDEX_LENGTH 255
-
-#define GLITE_JPIS_PARAM(DEST, DEST_LEN, SRC) do { \
- (DEST)[sizeof((DEST)) - 1] = '\0'; \
- strncpy((DEST), (SRC), sizeof((DEST)) - 1); \
- (DEST_LEN) = strlen((SRC)); \
-} while(0)
-
-
-char *glite_jpis_attr_name2id(const char *name);
-
-int glite_jpis_initDatabase(glite_jpis_context_t ctx);
-int glite_jpis_initDatabaseFeeds(glite_jpis_context_t ctx);
-int glite_jpis_dropDatabase(glite_jpis_context_t ctx);
-
-int glite_jpis_init_db(glite_jpis_context_t isctx);
-void glite_jpis_free_db(glite_jpis_context_t ctx);
-
-int glite_jpis_lockSearchFeed(glite_jpis_context_t ctx, int initialized, long int *uinqueid, char **PS_URL, int *status, char **feedid);
-int glite_jpis_initFeed(glite_jpis_context_t ctx, long int uniqueid, const char *feedId, time_t feedExpires, int status);
-int glite_jpis_unlockFeed(glite_jpis_context_t ctx, long int uniqueid);
-int glite_jpis_tryReconnectFeed(glite_jpis_context_t ctx, long int uniqueid, time_t reconn_time, int state);
-int glite_jpis_destroyTryReconnectFeed(glite_jpis_context_t ctx, long int uniqueid, time_t reconn_time);
-
-int glite_jpis_insertAttrVal(glite_jpis_context_t ctx, const char *jobid, glite_jp_attrval_t *av);
-
-int glite_jpis_lazyInsertJob(glite_jpis_context_t ctx, const char *ps, const char *jobid, const char *owner);
-
-int glite_jpis_feeding(glite_jpis_context_t ctx, const char *fname, const char *dn);
-
-#endif
+++ /dev/null
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-
-#include "jp_H.h"
-
-int main() {
- struct soap soap;
- int i, m, s; // master and slave sockets
-
- glite_jp_context_t ctx;
-
- soap_init(&soap);
- glite_jp_init_context(&ctx);
- soap.user = (void *) ctx;
-
- srand48(time(NULL)); /* feed id generation */
-
- m = soap_bind(&soap, NULL, 8902, 100);
- if (m < 0)
- soap_print_fault(&soap, stderr);
- else
- {
- fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
- for (i = 1; ; i++) {
- s = soap_accept(&soap);
- if (s < 0) {
- soap_print_fault(&soap, stderr);
- break;
- }
- soap_serve(&soap); // process RPC request
- soap_destroy(&soap); // clean up class instances
- soap_end(&soap); // clean up everything and close socket
- glite_jp_run_deferred(ctx);
- }
- }
- soap_done(&soap); // close master socket
-
- return 0;
-}
+++ /dev/null
-#include <stdio.h>
-#include <fcntl.h>
-#include <assert.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/jobid/strmd5.h"
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/attr.h"
-#include "glite/jp/known_attr.h"
-#include "glite/jp/indexdb.h"
-
-#include "jp_H.h"
-#include "soap_version.h"
-#include "glite/security/glite_gscompat.h"
-#include "db_ops.h"
-#include "ws_ps_typeref.h"
-#include "ws_is_typeref.h"
-#include "context.h"
-#include "common.h"
-
-#define INDEXED_STRIDE 2 // how often realloc indexed attr result
- // XXX: 2 is only for debugging, replace with e.g. 100
-#define JOBIDS_STRIDE 2 // how often realloc matched jobids result
-
-/*------------------*/
-/* Helper functions */
-/*------------------*/
-
-#include "glite/jp/ws_fault.c"
-
-
-
-/*-----------------------------------------*/
-/* IS WSDL server function implementations */
-/*-----------------------------------------*/
-
-
-#define CONTEXT_FROM_SOAP(soap,ctx) glite_jpis_context_t ctx = (glite_jpis_context_t) ((slave_data_t *) (soap->user))->ctx
-
-
-static int updateJob(glite_jpis_context_t ctx, const char *ps, struct jptype__jobRecord *jobAttrs) {
- glite_jp_attrval_t av;
- struct jptype__attrValue *attr;
- int ret, iattrs;
-
- lprintf("jobid='%s', attrs=%d\n", jobAttrs->jobid, jobAttrs->__sizeattributes);
-
- if (jobAttrs->remove) assert(*(jobAttrs->remove) == GLITE_SECURITY_GSOAP_FALSE);
-
- if ((ret = glite_jpis_lazyInsertJob(ctx, ps, jobAttrs->jobid, jobAttrs->owner)) != 0) return ret;
- for (iattrs = 0; iattrs < jobAttrs->__sizeattributes; iattrs++) {
- attr = GLITE_SECURITY_GSOAP_LIST_GET(jobAttrs->attributes, iattrs);
- glite_jpis_SoapToAttrVal(&av, attr);
- if (!glite_jpis_find_attr(ctx->conf->attrs, av.name)) {
- fprintf(stderr, "unkown attribute '%s'\n", av.name);
- continue;
- }
- if ((ret = glite_jpis_insertAttrVal(ctx, jobAttrs->jobid, &av)) != 0) return ret;
- }
-
- return 0;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__UpdateJobs(
- struct soap *soap,
- struct _jpelem__UpdateJobs *jpelem__UpdateJobs,
- struct _jpelem__UpdateJobsResponse *jpelem__UpdateJobsResponse UNUSED)
-{
- int ret, ijobs;
- const char *feedid;
- int status, done;
- CONTEXT_FROM_SOAP(soap, ctx);
- glite_jp_context_t jpctx = ctx->jpctx;
- char *err, *ps;
- char *res[3];
- long int uniqueid;
-
- // XXX: test client in examples/jpis-test
- // sends to this function some data for testing
- puts(__FUNCTION__);
- glite_jp_clear_error(jpctx);
- ps = NULL;
-
- // get info about the feed
- feedid = jpelem__UpdateJobs->feedId;
- lprintf("feedid='%s'\n", feedid);
-
- if ((ret = glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->select_info_feed_stmt, 1, GLITE_LBU_DB_TYPE_CHAR, feedid)) != 1) {
- fprintf(stderr, "can't get info about feed '%s', returned %d records", feedid, ret);
- if (jpctx->error) fprintf(stderr, ": %s (%s)\n", jpctx->error->desc, jpctx->error->source);
- else fprintf(stderr, "\n");
- goto fail;
- }
- if (glite_jp_db_FetchRow(ctx->jpctx, ctx->select_info_feed_stmt, 3, NULL, res) <= 0) {
- fprintf(stderr, "can't fetch feed '%s'", feedid);
- if (jpctx->error) fprintf(stderr, ": %s (%s)\n", jpctx->error->desc, jpctx->error->source);
- else fprintf(stderr, "\n");
- glite_jpis_stack_error(ctx->jpctx, ENODATA, "can't fetch feed '%s'", feedid);
- goto fail;
- }
- lprintf("uniqueid=%s, state=%s, source='%s'\n", res[0], res[1], res[2]);
- uniqueid = atol(res[0]); free(res[0]);
- status = atoi(res[1]); free(res[1]);
- ps = res[2];
-
- // update status, if needed (only orig)
- done = jpelem__UpdateJobs->feedDone ? GLITE_JP_IS_STATE_DONE : 0;
- if ((done != (status & GLITE_JP_IS_STATE_DONE)) && done) {
- status |= done;
- if ((ret = glite_jp_db_ExecPreparedStmt(ctx->jpctx, ctx->update_state_feed_stmt, 2,
- GLITE_LBU_DB_TYPE_INT, status,
- GLITE_LBU_DB_TYPE_INT, uniqueid)) != 1) {
- fprintf(stderr, "can't update state of '%s', returned %d records", feedid, ret);
- if (jpctx->error) fprintf(stderr, ": %s (%s)\n", jpctx->error->desc, jpctx->error->source);
- else fprintf(stderr, "\n");
- goto fail;
- }
- }
-
- // insert all attributes
- for (ijobs = 0; ijobs < jpelem__UpdateJobs->__sizejobAttributes; ijobs++) {
- if (updateJob(ctx, (const char *) ps, GLITE_SECURITY_GSOAP_LIST_GET(jpelem__UpdateJobs->jobAttributes, ijobs)) != 0) goto fail;
- }
- free(ps);
-
- return SOAP_OK;
-
-fail:
- free(ps);
- if (ctx->jpctx->error) {
- err = glite_jp_error_chain(ctx->jpctx);
- fprintf(stderr, "%s:%s\n", __FUNCTION__, err);
- free(err);
- }
- glite_jp_server_err2fault(ctx->jpctx, soap);
- return SOAP_FAULT;
-}
-
-
-static int checkIndexedConditions(glite_jpis_context_t ctx, struct _jpelem__QueryJobs *in)
-{
- char **indexed_attrs = NULL, *res;
- int i, j, k, ret;
- glite_lbu_Statement stmt;
-
-
- if ((ret = glite_jp_db_ExecSQL(ctx->jpctx,
- "SELECT name FROM attrs WHERE (indexed=1)", &stmt)) < 0) goto end;
-
- i = 0;
- while ( (ret = glite_jp_db_FetchRow(ctx->jpctx, stmt, 1, NULL, &res)) > 0 ) {
- if (!(i % INDEXED_STRIDE)) {
- indexed_attrs = realloc(indexed_attrs,
- ((i / INDEXED_STRIDE + 1) * INDEXED_STRIDE)
- * sizeof(*indexed_attrs));
- }
- indexed_attrs[i++] = res;
- }
- if ( ret < 0 ) goto end;
-
- for (k=0; k < in->__sizeconditions; k++) {
- for (j=0; j < i; j++) {
- char *attr = GLITE_SECURITY_GSOAP_LIST_GET(in->conditions, k)->attr;
-
- if (!attr) {
- glite_jpis_stack_error(ctx->jpctx, EINVAL, "condition attribute no %d is NULL", j);
- ret = 0;
- goto end;
- }
- if (!strcasecmp(attr, GLITE_JP_ATTR_JOBID) || !strcasecmp(attr, indexed_attrs[j])) {
- ret = 0;
- goto end;
- }
- }
- }
- ret = 1;
-
-end:
- for (j=0; j < i; j++) free(indexed_attrs[j]);
- free(indexed_attrs);
-
- return(ret);
-}
-
-
-static int checkConditions(glite_jpis_context_t ctx, struct _jpelem__QueryJobs *in) {
- int i, j;
- char *attr;
-
- for (i = 0; i < in->__sizeconditions; i++) {
- attr = GLITE_SECURITY_GSOAP_LIST_GET(in->conditions, i)->attr;
- if (!attr) return 1;
- for (j = 0; ctx->conf->attrs[j] && strcasecmp(ctx->conf->attrs[j], attr) != 0; j++);
- if (!ctx->conf->attrs[j]) return 1;
- }
- for (i = 0; i < in->__sizeattributes; i++) {
- if ((attr = in->attributes[i]) == NULL) return 1;
- for (j = 0; ctx->conf->attrs[j] && strcasecmp(ctx->conf->attrs[j], attr) != 0; j++);
- if (!ctx->conf->attrs[j]) return 1;
- }
-
- return 0;
-}
-
-
-/* adds attr table name to the list (null terminated) , iff unigue */
-static void add_attr_table(char *new, char ***attr_tables)
-{
- int i;
-
- for (i=0; (*attr_tables && (*attr_tables)[i]); i++) {
- if (!strcmp((*attr_tables)[i], new)) return;
- }
-
- *attr_tables = realloc((*attr_tables), (i+2) * sizeof(**attr_tables));
- (*attr_tables)[i] = strdup(new);
- (*attr_tables)[i+1] = NULL;
-}
-
-/* transform soap enum queryOp to mysql equivalent */
-static int get_op(const enum jptype__queryOp in, char **out)
-{
- char *qop;
- glite_jp_queryop_t op;
-
- glite_jpis_SoapToQueryOp(in, &op);
- switch (op) {
- case GLITE_JP_QUERYOP_EQUAL:
- qop = strdup("=");
- break;
- case GLITE_JP_QUERYOP_UNEQUAL:
- qop = strdup("!=");
- break;
- case GLITE_JP_QUERYOP_GREATER:
- qop = strdup(">");
- break;
- case GLITE_JP_QUERYOP_LESS:
- qop = strdup("<");
- break;
- case GLITE_JP_QUERYOP_WITHIN:
- qop = strdup("BETWEEN");
- break;
- default:
- // unsupported query operator
- return(1);
- break;
- }
-
- *out = qop;
- return(0);
-}
-
-
-static char *get_sql_stringvalue(struct jptype__stringOrBlob *value) {
- if (!value) return NULL;
- if (!GSOAP_ISSTRING(value)) return NULL;
- return GSOAP_STRING(value);
-}
-
-
-static int get_sql_indexvalue(char **sql, glite_jpis_context_t ctx, struct jptype__indexQuery *condition, struct jptype__stringOrBlob *value) {
- glite_jp_attrval_t attr;
-
- *sql = NULL;
- if (!value) return 0;
- memset(&attr, 0, sizeof attr);
- attr.name = condition->attr;
- if (GSOAP_ISSTRING(value)) {
- attr.value = GSOAP_STRING(value);
- attr.binary = 0;
- } else if (GSOAP_ISBLOB(value)) {
- attr.value = (char *)GSOAP_BLOB(value)->__ptr;
- attr.size = GSOAP_BLOB(value)->__size;
- attr.binary = 1;
- } else return 0;
- glite_jpis_SoapToAttrOrig(condition->origin, &(attr.origin));
-
- *sql = glite_jp_attrval_to_db_index(ctx->jpctx, &attr, GLITE_JPIS_INDEX_LENGTH);
- return 0;
-}
-
-
-static int get_sql_cond(char **sql, const char *attr_md5, enum jptype__queryOp op, char *value, char *value2) {
- char *s, *qop, *column;
-
- *sql = NULL;
- if (get_op(op, &qop) != 0) return 0;
- if (attr_md5) trio_asprintf(&column, "attr_%|Ss.value", attr_md5);
- else asprintf(&column, "jobs.dg_jobid");
- trio_asprintf(sql, "%s %s '%|Ss'", column, qop, value);
- free(column);
- free(qop);
- if (op == jptype__queryOp__WITHIN) {
- if (!value) {
- free(*sql);
- *sql = NULL;
- return EINVAL;
- }
- trio_asprintf(&s, "%s AND '%|Ss'", *sql, value2);
- free(*sql); *sql = s;
- }
- return 0;
-}
-
-
-static char *get_sql_or(glite_jpis_context_t ctx, struct jptype__indexQuery *condition, const char *attr_md5) {
- struct jptype__indexQueryRecord *record;
- char *sql, *cond, *s = NULL, *value, *value2;
- int j;
-
- sql = strdup("");
- for (j=0; j < condition->__sizerecord; j++) {
- record = GLITE_SECURITY_GSOAP_LIST_GET(condition->record, j);
- if (record->op == jptype__queryOp__EXISTS) {
- /* no additional conditions needed when existing is enough */
- } else {
- if (strcasecmp(condition->attr, GLITE_JP_ATTR_JOBID) == 0) {
- value = get_sql_stringvalue(record->value);
- if (!value) goto err;
- value2 = get_sql_stringvalue(record->value2);
- if (get_sql_cond(&cond, attr_md5, record->op, value, value2) != 0) goto err;
- } else {
- get_sql_indexvalue(&value, ctx, condition, record->value);
- get_sql_indexvalue(&value2, ctx, condition, record->value2);
- get_sql_cond(&cond, attr_md5, record->op, value, value2);
- free(value);
- free(value2);
- if (!cond) goto err;
- }
- trio_asprintf(&s,"%s%s%s", sql, (sql[0] ? " OR " : ""), cond);
- free(cond);
- free(sql); sql = s;
- }
- }
-
- return sql;
-err:
- free(sql);
- free(s);
- return NULL;
-}
-
-
-/* get all jobids matching the query conditions */
-static int get_jobids(glite_jpis_context_t ctx, struct _jpelem__QueryJobs *in, char ***jobids, char *** ps_list)
-{
- char *qa = NULL, *qb = NULL, *qor, *attr_md5,
- *qwhere = NULL, *query = NULL, *res[2],
- **jids = NULL, **pss = NULL, **attr_tables = NULL;
- int i, ret;
- glite_lbu_Statement stmt = NULL;
- glite_jp_attr_orig_t orig;
-
-
- qwhere = strdup("");
- for (i=0; i < in->__sizeconditions; i++) {
- struct jptype__indexQuery *condition;
-
- condition = GLITE_SECURITY_GSOAP_LIST_GET(in->conditions, i);
-
- /* attr name */
- if (strcasecmp(condition->attr, GLITE_JP_ATTR_JOBID) == 0) {
- /* no subset from attr_ table, used jobs table instead */
- attr_md5 = NULL;
- qa = strdup("");
- } else {
- attr_md5 = glite_jp_indexdb_attr2id(condition->attr);
- add_attr_table(attr_md5, &attr_tables);
-
- /* origin */
- if (condition->origin) {
- glite_jpis_SoapToAttrOrig(condition->origin, &orig);
- trio_asprintf(&qb, "attr_%|Ss.origin = %d AND ", attr_md5, orig);
- } else
- trio_asprintf(&qb, "");
-
- /* select given records in attr_ table */
- trio_asprintf(&qa,"%s%sjobs.jobid = attr_%|Ss.jobid",
- (i ? "AND " : ""), qb, attr_md5);
-
- free(qb);
- }
-
- /* inside part of the condition: record list (ORs) */
- if ((qor = get_sql_or(ctx, condition, attr_md5)) == NULL) goto err;
- if (qor[0]) {
- asprintf(&qb, "%s%s(%s)", qa, qa[0] ? " AND " : "", qor);
- free(qa);
- qa = qb;
- }
- free(qor);
-
- trio_asprintf(&qb,"%s%s%s", qwhere, qa[0] ? " " : "", qa);
- free(qa); qwhere = qb; qb = NULL; qa = NULL;
- free(attr_md5);
- }
-
- qa = strdup("");
-
- for (i=0; (attr_tables && attr_tables[i]); i++) {
- trio_asprintf(&qb,"%s, attr_%s", qa, attr_tables[i]);
- free(qa); qa = qb; qb = NULL;
- }
-
- if (ctx->conf->no_auth) {
- trio_asprintf(&query, "SELECT DISTINCT dg_jobid,ps FROM jobs%s WHERE%s", qa, qwhere);
- }
- else {
- trio_asprintf(&query, "SELECT DISTINCT dg_jobid,ps FROM jobs,users%s WHERE (jobs.ownerid = users.userid AND users.cert_subj='%s') AND%s", qa, ctx->jpctx->peer, qwhere);
- }
- printf("Incomming QUERY:\n %s\n", query);
- free(qwhere);
- free(qa);
-
- if ((ret = glite_jp_db_ExecSQL(ctx->jpctx, query, &stmt)) < 0) goto err;
- free(query);
-
- i = 0;
- while ( (ret = glite_jp_db_FetchRow(ctx->jpctx, stmt, sizeof(res)/sizeof(res[0]), NULL, res)) > 0 ) {
- if (!(i % JOBIDS_STRIDE)) {
- jids = realloc(jids,
- ((i / JOBIDS_STRIDE + 1) * JOBIDS_STRIDE + 1)
- * sizeof(*jids));
- }
- if (!(i % JOBIDS_STRIDE)) {
- pss = realloc(pss,
- ((i / JOBIDS_STRIDE + 1) * JOBIDS_STRIDE + 1)
- * sizeof(*pss));
- }
- jids[i] = res[0];
- jids[i+1] = NULL;
- pss[i] = res[1];
- pss[i+1] = NULL;
- i++;
- }
-
- if ( ret < 0 ) goto err;
-
- glite_jp_db_FreeStmt(&stmt);
-
- *jobids = jids;
- *ps_list = pss;
-
- return 0;
-
-err:
- free(query);
- for (i=0; (pss && pss[i]); i++) free(pss[i]);
- free(pss);
- for (i=0; (jids && jids[i]); i++) free(jids[i]);
- free(jids);
- glite_jp_db_FreeStmt(&stmt);
-
- return ret;
-}
-
-static void freeAttval_t(glite_jp_attrval_t jav)
-{
- free(jav.name);
- free(jav.value);
- free(jav.origin_detail);
-}
-
-
-/* get all values of a given attribute for a job with a given jobid */
-/* all values are soap_malloc-ated, exept of av (due to absence of */
-/* soap_realloc) */
-/* Needs to be copied to list using soap_malloc in calling function! */
-
-static int get_attr(struct soap *soap, glite_jpis_context_t ctx, char *jobid, char *attr_name, int *size, struct jptype__attrValue **out)
-{
- glite_jp_attrval_t jav;
- struct jptype__attrValue *av;
- enum jptype__attrOrig *origin;
- char *query, *fv, *jobid_md5, *attr_md5;
- int i, ret;
- glite_lbu_Statement stmt;
-
- memset(&jav,0,sizeof(jav));
- jobid_md5 = str2md5(jobid);
- attr_md5 = glite_jp_indexdb_attr2id(attr_name);
- trio_asprintf(&query,"SELECT full_value FROM attr_%|Ss WHERE jobid = \"%s\"",
- attr_md5, jobid_md5);
- free(attr_md5);
- free(jobid_md5);
-
- if ((ret = glite_jp_db_ExecSQL(ctx->jpctx, query, &stmt)) < 0) {
- glite_jpis_stack_error(ctx->jpctx, EIO, "SELECT from attribute '%s' failed", attr_name);
- goto err;
- }
- free(query);
-
- av = *out;
- i = *size;
- while ( (ret = glite_jp_db_FetchRow(ctx->jpctx, stmt, 1, NULL, &fv)) > 0 ) {
- av = realloc(av, (i+1) * sizeof(*av));
- memset(&av[i], 0, sizeof(av[i]));
-
- memset(&jav,0,sizeof(jav));
- if (glite_jp_attrval_from_db(ctx->jpctx, fv, &jav)) goto err;
- av[i].name = soap_strdup(soap, attr_name);
- av[i].value = soap_malloc(soap, sizeof(*(av[i].value)));
- memset(av[i].value, 0, sizeof(*(av[i].value)));
- if (jav.binary) {
- GSOAP_SETBLOB(av[i].value, soap_malloc(soap, sizeof(*(GSOAP_BLOB(av[i].value)))));
- memset(GSOAP_BLOB(av[i].value), 0, sizeof(*(GSOAP_BLOB(av[i].value))));
- GSOAP_BLOB(av[i].value)->__ptr = soap_malloc(soap, jav.size);
- memcpy(GSOAP_BLOB(av[i].value)->__ptr, jav.value, jav.size);
- GSOAP_BLOB(av[i].value)->__size = jav.size;
- // XXX: id, type, option - how to handle?
- }
- else {
- GSOAP_SETSTRING(av[i].value, jav.value ? soap_strdup(soap, jav.value) : NULL);
- }
- av[i].timestamp = jav.timestamp;
- glite_jpis_AttrOrigToSoap(soap, jav.origin, &origin);
- // atribute has always origin
- assert(origin != GLITE_JP_ATTR_ORIG_ANY);
- av[i].origin = *origin; soap_dealloc(soap, origin);
- if (jav.origin_detail) av[i].originDetail = soap_strdup(soap, jav.origin_detail);
-
- i++;
- freeAttval_t(jav);
- }
- if (ret < 0) goto err;
-
- glite_jp_db_FreeStmt(&stmt);
- *size = i;
- *out = av;
-
- return 0;
-
-err:
- glite_jp_db_FreeStmt(&stmt);
- freeAttval_t(jav);
- return 1;
-}
-
-
-/* return owner of job record */
-static int get_owner(glite_jpis_context_t ctx, char *jobid, char **owner)
-{
- char *ownerid = NULL, *jobid_md5, *query, *fv = NULL;
- glite_lbu_Statement stmt;
-
-
- /* get ownerid correspondig to jobid */
- jobid_md5 = str2md5(jobid);
- trio_asprintf(&query,"SELECT ownerid FROM jobs WHERE jobid = \"%s\"",
- jobid_md5);
- free(jobid_md5);
-
- if ((glite_jp_db_ExecSQL(ctx->jpctx, query, &stmt)) < 0) goto err;
- free(query);
-
- if (glite_jp_db_FetchRow(ctx->jpctx, stmt, 1, NULL, &ownerid) <= 0 ) goto err;
-
- /* DB consistency check - only one record per jobid ! */
- assert (glite_jp_db_FetchRow(ctx->jpctx, stmt, 1, NULL, &fv) <=0); free(fv);
-
-
- /* get cert_subj corresponding to ownerid */
- trio_asprintf(&query,"SELECT cert_subj FROM users WHERE userid = \"%s\"",
- ownerid);
-
- if ((glite_jp_db_ExecSQL(ctx->jpctx, query, &stmt)) < 0) goto err;
- free(query);
-
- if (glite_jp_db_FetchRow(ctx->jpctx, stmt, 1, NULL, owner) <= 0 ) goto err;
-
- /* DB consistency check - only one record per userid ! */
- assert (glite_jp_db_FetchRow(ctx->jpctx, stmt, 1, NULL, &fv) <=0); free(fv);
-
-
- return 0;
-err:
- free(ownerid);
- free(query);
- return 1;
-}
-
-/* fills structure jobRecord for a given jobid*/
-static int get_attrs(struct soap *soap, glite_jpis_context_t ctx, char *jobid, struct _jpelem__QueryJobs *in, struct jptype__jobRecord *out)
-{
- struct jptype__attrValue *av = NULL;
- int j, size = 0;
-
-
- assert(out);
- memset(out, 0, sizeof(*out));
-
- /* jobid */
- out->jobid = soap_strdup(soap, jobid);
-
- /* sizeattributes & attributes */
- size = 0;
- for (j=0; j < in->__sizeattributes; j++)
- if (get_attr(soap, ctx, jobid, in->attributes[j], &size, &av) ) goto err;
- if ( get_owner(ctx, jobid, &(out->owner)) ) goto err;
-
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, attributes, struct jptype__attrValue, size);
- for (j = 0; j < size; j++)
- memcpy(GLITE_SECURITY_GSOAP_LIST_GET(out->attributes, j), &av[j], sizeof(av[0]));
- free(av);
-
- return 0;
-
-err:
- return 1;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__QueryJobs(
- struct soap *soap,
- struct _jpelem__QueryJobs *in,
- struct _jpelem__QueryJobsResponse *out)
-{
- CONTEXT_FROM_SOAP(soap, ctx);
- struct jptype__jobRecord *jr;
-
- char **jobids = NULL, **ps_list = NULL;
- int i, size, err;
-
-
- puts(__FUNCTION__);
- glite_jp_clear_error(ctx->jpctx);
- memset(out, 0, sizeof(*out));
-
- /* test whether there is any indexed attribudes in the condition */
- if ( checkIndexedConditions(ctx, in) ) {
- glite_jpis_stack_error(ctx->jpctx, EINVAL, "No indexed attribute in query");
- goto fail;
- }
-
- /* test whether there is known attribudes in the condition */
- if ( checkConditions(ctx, in) ) {
- glite_jpis_stack_error(ctx->jpctx, EINVAL, "Unknown attribute in query");
- goto fail;
- }
-
- /* get all jobids matching the conditions */
- if ( (err = get_jobids(ctx, in, &jobids, &ps_list)) != 0 ) {
- glite_jpis_stack_error(ctx->jpctx, err, "Error getting jobs");
- goto fail;
- }
-
- /* get all requested attributes for matching jobids */
- for (i=0; (jobids && jobids[i]); i++);
- size = i;
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, jobs, struct jptype__jobRecord, size);
- for (i=0; (jobids && jobids[i]); i++) {
- jr = GLITE_SECURITY_GSOAP_LIST_GET(out->jobs, i);
- if ( (err = get_attrs(soap, ctx, jobids[i], in, jr)) != 0 ) {
- glite_jpis_stack_error(ctx->jpctx, err, "Error getting attributes of the job '%s'", jobids[i]);
- goto fail;
- }
-
- // XXX: in prototype we return only first value of PS URL
- // in future database should contain one more table with URLs
- jr->__sizeprimaryStorage = 1;
- jr->primaryStorage = soap_malloc(soap, sizeof(*(jr->primaryStorage)));
- jr->primaryStorage[0] = soap_strdup(soap, ps_list[i]);
- free(ps_list[i]);
- free(jobids[i]);
- }
- free(jobids);
- free(ps_list);
-
- return SOAP_OK;
-fail:
- glite_jp_server_err2fault(ctx->jpctx, soap);
- return SOAP_ERR;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__AddFeed(
- struct soap *soap UNUSED,
- struct _jpelem__AddFeed *in UNUSED,
- struct _jpelem__AddFeedResponse *out UNUSED)
-{
- // XXX: test client in examples/jpis-test
- // sends to this function some data for testing
- puts(__FUNCTION__);
- return SOAP_OK;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetFeedIDs(
- struct soap *soap UNUSED,
- struct _jpelem__GetFeedIDs *in UNUSED,
- struct _jpelem__GetFeedIDsResponse *out UNUSED)
-{
- // XXX: test client in examples/jpis-test
- // sends to this function some data for testing
- puts(__FUNCTION__);
- return SOAP_OK;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__DeleteFeed(
- struct soap *soap UNUSED,
- struct _jpelem__DeleteFeed *in UNUSED,
- struct _jpelem__DeleteFeedResponse *out UNUSED)
-{
- // XXX: test client in examples/jpis-test
- // sends to this function some data for testing
- puts(__FUNCTION__);
- return SOAP_OK;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__ServerConfiguration(
- struct soap *soap UNUSED,
- struct _jpelem__ServerConfiguration *in UNUSED,
- struct _jpelem__ServerConfigurationResponse *out UNUSED)
-{
- // empty, just for deserializer generation
- puts(__FUNCTION__);
- return SOAP_OK;
-}
+++ /dev/null
-#include <sys/time.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <assert.h>
-
-#include "soap_version.h"
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/security/glite_gss.h"
-#include "glite/security/glite_gsplugin.h"
-#include "glite/security/glite_gscompat.h"
-
-#include "jp_H.h"
-
-#include "conf.h"
-#include "db_ops.h"
-#include "ws_ps_typeref.h"
-#include "context.h"
-#include "common.h"
-
-#include "stdsoap2.h"
-
-
-extern struct Namespace jp__namespaces[];
-
-
-/*------------------*/
-/* Helper functions */
-/*------------------*/
-
-#define dprintf(FMT, ARGS...) do {fprintf(stderr, "[%d] %s: ", getpid(), __FUNCTION__); fprintf(stderr, FMT, ##ARGS); } while(0);
-#include "glite/jp/ws_fault.c"
-#define check_fault(SOAP, ERR) glite_jp_clientCheckFault((SOAP), (ERR), NULL, 0)
-
-
-/*----------------------*/
-/* PS WSDL client calls */
-/*----------------------*/
-
-static int find_dest_index(glite_jp_is_conf *conf, long int uniqueid)
-{
- int i;
-
- for (i=0; conf->feeds[i]; i++)
- if (conf->feeds[i]->uniqueid == uniqueid) return(i);
-
- return -1;
-}
-
-
-static int refresh_gsoap(glite_jpis_context_t ctx, struct soap *soap) {
- edg_wll_GssCred cred;
- edg_wll_GssStatus gss_code;
- char *et;
- // preventive very long timeout
- static const struct timeval to = {tv_sec: 7200, tv_usec: 0};
- glite_gsplugin_Context plugin_ctx;
-
- if (edg_wll_gss_acquire_cred_gsi(ctx->conf->server_cert, ctx->conf->server_key, &cred, &gss_code) != 0) {
- edg_wll_gss_get_error(&gss_code,"",&et);
- glite_jpis_stack_error(ctx->jpctx, EINVAL, "can't refresh certificates (%s)", et);
- free(et);
- return EINVAL;
- //printf("[%d] %s: %s\n", getpid(), __FUNCTION__, err.desc);
- }
-
- plugin_ctx = glite_gsplugin_get_context(soap);
- glite_gsplugin_set_timeout(plugin_ctx, &to);
- glite_gsplugin_set_credential(plugin_ctx, cred);
-
- return 0;
-}
-
-
-// call PS FeedIndex for a given destination
-int MyFeedIndex(struct soap *soap, glite_jpis_context_t ctx, long int uniqueid, const char *dest)
-{
- struct _jpelem__FeedIndex in;
- struct _jpelem__FeedIndexResponse out;
-// struct jptype__primaryQuery query;
-// struct jptype__stringOrBlob value;
-// struct xsd__base64Binary blob;
- int i, dest_index, status;
- glite_jp_is_conf *conf = ctx->conf;
-
- lprintf("(%ld) for %s called\n", uniqueid, dest);
-
- if (refresh_gsoap(ctx, soap) != 0)
- return glite_jpis_stack_error(ctx->jpctx, EINVAL, "can't refresh credentials");
-
- memset(&in, 0, sizeof(in));
-
- for (i=0; conf->attrs[i]; i++) ;
- in.__sizeattributes = i;
- in.attributes = conf->attrs;
-
- if ((dest_index = find_dest_index(conf, uniqueid)) < 0)
- return glite_jpis_stack_error(ctx->jpctx, EINVAL, "internal error (feed index %ld not found)", uniqueid);
-
- soap_begin(soap);
- for (i=0; conf->feeds[dest_index]->query[i].attr; i++);
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, &in, conditions, struct jptype__primaryQuery, i);
-
- for (i=0; conf->feeds[dest_index]->query[i].attr; i++) {
- if (glite_jpis_QueryCondToSoap(soap, &conf->feeds[dest_index]->query[i],
- GLITE_SECURITY_GSOAP_LIST_GET(in.conditions, i)) != SOAP_OK) {
- soap_end(soap);
- return glite_jpis_stack_error(ctx->jpctx, EINVAL, "error during conds conversion");
- }
- }
-
- in.history = conf->feeds[dest_index]->history;
- in.continuous = conf->feeds[dest_index]->continuous;
- in.destination = ctx->hname;
- lprintf("(%ld) destination IS: '%s'\n", uniqueid, ctx->hname);
-
- if (check_fault(soap,soap_call___jpsrv__FeedIndex(soap,dest,"", &in, &out)) != 0) {
- fprintf(stderr, "\n");
- glite_jpis_unlockFeed(ctx, uniqueid);
- glite_jpis_stack_error(ctx->jpctx, EIO, "soap_call___jpsrv__FeedIndex() returned error %d", soap->error);
- soap_end(soap);
- return EIO;
- }
- else {
- status = (conf->feeds[dest_index]->history ? GLITE_JP_IS_STATE_HIST : 0) | (conf->feeds[dest_index]->continuous ? GLITE_JP_IS_STATE_CONT : 0);
- lprintf("(%ld) FeedId: %s\n", uniqueid, out.feedId);
- lprintf("(%ld) Expires: %s", uniqueid, ctime(&out.feedExpires));
- glite_jpis_initFeed(ctx, uniqueid, out.feedId, time(NULL) + (out.feedExpires - time(NULL)) / 2, status);
- glite_jpis_unlockFeed(ctx, uniqueid);
- }
-
- soap_end(soap);
-
- return 0;
-}
-
-
-int MyFeedRefresh(struct soap *soap, glite_jpis_context_t ctx, long int uniqueid, const char *dest, int status, const char *feedid)
-{
- struct _jpelem__FeedIndexRefresh in;
- struct _jpelem__FeedIndexRefreshResponse out;
-
- lprintf("(%ld) for %s called, status = %d\n", uniqueid, feedid, status);
-
- if (refresh_gsoap(ctx, soap) != 0)
- return glite_jpis_stack_error(ctx->jpctx, EINVAL, "can't refresh credentials");
-
- soap_begin(soap);
- memset(&in, 0, sizeof(in));
- in.feedId = soap_strdup(soap, feedid);
- if (check_fault(soap,soap_call___jpsrv__FeedIndexRefresh(soap,dest,"", &in, &out)) != 0) {
- fprintf(stderr, "\n");
- glite_jpis_unlockFeed(ctx, uniqueid);
- glite_jpis_stack_error(ctx->jpctx, EIO, "soap_call___jpsrv__FeedRefresh() returned error %d", soap->error);
- soap_end(soap);
- return EIO;
- }
- else {
- status &= (~GLITE_JP_IS_STATE_ERROR);
- lprintf("(%ld) FeedId: %s\n", uniqueid, feedid);
- lprintf("(%ld) Expires: %s", uniqueid, ctime(&out.feedExpires));
- glite_jpis_initFeed(ctx, uniqueid, feedid, time(NULL) + (out.feedExpires - time(NULL)) / 2, status);
- glite_jpis_unlockFeed(ctx, uniqueid);
- }
-
- soap_end(soap);
- return 0;
-}
-
-
-int __jpsrv__RegisterJob(struct soap* soap UNUSED, struct _jpelem__RegisterJob *jpelem__RegisterJob UNUSED, struct _jpelem__RegisterJobResponse *jpelem__RegisterJobResponse UNUSED) { return 0; }
-int __jpsrv__StartUpload(struct soap* soap UNUSED, struct _jpelem__StartUpload *jpelem__StartUpload UNUSED, struct _jpelem__StartUploadResponse *jpelem__StartUploadResponse UNUSED) { return 0; }
-int __jpsrv__CommitUpload(struct soap* soap UNUSED, struct _jpelem__CommitUpload *jpelem__CommitUpload UNUSED, struct _jpelem__CommitUploadResponse *jpelem__CommitUploadResponse UNUSED) { return 0; }
-int __jpsrv__RecordTag(struct soap* soap UNUSED, struct _jpelem__RecordTag *jpelem__RecordTag UNUSED, struct _jpelem__RecordTagResponse *jpelem__RecordTagResponse UNUSED) { return 0; }
-int __jpsrv__FeedIndex(struct soap* soap UNUSED, struct _jpelem__FeedIndex *jpelem__FeedIndex UNUSED, struct _jpelem__FeedIndexResponse *jpelem__FeedIndexResponse UNUSED) { return 0; }
-int __jpsrv__FeedIndexRefresh(struct soap* soap UNUSED, struct _jpelem__FeedIndexRefresh *jpelem__FeedIndexRefresh UNUSED, struct _jpelem__FeedIndexRefreshResponse *jpelem__FeedIndexRefreshResponse UNUSED) { return 0; }
-int __jpsrv__GetJobFiles(struct soap* soap UNUSED, struct _jpelem__GetJobFiles *jpelem__GetJobFiles UNUSED, struct _jpelem__GetJobFilesResponse *jpelem__GetJobFilesResponse UNUSED) { return 0; }
-int __jpsrv__GetJobAttributes(struct soap* soap UNUSED, struct _jpelem__GetJobAttributes *jpelem__GetJobAttributes UNUSED, struct _jpelem__GetJobAttributesResponse *jpelem__GetJobAttributesResponse UNUSED) { return 0; }
-
-int __jpsrv__RecordMultiTags(struct soap* soap UNUSED, struct _jpelem__RecordMultiTags *jpelem__RecordMultiTags UNUSED, struct _jpelem__RecordMultiTagsResponse *jpelem__RecordMultiTagsResponse UNUSED) { return 0; }
+++ /dev/null
-#ident "$Header$"
-
-#ifndef _SOAP_PS_CALLS_H
-#define _SOAP_PS_CALLS_H
-
-#include "context.h"
-#include "conf.h"
-
-int MyFeedIndex(struct soap *soap, glite_jpis_context_t ctx, long int uniqueid, const char *dest);
-int MyFeedRefresh(struct soap *soap, glite_jpis_context_t ctx, long int uniqueid, const char *dest, int status, const char *feedid);
-
-#endif
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <dlfcn.h>
-#include <errno.h>
-
-#include <glite/jp/types.h>
-#include <glite/jp/context.h>
-#include "glite/jp/type_plugin.h"
-
-int glite_jp_typeplugin_load(glite_jp_context_t ctx,const char *so){
-/* XXX: not stored but we never dlclose() yet */
- void *dl_handle = dlopen(so,RTLD_NOW);
-
- glite_jp_error_t err;
- const char *e;
- glite_jp_tplug_data_t *data;
- int i;
-
- glite_jp_tplug_init_t init;
- memset(&err,0,sizeof err);
-
- if (!dl_handle) {
- err.source = "dlopen()";
- err.code = EINVAL;
- err.desc = dlerror();
- return glite_jp_stack_error(ctx,&err);
- }
-
- dlerror();
- init = dlsym(dl_handle,"init");
- e = dlerror();
- if (e) {
- char buf[300];
- snprintf(buf,sizeof buf,"dlsym(\"%s\",\"init\")",so);
- buf[299] = 0;
- err.source = buf;
- err.code = ENOENT;
- err.desc = e;
- return glite_jp_stack_error(ctx,&err);
- }
-
- data = calloc(1,sizeof *data);
-
- if (init(ctx, NULL, data)) return -1;
-
- i = 0;
- if (ctx->type_plugins) for (i=0; ctx->type_plugins[i]; i++);
- ctx->type_plugins = realloc(ctx->type_plugins,
- (i+2) * sizeof *ctx->type_plugins);
- ctx->type_plugins[i] = data;
- ctx->type_plugins[i+1] = NULL;
-
- /* TODO: check consistency of uri+class pairs wrt. previous plugins */
-
- return 0;
-}
-
+++ /dev/null
-jpsrv = http://glite.org/wsdl/services/jp
-jptype = http://glite.org/wsdl/types/jp
-jpelem = http://glite.org/wsdl/elements/jp
-jpisclient = http://glite.org/xsd/types/jpisclient
+++ /dev/null
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdsoap2.h>
-
-#include <glite/jp/types.h>
-#include "soap_version.h"
-
-#include "jp_H.h"
-#include "ws_typemap.h"
-#include <glite/security/glite_gscompat.h>
-#include "ws_is_typeref.h"
-
-#include "glite/jp/ws_fault.c"
-
-
-void glite_jpis_SoapToQueryOp(const enum jptype__queryOp in, glite_jp_queryop_t *out)
-{
- switch ( in )
- {
- case EQUAL: *out = GLITE_JP_QUERYOP_EQUAL; break;
- case UNEQUAL: *out = GLITE_JP_QUERYOP_UNEQUAL; break;
- case LESS: *out = GLITE_JP_QUERYOP_LESS; break;
- case GREATER: *out = GLITE_JP_QUERYOP_GREATER; break;
- case WITHIN: *out = GLITE_JP_QUERYOP_WITHIN; break;
- case EXISTS: *out = GLITE_JP_QUERYOP_EXISTS; break;
- default: assert(0); break;
- }
-}
-
-void glite_jpis_SoapToAttrOrig(const enum jptype__attrOrig *in, glite_jp_attr_orig_t *out)
-{
- assert(out);
-
- if (!in) {
- *out = GLITE_JP_ATTR_ORIG_ANY;
- return;
- }
-
- switch ( *in )
- {
- case SYSTEM: *out = GLITE_JP_ATTR_ORIG_SYSTEM; break;
- case USER: *out = GLITE_JP_ATTR_ORIG_USER; break;
- case FILE_: *out = GLITE_JP_ATTR_ORIG_FILE; break;
- default: assert(0); break;
- }
-}
-
-static int SoapToQueryRecordVal(
- struct jptype__stringOrBlob *in,
- int *binary,
- size_t *size,
- char **value)
-{
-
- assert(in);
- if (GSOAP_ISSTRING(in)) {
- *binary = 0;
- *size = 0;
- *value = strdup(GSOAP_STRING(in));
-
- return 0;
- }
- else if (GSOAP_ISBLOB(in)) {
- *binary = 1;
- *size = GSOAP_BLOB(in)->__size;
- memcpy(*value, GSOAP_BLOB(in)->__ptr, GSOAP_BLOB(in)->__size);
- // XXX how to handle id, type, option?
-
- return 0;
- }
- else
- // malformed value
- return 1;
-}
-
-
-#if 0
-static int SoapToQueryCond(
- struct jptype__indexQuery *in,
- glite_jp_query_rec_t **out)
-{
- glite_jp_query_rec_t *qr;
- int i;
- struct jptype__indexQueryRecord *record;
-
- assert(in); assert(out);
- qr = calloc(in->__sizerecord + 1, sizeof(*qr));
-
- for (i=0; i < in->__sizerecord; i++) {
- record = GLITE_SECURITY_GSOAP_LIST_GET(in->record, i);
- qr[i].attr = strdup(in->attr);
- glite_jpis_SoapToQueryOp(record->op, &(qr[i].op));
-
- switch (qr[i].op) {
- case GLITE_JP_QUERYOP_EXISTS:
- break;
-
- case GLITE_JP_QUERYOP_WITHIN:
- SoapToQueryRecordVal(record->value2, &(qr[i].binary),
- &(qr[i].size2), &(qr[i].value2));
- // fall through
- default:
- if ( SoapToQueryRecordVal(record->value, &(qr[i].binary),
- &(qr[i].size), &(qr[i].value)) ) {
- *out = NULL;
- return 1;
- }
- break;
- }
-
- glite_jpis_SoapToAttrOrig(in->origin, &(qr[i].origin) );
- }
-
- *out = qr;
-
- return 0;
-}
-
-/**
- * Translate JP index query conditions from soap to C query_rec
- *
- * \param OUT array of glite_jp_query_rec_t query records
- */
-int glite_jpis_SoapToQueryConds(
- int size,
- struct jptype__indexQuery **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<size; i++) {
- if ( SoapToQueryCond(in[i], &(qr[i])) ) {
- *out = NULL;
- return 1;
- }
- }
-
- *out = qr;
-
- return 0;
-}
-#endif
-
-
-static int SoapToPrimaryQueryCond(
- struct jptype__primaryQuery *in,
- glite_jp_query_rec_t *out)
-{
- glite_jp_query_rec_t *qr;
-
-
- assert(in && in->attr); assert(out);
- qr = out;
-
- 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(in->value2, &(qr[0].binary),
- &(qr[0].size2), &(qr[0].value2));
- // fall through
- default:
- if ( SoapToQueryRecordVal(in->value, &(qr[0].binary),
- &(qr[0].size), &(qr[0].value)) ) {
- return 1;
- }
- break;
- }
-
- glite_jpis_SoapToAttrOrig(in->origin, &(qr[0].origin) );
-
- 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(
- int size,
- GLITE_SECURITY_GSOAP_LIST_TYPE(jptype, primaryQuery) in,
- glite_jp_query_rec_t **out)
-{
- glite_jp_query_rec_t *qr;
- int i;
-
- assert(in || !size); assert(out);
- qr = calloc(size+1, sizeof(*qr));
-
- for (i=0; i<size; i++) {
- if ( SoapToPrimaryQueryCond(GLITE_SECURITY_GSOAP_LIST_GET(in, i), &qr[i]) ) {
- *out = NULL;
- free(qr);
- return 1;
- }
- }
-
- *out = qr;
-
- return 0;
-}
+++ /dev/null
-#ifndef GLITE_JPIS_IS_TYPEREF_H
-#define GLITE_JPIS_IS_TYPEREF_H
-
-#include "jp_H.h"
-
-void glite_jpis_SoapToQueryOp(const enum jptype__queryOp in, glite_jp_queryop_t *out);
-void glite_jpis_SoapToAttrOrig(const enum jptype__attrOrig *in, glite_jp_attr_orig_t *out);
-#if 0
-int glite_jpis_SoapToQueryConds(int size, struct jptype__indexQuery **in, glite_jp_query_rec_t ***out);
-#endif
-int glite_jpis_SoapToPrimaryQueryConds(int size, GLITE_SECURITY_GSOAP_LIST_TYPE(jptype, primaryQuery) in, glite_jp_query_rec_t **out);
-
-#endif
+++ /dev/null
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdsoap2.h>
-
-#include <glite/jp/types.h>
-
-#include "jp_H.h"
-#include "ws_typemap.h"
-#include "ws_ps_typeref.h"
-#include "glite/jp/ws_fault.c"
-
-
-static void QueryOpToSoap(const glite_jp_queryop_t in, enum jptype__queryOp *out)
-{
- switch ( in )
- {
- case GLITE_JP_QUERYOP_EQUAL: *out = EQUAL; break;
- case GLITE_JP_QUERYOP_UNEQUAL: *out = UNEQUAL; break;
- case GLITE_JP_QUERYOP_LESS: *out = LESS; break;
- case GLITE_JP_QUERYOP_GREATER: *out = GREATER; break;
- case GLITE_JP_QUERYOP_WITHIN: *out = WITHIN; break;
- case GLITE_JP_QUERYOP_EXISTS: *out = EXISTS; break;
- default: assert(0); break;
- }
-}
-
-void glite_jpis_AttrOrigToSoap(struct soap *soap, const glite_jp_attr_orig_t in, enum jptype__attrOrig **out)
-{
- enum jptype__attrOrig *o = soap_malloc(soap, sizeof(*o));
-
- switch ( in )
- {
- case GLITE_JP_ATTR_ORIG_ANY: o = NULL; break;
- case GLITE_JP_ATTR_ORIG_SYSTEM: *o = SYSTEM; break;
- case GLITE_JP_ATTR_ORIG_USER: *o = USER; break;
- case GLITE_JP_ATTR_ORIG_FILE: *o = FILE_; break;
- default: assert(0); break;
- }
-
- *out = o;
-}
-
-static int QueryRecordValToSoap(
- struct soap *soap,
- int binary,
- size_t size,
- char *in,
- struct jptype__stringOrBlob **out)
-{
- struct jptype__stringOrBlob *val;
-
-
- assert(out);
- if ( !(val = soap_malloc(soap, sizeof(*val))) ) return SOAP_FAULT;
- memset(val, 0, sizeof(*val) );
-
- if (binary) {
- GSOAP_SETBLOB(val, soap_malloc(soap, sizeof(*GSOAP_BLOB(val))));
- if ( !GSOAP_BLOB(val) ) return SOAP_FAULT;
- GSOAP_BLOB(val)->__size = size;
- if ( !(GSOAP_BLOB(val)->__ptr = soap_malloc(soap, GSOAP_BLOB(val)->__size)) ) return SOAP_FAULT;
- memcpy(GSOAP_BLOB(val)->__ptr, in, GSOAP_BLOB(val)->__size);
- // XXX how to handle id, type, option?
- }
- else {
- GSOAP_SETSTRING(val, soap_strdup(soap, in));
- if ( !(GSOAP_STRING(val) ) ) return SOAP_FAULT;
- }
-
- *out = val;
-
- return SOAP_OK;
-}
-
-/**
- * Translate JP query condition from C query_rec to Soap
- *
- * \param IN in glite_jp_query_rec_t query record
- * \param OUT Soap structure
- */
-int glite_jpis_QueryCondToSoap(
- struct soap *soap,
- glite_jp_query_rec_t *in,
- struct jptype__primaryQuery *out)
-{
- struct jptype__primaryQuery *qr;
-
- assert(in); assert(out);
- qr = out;
- memset(qr, 0, sizeof(*qr));
-
- if ( !(qr->attr = soap_strdup(soap, in->attr)) ) return SOAP_FAULT;
- QueryOpToSoap(in->op, &(qr->op));
- glite_jpis_AttrOrigToSoap(soap, in->origin, &(qr->origin));
-
- switch ( in->op ) {
- case GLITE_JP_QUERYOP_WITHIN:
- if (QueryRecordValToSoap(soap, in->binary, in->size2, in->value2, &qr->value2))
- return SOAP_FAULT;
- case GLITE_JP_QUERYOP_EQUAL:
- case GLITE_JP_QUERYOP_UNEQUAL:
- case GLITE_JP_QUERYOP_LESS:
- case GLITE_JP_QUERYOP_GREATER:
- if (QueryRecordValToSoap(soap, in->binary, in->size, in->value, &qr->value))
- return SOAP_FAULT;
- case GLITE_JP_QUERYOP_EXISTS:
- break;
- default:
- assert(0); // unknown or undefined operation
- break;
- }
-
- *out = *qr;
-
- return SOAP_OK;
-}
-
-static void SoapToAttrOrig(glite_jp_attr_orig_t *out, const enum jptype__attrOrig in)
-{
- switch ( in )
- {
- case jptype__attrOrig__SYSTEM: *out = GLITE_JP_ATTR_ORIG_SYSTEM; break;
- case jptype__attrOrig__USER: *out = GLITE_JP_ATTR_ORIG_USER; break;
- case jptype__attrOrig__FILE_: *out = GLITE_JP_ATTR_ORIG_FILE; break;
- default: assert(0); break;
- }
-}
-
-void glite_jpis_SoapToAttrVal(glite_jp_attrval_t *av, const struct jptype__attrValue *attr) {
- memset(av, 0, sizeof(*av));
- av->name = attr->name;
- av->binary = GSOAP_ISBLOB(attr->value);
- if (av->binary) {
- av->value = GSOAP_BLOB(attr->value)->__ptr;
- av->size = GSOAP_BLOB(attr->value)->__size ;
- } else {
- av->size = -1;
- av->value = GSOAP_STRING(attr->value);
- }
- SoapToAttrOrig(&av->origin, attr->origin);
- av->origin_detail = attr->originDetail;
- av->timestamp = attr->timestamp;
-}
+++ /dev/null
-#ifndef GLITE_JPIS_TYPEREF_H
-#define GLITE_JPIS_TYPEREF_H
-
-int glite_jpis_QueryCondToSoap(struct soap *soap, glite_jp_query_rec_t *in, struct jptype__primaryQuery *out);
-
-void glite_jpis_AttrOrigToSoap(struct soap *soap, const glite_jp_attr_orig_t in, enum jptype__attrOrig **out);
-
-void glite_jpis_SoapToAttrVal(glite_jp_attrval_t *av, const struct jptype__attrValue *attr);
-
-#endif
+++ /dev/null
-// XXX: may be glued with org.glite.jp.primary/src/jptype_map.h?
-
-#include "soap_version.h"
-
-#if GSOAP_VERSION >= 20700
-
-#define SYSTEM jptype__attrOrig__SYSTEM
-#define USER jptype__attrOrig__USER
-#define FILE_ jptype__attrOrig__FILE_
-
-#define EQUAL jptype__queryOp__EQUAL
-#define UNEQUAL jptype__queryOp__UNEQUAL
-#define LESS jptype__queryOp__LESS
-#define GREATER jptype__queryOp__GREATER
-#define WITHIN jptype__queryOp__WITHIN
-#define EXISTS jptype__queryOp__EXISTS
-
-#else
-
-#define __jpsrv__UpdateJobs __ns1__UpdateJobs
-#define __jpsrv__QueryJobs __ns1__QueryJobs
-#define __jpsrv__AddFeed __ns1__AddFeed
-#define __jpsrv__GetFeeds __ns1__getFeedIDs
-#define __jpsrv__DeleteFeed __ns1__DeleteFeed
-#define __jpsrv__ServerConfiguration __ns1__ServerConfiguration
-
-#endif
-
+++ /dev/null
-# defaults
-top_srcdir=.
-builddir=build
-top_builddir=${top_srcdir}/${builddir}
-stagedir=.
-globalprefix=glite
-jpprefix=jp
-package=glite-jp-primary
-version=0.0.0
-PREFIX=/opt/glite
-
-glite_location=/opt/glite
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-gsoap_prefix=/software/gsoap-2.6
-
-CC=gcc
-
--include Makefile.inc
-
-
-VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/test:${top_srcdir}/project:${stagedir}/interface
-
-archlib:=lib
-host_cpu:=${shell uname -m}
-ifeq (${host_cpu},x86_64)
- archlib:=lib64
-endif
-
-archlib:=lib
-host_cpu:=${shell uname -m}
-ifeq (${host_cpu},x86_64)
- archlib:=lib64
-endif
-
-
-ifneq (${classads_prefix},/usr)
- classadslib := -L${classads_prefix}/${archlib} -lclassad
-endif
-
-CLASSADPLUGIN_LIBS:= ${classadslib} -lstdc++
-
-CLASSADPLUGIN_LOBJS:= classad_plugin.lo
-
-GLOBUS_CFLAGS:=-I${globus_prefix}/include/${nothrflavour}
-
-DEBUG:=-g -O0 -DDEBUG
-
-CFLAGS:=${DEBUG} -I. -I${top_srcdir}/src -I${gsoap_prefix}/include -I${gsoap_prefix} -I${stagedir}/include -I${classads_prefix}/include -I${libtar_prefix}/include ${GLOBUS_CFLAGS}
-# 3.1 CFLAGS:=${DEBUG} -I. -I${top_srcdir}/interface -I${top_srcdir}/src -I${gsoap_prefix}/include -I${gsoap_prefix} -I${stagedir}/include ${GLOBUS_CFLAGS} -I${mysql_prefix}/include -I${mysql_prefix}/include/mysql -I${classads_prefix}/include -I${libtar_prefix}/include
-
-LDFLAGS:=-L${stagedir}/lib
-
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LTCOMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-SOLINK:=libtool --mode=link ${CC} -module ${LDFLAGS} -rpath ${stagedir}/lib
-LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-daemon:=glite-jp-primarystoraged
-example:=jpps-test dag-deps
-ps_prefix:=jpps_
-is_prefix:=jpis_
-sample_jobs:=sample_job_aborted sample_job_cleared sample_job_tagged_done sample_job_waiting
-
-plugins:=glite-jp-ftpdauth.la glite-jp-classad.la glite-jp-sandbox.la glite-jp-callouts_${nothrflavour}.la
-
-SRCS:= bones_server.c soap_ops.c \
- new_ftp_backend.c file_plugin.c \
- feed.c authz.c attrs.c \
- tags.c\
- is_client.c \
- soap_switch.c
-
-# ${ps_prefix}ServerLib.c \
-# ${is_prefix}ClientLib.c jpps_C.c
-
-TEST_SRCS:=jpps-test.c ${ps_prefix}C.c ${ps_prefix}Client.c
-DAG_SRCS:=dag-deps.c ${ps_prefix}C.c ${ps_prefix}Client.c
-
-gsoap_bin_prefix:=${shell if [ -x ${gsoap_prefix}/bin/soapcpp2 ]; then echo ${gsoap_prefix}/bin; else echo ${gsoap_prefix}; fi }
-
-OBJS:=${SRCS:.c=.o}
-TEST_OBJS:=${TEST_SRCS:.c=.o}
-DAG_OBJS:=${DAG_SRCS:.c=.o}
-
-dotless_soap_ver:=${shell echo ${gsoap_version} | tr -d . }
-COMMONLIB:=-lglite_jp_common_${nothrflavour}
-SRVCOMMONLIB:=-lglite_jp_server_common
-BONESLIB:=-lglite_lbu_server_bones
-GSOAPLIB:=-L${stagedir}/lib -lglite_security_gsoap_plugin_${dotless_soap_ver}_${nothrflavour}
-TRIOLIB:=-lglite_lbu_trio
-LIBTARLIB:=-L${libtar_prefix}/lib -ltar
-GSSLIB:=-lglite_security_gss_${nothrflavour}
-
-default all: compile
-
-compile: ${daemon} ${example} ${plugins}
-
-${daemon}: ${OBJS}
- ${LINK} -o $@ -export-dynamic ${OBJS} ${BONESLIB} ${TRIOLIB} ${COMMONLIB} ${GSOAPLIB} ${GSSLIB} ${SRVCOMMONLIB}
-
-jpps-test: ${TEST_OBJS}
- ${LINK} -o $@ ${TEST_OBJS} ${GSOAPLIB}
-
-dag-deps: ${DAG_OBJS}
- ${LINKXX} -o $@ ${DAG_OBJS} ${classadslib} ${GSOAPLIB}
-
-JobProvenancePS.xh: %.xh: %.wsdl JobProvenanceTypes.wsdl typemap.dat
- cp ${stagedir}/interface/JobProvenanceTypes.wsdl .
- ${gsoap_bin_prefix}/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o $@ $<
- rm -f JobProvenanceTypes.wsdl
-
-JobProvenanceIS.xh: %.xh: %.wsdl JobProvenanceTypes.wsdl typemap.dat
- cp ${stagedir}/interface/JobProvenanceTypes.wsdl .
- ${gsoap_bin_prefix}/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o $@ $<
- rm -f JobProvenanceTypes.wsdl
-
-glite-jp-classad.la: ${CLASSADPLUGIN_LOBJS}
- ${SOLINK} -o $@ ${CLASSADPLUGIN_LOBJS} ${CLASSADPLUGIN_LIBS}
-
-${ps_prefix}Client.c ${ps_prefix}ClientLib.c \
-${ps_prefix}Server.c ${ps_prefix}ServerLib.c \
-${ps_prefix}C.c ${ps_prefix}H.h: JobProvenancePS.xh
- ${gsoap_bin_prefix}/soapcpp2 -n -w -c -p ${ps_prefix} JobProvenancePS.xh
-
-${is_prefix}ClientLib.c ${is_prefix}Client.c \
-${is_prefix}C.c ${is_prefix}H.h: JobProvenanceIS.xh
- ${gsoap_bin_prefix}/soapcpp2 -n -w -c -p ${is_prefix} JobProvenanceIS.xh
-
-soap_ops.o: ${ps_prefix}ServerLib.c soap_util.c soap_env_ctx.c soap_env_ctx.h
-
-is_client.o: ${is_prefix}ClientLib.c soap_util.c soap_env_ctx.c soap_env_ctx.h
-
-env_C.c env_Server.c:
- touch env.xh
- ${gsoap_bin_prefix}/soapcpp2 -w -c -p env_ env.xh
-
-#$(SOAP_PREFIX)H.h $(SOAP_PREFIX)C.c: LB.xh
-# $(GSOAP_BIN_PATH)/soapcpp2 -w -c -p $(SOAP_PREFIX) LB.xh
-#
-#LB.xh: LB.wsdl typemap.dat
-# $(GSOAP_BIN_PATH)/wsdl2h -c -o $@ LB.wsdl
-#
-
-
-bones_server.o simple_server.o: ${is_prefix}H.h ${ps_prefix}H.h
-
-check:
- -echo nothing yet
-
-doc:
-
-stage: compile
- ${MAKE} PREFIX=${stagedir} DOSTAGE=yes install
-
-install:
- -mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/examples ${PREFIX}/etc/init.d ${PREFIX}/lib
- ${INSTALL} -m 755 ${daemon} ${PREFIX}/bin
- ${INSTALL} -m 755 jpps-test ${PREFIX}/examples/glite-jp-primary-test
- ${INSTALL} -m 755 ${top_srcdir}/examples/getjobattr.pl ${PREFIX}/examples/glite-jpps-getjobattr.pl
- for plugin in ${plugins}; do \
- ${INSTALL} -m 755 $$plugin ${PREFIX}/lib; \
- done
- ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-jp-primary
- ${INSTALL} -m 755 ${top_srcdir}/config/glite-jp-primary-dbsetup.sql ${PREFIX}/etc
- ${INSTALL} -m 755 ${top_srcdir}/config/glite-jp-primary-dbsetup.sh ${PREFIX}/etc
- ${INSTALL} -m 755 ${top_srcdir}/examples/jpps_store_test ${PREFIX}/examples/glite-jp-primary-store-test
- for i in ${sample_jobs}; do \
- ${INSTALL} -m 644 ${top_srcdir}/examples/$$i ${PREFIX}/examples/glite-jp-primary-$$i.lb; \
- done
- -mkdir -p ${PREFIX}/yaim/functions/
- -mkdir -p ${PREFIX}/yaim/node-info.d
- -mkdir -p ${PREFIX}/yaim/defaults
- -mkdir -m 0700 -p ${PREFIX}/yaim/examples/siteinfo/services
- ${INSTALL} -m 0644 ${top_srcdir}/config/functions/config* ${PREFIX}/yaim/functions
- ${INSTALL} -m 0644 ${top_srcdir}/config/node-info.d/glite* ${PREFIX}/yaim/node-info.d
- ${INSTALL} -m 0644 ${top_srcdir}/config/defaults/glite* ${PREFIX}/yaim/defaults
- ${INSTALL} -m 0600 ${top_srcdir}/config/site-info.def.example ${PREFIX}/yaim/examples/siteinfo/services/glite_jpps
-clean:
-
-simple_server.o soap_ops.o jpps-test.o: ${ps_prefix}H.h
-
-# we have no real config.h but have to force gSoap not to use
-# linux ftime with broken (aka obsolete) DST information
-
-# stdsoap2.o: ${gsoap_prefix}/devel/stdsoap2.c
-# test -f config.h || touch config.h
-# @echo 'The following warning "time_t (de)serialization is not MT safe on this platform" is harmless'
-# ${CC} -o $@ -c -DWITH_NONAMESPACES -DHAVE_CONFIG_H ${CFLAGS} ${gsoap_prefix}/devel/stdsoap2.c
-#
-
-glite-jp-sandbox.la: sandbox_plugin.lo
- ${SOLINK} -o $@ sandbox_plugin.lo ${LIBTARLIB}
-
-glite-jp-ftpdauth.la: ftpd_auth.lo
- ${SOLINK} -o $@ ftpd_auth.lo ${COMMONLIB} ${TRIOLIB} ${SRVCOMMONLIB}
-
-glite-jp-callouts_${nothrflavour}.la: jp_callouts.lo
- ${SOLINK} -o $@ $^ ${COMMONLIB} ${TRIOLIB} ${SRVCOMMONLIB}
-
-#glite-jp-classad.lo: classad_plugin.c
-# ${LTCOMPILE} -DPLUGIN_DEBUG -o $@ -c $<
-
-#glite-jp-classad.lo: classad_plugin.c
-# ${LTCOMPILE} -DPLUGIN_DEBUG -o $@ -c $<
-
-%.lo: %.c
- ${LTCOMPILE} -o $@ -c $<
-
-soap_ops.o bones_server.o: soap_version.h
-
-soap_version.h:
- ${gsoap_bin_prefix}/soapcpp2 /dev/null
- perl -ne '$$. == 2 && /.*([0-9])\.([0-9])\.([0-9]).*/ && printf "#define GSOAP_VERSION %d%02d%02d\n",$$1,$$2,$$3' soapH.h >$@
- -rm soapC.cpp soapH.h soapStub.h soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp
-
-soap_env_ctx.c soap_env_ctx.h soap_switch.c: env_C.c mk_soap_switch.pl
- ${top_srcdir}/src/mk_soap_switch.pl env_C.c >soap_switch.c
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the GLite JP Primary module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.5 2007/03/29 13:01:58 valtri
- merge from RC31 branch (compiles and seems working)
-
- Revision 1.4.6.1 2007/03/12 15:46:04 akrenek
- fetch gsoap
-
- Revision 1.4 2005/05/26 15:13:31 zurek
- inserted module.build.file
-
- Revision 1.3 2004/11/22 14:00:19 dimeglio
- Updated to use standard files
- Fixed names (was using common instead of real module name)
-
- Revision 1.2 2004/11/22 13:55:30 dimeglio
- First version of this file
- Use central subsystem definition
-
- Revision 1.1.1.1 2004/10/15 09:49:24 akrenek
--->
-
-<project name="primary" default="dist">
-
- <!-- =========================================
- Builds the gLite JP Primary Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="gsoap" inheritAll="false">
- <param name="ext.gsoap.version" value="2.7.9d"/>
- <param name="ext.gsoap.rep.file" value="gSOAP-2.7.9d.tar.gz"/>
- </antcall>
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-### Default values to some glite-JPPS variables
-GLITE_USER=glite
+++ /dev/null
-function config_glite_jpps_check(){
- requires MYSQL_PASSWORD
-}
-
-function config_glite_jpps_setenv(){
-
- yaimgridenv_set GLITE_LOCATION ${INSTALL_ROOT:-opt}/glite
- yaimgridenv_set GLITE_LOCATION_VAR ${GLITE_LOCATION_VAR:-/var/glite}
- yaimgridenv_set GLITE_USER ${GLITE_USER:-glite}
- yaimgridenv_set GLITE_HOST_CERT ${GLITE_USER_HOME:-/home/glite}/.certs/hostcert.pem
- yaimgridenv_set GLITE_HOST_KEY ${GLITE_USER_HOME:-/home/glite}/.certs/hostkey.pem
- yaimgridenv_set X509_CERT_DIR /etc/grid-security/certificates
- yaimgridenv_set GLITE_JP_PRIMARY_PORT ${GLITE_JP_PRIMARY_PORT:-8901}
- yaimgridenv_set GLITE_JP_PRIMARY_PEERS ${GLITE_JP_PRIMARY_PEERS:-$GLITE_LOCATION/etc/JPPS-peers}
- yaimgridenv_set GLITE_JP_PRIMARY_FTP_PORT ${GLITE_JP_PRIMARY_FTP_PORT:-8911}
- yaimgridenv_set GLITE_JP_PRIMARY_INTERNAL ${GLITE_USER_HOME:-/home/glite}/jpps
- yaimgridenv_set GLITE_JP_PRIMARY_EXTERNAL gsiftp://`hostname -f`:${GLITE_JP_PRIMARY_FTP_PORT:-8911}${GLITE_USER_HOME:-/home/glite}/jpps
- yaimgridenv_set GLITE_JP_PRIMARY_DBCS ${GLITE_JP_PRIMARY_DBCS:-jpps/@localhost:jpps}
- yaimgridenv_set GLITE_JP_PRIMARY_SPECIAL ${GLITE_JP_PRIMARY_SPECIAL:-}
- yaimgridenv_set GLITE_JP_GSI_AUTHZ ${GLITE_JP_GSI_AUTHZ:-$GLITE_LOCATION/etc/gsi_authz.conf}
-
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/glite/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/globus/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/c-ares/lib
-}
-
-function config_glite_jpps() {
-
- ####################################################
- # Job Provenance Primary Storage configuration #
- ####################################################
-
- HOSTNAME=`hostname -f`
-
- chmod og+rx /var/lib/mysql/
- chown mysql:mysql /var/run/mysqld/
-
- # add option --max_allowed_packet=17M
- if [ ! -f /etc/my.cnf ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- else
- grep "^[mysqld]" /etc/my.cnf > /dev/null
- if [ ! $? = 0 ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- fi
- fi
-
- /sbin/chkconfig mysqld on
- ps ax | grep -v grep |grep mysqld_safe > /dev/null 2>&1
- if [ ! $? = 0 ] ; then
- /etc/init.d/mysqld start
- sleep 1
- fi
-
- ls /tmp/mysql.sock > /dev/null 2>&1
- if [ ! $? = 0 ]; then
- ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
- fi
-
- # set mysql password
- set_mysql_passwd || return 1 # the function uses $MYSQL_PASSWORD
-
- # Check if database exist
- mysqlshow --password="$MYSQL_PASSWORD" | grep "jpps" > /dev/null 2>&1
-
- if [ ! $? = 0 ]; then
- mysql -u root --password="$MYSQL_PASSWORD" -e "CREATE DATABASE jpps"
- mysql --password="$MYSQL_PASSWORD" jpps < ${INSTALL_ROOT}/glite/etc/glite-jp-primary-dbsetup.sql
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on jpps.* to jpps IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on jpps.* to jpps@'$HOSTNAME' IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on jpps.* to jpps@localhost IDENTIFIED BY '' WITH GRANT OPTION;"
- else
- yaimlog "Database jpps already exists"
- fi
-
- . /opt/glite/etc/profile.d/grid-env.sh
- mkdir -p $GLITE_LOCATION_VAR # Needed to store PID of JPPS
- chown $GLITE_USER:$GLITE_USER $GLITE_LOCATION_VAR
- chmod 0755 $GLITE_LOCATION_VAR
-
- mkdir -p $GLITE_JP_PRIMARY_INTERNAL
- chown $GLITE_USER:$GLITE_USER $GLITE_JP_PRIMARY_INTERNAL
- chmod 0755 $GLITE_JP_PRIMARY_INTERNAL
-
- mkdir -p $GLITE_USER_HOME/.certs
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs
- chmod 0755 $GLITE_USER_HOME/.certs
- cp -f /etc/grid-security/hostcert.pem /etc/grid-security/hostkey.pem $GLITE_USER_HOME/.certs/
- if [ ! $? = 0 ] ; then
- echo "Please copy host certificate and key into /etc/grid-security and"
- echo " $GLITE_USER_HOME/.certs/, change the owner of the ones in"
- echo " $GLITE_USER_HOME/.certs/ to $GLITE_USER"
- fi
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs/hostcert.pem $GLITE_USER_HOME/.certs/hostkey.pem
- chmod 0644 $GLITE_USER_HOME/.certs/hostcert.pem
- chmod 0400 $GLITE_USER_HOME/.certs/hostkey.pem
-
- # Start services
- if [ ! -f ${GLITE_LOCATION}/etc/gLiteservices ] ; then
- touch ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- grep glite-jp-primary ${GLITE_LOCATION}/etc/gLiteservices > /dev/null
- if [ ! $? = 0 ] ; then
- echo "${GLITE_LOCATION}/etc/init.d/glite-jp-primary" >> ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- touch ${GLITE_JP_PRIMARY_PEERS}
-
- ${GLITE_LOCATION}/etc/init.d/glite-jp-primary stop
- ${GLITE_LOCATION}/etc/init.d/glite-jp-primary start
-
- if [ ! $? = 0 ] ; then
- yaimlog ABORT "Service glite-jp-primary failed to start!"
- return 1
- fi
-
- return 0
-
-}
+++ /dev/null
-#! /bin/sh
-
-#
-# Shell example of preparing the database for JP Index Server
-#
-
-# database
-mysqladmin -u root -p create jpps
-
-# user
-mysql -u root -p -e 'GRANT ALL on jpps.* to jpps@localhost'
-
-# tables
-mysql -u jpps jpps < `dirname $0`/glite-jp-primary-dbsetup.sql
+++ /dev/null
-create table jobs (
- jobid char(32) binary not null,
- dg_jobid varchar(255) binary not null,
- owner char(32) binary not null,
-
- reg_time datetime not null,
-
- primary key (jobid),
- unique (dg_jobid),
- index (owner),
- index (owner,reg_time)
-);
-
-create table files (
- jobid char(32) binary not null,
- filename varchar(255) binary not null,
- int_path mediumblob null,
- ext_url mediumblob null,
-
- state char(32) binary not null,
- deadline datetime null,
- ul_userid char(32) binary not null,
-
- primary key (jobid,filename),
- index (ext_url(255))
-);
-
-create table attrs (
- jobid char(32) binary not null,
- name varchar(255) binary not null,
- value mediumblob null,
-
- primary key (jobid,name)
-);
-
-create table users (
- userid char(32) binary not null,
- cert_subj varchar(255) binary not null,
-
- primary key (userid),
- unique (cert_subj)
-);
-
-create table backend_info (
- version char(32) binary not null
-);
-
-create table feeds (
- feedid char(32) binary not null,
- destination varchar(255) binary not null,
- expires datetime not null,
- cols mediumblob not null,
- query mediumblob not null,
-
- primary key (feedid)
-);
-
-create table fed_jobs (
- feedid char(32) binary not null,
- jobid char(32) binary not null,
-
- primary key (jobid,feedid)
-);
+++ /dev/null
-GLOBUS_GSI_AUTHZ_SYSTEM_INIT glite-jp-callouts_gcc64 authz_jp_system_init_callout
-GLOBUS_GSI_AUTHZ_SYSTEM_DESTROY glite-jp-callouts_gcc64 authz_jp_system_destroy_callout
-GLOBUS_GSI_AUTHZ_HANDLE_INIT glite-jp-callouts_gcc64 authz_jp_handle_init_callout
-GLOBUS_GSI_AUTHZ_HANDLE_DESTROY glite-jp-callouts_gcc64 authz_jp_handle_destroy_callout
-GLOBUS_GSI_AUTHORIZE_ASYNC glite-jp-callouts_gcc64 authz_jp_authorize_async_callout
-globus_mapping glite-jp-callouts_gcc64 authz_jp_globus_mapping
+++ /dev/null
-JPPS_FUNCTIONS="
-config_host_certs
-config_edgusers
-config_globus_clients
-config_glite_jpps
-config_glite_initd"
+++ /dev/null
-#
-# site-info.def example, part for org.glite.jp.primary
-#
-# options configured by YAIM can be overriden by:
-# - /etc/glite.conf
-# - $GLITE_LOCATION/etc/glite-wms.conf
-# - $HOME/.glite.conf # of root user
-#
-
-#
-# required minimum set of YAIM options given from
-# /opt/glite/yaim/examples/siteinfo/site-info.def
-#
-YAIM_LOGGING_LEVEL=INFO
-MY_DOMAIN=civ.zcu.cz
-INSTALL_ROOT=/opt
-CRON_DIR=/etc/cron.d
-GLOBUS_TCP_PORT_RANGE="20000,25000"
-MYSQL_PASSWORD=set_this_to_a_good_password
-
-#
-# default values of basic options
-#
-
-#GLITE_LOCATION=${INSTALL_ROOT:-opt}/glite
-#GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
-#GLITE_USER=${GLITE_USER:-glite}
-#GLITE_HOST_CERT=${GLITE_USER_HOME:-/home/glite}/.certs/hostcert.pem
-#GLITE_HOST_KEY=${GLITE_USER_HOME:-/home/glite}/.certs/hostkey.pem
-#X509_CERT_DIR=/etc/grid-security/certificates
-
-
-#
-# required external options
-#
-
-#GLOBUS_LOCATION=/opt/globus
-
-
-#
-# JPPS configuration default values
-#
-
-# pidfile
-#GLITE_JP_PRIMARY_PIDFILE=$GLITE_LOCATION_VAR/glite-jp-primarystoraged.pid
-
-# port
-#GLITE_JP_PRIMARY_PORT=8901
-
-# FTP port
-#GLITE_JP_PRIMARY_FTP_PORT=8911
-
-#FTP authz configuration file
-#GLITE_JP_GSI_AUTHZ=$GLITE_LOCATION/etc/gsi_authz.conf
-
-# List of privileged DN subjects
-#GLITE_JP_PRIMARY_PEERS=$GLITE_LOCATION/etc/JPPS-peers
-
-# connection string to database (USER/PASSWORD@HOST:DBNAME)
-# If the default is changed, the database has to be created manually !
-#GLITE_JP_PRIMARY_DBCS=jpps/@localhost:jpps
-
-# Additional switches for JPPS.
-#GLITE_JP_PRIMARY_SPECIAL=""
+++ /dev/null
-#!/bin/sh
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-
-[ -f $GLITE_LOCATION/etc/jp.conf ] && . $GLITE_LOCATION/etc/jp.conf
-[ -f $GLITE_LOCATION_VAR/etc/jp.conf ] && . $GLITE_LOCATION_VAR/etc/jp.conf
-
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-[ -n "$GLITE_JP_PRIMARY_PIDFILE" ] && pidfile=$GLITE_JP_PRIMARY_PIDFILE ||
- pidfile="$GLITE_LOCATION_VAR/glite-jp-primarystoraged.pid"
-
-unset creds
-
-test -n "$GLITE_JP_PRIMARY_PORT" || GLITE_JP_PRIMARY_PORT=8901
-
-start()
-{
- if test -z "$GLITE_USER" ;then
- echo 'Error: GLITE_USER is not set'
- echo FAILED
- return 1
- fi
- if test -z "$GLOBUS_LOCATION" ;then
- echo 'Error: GLOBUS_LOCATION is not set'
- echo FAILED
- return 1
- fi
- if test -z "$GLITE_JP_PRIMARY_PEERS" ;then
- echo 'Error: incomplete configuration (GLITE_JP_PRIMARY_PEERS is not set)'
- echo FAILED
- return 1
- fi
- if test -z "$GLITE_JP_PRIMARY_FTP_PORT" -o \
- -z "$GLITE_JP_PRIMARY_INTERNAL" -o -z "$GLITE_JP_PRIMARY_EXTERNAL" ;then
- echo 'Error: incomplete configuration (GLITE_JP_PRIMARY_FTP_PORT,' \
- 'GLITE_JP_PRIMARY_INTERNAL, or GLITE_JP_PRIMARY_EXTERNAL is not set)'
- echo FAILED
- return 1
- fi
-
- if [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] ;then
- creds="-c '$GLITE_HOST_CERT' -k '$GLITE_HOST_KEY'"
- X509_USER_CERT="$GLITE_HOST_CERT"
- X509_USER_KEY="$GLITE_HOST_KEY"
- fi
-
- if test -z "$creds"; then
- if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
- echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
- creds="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
- X509_USER_CERT=/etc/grid-security/hostcert.pem
- X509_USER_KEY=/etc/grid-security/hostkey.pem
- fi
- fi
-
-
- [ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
-
- unset GLITE_JP_PRIMARY_DBCS_OPTION
- if test -n "$GLITE_JP_PRIMARY_DBCS"; then
- GLITE_JP_PRIMARY_DBCS_OPTION="-BD,'$GLITE_JP_PRIMARY_DBCS'"
- fi
-
- echo -n Starting glite-jp-primarystoraged ...
- su - $GLITE_USER -c " $GLITE_LOCATION/bin/glite-jp-primarystoraged \
- $GLITE_JP_DEBUG \
- -P $GLITE_LOCATION/lib/glite_lb_plugin.so -P $GLITE_LOCATION/lib/glite-jp-sandbox.so \
- $creds -a '$GLITE_JP_PRIMARY_PEERS' \
- -i '$pidfile' -p $GLITE_JP_PRIMARY_PORT $GLITE_JP_PRIMARY_SPECIAL \
- -BI,'$GLITE_JP_PRIMARY_INTERNAL' -BE,'$GLITE_JP_PRIMARY_EXTERNAL' \
- ${GLITE_JP_PRIMARY_DBCS_OPTION} " && echo " done" || echo " FAILED"
-
- echo -n Starting JP gridftp server ...
- su - $GLITE_USER -c "X509_USER_CERT=\"$X509_USER_CERT\" \
- X509_USER_KEY=\"$X509_USER_KEY\" \
- GLITE_USER=\"$GLITE_USER\" \
- FTPBE_INT_PREFIX=\"$GLITE_JP_PRIMARY_INTERNAL\" \
- LD_LIBRARY_PATH=$GLOBUS_LOCATION/lib \
- FTPBE_DB_CS=$GLITE_JP_PRIMARY_DBCS \
- GSI_AUTHZ_CONF=$GLITE_JP_GSI_AUTHZ \
- $GLOBUS_LOCATION/sbin/globus-gridftp-server -debug -s -p $GLITE_JP_PRIMARY_FTP_PORT & \
- pid=\$!; echo \$pid > $pidfile.ftpd; sleep 2; true kill -0 \$pid" && echo " done" || echo " FAILED"
-}
-
-stop()
-{
- if [ -f "$pidfile" ]; then
- pid=`cat "$pidfile"`
- kill $pid
- echo -n Stopping glite-jp-primarystoraged \($pid\) ...
- try=0
- while ps p $pid >/dev/null 2>&1; do
- sleep 1;
- try=`expr $try + 1`
- if [ $try = 20 ]; then
- echo " giving up after $try retries"
- return 1
- fi
- done
- kill -9 $pid >/dev/null 2>&1
- echo " done"
- rm -f "$pidfile"
- else
- echo "$pidfile" does not exist - glite-jp-primarystoraged not running? >&2
- return 1
- fi
- if [ -f "$pidfile.ftpd" ]; then
- pid=`cat "$pidfile.ftpd"`
- kill $pid
- echo -n Stopping JP ftp server \($pid\) ...
- try=0
- while ps p $pid >/dev/null 2>&1; do
- sleep 1;
- try=`expr $try + 1`
- if [ $try = 20 ]; then
- echo " giving up after $try retries"
- return 1
- fi
- done
- kill -9 $pid >/dev/null 2>&1
- echo " done"
- rm -f "$pidfile.ftpd"
- else
- echo "$pidfile.ftpd" does not exist - JP ftp server not running? >&2
- return 1
- fi
-
- return 0
-}
-
-status()
-{
- retval=0
- # XXX pidfile?
- if netstat -an --inet | grep "^tcp .* 0.0.0.0:${GLITE_JP_PRIMARY_PORT} .*LISTEN" >/dev/null 2>&1 ;then
- echo glite-jp-primarystoraged running
- else
- echo glite-jp-primarystoraged not running
- retval=1
- fi
-
- if netstat -an --inet | grep "^tcp .* 0.0.0.0:${GLITE_JP_PRIMARY_FTP_PORT} .*LISTEN" >/dev/null 2>&1 ;then
- echo JP gridftp server running
- else
- echo JP gridftp server not running
- retval=1
- fi
-
- return $retval
-}
-
-case x$1 in
- xstart) start;;
- xstop) stop;;
- xrestart) stop; start;;
- xstatus) status;;
- x*) echo usage: $0 start,stop,restart,status >&2
- exit 1;;
-esac
+++ /dev/null
-0. install glite-jp-primary package
-
-1. create MySQL database of the service, preferably using
- ${GLITE_LOCATION}/etc/glite-jp-primary-dbsetup.sh
- (the script prompts two times for MySQL root password)
-
-2. create a directory where JPPS files will be stored and configure
- gridftp server so that this directory is accessible via gridftp
-
-3. create the configuration file $GLITE_LOCATION/etc/jp.conf, it should
- contain /bin/sh syntax assignment to the following variables (or they
- have to be set in the environment of the startup script by other means:
-
- GLITE_USER the unix user running the service
-
- GLOBUS_LOCATION where is Globus installed
-
- GLITE_JP_PRIMARY_FTP_PORT
- port for the ftp JPPS interface (bulk file transfers)
-
- GLITE_JP_PRIMARY_INTERNAL
- directory where the JPPS files are stored (local path)
-
- GLITE_JP_PRIMARY_EXTERNAL
- URL prefix which is mapped by gridftp to the directory,
- eg. gsiftp://this.host.name:$GLITE_JP_PRIMARY_FTP_PORT/some/directory
-
-
- GLITE_JP_PRIMARY_PEERS
- file with list (one per line) of X509 certificate subjects of "trusted peers", i.e. L&B servers which may upload data to this JPPS
-
-
-4. start the service with
- $GLITE_LOCATION/etc/init.d/glite-jp-primary start
-
-
-5. This step taints the database with testing data. Don't do it if it is an issue.
-It is not necessary for the service operation, it's just checking its basic functionality.
-
-$ JOB=https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng
-$ TEST=$GLITE_LOCATION/examples/glite-jp-primary-test
-$ export X5O9_USER_PROXY=/some/proxy.pem # must be among $GLITE_JP_PRIMARY_PEERS
-
-$ $TEST registerjob $JOB '/the/job/owner/x509/cert'
-
-$ $TEST startupload "urn:org.glite.jp.primary:lb" 1 text/plain
- responds with destination gsiftp url
-
-$ globus-url-copy file:///$GLITE_LOCATION/examples/glite-jp-primary-sample_job.lb $DESTINATION_URL
-
-$ $TEST commitupload $DESTINATION_URL
-
-$ $TEST getjobattr $JOB http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
-
-The command should output:
-
- Waiting FILE Mon Oct 10 23:48:47 2005
-
---
+++ /dev/null
-Create database:
-----------------
-
-$ mysqladmin -u root -p create jpps
-$ mysql -u root -p
-mysql> grant all privileges on jpps.* to jpps@localhost identified by '';
-
-$ mysql -p -u jpps jpps <config/glite-jp-primary-dbsetup.sql
-
-
-Start server:
--------------
-
-$ glite-jp-primarystoraged -P .libs/glite-jp-tags.so -P/wherever/it/is/glite_lb_plugin.so \
- -BI,/INTERNAL/PATH -BE,gsiftp://`hostname`/EXT/PREFIX -a trusted_peers
-
-$ LD_PRELOAD=.libs/glite-jp-ftpdauth.so GLITE_USER=ljocha X509_USER_PROXY=/home/ljocha/umbar.pem \
- FTPBE_INT_PREFIX=/INTERNAL/PATH \
- ${GLOBUS_LOCATION}/sbin/in.ftpd -a -s -p 8902 -v
-
-/INTENAL/PATH points to the directory where JP files are stored
-
-/EXT/PREFIX prefix in URLs to manipulate with these files -- ftp should be
-configured to map ftp://`hostname`/EXT/PREFIX/file to /INTERNAL/PATH/file
-
-trusted_peers line-by-line list of X509 subjects to be considered "trusted",
- i.e. services (like LB) we accept data from
-
-
-
-Register job:
--------------
-
-$ jpps-test RegisterJob JOBID OWNER
-
-Returns:
-- OK
-- File exists (Job already registered)
-- Operation not permitted (you are not a trusted peer)
-
-
-Check system attributes known from job registration:
-
-$ ./jpps-test GetJobAttr JOBID http://egee.cesnet.cz/en/Schema/JP/System:owner
-$ ./jpps-test GetJobAttr JOBID http://egee.cesnet.cz/en/Schema/JP/System:regtime
-
-
-Record JP tag:
---------------
-
-$ jpps-test RecordTag JOBID TagA 1 blah
-
-
-TODO
-
-
-Upload
-------
-
-Normal way:
-
-$ ./jpps-test startupload JOBID urn:org.glite.jp.primary:lb 1234 text/plain
-
-OK
-Destination: gsiftp://the.jp.server/EXT/PREFIX/some/strange/path
-Commit before: Fri Sep 8 14:38:53 2006
-
-$ globus-url-copy file://where/the/file/is/lb-dump-JOBID gsiftp://the.jp.server/EXT/PREFIX/some/strange/path
-$ ./jpps-test commitupload gsiftp://the.jp.server/EXT/PREFIX/some/strange/path
-OK
-
-Attacks:
-XX - upload something without startupload
-OK - repeated startupload
-XX - get uncommitted file
-XX - get file with different credentials
-XX - upload again comitted file
-
-
-
-
-
-Register feed
-
-$ jpps-test FeedIndex
-
-registers predefined feed, seen in database (table feeds), slaves should
-restart
-
-
-
-Batch feed
-
-$ jpps-test FeedIndex yes
+++ /dev/null
-#define _GNU_SOURCE /* strndup */
-
-#include <stdio.h>
-#include <sysexits.h>
-
-#include <string.h>
-#include <ctype.h>
-#include <assert.h>
-
-#include <cclassad.h>
-
-#include "glite/jp/known_attr.h"
-
-#include "jpps_H.h"
-#include "jpps_.nsmap"
-
-#include "jptype_map.h"
-#include "glite/security/glite_gsplugin.h"
-#include "glite/security/glite_gscompat.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
-
-#define dprintf(FMT, ARGS...) fprintf(stderr, (FMT), ##ARGS)
-#include "glite/jp/ws_fault.c"
-#define check_fault(SOAP, ERR) glite_jp_clientCheckFault((SOAP), (ERR), NULL, 0)
-
-
-static void usage(const char *me)
-{
- fprintf(stderr,"%s: [-s server-url] jobid\n",me);
-
- exit (EX_USAGE);
-}
-
-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(GSOAP_STRING(GLITE_SECURITY_GSOAP_LIST_GET(out.attrValues, 0)->value));
- 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;
- memset(&val, 0, sizeof(val));
- GSOAP_SETSTRING(&val, js);
-
- 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;
- GSOAP_SETSTRING(&val, ja);
-
- printf("Register ancestor ...\n");
- ret = check_fault(soap,soap_call___jpsrv__RecordTag(soap, server, "",&in, &empty));
- putchar(10);
- }
- }
-
- return ret;
-}
+++ /dev/null
-#!/usr/bin/perl
-
-use SOAP::Lite;
-use Data::Dumper;
-
-$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates';
-$ENV{HTTPS_VERSION}='3';
-
-$cred = $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<";
-$ENV{HTTPS_CERT_FILE}= $ENV{HTTPS_KEY_FILE} = $ENV{HTTPS_CA_FILE} = $cred;
-
-$proxy = shift;
-$job = shift;
-
-die "usage: $0 https://jp.primary.storage.org:8901/jpps https://some.nice.job/id attr attr ...\n"
- unless $ARGV[0];
-
-$c = SOAP::Lite
- -> proxy($proxy)
- -> uri('http://glite.org/wsdl/services/jp');
-
-service $c 'http://egee.cesnet.cz/cms/export/sites/egee/en/WSDL/3.1/JobProvenancePS.wsdl' or die "service: $1\n";
-
-ns $c 'http://glite.org/wsdl/elements/jp';
-
-print "WSDL OK\n";
-
-push @attr,SOAP::Data->name(attributes => $_) for (@ARGV);
-
-$req = SOAP::Data->value(
- SOAP::Data->name(jobid => $job),
- @attr
-# SOAP::Data->name(attributes => 'http://egee.cesnet.cz/en/Schema/LB/Attributes:CE'),
-# SOAP::Data->name(attributes => 'http://egee.cesnet.cz/en/Schema/JP/System:owner')
-);
-
-
-
-on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; };
-
-$resp = GetJobAttributes $c $req;
-
-print Dumper $resp->body unless $fault;
-
+++ /dev/null
-DG.ARRIVED=20051010210927.000000 DATE=20051010210926.978300 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="UserInterface" DG.SRC_INSTANCE="" DG.EVNT="RegJob" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000001:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.REGJOB.JDL="blabla" DG.REGJOB.NS="NNNSSSS" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="uLU0BArrdV98O41PLThJ5Q"
-DG.ARRIVED=20051010210928.000000 DATE=20051010210928.871099 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.ACCEPTED.FROM="UserInterface" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DG.ARRIVED=20051010210928.000000 DATE=20051010210928.917822 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DG.ARRIVED=20051010210928.000000 DATE=20051010210928.947076 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DG.ARRIVED=20051010210928.000000 DATE=20051010210928.980395 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperCall" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.HELPERCALL.HELPER_NAME="name of the called component" DG.HELPERCALL.HELPER_PARAMS="parameters of the call" DG.HELPERCALL.SRC_ROLE="CALLING"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.011781 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="Match" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000005:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.MATCH.DEST_ID="destination CE/queue"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.283947 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000007:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="reason for the change" DG.DONE.EXIT_CODE="0"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.042443 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperReturn" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000007:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.HELPERRETURN.HELPER_NAME="name of the called component" DG.HELPERRETURN.RETVAL="returned data" DG.HELPERRETURN.SRC_ROLE="CALLING"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.071034 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000009:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.101204 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.132080 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="" DG.EVNT="Transfer" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="destination hostname" DG.TRANSFER.DEST_INSTANCE="destination instance" DG.TRANSFER.JOB="(nil)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="detailed description of transfer" DG.TRANSFER.DEST_JOBID="destination internal jobid"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.167712 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000001:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.203602 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Transfer" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000003:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="destination hostname" DG.TRANSFER.DEST_INSTANCE="destination instance" DG.TRANSFER.JOB="(nil)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="detailed description of transfer" DG.TRANSFER.DEST_JOBID="destination internal jobid"
-DG.ARRIVED=20051010210929.000000 DATE=20051010210929.249042 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="_CHANGE_ME_JOBID_" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000005:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.RUNNING.NODE="worker node"
+++ /dev/null
-#include <stdio.h>
-#include <sysexits.h>
-#include <string.h>
-#include <assert.h>
-
-#include "jpps_H.h"
-#include "jpps_.nsmap"
-
-#include "jptype_map.h"
-#include "glite/security/glite_gsplugin.h"
-#include "glite/security/glite_gscompat.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
-
-#define dprintf(FMT, ARGS...) printf(FMT, ##ARGS)
-#include "glite/jp/ws_fault.c"
-#define check_fault(SOAP, ERR) glite_jp_clientCheckFault((SOAP), (ERR), NULL, 0)
-
-static void usage(const char *me)
-{
- fprintf(stderr,"%s: [-s server-url] operation args \n\n"
- " operations are:\n"
- " RegisterJob jobid owner\n"
- " StartUpload jobid class commit_before mimetype\n"
- " CommitUpload destination\n"
- " RecordTag jobid tagname stringvalue ...\n"
- " GetJobFiles jobid\n"
- " GetJobAttr jobid attr\n"
- " FeedIndex [yes (history)]\n"
- " FeedIndexRefresh feedid\n"
- ,me);
-
- exit (EX_USAGE);
-}
-
-/* FIXME: new wsdl */
-#if 0
-static struct jptype__Attribute sample_attr[] = {
- { OWNER, NULL },
- { TIME, "submitted" },
- { TAG, "test" },
-};
-
-static struct jptype__PrimaryQueryElement sample_query[][5] = {
- {
- { sample_attr+OWNER, EQUAL, "unknown", NULL },
- { NULL, 0, NULL, NULL }
- },
-};
-#endif
-
-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;
- struct soap *soap = soap_new2(SOAP_IO_KEEPALIVE,SOAP_IO_KEEPALIVE);
-
- 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]);
- }*/
- int i;
- for (i = 0; i < argc-1; i++)
- if (strcmp(argv[i], "-s") == 0)
- server = argv[i+1];
-
- if (server) {
- argv += 2;
- argc -= 2;
- }
- else server = "http://localhost:8901";
-
-
- if (!strcasecmp(argv[1],"RegisterJob")) {
- struct _jpelem__RegisterJob in;
- struct _jpelem__RegisterJobResponse empty;
-
- if (argc != 4) usage(argv[0]);
- in.job = argv[2];
- in.owner = argv[3];
- ret = check_fault(soap,
- soap_call___jpsrv__RegisterJob(soap,server,"",&in,&empty));
- } else if (!strcasecmp(argv[1], "StartUpload")) {
- struct _jpelem__StartUpload in;
- struct _jpelem__StartUploadResponse out;
-
- in.job = argv[2];
- in.class_ = argv[3];
- in.name = NULL;
- in.commitBefore = atoi(argv[4]) + time(NULL);
- in.contentType = argv[5];
-
- if (argc != 6) usage(argv[0]);
- if (!(ret = check_fault(soap,
- soap_call___jpsrv__StartUpload(soap, server, "",&in,&out))))
- {
- printf("Destination: %s\nCommit before: %s\n", out.destination, ctime(&out.commitBefore));
- }
- } else if (!strcasecmp(argv[1], "CommitUpload")) {
- struct _jpelem__CommitUpload in;
- struct _jpelem__CommitUploadResponse empty;
-
- in.destination = argv[2];
-
- if (argc != 3) usage(argv[0]);
- if (!(ret = check_fault(soap,
- soap_call___jpsrv__CommitUpload(soap, server, "",&in,&empty)))) {
- /* OK */
- }
- } else if (!strcasecmp(argv[1], "RecordTag")) {
- struct _jpelem__RecordTag in;
- struct _jpelem__RecordTagResponse empty;
- struct jptype__tagValue tagval;
- struct jptype__stringOrBlob val;
- int idx;
-
- if (argc < 5 && argc % 2 == 0) usage(argv[0]);
-
- in.jobid = argv[2];
- in.tag = &tagval;
- tagval.value = &val;
-
- for (idx = 3; idx < argc; idx += 2) {
- tagval.name = argv[idx];
- memset(&val, 0, sizeof(val));
- GSOAP_SETSTRING(&val, argv[idx+1]);
-
- printf("%s ... ",tagval.name);
- if (!(ret = check_fault(soap,
- soap_call___jpsrv__RecordTag(soap, server, "",&in, &empty)))) {
- /* OK */
- }
- }
- }
- else if (!strcasecmp(argv[1],"FeedIndex")) {
- char *ap[2] = {
- "http://egee.cesnet.cz/en/Schema/LB/Attributes:RB",
- "http://egee.cesnet.cz/en/Schema/JP/System:owner"
- };
- int sizepq;
-
- struct jptype__stringOrBlob vals[2];
- memset(vals, 0, sizeof vals);
- GSOAP_SETSTRING(vals, "/O=CESNET/O=Masaryk University/CN=Ales Krenek");
- GSOAP_SETSTRING(vals + 1, "Done");
-
- struct jptype__primaryQuery q[] = {
- {
- "http://egee.cesnet.cz/en/Schema/JP/System:owner",
- jptype__queryOp__EQUAL,
- NULL, vals, NULL
- },
- {
- "http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus",
- jptype__queryOp__UNEQUAL,
- NULL, vals+1, NULL
- }
- };
- GLITE_SECURITY_GSOAP_LIST_TYPE(jptype, primaryQuery) pq;
-
- GLITE_SECURITY_GSOAP_LIST_CREATE0(soap, pq, sizepq, struct jptype__primaryQuery, 2);
- memcpy(GLITE_SECURITY_GSOAP_LIST_GET(pq, 0), &q[0], sizeof(q[0]));
- memcpy(GLITE_SECURITY_GSOAP_LIST_GET(pq, 1), &q[1], sizeof(q[1]));
- struct _jpelem__FeedIndex in = {
- "http://some.index//",
- 2,ap,
- sizepq,pq,
- 0,
- 1
- };
- struct _jpelem__FeedIndexResponse out;
-
- in.history = argc >= 3 && !strcasecmp(argv[2],"yes");
-
- if (!(ret = check_fault(soap,soap_call___jpsrv__FeedIndex(soap,server,"",&in,&out))))
- {
- printf("FeedId: %s\nExpires: %s\n",out.feedId,ctime(&out.feedExpires));
- }
- GLITE_SECURITY_GSOAP_LIST_DESTROY(soap, &in, conditions);
- }
-/* FIXME: new wsdl */
-#if 0
- } else if (!strcasecmp(argv[1], "FeedIndexRefresh")) {
- struct jpsrv__FeedIndexRefreshResponse r;
-
- if (argc != 3) usage(argv[0]);
- if (!check_fault(soap,
- soap_call_jpsrv__FeedIndexRefresh(soap, server, "",
- argv[2], &r))) {
- printf("FeedId: %s\nExpires: %s\n",r.feedId,ctime(&r.expires));
- }
- }
-#endif
- else if (!strcasecmp(argv[1],"GetJobFiles")) {
- struct _jpelem__GetJobFiles in;
- struct _jpelem__GetJobFilesResponse out;
- struct jptype__jppsFile *outf;
-
- if (argc != 3) usage(argv[0]);
- in.jobid = argv[2];
-
- if (!(ret = check_fault(soap,soap_call___jpsrv__GetJobFiles(soap,server,"",
- &in,&out))))
- {
- int i;
-
- printf("JobFiles:\n");
-
- for (i=0; i<out.__sizefiles;i++) {
- outf = GLITE_SECURITY_GSOAP_LIST_GET(out.files, i);
- printf("\tclass = %s, name = %s, url = %s\n",
- outf->class_,
- outf->name,
- outf->url);
- }
- }
-
- }
- else if (!strcasecmp(argv[1],"GetJobAttr")) {
- struct _jpelem__GetJobAttributes in;
- struct _jpelem__GetJobAttributesResponse out;
- struct jptype__attrValue *outav;
-
- int rep = 1;
-
- if (argc < 4 || argc > 5) usage(argv[0]);
-
- if (argc == 5) rep = atoi(argv[4]);
-
- in.jobid = argv[2];
- in.__sizeattributes = 1;
- in.attributes = &argv[3];
-
- for (;rep;rep--) if (!(ret = check_fault(soap,soap_call___jpsrv__GetJobAttributes(soap,server,"",&in,&out))))
- {
- int i;
-
- puts("Attribute values:");
- for (i=0; i<out.__sizeattrValues; i++) {
- outav = GLITE_SECURITY_GSOAP_LIST_GET(out.attrValues, i);
- printf("\t%s\t%s\t%s\t%s",
- GSOAP_ISSTRING(outav->value) ?
- GSOAP_STRING(outav->value) :
- "binary",
- orig2str(outav->origin),
- outav->originDetail,
- ctime(&outav->timestamp));
- }
-
- }
-
- }
- else { usage(argv[0]); ret = 1; }
-
- return ret;
-}
-
-
-/* XXX: we don't use it */
-SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} };
+++ /dev/null
-#!/bin/bash
-
-# usage:
-#
-# $ export X509_USER_PROXY=/trusted/peer/credentials
-# $ /where/it/is/jpps_store_test \
-# -s jppps.host.name:port \ # default localhost:8901
-# -o '/job/owner/DN' \ # mandatory
-# -t "name=value" ... \ # may occur multiple times
-# -d /dump/file/template # optional
-#
-# in /dump/file/template occurences of _CHANGE_ME_JOBID_ are substituted with
-# fake jobid generated by this script
-
-echodo()
-{
- echo '**' $@
- "$@" || exit 1
-}
-
-if [ -f jpps-test ];
-then
- jpps="./jpps-test"
-elif [ -f glite-jp-primary-test ];
-then
- jpps="./glite-jp-primary-test"
-else
- echo "glite-jp-primary-test or jpps-test not found!"
- exit 1;
-fi
-
-#getopt -s sh o:d:t:s: "$@"
-#set -- `getopt -s sh o:d:t:s: "$@"`
-while [ "x$1" != x ]; do case $1 in
- -s) shift; jpps="$jpps -s $1";;
- -o) shift; owner="$1";;
- -d) shift; dump="$1";;
- -t) shift; tags="$1|$tags";;
-esac; shift; done
-
-[ x"$owner" = x ] && { echo -o required; exit 1; }
-
-jobid="https://nonexistent.test.server/jpps_store_test_$$"
-
-echodo $jpps RegisterJob $jobid "$owner"
-
-echodo $jpps GetJobAttr $jobid http://egee.cesnet.cz/en/Schema/JP/System:owner
-
-echodo $jpps GetJobAttr $jobid http://egee.cesnet.cz/en/Schema/JP/System:regtime
-
-
-if [ -f "$dump" ]; then
- sed "s|_CHANGE_ME_JOBID_|$jobid|" $dump >job.$$
- echodo $jpps StartUpload $jobid urn:org.glite.jp.primary:lb 1234 text/plain >start.$$
- cat start.$$
- dest=`grep '^Destination:' start.$$ | cut -d' ' -f2`
- rm start.$$
- echodo globus-url-copy "file:$PWD/job.$$" $dest
-# rm job.$$
- echodo $jpps CommitUpload "$dest"
-
-# does not pass authz check -- probably OK
-# echodo $jpps GetJobFiles $jobid
-
- lbprefix="http://egee.cesnet.cz/en/Schema/LB/Attributes"
- echodo $jpps GetJobAttr $jobid "$lbprefix:user"
- echodo $jpps GetJobAttr $jobid "$lbprefix:finalStatus"
-fi
-
-if [ "x$tags" != x ]; then
- oIFS=$IFS
- IFS='|'
- set -- $tags
- IFS=$oIFS
-
- while [ x$1 != x ]; do
- value=`echo $1 | sed 's/^.*=//'`
- name=`echo $1 | sed 's/=.*$//'`
-
- echodo $jpps RecordTag $jobid $name $value
-
- echodo $jpps GetJobAttr $jobid $name
-
- shift
- done
-fi
+++ /dev/null
-#!/usr/bin/perl
-
-use SOAP::Lite;
-use Data::Dumper;
-
-$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates';
-$ENV{HTTPS_VERSION}='3';
-
-$cred = $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<";
-$ENV{HTTPS_CERT_FILE}= $ENV{HTTPS_KEY_FILE} = $ENV{HTTPS_CA_FILE} = $cred;
-
-$proxy = shift;
-
-die "usage: $0 https://jp.primary.storage.org:8901/jpps https://some.nice.job/id attr=value ...\n\t\thttps://another.nice.job/id attr=value ...\n"
- unless $ARGV[0];
-
-$c = SOAP::Lite
- -> proxy($proxy)
- -> uri('http://glite.org/wsdl/services/jp');
-
-service $c 'http://egee.cesnet.cz/cms/export/sites/egee/en/WSDL/HEAD/JobProvenancePS.wsdl' or die "service: $1\n";
-
-ns $c 'http://glite.org/wsdl/elements/jp';
-
-print "WSDL OK\n";
-
-push @ARGV,'__KONEC__';
-$job = shift;
-while ($_ = shift) {
- if (! /(.*)=(.*)/) {
- push @j,SOAP::Data->name(jobs => \SOAP::Data->value(
- SOAP::Data->name(jobid=>$job),
- @a
- ));
-
- break if $_ eq '__KONEC__';
-
- $job = $_;
- @a = ();
- }
- else {
- $name = $1; $value = $2;
- print "$job: $name = $value\n";
-
- push @a, SOAP::Data->name(attributes=>\SOAP::Data->value(
- SOAP::Data->name(name=>$name),
- SOAP::Data->name(value=> \SOAP::Data->value(SOAP::Data->name(string=>$value)))
- ))
- }
-}
-
-
-$req = SOAP::Data->value(@j);
-print Dumper($req);
-
-on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; };
-
-$resp = RecordMultiTags $c $req;
-
-print Dumper $resp->body unless $fault;
-
+++ /dev/null
-DATE=20060313114012.259501 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="UserInterface" DG.SRC_INSTANCE="" DG.EVNT="RegJob" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000001:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="blabla" DG.REGJOB.NS="NNNSSSS" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="uLU0BArrdV98O41PLThJ5Q"
-DATE=20060313114012.332573 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="UserInterface" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DATE=20060313114012.421854 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DATE=20060313114012.527562 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000004:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DATE=20060313114012.629873 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperCall" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000004:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.HELPERCALL.HELPER_NAME="name of the called component" DG.HELPERCALL.HELPER_PARAMS="parameters of the call" DG.HELPERCALL.SRC_ROLE="CALLING"
-DATE=20060313114012.730207 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="Match" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000004:WM=000005:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.MATCH.DEST_ID="destination CE/queue"
-DATE=20060313114012.835673 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperReturn" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000004:WM=000007:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.HELPERRETURN.HELPER_NAME="name of the called component" DG.HELPERRETURN.RETVAL="returned data" DG.HELPERRETURN.SRC_ROLE="CALLING"
-DATE=20060313114012.940723 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000004:WM=000009:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DATE=20060313114013.040365 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="" DG.EVNT="Abort" DG.JOBID="https://scientific.civ.zcu.cz:9000/c63-U-RaOAAHp8YV8QMipw" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ABORT.REASON="just to test"
+++ /dev/null
-DATE=20060313113718.964280 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="UserInterface" DG.SRC_INSTANCE="" DG.EVNT="RegJob" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000001:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="blabla" DG.REGJOB.NS="NNNSSSS" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="uLU0BArrdV98O41PLThJ5Q"
-DATE=20060313113719.131973 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="UserInterface" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DATE=20060313113719.202155 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DATE=20060313113719.316644 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DATE=20060313113719.442051 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperCall" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.HELPERCALL.HELPER_NAME="name of the called component" DG.HELPERCALL.HELPER_PARAMS="parameters of the call" DG.HELPERCALL.SRC_ROLE="CALLING"
-DATE=20060313113719.542691 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="Match" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000005:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.MATCH.DEST_ID="destination CE/queue"
-DATE=20060313113719.632697 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperReturn" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000007:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.HELPERRETURN.HELPER_NAME="name of the called component" DG.HELPERRETURN.RETVAL="returned data" DG.HELPERRETURN.SRC_ROLE="CALLING"
-DATE=20060313113719.739851 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000009:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DATE=20060313113719.839754 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DATE=20060313113719.955172 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="" DG.EVNT="Transfer" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="destination hostname" DG.TRANSFER.DEST_INSTANCE="destination instance" DG.TRANSFER.JOB="(nil)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="detailed description of transfer" DG.TRANSFER.DEST_JOBID="destination internal jobid"
-DATE=20060313113720.062341 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000001:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DATE=20060313113720.158744 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Transfer" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000003:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="destination hostname" DG.TRANSFER.DEST_INSTANCE="destination instance" DG.TRANSFER.JOB="(nil)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="detailed description of transfer" DG.TRANSFER.DEST_JOBID="destination internal jobid"
-DATE=20060313113720.261956 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000005:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="worker node"
-DATE=20060313113720.371040 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000007:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="reason for the change" DG.DONE.EXIT_CODE="0"
-DATE=20060313113720.473822 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Clear" DG.JOBID="https://scientific.civ.zcu.cz:9000/Zziy0_yoV0-j9dtlNl1h7w" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000009:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.CLEAR.REASON="USER"
+++ /dev/null
-DATE=20060313114125.327248 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="UserInterface" DG.SRC_INSTANCE="" DG.EVNT="RegJob" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000001:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.REGJOB.JDL="blabla" DG.REGJOB.NS="NNNSSSS" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="uLU0BArrdV98O41PLThJ5Q"
-DATE=20060313114125.449249 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="UserInterface" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DATE=20060313114125.577238 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DATE=20060313114125.708618 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DATE=20060313114125.817613 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperCall" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.HELPERCALL.HELPER_NAME="name of the called component" DG.HELPERCALL.HELPER_PARAMS="parameters of the call" DG.HELPERCALL.SRC_ROLE="CALLING"
-DATE=20060313114125.913634 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="Match" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000005:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.MATCH.DEST_ID="destination CE/queue"
-DATE=20060313114126.015139 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperReturn" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000007:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.HELPERRETURN.HELPER_NAME="name of the called component" DG.HELPERRETURN.RETVAL="returned data" DG.HELPERRETURN.SRC_ROLE="CALLING"
-DATE=20060313114126.132840 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000009:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DATE=20060313114126.254850 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000001:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DATE=20060313114126.359397 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="JobController" DG.SRC_INSTANCE="" DG.EVNT="Transfer" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000003:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="destination hostname" DG.TRANSFER.DEST_INSTANCE="destination instance" DG.TRANSFER.JOB="(nil)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="detailed description of transfer" DG.TRANSFER.DEST_JOBID="destination internal jobid"
-DATE=20060313114126.462961 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000001:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.ACCEPTED.FROM="JobController" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DATE=20060313114126.564692 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Transfer" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000003:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.TRANSFER.DESTINATION="LRMS" DG.TRANSFER.DEST_HOST="destination hostname" DG.TRANSFER.DEST_INSTANCE="destination instance" DG.TRANSFER.JOB="(nil)" DG.TRANSFER.RESULT="OK" DG.TRANSFER.REASON="detailed description of transfer" DG.TRANSFER.DEST_JOBID="destination internal jobid"
-DATE=20060313114126.665625 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Running" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000005:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.RUNNING.NODE="worker node"
-DATE=20060313114126.775084 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="LogMonitor" DG.SRC_INSTANCE="" DG.EVNT="Done" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000007:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.DONE.STATUS_CODE="OK" DG.DONE.REASON="reason for the change" DG.DONE.EXIT_CODE="0"
-DATE=20060313114936.079576 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="Application" DG.SRC_INSTANCE="" DG.EVNT="UserTag" DG.JOBID="https://scientific.civ.zcu.cz:9000/rQn3lfqMWxWz3Dpm7kypqQ" DG.SEQCODE="UI=000002:NS=0000000004:WM=000010:BH=0000000000:JSS=000004:LM=000007:LRMS=000000:APP=000002" DG.USER="/O=CESNET/O=Masaryk University/CN=Milos Mulac" DG.USERTAG.NAME="color" DG.USERTAG.VALUE="green"
+++ /dev/null
-DG.ARRIVED=20051010204845.000000 DATE=20051010204845.409455 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="UserInterface" DG.SRC_INSTANCE="" DG.EVNT="RegJob" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000001:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.REGJOB.JDL="blabla" DG.REGJOB.NS="NNNSSSS" DG.REGJOB.PARENT="" DG.REGJOB.JOBTYPE="SIMPLE" DG.REGJOB.NSUBJOBS="0" DG.REGJOB.SEED="uLU0BArrdV98O41PLThJ5Q"
-DG.ARRIVED=20051010204847.000000 DATE=20051010204847.451986 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="DeQueued" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000002:NS=0000000004:WM=000001:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.DEQUEUED.QUEUE="queue name" DG.DEQUEUED.LOCAL_JOBID="new jobId assigned by the receiving component"
-DG.ARRIVED=20051010204847.000000 DATE=20051010204847.485702 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperCall" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000002:NS=0000000004:WM=000003:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.HELPERCALL.HELPER_NAME="name of the called component" DG.HELPERCALL.HELPER_PARAMS="parameters of the call" DG.HELPERCALL.SRC_ROLE="CALLING"
-DG.ARRIVED=20051010204847.000000 DATE=20051010204847.520663 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="Match" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000002:NS=0000000004:WM=000005:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.MATCH.DEST_ID="destination CE/queue"
-DG.ARRIVED=20051010204847.000000 DATE=20051010204847.552015 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="HelperReturn" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000002:NS=0000000004:WM=000007:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.HELPERRETURN.HELPER_NAME="name of the called component" DG.HELPERRETURN.RETVAL="returned data" DG.HELPERRETURN.SRC_ROLE="CALLING"
-DG.ARRIVED=20051010204847.000000 DATE=20051010204847.584267 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="WorkloadManager" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000002:NS=0000000004:WM=000009:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
-DG.ARRIVED=20051010204847.000000 DATE=20051010204847.381506 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="Accepted" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000002:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.ACCEPTED.FROM="UserInterface" DG.ACCEPTED.FROM_HOST="sending component hostname" DG.ACCEPTED.FROM_INSTANCE="sending component instance" DG.ACCEPTED.LOCAL_JOBID="new jobId (Condor Globus ...)"
-DG.ARRIVED=20051010204847.000000 DATE=20051010204847.409422 HOST="scientific.civ.zcu.cz" PROG=edg-wms LVL=SYSTEM DG.PRIORITY=0 DG.SOURCE="NetworkServer" DG.SRC_INSTANCE="" DG.EVNT="EnQueued" DG.JOBID="https://scientific.civ.zcu.cz:9200/1Yjk3Wlaspl07y45iX8Tng" DG.SEQCODE="UI=000002:NS=0000000003:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000" DG.USER="/O=CESNET/O=Masaryk University/CN=Ales Krenek" DG.ENQUEUED.QUEUE="destination queue" DG.ENQUEUED.JOB="job description in receiver language" DG.ENQUEUED.RESULT="OK" DG.ENQUEUED.REASON="detailed description of transfer"
+++ /dev/null
-#Sat Oct 15 06:52:14 CEST 2005
-module.build=39
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Configuration options for the gLite JP Primary module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.7 2006/10/10 17:36:32 akrenek
- merge from 3.1
-
- Revision 1.6.4.1 2006/08/28 18:49:23 akrenek
- pch06 tool to generate subjob relationships from DAG JDL
-
- 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
- - ares clean up (now should be mentioned only in modules that really need it)
- - patch for security.gsoap-plugin not yet in CVS (sent to interation list)
- I do not know what will happen when one try to mix ares with c-ares libs
- => weird things may arise!
-
- Revision 1.5 2005/10/11 20:49:27 akrenek
- - detect gsoap
- - use flavoured gsoap plugin
-
- Revision 1.4 2005/06/03 11:56:49 akrenek
- make it build with the new ftp backend
-
- Revision 1.3 2004/11/22 13:55:30 dimeglio
- First version of this file
- Use central subsystem definition
-
- Revision 1.2 2004/10/15 12:19:28 akrenek
- build with gsoap 2.7 too
-
- Revision 1.1.1.1 2004/10/15 09:49:24 akrenek
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="LB Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-gsoap_prefix=${with.gsoap.prefix}
-gsoap_version=${ext.gsoap.version}
-mysql_prefix=${with.mysql.prefix}
-mysql_version=${ext.mysql.version}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-cppunit=${with.cppunit.prefix}
-jpproject=${subsystem.project.dir}
-project=${component.project.dir}
-classads_prefix=${with.classads.prefix}
-libtar_prefix=${with.libtar.prefix}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP Primary component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="JP Primary component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="primary" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-module.version=1.3.0
-module.age=1
+++ /dev/null
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/jp/types.h"
-#include "glite/jp/attr.h"
-#include "glite/jp/backend.h"
-#include "glite/jp/file_plugin.h"
-#include "glite/jp/builtin_plugins.h"
-
-#include "feed.h"
-#include "attrs.h"
-
-static struct {
- char *namespace;
- glite_jpps_fplug_data_t **plugins;
- int nplugins;
- char **opened_classes; // for each plugin contains name of the open class (NULL for no open file)
- char **opened_files; // for each plugin contains name of the open file (NULL for no open file)
- void **plugin_handles; // contains handle for each opened plugin (NULL for not opened)
- void **file_handles; // contains handle for each opened file by plugin (NULL for not opened)
-} *known_namespaces;
-
-static void scan_namespaces(glite_jp_context_t ctx)
-{
- int i,j,k;
- glite_jpps_fplug_data_t *pd;
-
- if (!ctx->plugins) return;
-
- for (i=0; ctx->plugins[i]; i++) {
- pd = ctx->plugins[i];
-
- if (pd->namespaces){
- for (j=0; pd->namespaces[j]; j++) {
- for (k=0; known_namespaces && known_namespaces[k].namespace
- && strcmp(pd->namespaces[j],known_namespaces[k].namespace); k++) {};
-
- if (known_namespaces && known_namespaces[k].namespace) {
- printf("Adding new plugin into namespace %s\n", known_namespaces[k].namespace);
- known_namespaces[k].plugins = realloc(known_namespaces[k].plugins,
- (known_namespaces[k].nplugins + 2) * sizeof(glite_jpps_fplug_data_t *));
- known_namespaces[k].plugins[known_namespaces[k].nplugins++] = pd;
- known_namespaces[k].plugins[known_namespaces[k].nplugins] = NULL;
- known_namespaces[k].namespace = pd->namespaces[j];
- known_namespaces[k].opened_classes = realloc(known_namespaces[k].opened_classes,
- (known_namespaces[k].nplugins + 1) * sizeof(char*));
- known_namespaces[k].opened_classes[known_namespaces[k].nplugins-1] = NULL;
- known_namespaces[k].opened_files = realloc(known_namespaces[k].opened_files,
- (known_namespaces[k].nplugins + 1) * sizeof(char*));
- known_namespaces[k].opened_files[known_namespaces[k].nplugins-1] = NULL;
- known_namespaces[k].plugin_handles = realloc(known_namespaces[k].plugin_handles,
- (known_namespaces[k].nplugins + 1) * sizeof(void*));
- known_namespaces[k].plugin_handles[known_namespaces[k].nplugins-1] = NULL;
- known_namespaces[k].file_handles = realloc(known_namespaces[k].file_handles,
- (known_namespaces[k].nplugins + 1) * sizeof(void*));
- known_namespaces[k].file_handles[known_namespaces[k].nplugins-1] = NULL;
- }
- else {
- printf("Adding new namespace %s\n", pd->namespaces[j]);
- known_namespaces = realloc(known_namespaces,(k+2) * sizeof *known_namespaces);
- known_namespaces[k].plugins = malloc(2 * sizeof(glite_jpps_fplug_data_t *));
- known_namespaces[k].plugins[0] = pd;
- known_namespaces[k].plugins[1] = NULL;
- known_namespaces[k].nplugins = 1;
- known_namespaces[k].namespace = pd->namespaces[j];
- memset(known_namespaces+k+1,0,sizeof *known_namespaces);
- known_namespaces[k].opened_classes = calloc(1, sizeof(char*));
- known_namespaces[k].opened_files = calloc(1, sizeof(char*));
- known_namespaces[k].plugin_handles = calloc(1, sizeof(void*));
- known_namespaces[k].file_handles = calloc(1, sizeof(void*));
- }
- }
- }
- }
-}
-
-static int merge_attrvals(glite_jp_attrval_t **out,int nout,const glite_jp_attrval_t *in)
-{
- int nin;
-
- if (!in) return nout;
-
- for (nin=0; in[nin].name; nin++);
- *out = realloc(*out,(nout+nin+1) * sizeof **out);
- memcpy(*out + nout,in,(nin+1) * sizeof **out);
- memset(*out + nout+nin, 0, sizeof **out);
- return nout+nin;
-}
-
-static void process_files(glite_jp_context_t ctx, const char *job, glite_jp_attrval_t** out, int* nout, const char* attr, const glite_jpps_fplug_data_t* plugin, const char* class, const char* uri, char **opened_class, char **opened_file, void **op_handle, void **of_handle){
- void *ph, *beh;
- char** names = NULL;
- int nnames;
- int n;
- glite_jp_error_t *keep_err = NULL;
-
- nnames = glite_jppsbe_get_names(ctx, job, class, &names);
-
- for (n = 0; n < nnames; n++){
- int plugin_ok = 0;
- if (*opened_class && !strcmp(*opened_class, class) && ((!*opened_file && !names[n]) || !strcmp(*opened_file, names[n]))){
- ph = *op_handle;
- beh = *of_handle;
- plugin_ok = 1;
- }
- else{
- if (*opened_class){
- free(*opened_class);
- *opened_class = NULL;
- free(*opened_file);
- *opened_file = NULL;
- plugin->ops.close(plugin->fpctx, *op_handle);
- *op_handle = NULL;
- glite_jppsbe_close_file(ctx, *of_handle);
- *of_handle = NULL;
- }
- if (! glite_jppsbe_open_file(ctx,job,class, names[n], O_RDONLY, &beh)
- && !plugin->ops.open(plugin->fpctx,beh,uri,&ph)){
- plugin_ok = 1;
- *opened_class = strdup(class);
- if (names[n])
- *opened_file = strdup(names[n]);
- else
- *opened_file = NULL;
- *op_handle = (void*)ph;
- *of_handle = (void*)beh;
- printf("opening plugin %i at class %s, file %s\n", *op_handle, class, names[n]);
- }
- }
- if (plugin_ok){
- glite_jp_attrval_t* myattr;
- // XXX: ignore errors
- if (!plugin->ops.attr(plugin->fpctx,ph,attr,&myattr) && myattr) {
- int k;
- for (k=0; myattr[k].name; k++) {
- myattr[k].origin = GLITE_JP_ATTR_ORIG_FILE;
- if (!myattr[k].origin_detail)
- trio_asprintf(&myattr[k].origin_detail,"%s %s", uri, names[n] ? names[n] : "");
- }
- *nout = merge_attrvals(out,*nout,myattr);
- free(myattr);
- }
- keep_err = ctx->error; ctx->error = NULL;
- if (keep_err) { ctx->error = keep_err; keep_err = NULL; }
- }
- keep_err = ctx->error; ctx->error = NULL;
- if (keep_err) { ctx->error = keep_err; keep_err = NULL; }
- }
-
- for (n = 0; n < nnames; n++)
- free(names[n]);
- free(names);
-}
-
-int glite_jpps_get_attrs(glite_jp_context_t ctx,const char *job,char **attr,int nattr,glite_jp_attrval_t **attrs_out)
-{
- glite_jp_attrval_t *meta = NULL,*out = NULL,*tag_out = NULL;
- char const **other = NULL;
- int i,j,nmeta,nother,err = 0,nout = 0;
-
- nmeta = nother = 0;
- glite_jp_clear_error(ctx);
-
-/* sort the queried attributes to backend metadata and others -- retrived by plugins
- * XXX: assumes unique values for metadata.
- */
-
- for (i=0; i<nattr; i++) {
- if (glite_jppsbe_is_metadata(ctx,attr[i])) {
- meta = realloc(meta,(nmeta+2) * sizeof *meta);
- memset(meta+nmeta,0,2 * sizeof *meta);
- meta[nmeta].name = strdup(attr[i]);
- nmeta++;
- }
- else {
- other = realloc(other,(nother+2) * sizeof *other);
- other[nother++] = attr[i]; /* XXX: not strdupped */
- other[nother] = NULL;
- }
- }
-
-/* retrieve the metadata */
- if (meta && (err = glite_jppsbe_get_job_metadata(ctx,job,meta))) goto cleanup;
-
- if (!known_namespaces) scan_namespaces(ctx);
-
-/* loop over the attributes */
- int k, l;
- for (i = 0; i < nother; i++){
- if (! glite_jppsbe_read_tag(ctx, job, other[i], &tag_out)) {
- nout = merge_attrvals(&out, nout, tag_out);
- free(tag_out); tag_out = NULL;
- }
- char* attr_namespace = glite_jpps_get_namespace(other[i]);
- for (j = 0; known_namespaces && known_namespaces[j].namespace; j++) {
- if (strcmp(attr_namespace, known_namespaces[j].namespace) == 0){
- for (k = 0; known_namespaces[j].plugins[k]; k++)
- for (l = 0; known_namespaces[j].plugins[k]->classes[l]; l++)
- process_files(ctx, job, &out, &nout, other[i], known_namespaces[j].plugins[k]
- , known_namespaces[j].plugins[k]->classes[l]
- , known_namespaces[j].plugins[k]->uris[l]
- , &known_namespaces[j].opened_classes[k]
- , &known_namespaces[j].opened_files[k]
- , &known_namespaces[j].plugin_handles[k]
- , &known_namespaces[j].file_handles[k]);
- break;
- }
- }
- free(attr_namespace);
- }
-
-/* close plugins */
- for (i = 0; known_namespaces && known_namespaces[i].namespace; i++)
- for (j = 0; known_namespaces[i].plugins[j]; j++)
- if (known_namespaces[i].opened_classes[j]){
- known_namespaces[i].plugins[j]->ops.close(known_namespaces[i].plugins[j]->fpctx
- , known_namespaces[i].plugin_handles[j]);
- printf("closing plugin %i at class %s, file %s\n", known_namespaces[i].plugin_handles[j], known_namespaces[i].opened_classes[j], known_namespaces[i].opened_files[j]);
- glite_jppsbe_close_file(ctx, known_namespaces[i].file_handles[j]);
- if (known_namespaces[i].opened_classes[j]){
- free(known_namespaces[i].opened_classes[j]);
- known_namespaces[i].opened_classes[j] = NULL;
- }
- if (known_namespaces[i].opened_files[j]){
- free(known_namespaces[i].opened_files[j]);
- known_namespaces[i].opened_files[j] = NULL;
- }
- known_namespaces[i].plugin_handles[j] = NULL;
- known_namespaces[i].file_handles[j] = NULL;
- }
-
- nout = merge_attrvals(&out,nout,meta);
-
- free(meta); meta = NULL;
-
- if (nout) {
- *attrs_out = out;
- err = 0;
- }
- else {
- glite_jp_error_t e;
- e.code = ENOENT;
- e.source = __FUNCTION__;
- e.desc = "no attributes found";
- err = glite_jp_stack_error(ctx,&e);
- }
-
-cleanup:
- if (meta) for (i=0; i<nmeta; i++) glite_jp_attrval_free(meta+i,0);
- free(meta);
-
- free(other);
-
- return err;
-}
-
+++ /dev/null
-int glite_jpps_get_attrs(glite_jp_context_t,const char *,char **,int,glite_jp_attrval_t **);
-
+++ /dev/null
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <assert.h>
-
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-
-#include "jpps_H.h"
-#include "jptype_map.h"
-
-int glite_jpps_authz(glite_jp_context_t ctx,int op,const char *job,const char *owner)
-{
- glite_jp_error_t err;
- char buf[200];
- int i;
-
- memset(&err,0,sizeof err);
- glite_jp_clear_error(ctx);
- err.source = __FUNCTION__;
- err.code = EPERM;
-
- switch (op) {
- case SOAP_TYPE___jpsrv__RegisterJob:
- case SOAP_TYPE___jpsrv__StartUpload:
- case SOAP_TYPE___jpsrv__CommitUpload:
- for (i=0; ctx->trusted_peers && ctx->trusted_peers[i]; i++)
- if (!strcmp(ctx->trusted_peers[i],ctx->peer)) return 0;
- err.desc = "you are not a trusted peer";
- return glite_jp_stack_error(ctx,&err);
-
- case SOAP_TYPE___jpsrv__GetJobFiles:
- case SOAP_TYPE___jpsrv__GetJobAttributes:
- case SOAP_TYPE___jpsrv__RecordTag:
- assert(owner);
- 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:
- snprintf(buf,sizeof buf,"%d: unknown operation",op);
- err.desc = buf;
- err.code = EINVAL;
- return glite_jp_stack_error(ctx,&err);
- }
-}
-
-int glite_jpps_readauth(glite_jp_context_t ctx,const char *file)
-{
- FILE *f = fopen(file,"r");
- glite_jp_error_t err;
- int cnt = 0;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- if (!f) {
- err.code = errno;
- err.desc = file;
- return glite_jp_stack_error(ctx,&err);
- }
-
- ctx->trusted_peers = NULL;
- while (!feof(f)) {
- char buf[BUFSIZ];
-
- if (fscanf(f,"%[^\n]\n",buf) != 1) {
- err.code = EINVAL;
- err.desc = file;
- fclose(f);
- return glite_jp_stack_error(ctx,&err);
- }
-
- ctx->trusted_peers = realloc(ctx->trusted_peers, (cnt+2) * sizeof *ctx->trusted_peers);
- ctx->trusted_peers[cnt++] = strdup(buf);
- ctx->trusted_peers[cnt] = NULL;
- }
- fclose(f);
- return 0;
-}
-
+++ /dev/null
-/**
- * Check authorisation of JPPS operation on job.
- *
- * \param[in] ctx JP context including peer name & other credentials (VOMS etc.)
- * \param[in] op operation, one of SOAP_TYPE___jpsrv__*
- * \param[in] job jobid of the job to decide upon
- * \param[in] owner current known owner of the job (may be NULL), shortcut to avoid
- * unnecessary database query.
- *
- * \retval 0 OK, operation permitted
- * \retval EPERM denied
- * \retval other error
- */
-
-int glite_jpps_authz(glite_jp_context_t ctx,int op,const char *job,const char *owner);
-
-int glite_jpps_readauth(glite_jp_context_t ctx,const char *file);
-
+++ /dev/null
-#ifndef GLITE_JP_BACKEND_H
-#define GLITE_JP_BACKEND_H
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "feed.h"
-
-int glite_jppsbe_init(
- glite_jp_context_t ctx,
- int argc,
- char *argv[]
-);
-
-int glite_jppsbe_init_slave(
- glite_jp_context_t ctx
-);
-
-int glite_jppsbe_register_job(
- glite_jp_context_t ctx,
- const char *job,
- const char *owner
-);
-
-int glite_jppsbe_start_upload(
- glite_jp_context_t ctx,
- const char *job,
- const char *class, /* must be filesystem-friendly */
- const char *name, /* optional name within the class */
- const char *content_type,
- char **destination_out,
- time_t *commit_before_inout
-);
-
-int glite_jppsbe_commit_upload(
- glite_jp_context_t ctx,
- const char *destination
-);
-
-int glite_jppsbe_get_names(
- glite_jp_context_t ctx,
- const char *job,
- const char *class,
- char ***names_out
-);
-
-int glite_jppsbe_destination_info(
- glite_jp_context_t ctx,
- const char *destination,
- char **job_out,
- char **class_out,
- char **name_out
-);
-
-int glite_jppsbe_get_job_url(
- glite_jp_context_t ctx,
- const char *job,
- const char *class,
- const char *name, /* optional within class */
- char **url_out
-);
-
-int glite_jppsbe_open_file(
- glite_jp_context_t ctx,
- const char *job,
- const char *class,
- const char *name, /* optional within class */
- int mode,
- void **handle_out
-);
-
-int glite_jppsbe_close_file(
- glite_jp_context_t ctx,
- void *handle
-);
-
-int glite_jppsbe_file_attrs(
- glite_jp_context_t ctx,
- void *handle,
- struct stat *buf
-);
-
-int glite_jppsbe_pread(
- glite_jp_context_t ctx,
- void *handle,
- void *buf,
- size_t nbytes,
- off_t offset,
- ssize_t *nbytes_ret
-);
-
-int glite_jppsbe_pwrite(
- glite_jp_context_t ctx,
- void *handle,
- void *buf,
- size_t nbytes,
- off_t offset
-);
-
-int glite_jppsbe_append(
- glite_jp_context_t ctx,
- void *handle,
- void *buf,
- size_t nbytes
-);
-
-int glite_jppsbe_is_metadata(
- glite_jp_context_t ctx,
- const char *attr
-);
-
-int glite_jppsbe_get_job_metadata(
- glite_jp_context_t ctx,
- const char *job,
- glite_jp_attrval_t attrs_inout[]
-);
-
-int glite_jppsbe_query(
- glite_jp_context_t ctx,
- const glite_jp_query_rec_t query[],
- char *attrs[],
- void *arg,
- int (*callback)(
- glite_jp_context_t ctx,
- const char *job,
- const glite_jp_attrval_t metadata[],
- void *arg
- )
-);
-
-/** mark the job as sent to this feed */
-int glite_jppsbe_set_fed(
- glite_jp_context_t ctx,
- const char *feed,
- const char *job
-);
-
-/** check whether the job has been already sent to this feed */
-int glite_jppsbe_check_fed(
- glite_jp_context_t ctx,
- const char *feed,
- const char *job,
- int *result
-);
-
-/** store the feed to database */
-int glite_jppsbe_store_feed(
- glite_jp_context_t ctx,
- struct jpfeed *feed
-);
-
-/** purge expired feeds */
-int glite_jppsbe_purge_feeds(
- glite_jp_context_t ctx
-);
-
-/** read stored feed into context */
-int glite_jppsbe_read_feeds(
- glite_jp_context_t ctx
-);
-
-#endif /* GLITE_JP_BACKEND_H */
+++ /dev/null
-#ifndef GLITE_JP_BACKEND_PRIVATE_H
-#define GLITE_JP_BACKEND_PRIVATE_H
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "feed.h"
-
-#include "glite/jp/backend.h"
-
-int glite_jppsbe_init(
- glite_jp_context_t ctx,
- int argc,
- char *argv[]
-);
-
-int glite_jppsbe_init_slave(
- glite_jp_context_t ctx
-);
-
-int glite_jppsbe_register_job(
- glite_jp_context_t ctx,
- const char *job,
- const char *owner
-);
-
-int glite_jppsbe_start_upload(
- glite_jp_context_t ctx,
- const char *job,
- const char *class, /* must be filesystem-friendly */
- const char *name, /* optional name within the class */
- const char *content_type,
- char **destination_out,
- time_t *commit_before_inout
-);
-
-int glite_jppsbe_commit_upload(
- glite_jp_context_t ctx,
- const char *destination
-);
-
-int glite_jppsbe_append_tags(void *fpctx, char *jobid, glite_jp_attrval_t *attr);
-
-/** mark the job as sent to this feed */
-int glite_jppsbe_set_fed(
- glite_jp_context_t ctx,
- const char *feed,
- const char *job
-);
-
-/** check whether the job has been already sent to this feed */
-int glite_jppsbe_check_fed(
- glite_jp_context_t ctx,
- const char *feed,
- const char *job,
- int *result
-);
-
-/** store the feed to database */
-int glite_jppsbe_store_feed(
- glite_jp_context_t ctx,
- struct jpfeed *feed
-);
-
-/** purge expired feeds */
-int glite_jppsbe_purge_feeds(
- glite_jp_context_t ctx
-);
-
-/** read stored feed into context */
-int glite_jppsbe_read_feeds(
- glite_jp_context_t ctx
-);
-
-#endif /* GLITE_JP_BACKEND_PRIVATE_H */
+++ /dev/null
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <assert.h>
-
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/file_plugin.h"
-
-#include "glite/lbu/srvbones.h"
-#include "glite/security/glite_gss.h"
-
-#include <stdsoap2.h>
-#include "glite/security/glite_gsplugin.h"
-
-#include "feed.h"
-#include "backend_private.h"
-
-#include "soap_version.h"
-#include "jpps_H.h"
-
-#define CONN_QUEUE 20
-
-extern SOAP_NMAC struct Namespace jpis__namespaces[],jpps__namespaces[];
-
-static int newconn(int,struct timeval *,void *);
-static int request(int,struct timeval *,void *);
-static int reject(int);
-static int disconn(int,struct timeval *,void *);
-static int data_init(void **data);
-
-static struct glite_srvbones_service stab = {
- "JP Primary Storage", -1, newconn, request, reject, disconn
-};
-
-static time_t cert_mtime;
-char *server_cert, *server_key, *cadir;
-edg_wll_GssCred mycred = NULL;
-static char *mysubj;
-
-static char *port = "8901";
-static int debug = 0;
-
-static glite_jp_context_t ctx;
-
-static int call_opts(glite_jp_context_t,char *,char *,int (*)(glite_jp_context_t,int,char **));
-
-const char *glite_jp_default_namespace;
-
-pid_t master;
-
-int main(int argc, char *argv[])
-{
- int one = 1,opt,i;
- edg_wll_GssStatus gss_code;
- struct sockaddr_in a;
- char *b_argv[20] = { "backend" },*p_argv[20] = { "plugins" },*com;
- int b_argc,p_argc;
- char buf[1000];
- int slaves = 10;
- char *logfile = "/dev/null";
- char pidfile[PATH_MAX] = "/var/run/glite-jp-primarystoraged.pid";
- FILE *fpid;
-
- glite_jp_init_context(&ctx);
- edg_wll_gss_gethostname(buf,sizeof buf);
- buf[999] = 0;
- ctx->myURL = buf;
-
- if (geteuid()) snprintf(pidfile,sizeof pidfile,"%s/glite-jp-primarystoraged.pid",getenv("HOME"));
-
- b_argc = p_argc = 1;
-
- 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;
-
- /* XXX: memleak -- who cares for once */
- asprintf(&b_argv[b_argc++],"-%s",optarg);
- if (com) b_argv[b_argc++] = com+1;
-
- break;
- case 'P':
- assert(p_argc < 20);
- p_argv[p_argc++] = optarg;
-
- break;
- case 'a':
- if (glite_jpps_readauth(ctx,optarg)) {
- fprintf(stderr,"%s: %s\n",argv[0],glite_jp_error_chain(ctx));
- exit (1);
- }
- break;
- case 'p':
- port = optarg;
- break;
- case 'd': debug = 1; break;
- case 's': slaves = atoi(optarg);
- if (slaves <= 0) {
- fprintf(stderr,"%s: -s %s: invalid number\n",argv[0],optarg);
- exit(1);
- }
- break;
- case 'l': logfile = optarg; break;
- 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);
- }
-
- if (b_argc == 1) {
- fputs("-B required\n",stderr);
- exit (1);
- }
-
- optind = 0; /* XXX: getopt used internally */
- if (glite_jppsbe_init(ctx,b_argc,b_argv)) {
- fputs(glite_jp_error_chain(ctx), stderr);
- exit(1);
- }
-
- optind = 0; /* XXX: getopt used internally */
- if (b_argc > 1 && glite_jpps_fplug_load(ctx,p_argc,p_argv)) {
- fputs(glite_jp_error_chain(ctx), stderr);
- exit(1);
- }
-
- srand48(time(NULL)); /* feed id generation */
-
-#if GSOAP_VERSION <= 20602
- for (i=0; jpps__namespaces[i].id && strcmp(jpps__namespaces[i].id,"ns1"); i++);
-#else
- for (i=0; jpps__namespaces[i].id && strcmp(jpps__namespaces[i].id,"jpsrv"); i++);
-#endif
- assert(jpps__namespaces[i].id);
- glite_jp_default_namespace = jpps__namespaces[i].ns;
-
- stab.conn = socket(PF_INET, SOCK_STREAM, 0);
- if (stab.conn < 0) {
- perror("socket");
- return 1;
- }
-
- setsockopt(stab.conn,SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-
- a.sin_family = AF_INET;
- a.sin_addr.s_addr = INADDR_ANY;
- a.sin_port = htons(atoi(port));
- if (bind(stab.conn,(struct sockaddr *) &a, sizeof(a)) ) {
- char buf[200];
-
- snprintf(buf,sizeof(buf),"bind(%d)",atoi(port));
- perror(buf);
- return 1;
- }
-
- if (listen(stab.conn,CONN_QUEUE)) {
- perror("listen()");
- return 1;
- }
-
- if (!server_cert || !server_key)
- fprintf(stderr, "%s: WARNING: key or certificate file not specified, "
- "can't watch them for changes\n",
- argv[0]);
-
- if ( cadir ) setenv("X509_CERT_DIR", cadir, 1);
- edg_wll_gss_watch_creds(server_cert, &cert_mtime);
-
- if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &mycred, &gss_code)) {
- mysubj = strdup(mycred->name);
- fprintf(stderr,"Server idenity: %s\n",mysubj);
- }
- else fputs("WARNING: Running unauthenticated\n",stderr);
-
- /* XXX: daemonise */
-
- if (!debug) {
- int lfd = open(logfile,O_CREAT|O_TRUNC|O_WRONLY,0600);
- if (lfd < 0) {
- fprintf(stderr,"%s: %s: %s\n",argv[0],logfile,strerror(errno));
- exit(1);
- }
- daemon(0,1);
- dup2(lfd,1);
- dup2(lfd,2);
- }
-
- setpgrp(); /* needs for signalling */
- master = getpid();
- fpid = fopen(pidfile,"r");
- if ( fpid )
- {
- int opid = -1;
-
- if ( fscanf(fpid,"%d",&opid) == 1 )
- {
- if ( !kill(opid,0) )
- {
- fprintf(stderr,"%s: another instance running, pid = %d\n",argv[0],opid);
- return 1;
- }
- else if (errno != ESRCH) { perror("kill()"); return 1; }
- }
- fclose(fpid);
- } else if (errno != ENOENT) { perror(pidfile); return 1; }
-
- fpid = fopen(pidfile, "w");
- if (!fpid) { perror(pidfile); return 1; }
- fprintf(fpid, "%d", getpid());
- fclose(fpid);
-
- glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT,slaves);
- glite_srvbones_run(data_init,&stab,1 /* XXX: entries in stab */,debug);
-
- return 0;
-}
-
-static int data_init(void **data)
-{
- *data = (void *) soap_new();
-
- printf("[%d] slave started\n",getpid());
- glite_jpps_srv_init(ctx);
- glite_jppsbe_init_slave(ctx); /* XXX: global but slave's */
- //sleep(10);
- if (glite_jppsbe_purge_feeds(ctx) || /* XXX: is there a better place for the call? */
- glite_jppsbe_read_feeds(ctx)) fputs(glite_jp_error_chain(ctx),stderr);
- printf("[%d] slave init done\n",getpid());
-
- return 0;
-}
-
-static int newconn(int conn,struct timeval *to,void *data)
-{
- struct soap *soap = (struct soap *) data;
- glite_gsplugin_Context plugin_ctx;
-
- edg_wll_GssCred newcred = NULL;
- edg_wll_GssStatus gss_code;
- edg_wll_GssPrincipal client = NULL;
- edg_wll_GssConnection connection;
-
- int ret = 0;
-
- soap_init2(soap,SOAP_IO_KEEPALIVE,SOAP_IO_KEEPALIVE);
- soap_set_omode(soap, SOAP_IO_BUFFER); // set buffered response
- // buffer set to SOAP_BUFLEN (default = 8k)
-
- soap_set_namespaces(soap,jpps__namespaces);
- soap->user = (void *) ctx; /* XXX: one instance per slave */
-
- switch (edg_wll_gss_watch_creds(server_cert,&cert_mtime)) {
- case 0: break;
- case 1: if (!edg_wll_gss_acquire_cred_gsi(server_cert,server_key,
- &newcred,&gss_code))
- {
-
- printf("[%d] reloading credentials\n",getpid()); /* XXX: log */
- edg_wll_gss_release_cred(&mycred, NULL);
- mycred = newcred;
-
- /* drop it too, it is recreated and reloads creds when necessary */
- if (ctx->other_soap) {
- soap_end(ctx->other_soap);
- soap_free(ctx->other_soap);
- ctx->other_soap = NULL;
- }
- }
- break;
- case -1:
- printf("[%d] edg_wll_gss_watch_creds failed\n", getpid()); /* XXX: log */
- break;
- }
-
- /* TODO: DNS paranoia etc. */
-
- if (edg_wll_gss_accept(mycred,conn,to,&connection,&gss_code)) {
- char *et;
-
- edg_wll_gss_get_error(&gss_code,"",&et);
-
- fprintf(stderr,"[%d] GSS connection accept failed: %s\nClosing connection.\n",getpid(),et);
- free(et);
- ret = 1;
- goto cleanup;
- }
-
- ret = edg_wll_gss_get_client_conn(&connection, &client, NULL);
-
- if (ctx->peer) free(ctx->peer);
- if (ret || client->flags & EDG_WLL_GSS_FLAG_ANON) {
- printf("[%d] annonymous client\n",getpid());
- ctx->peer = NULL;
- }
- else {
- printf("[%d] client DN: %s\n",getpid(),client->name); /* XXX: log */
-
- ctx->peer = strdup(client->name);
- edg_wll_gss_free_princ(client);
- }
-
- glite_gsplugin_init_context(&plugin_ctx);
- glite_gsplugin_set_connection(plugin_ctx, &connection);
- soap_register_plugin_arg(soap,glite_gsplugin,plugin_ctx);
-
- return 0;
-
-cleanup:
- soap_end(soap);
-
- return ret;
-}
-
-static int request(int conn,struct timeval *to,void *data)
-{
- struct soap *soap = data;
- glite_jp_context_t ctx = soap->user;
-
- glite_gsplugin_set_timeout(glite_gsplugin_get_context(soap),to);
-
- soap->max_keep_alive = 1; /* XXX: prevent gsoap to close connection */
- soap_begin(soap);
- if (soap_begin_recv(soap)) {
- if (soap->error < SOAP_STOP) {
- soap_send_fault(soap);
- return EIO;
- }
- return ENOTCONN;
- }
-
- soap->keep_alive = 1;
- if (soap_envelope_begin_in(soap)
- || soap_recv_header(soap)
- || soap_body_begin_in(soap)
- || jpps__serve_request(soap)
-#if GSOAP_VERSION >= 20700
- || (soap->fserveloop && soap->fserveloop(soap))
-#endif
- )
- {
- soap_send_fault(soap); // sets soap->keep_alive back to 0 :(
- // and closes connection
- if (ctx->error) {
- /* XXX: shall we die on some errors? */
- int err = ctx->error->code;
- glite_jp_clear_error(ctx);
- return err;
- }
- return ECANCELED; // let srv_bones know something is wrong
- }
-//printf("Ja cekam %d\n", getpid());
-//sleep(10);
- if (glite_jp_run_deferred(ctx)) {
- char *e;
- fprintf(stderr,"[%d] %s\n",getpid(),e = glite_jp_error_chain(ctx));
- free(e);
- }
- return 0;
-}
-
-static int reject(int conn)
-{
- int flags = fcntl(conn, F_GETFL, 0);
-
- fcntl(conn,F_SETFL,flags | O_NONBLOCK);
- edg_wll_gss_reject(conn);
-
- return 0;
-}
-
-static int disconn(int conn,struct timeval *to,void *data)
-{
- struct soap *soap = (struct soap *) data;
- glite_jp_context_t ctx = soap->user;
-
- soap_end(soap); // clean up everything and close socket
- if (ctx->other_soap) {
- soap_end(ctx->other_soap);
- soap_free(ctx->other_soap);
- ctx->other_soap = NULL;
- }
-
- return 0;
-}
-
-#define WSPACE "\t\n "
-
-static int call_opts(glite_jp_context_t ctx,char *opt,char *name,int (*f)(glite_jp_context_t,int,char **))
-{
- int ac = 1,ret,my_optind;
- char **av = malloc(sizeof *av),*ap;
-
- *av = name;
- for (ap = strtok(opt,WSPACE); ap; ap = strtok(NULL,WSPACE)) {
- av = realloc(av,(ac+1) * sizeof *av);
- av[ac++] = ap;
- }
-
- my_optind = optind;
- optind = 0;
- ret = f(ctx,ac,av);
- optind = my_optind;
- free(av);
- return ret;
-}
-
-
-/* XXX: we don't use it */
-SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} };
+++ /dev/null
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <cclassad.h>
-#include <errno.h>
-#include <sys/stat.h>
-
-/*
-#include "glite/lb/context.h"
-#include "glite/lb/jobstat.h"
-#include "glite/lb/events.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/trio.h"
-*/
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/attr.h"
-#include "glite/jp/known_attr.h"
-
-#include "glite/jp/file_plugin.h"
-#include "glite/jp/backend.h"
-#include "glite/jp/builtin_plugins.h"
-
-//#define INITIAL_NUMBER_EVENTS 100
-//#define INITIAL_NUMBER_STATES EDG_WLL_NUMBER_OF_STATCODES
-//#define LB_PLUGIN_NAMESPACE "urn:org.glite.lb"
-
-//extern int processEvent(intJobStat *, edg_wll_Event *, int, int, char **);
-
-
-typedef struct _classad_handle{
- char* data;
- struct cclassad* ad;
- time_t timestamp;
-} classad_handle;
-
-static int classad_query(void *fpctx, void *handle, const char *attr, glite_jp_attrval_t **attrval);
-static int classad_open(void *fpctx, void *bhandle, const char *uri, void **handle);
-static int classad_open_str(void *fpctx, const char *str, const char *uri, const char *ns, void **handle);
-static int classad_close(void *fpctx, void *handle);
-static int classad_filecom(void *fpctx, void *handle);
-
-int init(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data) {
- data->fpctx = ctx;
-
- data->uris = calloc(2,sizeof *data->uris);
- data->uris[0] = strdup(GLITE_JP_FILETYPE_CLASSAD);
-
- data->classes = calloc(2,sizeof *data->classes);
- data->classes[0] = strdup("classad");
-
- data->namespaces = calloc(2, sizeof *data->namespaces);
- data->namespaces[0] = strdup(GLITE_JP_JDL_NS);
-
- data->ops.open = classad_open;
- data->ops.close = classad_close;
- data->ops.attr = classad_query;
- data->ops.open_str = classad_open_str;
- data->ops.filecom = classad_filecom;
-
-#ifdef PLUGIN_DEBUG
- fprintf(stderr,"classad_plugin: init OK\n");
-#endif
-
- return 0;
-}
-
-
-void done(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data) {
- free(data->uris[0]);
- free(data->classes[0]);
- free(data->uris);
- free(data->classes);
- memset(data, 0, sizeof(*data));
-}
-
-
-static int classad_open(void *fpctx, void *bhandle, const char *uri, void **handle) {
- glite_jp_context_t ctx = (glite_jp_context_t) fpctx;
- glite_jp_error_t err;
- classad_handle* h;
- void* fh;
- int retval = 0;
-
- glite_jp_clear_error(ctx);
- h = calloc(1, sizeof(classad_handle));
- h->data = NULL;
- struct stat fattr;
- glite_jppsbe_file_attrs(ctx, bhandle, &fattr);
- h->timestamp = fattr.st_mtime;
-
- // read the classad file
- char buf[1024];
- size_t nbytes;
- off_t offset = 0;
-
- do{
- if (! (retval = glite_jppsbe_pread(ctx, bhandle, buf, sizeof buf, offset, &nbytes))){
- h->data = realloc(h->data, offset + nbytes);
- memcpy(h->data + offset, buf, nbytes);
- offset += nbytes;
- }
- else
- goto fail;
- }while(nbytes);
-
- h->ad = cclassad_create(h->data);
-
-#ifdef PLUGIN_DEBUG
- fprintf(stderr,"classad_plugin: opened\n");
-#endif
-
- *handle = h;
-
- return 0;
-
-fail:
- err.code = EIO;
- err.desc = NULL;
- err.source = __FUNCTION__;
- glite_jp_stack_error(ctx,&err);
-
- return retval;
-}
-
-static int classad_open_str(void *fpctx,const char *str,const char *uri,const char *ns,void **handle){
- classad_handle* h;
-
- h = calloc(1, sizeof(classad_handle));
- h->data = strdup(str);
- h->ad = cclassad_create(h->data);
- h->timestamp = 0;
-
-#ifdef PLUGIN_DEBUG
- fprintf(stderr,"classad_plugin: opened\n");
-#endif
-
- *handle = h;
-
- return 0;
-
-}
-
-static int classad_close(void *fpctx,void *handle) {
- classad_handle *h = (classad_handle *) handle;
-
- cclassad_delete(h->ad);
- free(h->data);
- free(h);
-
-#ifdef PLUGIN_DEBUG
- fprintf(stderr,"classad plugin: close OK\n");
-#endif
- return 0;
-}
-
-
-static int classad_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_t **attrval) {
- glite_jp_context_t ctx = (glite_jp_context_t) fpctx;
- glite_jp_error_t err;
- glite_jp_attrval_t *av = NULL;
- classad_handle* h = (classad_handle*)handle;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- char *str = NULL;
-
- if (! h->ad){
- err.code = ENOENT;
- err.desc = strdup("Classad plugin: No classad string, cannot get attr!");
- *attrval = NULL;
- printf("Exiting classat_query...\n");
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (!cclassad_evaluate_to_string(h->ad, strrchr(attr, ':')+1, &str) &&
- cclassad_evaluate_to_expr(h->ad, strrchr(attr, ':')+1, &str) &&
- !strcasecmp(str,"undefined")) { free(str); str = NULL; }
-
- if (str) {
- //struct stat fattr;
- /*XXX ignore error */
- //glite_jppsbe_file_attrs(ctx, h->bhandle, &fattr);
- av = calloc(2, sizeof(glite_jp_attrval_t));
- av[0].name = strdup(attr);
- av[0].value = str; str = NULL;
- av[0].size = -1;
- av[0].timestamp = h->timestamp;
- av[0].origin = GLITE_JP_ATTR_ORIG_FILE;
- }
- else{
- printf("Classad plugin: bad attr!\n");
- }
-
- if (str) free(str);
-
- *attrval = av;
-
- if (av)
- return 0;
- else{
- err.code = ENOENT;
- err.desc = attr;
- return glite_jp_stack_error(ctx,&err);
- }
-}
-
-static int classad_filecom(void *fpctx, void *handle){
- return -1;
-}
-
+++ /dev/null
-#include <stdio.h>
-#include <time.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <fcntl.h>
-#include <signal.h>
-
-#include "glite/jobid/strmd5.h"
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/known_attr.h"
-#include "glite/jp/file_plugin.h"
-#include "glite/jp/builtin_plugins.h"
-
-#include "feed.h"
-#include "is_client.h"
-#include "backend_private.h"
-
-extern pid_t master;
-
-/*
- * seconds before feed expires: should be
- * XXX: should be configurable, default for real deployment sort of 1 hour
- */
-#define FEED_TTL 360
-
-/* XXX: configurable */
-#define BATCH_FEED_SIZE 200
-
-static int check_qry_item(
- glite_jp_context_t ctx,
- const glite_jp_query_rec_t *qry,
- const glite_jp_attrval_t *attr
-)
-{
- int cmp,cmp2;
- long scmp,ucmp;
- glite_jp_attrval_t qattr;
-
- if (strcmp(qry->attr,attr->name)) return 0;
-
- if (qry->origin != GLITE_JP_ATTR_ORIG_ANY && qry->origin != attr->origin) return 0;
-
- memset(&qattr,0,sizeof qattr);
- qattr.name = qry->attr;
- qattr.value = qry->value;
- qattr.binary = qry->binary;
- qattr.size = qry->size;
- qattr.origin = qry->origin;
-
- /* XXX: don't assert */
- assert(glite_jp_attrval_cmp(ctx,attr,&qattr,&cmp) == 0);
-
- switch (qry->op) {
- case GLITE_JP_QUERYOP_EQUAL: return !cmp;
- case GLITE_JP_QUERYOP_UNEQUAL: return cmp;
- case GLITE_JP_QUERYOP_LESS: return cmp < 0;
- case GLITE_JP_QUERYOP_GREATER: return cmp > 0;
-
- case GLITE_JP_QUERYOP_WITHIN:
- qattr.value = qry->value2;
- qattr.size = qry->size2;
- /* XXX: assert */
- assert(glite_jp_attrval_cmp(ctx,attr,&qattr,&cmp2) == 0);
- return cmp >= 0 && cmp2 <= 0;
- }
-}
-
-/* retrieve all attributes for a feed */
-int full_feed(
- glite_jp_context_t ctx,
- const struct jpfeed *feed,
- const char *job,
- glite_jp_attrval_t **attrs)
-{
- int i,ret,no_owner = 1;
- char **ma = NULL;
-
- for (i=0; feed->attrs[i]; i++)
- if (!strcmp(feed->attrs[i],GLITE_JP_ATTR_OWNER)) no_owner = 0;
-
- if (no_owner) {
- ma = malloc((i+2) * sizeof *ma);
- ma[0] = GLITE_JP_ATTR_OWNER;
- memcpy(ma+1,feed->attrs,(i+1) * sizeof *ma);
- }
- ret = glite_jpps_get_attrs(ctx,job,
- no_owner ? ma : feed->attrs,
- i+no_owner,attrs);
- free(ma);
- return ret;
-}
-
-/* XXX: limit on query size -- I'm lazy to malloc() */
-#define QUERY_MAX 100
-
-static int is_feed_matching(
- glite_jp_context_t ctx,
- const struct jpfeed *feed,
- const char *job,
-
-/* XXX: not checked for correctness,
- assuming single occurence only */
- const glite_jp_attrval_t attrs[]
-)
-{
- int i,fed,ret = 0;
- int qi[QUERY_MAX];
- char *owner = NULL;
- glite_jp_attrval_t *attr_out = NULL;
- glite_jp_attrval_t *newattr = NULL;
-
- glite_jp_clear_error(ctx);
-
- if (feed->qry) {
- int j,complete = 1;
-
- memset(qi,0,sizeof qi);
- for (i=0; feed->qry[i].attr; i++) {
- int sat = 0;
- assert(i<QUERY_MAX);
- for (j=0; !sat && attrs[j].name; j++)
- if (!strcmp(attrs[j].name,feed->qry[i].attr)) {
- if (check_qry_item(ctx,feed->qry+i,attrs+j)) {
- qi[i] = 1;
- sat = 1; /* matched, needn't loop further */
- }
- else return -1; /* can't be satisfied either */
- }
-
- if (!sat) complete = 0;
- }
-
- /* not all attributes in query are known from input
- * we have to retrieve job metadata from the backend
- *
- * XXX: It is not optimal to retrieve it here without sharing
- * over multiple invocations of match_feed() for the same job.
- */
-
- if (!complete) {
- char **attr = NULL;
-
- j=0;
- for (i=0; feed->qry[i].attr; i++) if (!qi[i]) {
- assert(j<QUERY_MAX);
- attr = realloc(attr, (j+1)*sizeof(*attr));
- attr[i] = feed->qry[i].attr;
- j++;
- }
-
- int err = glite_jpps_get_attrs(ctx, job, attr, j, &attr_out);
- int k;
- if (! err) for (k = 0; attr_out[k].name; k++);
- if (!err && (k < j)){
- glite_jp_error_t err;
-
- memset(&err,0,sizeof err);
- err.code = EIO;
- err.source = __FUNCTION__;
- err.desc = "complete query";
- ret = glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- for (i=0; feed->qry[i].attr; i++) {
- for (j = 0; j < k; j++)
- if (strcmp(feed->qry[i].attr, attr_out[j].name) == 0){
- if (!check_qry_item(ctx, feed->qry+i, attr_out+j)) {
- ret = -1;
- goto cleanup;
- }
- if (!strcmp(attr_out[i].name,GLITE_JP_ATTR_OWNER)) owner = attr_out[i].value;
- break;
- }
- }
- }
- }
-
-cleanup:
- if (attr_out){
- //for (i = 0; attr_out[i].name; i++)
- // glite_jp_attrval_free(&(attr_out[i]));
- free(attr_out);
- }
- return ret;
-}
-
-static int match_feed(
- glite_jp_context_t ctx,
- const struct jpfeed *feed,
- const char *job,
-
-/* XXX: not checked for correctness,
- assuming single occurence only */
- const glite_jp_attrval_t attrs[]
-)
-{
- if (is_feed_matching(ctx, feed, job, attrs))
- return 0;
-
- glite_jp_attrval_t meta[QUERY_MAX+1];
- char *owner = NULL;
- int fed, i;
-
- glite_jppsbe_check_fed(ctx,feed->id,job,&fed);
- if (!fed) {
- glite_jp_attrval_t *a;
- full_feed(ctx,feed,job,&a);
- for (i=0; a[i].name && strcmp(a[i].name,GLITE_JP_ATTR_OWNER); i++);
- owner = a[i].value;
-
- /* XXX: better error handling ? */
- if (!glite_jpps_single_feed(ctx,feed->id,0,feed->destination,job,owner,a))
- glite_jppsbe_set_fed(ctx,feed->id,job); /* XXX: on error? */
-
- for (i=0; a[i].name; i++) glite_jp_attrval_free(a+i,0);
- free(a);
- }
- else {
- int mf = 0;
- if (!owner) {
- mf = 1;
- memset(meta,0,sizeof meta);
- meta[0].name = strdup(GLITE_JP_ATTR_OWNER);
- glite_jppsbe_get_job_metadata(ctx,job,meta);
- owner = meta[0].value;
- }
- glite_jpps_single_feed(ctx,feed->id,0,feed->destination,job,owner,attrs);
- if (mf)
- for (i=0; meta[i].name; i++) glite_jp_attrval_free(meta+i,0);
- }
-
- return 0;
-}
-
-static int match_feed_multi(
- glite_jp_context_t ctx,
- const struct jpfeed *feed,
- const char **jobs,
- const glite_jp_attrval_t **attrs
-)
-{
- glite_jp_attrval_t meta[QUERY_MAX+1];
- char **owners = NULL;
- int *fed = NULL;
- glite_jp_attrval_t **attrs_to_feed = NULL;
- char **jobs_to_feed = NULL;
- int i, k;
- int j = 0;
-
- for (i = 0; jobs[i]; i++){
- if (! is_feed_matching(ctx, feed, jobs[i], attrs[i])){
- owners = realloc(owners, (j+1)*sizeof(*owners));
- attrs_to_feed = realloc(attrs_to_feed, (j+1)*sizeof(attrs_to_feed));
- jobs_to_feed = realloc(jobs_to_feed, (j+1)*sizeof(jobs_to_feed));
- fed = realloc(fed, (j+1)*sizeof(*fed));
- attrs_to_feed[j] = attrs[i];
- jobs_to_feed[j] = jobs[i];
- glite_jppsbe_check_fed(ctx,feed->id,jobs[i],&fed[j]);
- if (!fed){
- glite_jp_attrval_t *a;
- full_feed(ctx,feed,jobs[i],&a);
- int k;
- for (k=0; a[k].name && strcmp(a[k].name,GLITE_JP_ATTR_OWNER); k++);
- owners[j] = strdup(a[k].value);
- for (k=0; a[k].name; k++) glite_jp_attrval_free(a+k, 0);
- free(a);
- }
- else{
- memset(meta,0,sizeof meta);
- meta[0].name = strdup(GLITE_JP_ATTR_OWNER);
- glite_jppsbe_get_job_metadata(ctx,jobs[i],meta);
- owners[j] = strdup(meta[0].value);
- for (k = 0; meta[k].name; k++) glite_jp_attrval_free(meta+k,0);
- }
- j++;
- }
- }
-
- if (! glite_jpps_multi_feed(ctx, feed->id, 0, j,
- feed->destination, jobs_to_feed, owners, attrs_to_feed))
- for (i = 0; i < j; i++)
- if (fed[i])
- glite_jppsbe_set_fed(ctx,feed->id,jobs_to_feed[i]);
-
- for (i = 0; i < j; i++){
- free(owners[i]);
- //free(jobs_to_feed[i]);
- //glite_jp_attrval_free(attrs_to_feed[i],0);
- }
- free(jobs_to_feed);
- free(owners);
- free(attrs_to_feed);
- free(fed);
-
- return 0;
-}
-
-/* TODO: overit, ze do dalsich atributu se leze az kdyz matchuji metadata
- * kdyby ne, stejne se to nepovede ;
- * totez pro match_file */
-
-typedef struct{
- char *job;
- glite_jp_attrval_t *attrs;
-} match_attr;
-
-
-static int match_attr_deferred(
- glite_jp_context_t ctx,
- void *ma
-)
-{
- char *job = ((match_attr*)ma)->job;
- glite_jp_attrval_t *attrs = ((match_attr*)ma)->attrs;
-
- struct jpfeed *f = (struct jpfeed *) ctx->feeds;
- int i,j,doit;
-
- for (;f; f = f->next) {
- doit = 0;
-
- for (i=0; !doit && f->attrs[i]; i++)
- for (j=0; !doit && attrs[j].name; j++)
- if (!strcmp(f->attrs[i],attrs[j].name)) doit = 1;
-
- /* XXX: ignore any errors */
- if (doit) match_feed(ctx,f,job,attrs);
- }
-
- free(((match_attr*)ma)->job);
- //free(((match_attr*)ma)->attrs);
-
- return glite_jp_clear_error(ctx);
-}
-
-int glite_jpps_match_attr(
- glite_jp_context_t ctx,
- const char *job,
- const glite_jp_attrval_t attrs[]
-)
-{
- match_attr *ma = malloc(sizeof *ma);
- ma->job = strdup(job);
- ma->attrs = malloc(sizeof(*ma->attrs));
- ma->attrs[0].name = NULL;
- int i;
- for (i = 0; attrs[i].name; i++){
- ma->attrs = realloc(ma->attrs, (i+2)*sizeof(*ma->attrs));
-
- memcpy(&(ma->attrs[i]), &(attrs[i]), sizeof(*ma->attrs));
- ma->attrs[i].name = strdup(attrs[i].name);
- ma->attrs[i].value = strdup(attrs[i].value);
-
- ma->attrs[i+1].name = NULL;
- }
- glite_jp_add_deferred(ctx, match_attr_deferred, ma);
-}
-
-typedef struct{
- char **jobs;
- glite_jp_attrval_t **attrs;
-} match_attr_multi;
-
-static int match_attr_multi_deferred(
- glite_jp_context_t ctx,
- void *m
-)
-{
- match_attr_multi *mam = (match_attr_multi*)m;
- struct jpfeed *f = (struct jpfeed *) ctx->feeds;
- int i, j, k, doit;
-
- for (;f; f = f->next) {
- doit = 0;
- for (i = 0; !doit && f->attrs[i]; i++)
- for (j = 0; !doit && mam->attrs[j]; j++)
- for (k = 0; !doit && mam->attrs[j][k].name; k++)
- if (!strcmp(f->attrs[i],mam->attrs[j][k].name)) doit = 1;
-
- if (doit) match_feed_multi(ctx, f, mam->jobs, mam->attrs);
- }
-
- for (i=0; mam->jobs[i]; i++){
- free(mam->jobs[i]);
- if (mam->attrs[i])
- for (j = 0; mam->attrs[i][j].name; j++)
- glite_jp_attrval_free(&(mam->attrs[i][j]), 0);
- free(mam->attrs[i]);
- }
- free(mam->jobs);
- free(mam->attrs);
-
- return 0;
-}
-
-int glite_jpps_match_attr_multi(
- glite_jp_context_t ctx,
- const char **jobs,
- const glite_jp_attrval_t **attrs
-)
-{
- int i, j;
-
- match_attr_multi *mam = malloc(sizeof *mam);
- mam->jobs = NULL;
- mam->attrs = NULL;
- for (i = 0; jobs[i]; i++) {
- mam->jobs = realloc(mam->jobs, (i+2)*sizeof(*mam->jobs));
- mam->jobs[i] = strdup(jobs[i]);
- mam->attrs = realloc(mam->attrs, (i+2)*sizeof(*mam->attrs));
- mam->attrs[i] = calloc(0, sizeof(**mam->attrs));
- for (j = 0; attrs[i][j].name; j++){
- mam->attrs[i] = realloc(mam->attrs[i], (j+2)*sizeof(**mam->attrs));
- memcpy(&(mam->attrs[i][j]), &(attrs[i][j]), sizeof(**mam->attrs));
- mam->attrs[i][j].name = strdup(attrs[i][j].name);
- mam->attrs[i][j].value = strdup(attrs[i][j].value);
- mam->attrs[i][j].origin_detail = NULL;//strdup(attrs[i][j].origin_detail);
- }
- mam->attrs[i][j].name = NULL;
- }
- mam->jobs[i] = NULL;
- mam->attrs[i] = NULL;
-
- glite_jp_add_deferred(ctx, match_attr_multi_deferred, mam);
-
- return 0;
-
-/* TODO
- int i,j;
-
- puts(__FUNCTION__);
- for (i=0; jobs[i]; i++) {
- printf("job %s\n",jobs[i]);
-
- for (j=0; attrs[i][j].name; j++) {
- printf("\t%s = %s\n",attrs[i][j].name,attrs[i][j].value);
- }
- }
-
- return 0;*/
-}
-
-static int attr_void_cmp(const void *a, const void *b)
-{
- char const * const *ca = (char const * const *) a;
- char const * const *cb = (char const * const *) b;
- return strcmp(*ca,*cb);
-}
-
-static void attr_union(char **a, char **b, char ***c)
-{
- int ca = 0,cb = 0,cnt,i,j;
- char **out;
-
- if (a) for (ca = 0; a[ca]; ca++);
- if (b) for (cb = 0; b[cb]; cb++);
- out = malloc((ca+cb+1) * sizeof *out);
- if (a) memcpy(out,a,ca * sizeof *out);
- if (b) memcpy(out+ca,b,cb * sizeof *out);
- out[cnt = ca+cb] = NULL;
- qsort(out,cnt,sizeof *out,attr_void_cmp);
-
- for (i=0; i<cnt; i++) {
- for (j=i; j<cnt && !strcmp(out[i],out[j]); j++);
- if (j < cnt && j > i+1) memmove(out+i+1,out+j,(cnt-j) * sizeof *out);
- cnt -= j-i-1;
- }
- assert(cnt);
- out[cnt] = NULL;
-
- *c = out;
-}
-
-typedef struct{
- char *job;
- char *class;
- char *name;
-} match_file;
-
-int match_file_deferred(
- glite_jp_context_t ctx,
- void *mf
-)
-{
- char *job = ((match_file*)mf)->job;
- char *class = ((match_file*)mf)->class;
- char *name = ((match_file*)mf)->name;
-
- glite_jpps_fplug_data_t **pd = NULL;
- int pi;
- void *bh = NULL;
- int ret;
- struct jpfeed *f = ctx->feeds;
- glite_jp_attrval_t meta[QUERY_MAX+1];
-
- int nvals = 0,j,i;
- char **attrs = NULL, **attrs2;
- glite_jp_attrval_t *vals = NULL,*oneval;
-
- fprintf(stderr,"%s: %s %s %s\n",__FUNCTION__,job,class,name);
-
- memset(meta,0,sizeof meta);
- meta[0].name = strdup(GLITE_JP_ATTR_OWNER);
- glite_jppsbe_get_job_metadata(ctx,job,meta);
-
- if (!f) return 0;
-
- switch (glite_jpps_fplug_lookup_byclass(ctx,class,&pd)) {
- case ENOENT: return 0; /* XXX: shall we complain? */
- case 0: break;
- default: return -1;
- }
-
-
- for (;f;f=f->next) {
- attr_union(attrs,f->attrs,&attrs2);
- free(attrs);
- attrs = attrs2;
- }
-
- vals = malloc(sizeof *vals);
- vals[0].name = NULL;
-
- for (pi=0; pd[pi]; pi++) {
- int ci;
- for (ci=0; pd[pi]->uris[ci]; ci++) if (!strcmp(pd[pi]->classes[ci],class)) {
- void *ph;
-
- if (!bh && (ret = glite_jppsbe_open_file(ctx,job,pd[pi]->classes[ci],name,O_RDONLY,&bh))) {
- free(pd);
- return ret;
- }
-
- if (pd[pi]->ops.open(pd[pi]->fpctx,bh,class,&ph)) {
- /* XXX: complain more visibly */
- fputs("plugin open failed\n",stderr);
- continue;
- }
-
- for (i=0; attrs[i]; i++)
- if (!pd[pi]->ops.attr(pd[pi]->fpctx,ph,attrs[i],&oneval)) {
- /* XXX: ignore error */
- for (j=0; oneval[j].name; j++);
- vals = realloc(vals,(nvals+j+1) * sizeof *vals);
- memcpy(vals+nvals,oneval,(j+1) * sizeof *vals);
- nvals += j;
- free(oneval);
- }
-
- pd[pi]->ops.close(pd[pi]->fpctx,ph);
- }
- }
-
- free(attrs);
-
- if (bh) glite_jppsbe_close_file(ctx,bh);
- free(pd);
-
- for (f = ctx->feeds; f; f=f->next) {
- int k,fed;
- glite_jp_attrval_t * fattr;
-
- match_feed(ctx,f,job,vals);
-
-/* covered by match_feed()
- glite_jppsbe_check_fed(ctx,f->id,job,&fed);
- if (!fed) full_feed(ctx,f,job,&fattr);
- else {
- fattr = malloc((nvals+1) * sizeof *fattr);
-
- j = 0;
- for (i=0; i<nvals; i++) for (k=0; f->attrs[k]; k++)
- if (!strcmp(f->attrs[k],vals[i].name))
- memcpy(fattr+j++,vals+i,sizeof *fattr);
-
- memset(fattr+j,0,sizeof *fattr);
-
- }
- for (i=0; meta[i].name && strcmp(meta[i].name,GLITE_JP_ATTR_OWNER); i++);
- if (!glite_jpps_single_feed(ctx,f->id,0,f->destination,job,meta[i].value,fattr) && !fed)
- glite_jppsbe_set_fed(ctx,f->id,job);
-
- if (!fed) for (i=0; fattr[i].name; i++) glite_jp_attrval_free(fattr+i,0);
- free(fattr);
-*/
- }
-
- for (i=0; vals[i].name; i++) glite_jp_attrval_free(vals+i,0);
- free(vals);
-
- for (i=0; meta[i].name; i++) glite_jp_attrval_free(meta+i,0);
-
- free(((match_file*)mf)->job);
- free(((match_file*)mf)->class);
- free(((match_file*)mf)->name);
-
- return 0;
-}
-
-int glite_jpps_match_file(
- glite_jp_context_t ctx,
- const char *job,
- const char *class,
- const char *name
-)
-{
- match_file* mf = malloc(sizeof(*mf));
- mf->job = strdup(job);
- mf->class = strdup(class);
- if (name)
- mf->name = strdup(name);
- else
- mf->name = NULL;
-
- glite_jp_add_deferred(ctx, match_file_deferred, mf);
-}
-
-static char *generate_feedid(void)
-{
- char hname[200],buf[1000];
-
- gethostname(hname,sizeof hname);
- snprintf(buf,sizeof buf,"%s%d%ld",hname,getpid(),lrand48());
- buf[sizeof buf-1] = 0;
- return str2md5base64(buf);
-}
-
-static struct jpfeed *make_jpfeed(
- const char *destination,
- char const *const *attrs,
- const glite_jp_query_rec_t *qry,
- char *id,
- time_t expires)
-{
- int i;
- struct jpfeed *f = calloc(1,sizeof *f);
-
- f->id = id ? strdup(id) : NULL;
- f->destination = strdup(destination);
- f->expires = expires;
- for (i=0; attrs[i]; i++) {
- f->attrs = realloc(f->attrs,(i+2) * sizeof *f->attrs);
- f->attrs[i] = strdup(attrs[i]);
- f->attrs[i+1] = NULL;
- }
- for (i=0; qry[i].attr; i++) {
- f->qry = realloc(f->qry,(i+2) * sizeof *f->qry);
- glite_jp_queryrec_copy(f->qry+i,qry+i);
- memset(f->qry+i+1,0,sizeof *f->qry);
- }
-
- return f;
-}
-
-void jpfeed_free(struct jpfeed *f)
-{
- int i;
-
- assert(f->njobs == 0); /* XXX: we shouldn't do this */
-
- free(f->id);
- free(f->destination);
- if (f->attrs) {
- for (i=0; f->attrs[i]; i++) free(f->attrs[i]);
- free(f->attrs);
- }
- for (i=0; i<f->nmeta_attr; i++) free(f->meta_attr[i]);
- free(f->meta_attr);
- for (i=0; i<f->nother_attr; i++) free(f->other_attr[i]);
- free(f->other_attr);
-
- if (f->qry) {
- for (i=0; f->qry[i].attr; i++) glite_jp_free_query_rec(f->qry+i);
- free(f->qry);
- }
-
- for (i=0; i<f->nmeta_qry; i++) glite_jp_free_query_rec(f->meta_qry+i);
- free(f->meta_qry);
- for (i=0; i<f->nother_qry; i++) glite_jp_free_query_rec(f->other_qry+i);
- free(f->other_qry);
-
- /* XXX: no next */
-
- free(f);
-}
-
-static void drop_jobs(struct jpfeed *f)
-{
- int i,j;
- for (i=0; i<f->njobs; i++) {
- for (j=0; f->job_attrs[i][j].name; j++)
- glite_jp_attrval_free(&f->job_attrs[i][j],0);
- free(f->job_attrs[i]);
- free(f->jobs[i]);
- free(f->owners[i]);
- }
- free(f->job_attrs); f->job_attrs = NULL;
- free(f->jobs); f->jobs = NULL;
- free(f->owners); f->owners = NULL;
- f->njobs = 0;
-}
-
-static int drain_feed(glite_jp_context_t ctx, struct jpfeed *f,int done)
-{
- int ret = 0;
- glite_jp_clear_error(ctx);
- if (f->njobs) {
- int i;
- ret = glite_jpps_multi_feed(ctx,f->id,done,f->njobs,f->destination,f->jobs,f->owners,f->job_attrs);
-
- if (!ret && f->continuous) for (i=0; i<f->njobs; i++) glite_jppsbe_set_fed(ctx,f->id,f->jobs[i]);
- drop_jobs(f);
- }
- return ret;
-}
-
-static int feed_query_callback(
- glite_jp_context_t ctx,
- const char *job,
- const glite_jp_attrval_t meta[],
- void *arg)
-{
- int i,j,nout = 0,ec;
- glite_jp_error_t err;
- struct jpfeed *f = arg;
- glite_jp_attrval_t *other = NULL,*out = NULL;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- glite_jp_clear_error(ctx);
-
-/* retrieve other attributes */
- ec = glite_jpps_get_attrs(ctx,job,f->other_attr,f->nother_attr,&other);
- switch (ec) {
- case 0: break;
- case ENOENT: glite_jp_clear_error(ctx); break;
- default:
- err.code = EIO;
- err.desc = "retrieve job attributes";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
-/* filter on non-meta query items */
- if (f->nother_qry && !other) goto cleanup; /* unknown values can't match */
-
- for (i=0; i<f->nother_qry; i++) {
- for (j=0; other[j].name; j++)
- if (check_qry_item(ctx,f->other_qry+i,other+j)) break;
- if (!other[j].name) goto cleanup; /* no match is not an error */
- }
-
-/* extract attributes to be fed, stack the job for a batch feed */
- for (i=0; meta && meta[i].name; i++)
- for (j=0; j<f->nmeta_attr; j++)
- if (!strcmp(meta[i].name,f->meta_attr[j])) {
- out = realloc(out,(nout+2) * sizeof *out);
- glite_jp_attrval_copy(out+nout,meta+i);
- nout++;
- }
-
- if (other)
- for (i=0; other[i].name; i++)
- for (j=0; j<f->int_other_attr; j++)
- if (!strcmp(other[i].name,f->other_attr[j])) {
- out = realloc(out,(nout+2) * sizeof *out);
- glite_jp_attrval_copy(out+nout,other+i);
- nout++;
- }
-
- if (nout) {
- int oi;
-
- memset(out+nout,0,sizeof *out);
- f->jobs = realloc(f->jobs,(f->njobs+1)*sizeof *f->jobs);
- f->jobs[f->njobs] = strdup(job);
- f->job_attrs = realloc(f->job_attrs,(f->njobs+1)*sizeof *f->job_attrs);
- f->job_attrs[f->njobs] = out;
- out = NULL;
-
- for (oi=0; strcmp(meta[oi].name,GLITE_JP_ATTR_OWNER); oi++);
- assert(meta[oi].name);
- f->owners = realloc(f->owners,(f->njobs+1)*sizeof *f->owners);
- f->owners[f->njobs] = strdup(meta[oi].value);
-
- f->njobs++;
- }
-
-/* run the feed eventually */
- if (f->njobs >= BATCH_FEED_SIZE && drain_feed(ctx,f,0)) {
- err.code = EIO;
- err.desc = "sending batch feed";
- glite_jp_stack_error(ctx,&err);
- }
-
-cleanup:
- for (i=0; other && other[i].name; i++) glite_jp_attrval_free(other+i,0);
- free(other);
-
- return err.code;
-}
-
-
-static int run_feed_deferred(glite_jp_context_t ctx,void *feed)
-{
- struct jpfeed *f = feed;
- int i,m,o,cnt,ret = 0;
- char **meta;
-
- glite_jp_clear_error(ctx);
-/* count "meta" attributes */
- cnt = 0;
- for (i=0; f->attrs[i]; i++)
- if (glite_jppsbe_is_metadata(ctx,f->attrs[i])) cnt++;
-
- f->meta_attr = cnt ? malloc((cnt+1) * sizeof *f->meta_attr) : NULL;
- f->nmeta_attr = cnt;
-
- f->other_attr = i-cnt ? malloc((i-cnt+1) * sizeof *f->other_attr) : NULL;
- f->nother_attr = i-cnt;
-
-/* sort attributes to "meta" and others */
- m = o = 0;
- for (i=0; f->attrs[i]; i++)
- if (glite_jppsbe_is_metadata(ctx,f->attrs[i]))
- if (!strcmp(f->attrs[i],GLITE_JP_ATTR_OWNER)) {
- free(f->attrs[i]);
- f->nmeta_attr--;
- }
- else f->meta_attr[m++] = f->attrs[i];
- else {
- /* XXX: jobid and owner are sent anyway */
- if (!strcmp(f->attrs[i],GLITE_JP_ATTR_JOBID)) {
- free(f->attrs[i]);
- f->nother_attr--;
- }
- else f->other_attr[o++] = f->attrs[i];
- }
-
- if (f->nmeta_attr == 0) { free(f->meta_attr); f->meta_attr = NULL; }
- if (f->nother_attr == 0) { free(f->other_attr); f->other_attr = NULL; }
-
- if (f->meta_attr) f->meta_attr[m] = NULL;
- if (f->other_attr) f->other_attr[o] = NULL;
-
-
-/* the same for query records */
- cnt = 0;
- for (i=0; f->qry[i].attr; i++)
- if (glite_jppsbe_is_metadata(ctx,f->qry[i].attr)) cnt++;
-
- f->meta_qry = cnt ? malloc((cnt+1) * sizeof *f->meta_qry) : NULL;
- if (f->meta_qry) memset(f->meta_qry+cnt,0,sizeof *f->meta_qry);
- f->nmeta_qry = cnt;
- f->other_qry = i-cnt ? malloc((i-cnt+1) * sizeof *f->other_qry) : NULL;
- f->nother_qry = i-cnt;
-
- m = o = 0;
- for (i=0; f->qry[i].attr; i++)
- if (glite_jppsbe_is_metadata(ctx,f->qry[i].attr)) memcpy(f->meta_qry+m++,f->qry+i,sizeof *f->meta_qry);
- else memcpy(f->other_qry+o++,f->qry+i,sizeof *f->other_qry);
-
- free(f->attrs); free(f->qry);
- f->attrs = NULL;
- f->qry = NULL;
-
- if (f->meta_qry) memset(f->meta_qry+m,0,sizeof *f->meta_qry);
- else {
- glite_jp_error_t err;
- err.code = EINVAL;
- err.source = __FUNCTION__;
- err.desc = "at least one metadata query item required";
- ret = glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- if (f->other_qry) memset(f->other_qry+o,0,sizeof *f->other_qry);
-
-/* extract other_qry items that are not present in other_attr */
- f->int_other_attr = o = f->nother_attr;
- for (i=0; i<f->nother_qry; i++) {
- int j;
- for (j=0; j<f->int_other_attr && strcmp(f->other_attr[j],f->other_qry[i].attr); j++);
- if (j == f->int_other_attr) {
- f->other_attr = realloc(f->other_attr,(o+2) * sizeof *f->other_attr);
- f->other_attr[o++] = strdup(f->other_qry[i].attr);
- }
- }
- if (f->other_attr) f->other_attr[o] = NULL;
- f->nother_attr = o;
-
- meta = calloc(f->nmeta_attr+2,sizeof *meta);
- meta[0] = GLITE_JP_ATTR_OWNER;
- if (f->meta_attr) memcpy(meta+1,f->meta_attr,(f->nmeta_attr+1) * sizeof *meta);
- else meta[1] = NULL;
-
- ret = glite_jppsbe_query(ctx,f->meta_qry,meta,f,feed_query_callback);
- free(meta);
- if (ret == 0) ret = drain_feed(ctx,f,1);
- else if (ret == ENOENT) ret = 0;
- else drop_jobs(f);
-
-cleanup:
-
- jpfeed_free(f);
- return ret;
-}
-
-int glite_jpps_run_feed(
- glite_jp_context_t ctx,
- const char *destination,
- char const * const *attrs,
- const glite_jp_query_rec_t *qry,
- int continuous,
- char **feed_id)
-{
- struct jpfeed *f;
-
- fprintf(stderr,"%s: \n",__FUNCTION__);
- if (!*feed_id) *feed_id = generate_feedid();
-
- f = make_jpfeed(destination,attrs,qry,*feed_id,(time_t) 0);
- f->continuous = continuous;
- glite_jp_add_deferred(ctx,run_feed_deferred,f);
-
- return 0;
-}
-
-static int register_feed_deferred(glite_jp_context_t ctx,void *feed)
-{
- struct jpfeed *f = feed;
-
- if (glite_jppsbe_store_feed(ctx,f)) fputs(glite_jp_error_chain(ctx),stderr);
- else{
- time(&(f->expires));
- f->expires += FEED_TTL;
- glite_jppsbe_refresh_feed(ctx, f->id, f->expires);
- kill(-master,SIGUSR1); /* gracefully terminate slaves
- and let master restart them */
- }
-
- return 0;
-}
-
-
-int glite_jpps_register_feed(
- glite_jp_context_t ctx,
- const char *destination,
- char const *const *attrs,
- const glite_jp_query_rec_t *qry,
- char **feed_id,
- time_t *expires)
-{
- struct jpfeed *f = NULL;
-
- if (!*feed_id) *feed_id = generate_feedid();
- time(expires); *expires += FEED_TTL;
-
- f = make_jpfeed(destination,attrs,qry,*feed_id,*expires);
- glite_jp_add_deferred(ctx,register_feed_deferred,f);
-
- return 0;
-}
-
-int glite_jpps_refresh_feed(glite_jp_context_t ctx, char *feed_id, time_t *expires){
- time(expires); *expires += FEED_TTL;
-
- glite_jppsbe_refresh_feed(ctx, feed_id, *expires);
-
- printf("Feed %s has been refreshed.\n", feed_id);
-
- return 0;
-}
-
+++ /dev/null
-#ifndef GLITE_JP_FEED_H
-#define GLITE_JP_FEED_H
-
-
-struct jpfeed {
-/* feed data */
- char *id,*destination;
- time_t expires;
- int continuous;
-
-/* complete and split query and attribute list */
- char **attrs,**meta_attr,**other_attr;
- int int_other_attr; /* index from where other_attr is extended
- with attributes from other_query */
-
- int nother_attr, nmeta_attr, nmeta_qry, nother_qry;
- glite_jp_query_rec_t *qry,*meta_qry,*other_qry;
-
-/* jobs stacked for feed */
- int njobs;
- char **jobs;
- char **owners;
- glite_jp_attrval_t **job_attrs;
-
-/* next feed */
- struct jpfeed *next;
-};
-
-
-int glite_jpps_match_attr(glite_jp_context_t,const char *,const glite_jp_attrval_t[]);
-int glite_jpps_match_file(glite_jp_context_t,const char *,const char *,const char *);
-int glite_jpps_match_attr_multi(glite_jp_context_t,const char **, const glite_jp_attrval_t **);
-int glite_jpps_match_tag(glite_jp_context_t,const char *,const char *,const char *);
-int glite_jpps_run_feed(glite_jp_context_t,const char *,char const * const *,const glite_jp_query_rec_t *,int,char **);
-int glite_jpps_register_feed(glite_jp_context_t,const char *,char const * const *,const glite_jp_query_rec_t *,char **,time_t *);
-
-#endif /* GLITE_JP_FEED_H */
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <dlfcn.h>
-#include <errno.h>
-
-#include <glite/jp/types.h>
-#include "glite/jp/file_plugin.h"
-
-static struct option opts[] = {
- { "plugin", 1, NULL, 'p' },
- { NULL }
-};
-
-static int loadit(glite_jp_context_t ctx,const char *so)
-{
-/* XXX: not stored but we never dlclose() yet */
- void *dl_handle = dlopen(so,RTLD_NOW);
-
- glite_jp_error_t err;
- const char *e;
- glite_jpps_fplug_data_t *data,*dp;
- int i;
-
- glite_jpps_fplug_init_t init;
- memset(&err,0,sizeof err);
-
- if (!dl_handle) {
- err.source = "dlopen()";
- err.code = EINVAL;
- err.desc = dlerror();
- return glite_jp_stack_error(ctx,&err);
- }
-
- dlerror();
- init = dlsym(dl_handle,"init");
- e = dlerror();
- if (e) {
- char buf[300];
- snprintf(buf,sizeof buf,"dlsym(\"%s\",\"init\")",so);
- buf[299] = 0;
- err.source = buf;
- err.code = ENOENT;
- err.desc = e;
- return glite_jp_stack_error(ctx,&err);
- }
-
- data = calloc(1,sizeof *data);
-
- if (init(ctx,data)) return -1;
-
- i = 0;
- if (ctx->plugins) for (i=0; ctx->plugins[i]; i++);
- ctx->plugins = realloc(ctx->plugins, (i+2) * sizeof *ctx->plugins);
- ctx->plugins[i] = data;
- ctx->plugins[i+1] = NULL;
-
- /* TODO: check consistency of uri+class pairs wrt. previous plugins */
-
- return 0;
-}
-
-int glite_jpps_fplug_load(glite_jp_context_t ctx,int argc,char **argv)
-{
- int i;
-
- for (i=1; i<argc; i++) if (loadit(ctx,argv[i])) {
- glite_jp_error_t err;
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- err.code = EINVAL;
- err.desc = argv[i];
- return glite_jp_stack_error(ctx,&err);
- }
-
- return 0;
-}
-
-static int lookup_common(glite_jp_context_t ctx,const char *uri,const char *class, glite_jpps_fplug_data_t ***plugin_data)
-{
- int i;
-
- glite_jpps_fplug_data_t **out = NULL;
- int matches = 0;
-
- glite_jp_error_t err;
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- err.code = ENOENT;
- err.desc = (char *) (uri ? uri : class); /* XXX: we don't modify it, believe me, gcc! */
-
- glite_jp_clear_error(ctx);
- if (!ctx->plugins) {
- return glite_jp_stack_error(ctx,&err);
- }
-
- for (i = 0; ctx->plugins[i]; i++) {
- int j;
- glite_jpps_fplug_data_t *p = ctx->plugins[i];
-
- for (j=0; p->uris && p->uris[j]; j++)
- if ((uri && !strcmp(p->uris[j],uri)) || (class && !strcmp(p->classes[j],class))) {
- out = realloc(out, (matches+2) * sizeof *out);
- out[matches++] = p;
- out[matches] = NULL;
- }
- }
-
- if (matches) {
- *plugin_data = out;
- return 0;
- }
- else return glite_jp_stack_error(ctx,&err);
-}
-
-int glite_jpps_fplug_lookup(glite_jp_context_t ctx,const char *uri, glite_jpps_fplug_data_t ***plugin_data)
-{
- return lookup_common(ctx,uri,NULL,plugin_data);
-}
-
-int glite_jpps_fplug_lookup_byclass(glite_jp_context_t ctx, const char *class,glite_jpps_fplug_data_t ***plugin_data)
-{
- return lookup_common(ctx,NULL,class,plugin_data);
-}
-
+++ /dev/null
-#include <sys/types.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-
-#include "glite/jp/db.h"
-
-extern void reply(int n, char *fmt,...);
-
-#define FTPBE_DEFAULT_DB_CS "jpps/@localhost:jpps"
-
-static char *user_subj = NULL;
-static char *int_prefix = NULL;
-static glite_jp_context_t ctx;
-
-static int open_db()
-{
- char *db_cs = NULL;
-
- db_cs = getenv("FTPBE_DB_CS");
- if (!db_cs) db_cs = FTPBE_DEFAULT_DB_CS;
-
- int_prefix = getenv("FTPBE_INT_PREFIX");
- if (!int_prefix) {
- reply(550, "Internal error: prefix not configured");
- return 0;
- }
-
- glite_jp_init_context(&ctx);
- if (glite_lbu_InitDBContext(((glite_lbu_DBContext *)&ctx->dbhandle)) != 0) {
- reply(550, "Internal error: backend DB initialization failed");
- return 0;
- }
- if (glite_lbu_DBConnect(ctx->dbhandle, db_cs) != 0) {
- reply(550, "Internal error: backend DB access failed");
- return 0;
- }
-
- return 1;
-}
-
-static void close_db()
-{
- glite_lbu_DBClose(ctx->dbhandle);
- glite_lbu_FreeDBContext(ctx->dbhandle);
-}
-
-
-int globus_gss_assist_gridmap(char* globus_id, char** mapped_name)
-{
- char *logname;
-
- logname = getenv("GLITE_USER");
- if (logname) {
- *mapped_name = strdup(logname);
- user_subj = strdup(globus_id);
- if (!(*mapped_name) || !user_subj) return 1;
-
- return 0;
- } else {
- return 1;
- /*
- * Note: return value need not follow globus numbering
- * scheme in ftpd
- */
- }
-}
-
-int globus_gss_assist_userok(char*globus_id, char *account)
-{
- char *logname;
-
- logname = getenv("GLITE_USER");
- if (logname)
- return strcmp(account,strdup(logname)) ? 1 : 0;
- else
- return 1;
-}
-
-int checknoretrieve(char *name)
-{
- int result = 1; /* deny access by default */
-
- char *stmt = NULL;
- int db_retn;
- glite_lbu_Statement db_res;
- char *db_row[1] = { NULL };
-
- trio_asprintf(&stmt,"select j.owner from jobs j,files f where "
- "f.ext_url='%|Ss%|Ss' and j.jobid=f.jobid",
- int_prefix, name);
- if (!stmt) {
- reply(550, "Internal error: out of memory");
- return 1;
- }
-
- if (!open_db()) return 1;
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx, stmt, &db_res)) <= 0) {
- if (db_retn == 0) {
- reply(553, "No such file registered");
- } else {
- reply(550, "Internal error: backend DB access failed");
- }
- goto out;
- }
-
- db_retn = glite_jp_db_FetchRow(ctx, db_res, 1, NULL, db_row);
- if (db_retn != 1) {
- glite_jp_db_FreeStmt(&db_res);
- reply(550, "Internal error: backend DB access failed");
- goto out;
- }
- glite_jp_db_FreeStmt(&db_res);
-
- if (!strcmp(db_row[0], user_subj)) {
- result = 0;
- } else {
- reply(553, "Permission denied");
- }
-
-out:
- free(db_row[0]);
- close_db();
- free(stmt);
- return result;
-}
-
-int upl_check(char *name, uid_t * uid, gid_t * gid, int *f_mode, int *valid)
-{
- int result = -1; /* deny access by default */
-
- char *stmt = NULL;
- int db_retn;
- glite_lbu_Statement db_res;
- char *db_row[1] = { NULL };
-
- *valid = 0; /* don't used uid & gid */
-
- trio_asprintf(&stmt,"select state from files "
- "where ext_url='%|Ss%|Ss' and ul_userid='%|Ss'",
- int_prefix, name, user_subj);
- if (!stmt) {
- reply(550, "Internal error: out of memory");
- return -1;
- }
-
- if (!open_db()) return -1;
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx, stmt, &db_res)) <= 0) {
- if (db_retn == 0) {
- reply(553, "No such upload in progress");
- } else {
- reply(550, "Internal error: backend DB access failed");
- }
- goto out;
- }
-
- db_retn = glite_jp_db_FetchRow(ctx, db_res, 1, NULL, db_row);
- if (db_retn != 1) {
- glite_jp_db_FreeStmt(&db_res);
- reply(550, "Internal error: backend DB access failed");
- goto out;
- }
- glite_jp_db_FreeStmt(&db_res);
-
- if (!strcmp(db_row[0], "uploading")) {
- result = 1;
- } else {
- reply(553, "Permission denied");
- }
-
-out:
- free(db_row[0]);
- close_db();
- free(stmt);
- return result;
-}
-
-int del_check(char *name)
-{
- reply(553, "Deleting files not supported");
- return 0;
-}
-
-int rename(const char *f, const char * t)
-{
- errno = EPERM;
- return -1;
-}
-
-FILE *ftpd_popen(char *program, char *type, int closestderr)
-{
- errno = EPERM;
- return NULL;
-}
+++ /dev/null
-#include <stdio.h>
-#include <time.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#undef SOAP_FMAC1
-#define SOAP_FMAC1 static
-
-#include <stdsoap2.h>
-
-#include "glite/jp/types.h"
-#include "soap_version.h"
-#include "glite/security/glite_gsplugin.h"
-#include "glite/security/glite_gscompat.h"
-
-#include "feed.h"
-#include "is_client.h"
-
-/* same as ClientLib.c, without WITH_NOGLOBAL */
-#define SOAP_FMAC3 static
-#include "jpis_C.c"
-#include "jpis_Client.c"
-
-#include "jpis_.nsmap"
-
-#include "soap_env_ctx.h"
-#include "soap_env_ctx.c"
-
-#include "glite/jp/ws_fault.c"
-#include "soap_util.c"
-
-#define MAX_RETRY 10
-#define RETRY_SLEEP 2
-
-extern char *server_key, *server_cert; /* XXX */
-
-static int check_other_soap(glite_jp_context_t ctx)
-{
- glite_gsplugin_Context plugin_ctx;
- int ret = 0;
-
- if (!ctx->other_soap) {
- glite_gsplugin_init_context(&plugin_ctx);
- if (server_key || server_cert) {
- edg_wll_GssCred cred;
-
- ret = edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &cred, NULL);
- glite_gsplugin_set_credential(plugin_ctx, cred);
- }
-
- ctx->other_soap = soap_new();
- soap_init(ctx->other_soap);
- soap_set_namespaces(ctx->other_soap,jpis__namespaces);
- soap_set_omode(ctx->other_soap, SOAP_IO_BUFFER); // set buffered response
- // buffer set to SOAP_BUFLEN (default = 8k)
- soap_register_plugin_arg(ctx->other_soap,glite_gsplugin,plugin_ctx);
- ctx->other_soap->user = ctx;
- }
- return ret;
-}
-
-static check_fault(glite_jp_context_t ctx,struct soap *soap,int ec)
-{
- glite_jp_error_t err;
- char buf[1000] = "unknown fault";
-
- switch (ec) {
- case SOAP_OK: return 0;
- default:
- err.code = EIO;
- err.source = __FUNCTION__;
- err.desc = buf;
- if (soap->fault) snprintf(buf,sizeof buf,"%s %s\n",
- soap->fault->faultcode,
- soap->fault->faultstring);
- buf[999] = 0;
- glite_jp_stack_error(ctx,&err);
- return err.code;
- }
-}
-
-static struct _glite_jp_soap_env_ctx_t *keep_soap_env_ctx;
-
-#define SWITCH_SOAP_CTX \
-{ \
- keep_soap_env_ctx = glite_jp_soap_env_ctx; \
- glite_jp_soap_env_ctx = &my_soap_env_ctx; \
-} \
-
-#define RESTORE_SOAP_CTX \
-{ \
- glite_jp_soap_env_ctx = keep_soap_env_ctx; \
-} \
-
-static int glite_jpps_single_feed_wrapped(
- glite_jp_context_t ctx,
- const char *feed,
- int done,
- const char *destination,
- const char *job,
- const char *owner,
- glite_jp_attrval_t const *attrs
-)
-{
- struct _jpelem__UpdateJobs in;
- struct _jpelem__UpdateJobsResponse out;
- struct jptype__jobRecord jr, *jrp = &jr;
- int i;
- enum xsd__boolean false = GLITE_SECURITY_GSOAP_FALSE;
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
-
- /* TODO: call JP Index server via interlogger */
-
- printf("feed %s to %s, job %s\n",feed,destination,job);
-
- check_other_soap(ctx);
-
- in.feedId = (char *) feed; /* XXX: const */
- in.feedDone = done;
- in.__sizejobAttributes = 1;
-#warning FIXME for valtri
- in.jobAttributes = &jrp;
-
- for (i=0; attrs[i].name; i++);
- jr.jobid = soap_strdup(ctx->other_soap, job);
- jr.owner = soap_strdup(ctx->other_soap, owner);
-
- jr.__sizeattributes = jp2s_attrValues(ctx->other_soap,
- (glite_jp_attrval_t *) attrs, /* XXX: const */
- &jr.attributes,0);
-
- jr.remove = &false;
- jr.__sizeprimaryStorage = 1;
- jr.primaryStorage = &ctx->myURL;
-
-
- SWITCH_SOAP_CTX
- if (soap_call___jpsrv__UpdateJobs(ctx->other_soap,destination,"",
- &in,&out
- )) {
- char buf[1000];
- err.code = EIO;
- err.source = __FUNCTION__;
- err.desc = buf;
- memset(buf, 0, sizeof(buf));
- if (ctx->other_soap->fault) {
- snprintf(buf,sizeof buf,"%s %s\n",
- ctx->other_soap->fault->faultcode,
- ctx->other_soap->fault->faultstring);
- }
- else {
- sprintf(buf,"No detailed error description (JP IS not running?)\n");
- }
- buf[999] = 0;
- glite_jp_stack_error(ctx,&err);
- }
- RESTORE_SOAP_CTX
-
- soap_dealloc(ctx->other_soap, jr.jobid);
- soap_dealloc(ctx->other_soap, jr.owner);
- attrValues_free(ctx->other_soap,jr.attributes,jr.__sizeattributes);
-
- return err.code;
-}
-
-int glite_jpps_single_feed(
- glite_jp_context_t ctx,
- const char *feed,
- int done,
- const char *destination,
- const char *job,
- const char *owner,
- glite_jp_attrval_t const *attrs
-)
-{
- int retry,ret;
- assert(owner);
- for (retry = 0; retry < MAX_RETRY; retry++) {
- if ((ret = glite_jpps_single_feed_wrapped(ctx,feed,done,destination,job,owner,attrs)) == 0) break;
- sleep(RETRY_SLEEP);
- }
- return ret;
-}
-
-
-static int glite_jpps_multi_feed_wrapped(
- glite_jp_context_t ctx,
- const char *feed,
- int done,
- int njobs,
- const char *destination,
- char **jobs,
- char **owners,
- glite_jp_attrval_t **attrs)
-{
- int i,j;
-
- struct _jpelem__UpdateJobs in;
- struct _jpelem__UpdateJobsResponse out;
- struct jptype__jobRecord *jr;
- enum xsd__boolean false = GLITE_SECURITY_GSOAP_FALSE;
- glite_jp_error_t err;
-
- printf("multi_feed %s to %s\n",feed,destination);
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
-
- check_other_soap(ctx);
-
- in.feedId = (char *) feed; /* XXX: const */
- in.feedDone = done;
- GLITE_SECURITY_GSOAP_LIST_CREATE(ctx->other_soap, &in, jobAttributes, struct jptype__jobRecord, njobs);
-
- for (i=0; i<njobs; i++) {
- puts(jobs[i]);
- for (j=0; attrs[i][j].name; j++)
- printf("%s = %s\n",attrs[i][j].name,attrs[i][j].value);
- putchar(10);
-
- jr = GLITE_SECURITY_GSOAP_LIST_GET(in.jobAttributes, i);
- jr->jobid = jobs[i];
- jr->owner = owners[i];
-
- assert(jr->owner);
-
- jr->__sizeattributes = jp2s_attrValues(ctx->other_soap,
- attrs[i],
- &jr->attributes,0);
-
- jr->remove = &false;
- jr->__sizeprimaryStorage = 1;
- jr->primaryStorage = &ctx->myURL;
- }
-
- //#ifndef JP_PERF
- SWITCH_SOAP_CTX
- check_fault(ctx,ctx->other_soap,
- soap_call___jpsrv__UpdateJobs(ctx->other_soap,destination,"", &in,&out));
- RESTORE_SOAP_CTX
- for (i=0; i<njobs; i++) {
- jr = GLITE_SECURITY_GSOAP_LIST_GET(in.jobAttributes, i);
- attrValues_free(ctx->other_soap,jr->attributes,jr->__sizeattributes);
- }
- GLITE_SECURITY_GSOAP_LIST_DESTROY(ctx->other_soap, &in, jobAttributes);
- //#endif
-
- return err.code;
-}
-
-
-int glite_jpps_multi_feed(
- glite_jp_context_t ctx,
- const char *feed,
- int done,
- int njobs,
- const char *destination,
- char **jobs,
- char **owners,
- glite_jp_attrval_t **attrs)
-{
- int retry,ret;
- for (retry = 0; retry < MAX_RETRY; retry++) {
- if ((ret = glite_jpps_multi_feed_wrapped(ctx,feed,done,njobs,destination,jobs,owners,attrs)) == 0) break;
- sleep(RETRY_SLEEP);
- }
- return ret;
-}
+++ /dev/null
-int glite_jpps_single_feed(glite_jp_context_t,const char *,int,const char *,const char *,const char *,glite_jp_attrval_t const *);
-int glite_jpps_multi_feed(glite_jp_context_t,const char *,int,int,const char *,char **,char **,glite_jp_attrval_t **);
-
-
+++ /dev/null
-#include <stdlib.h>
-#include <globus_common.h>
-#include <globus_gsi_authz.h>
-#include <globus_gsi_authz_callout_error.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/db.h"
-
-#include "jp_callouts.h"
-
-#define FTPBE_DEFAULT_DB_CS "jpps/@localhost:jpps"
-
-/*
- This file provides following authorization callouts used by the globus
- gridftp server. The callouts must be specified in the gsi_auth.confs
- configuration file.
- 1. GLOBUS_GSI_AUTHZ_SYSTEM_INIT
- - called upon request arrival, runs under the deamon uid
- - opens connection to the DB
- 2. globus_mapping
- - performs mapping to a local account
- - n-to-one mapping implemented, which uses a generic user name
- 3. GLOBUS_GSI_AUTHZ_HANDLE_INIT
- - runs under the mapped client uid
- - used to save current GSS context for later use
- 4. GLOBUS_GSI_AUTHORIZE_ASYNC
- - called just before the request is served
- - performs actual authZ decision based on current state of the file in
- in the JP DB
- 5. GLOBUS_GSI_AUTHZ_HANDLE_DESTROY
- - cleanup of saved data
- (6. GLOBUS_GSI_AUTHZ_SYSTEM_DESTROY)
- - cleanup
- - we should close the connection to the DB, however this callout doesn't
- seem to be called by the ftpd
-*/
-
-static globus_result_t
-query_db(glite_jp_context_t ctx, glite_lbu_Statement *res,
- const char *format, ...)
-{
- char *stmt = NULL;
- int ret;
- glite_lbu_Statement db_res;
- va_list ap;
- globus_result_t result = GLOBUS_FAILURE;
-
- va_start(ap, format);
- trio_vasprintf(&stmt, format, ap);
- if (stmt == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERRNO_ERROR(result, errno);
- return result;
- }
- va_end(ap);
-
- ret = glite_jp_db_ExecSQL(ctx, stmt, &db_res);
- if (ret <= 0) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ((ret == 0) ? "No such file registered" :
- "Internal error: backend DB access failed"));
- goto end;
- }
-
- *res = db_res;
- result = GLOBUS_SUCCESS;
-
-end:
- if (stmt)
- free(stmt);
-
- return result;
-}
-
-static globus_result_t
-authz_read(authz_jp_system_state_struct *state, char *object, char *client)
-{
- globus_result_t result = GLOBUS_FAILURE;
- int db_retn;
- glite_lbu_Statement db_res;
- char *db_row[1] = { NULL };
- char *p;
-
- /* skip the gsiftp:// or ftp:// prefix */
- p = strstr(object, "ftp://");
- if (p == NULL) {
- result = GLOBUS_FAILURE;
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ("Unsupported file type, access denied"));
- goto out;
- }
- p += 6;
-
- /* find where the filename starts in the URL */
- p = strchr(p, '/');
-
- result = query_db(state->jp_ctx, &db_res,
- "select j.owner from jobs j,files f where "
- "f.int_path='%|Ss' and j.jobid=f.jobid", p);
- if (result != GLOBUS_SUCCESS)
- return result;
-
- db_retn = glite_jp_db_FetchRow(state->jp_ctx, db_res, 1, NULL, db_row);
- if (db_retn != 1) {
- result = GLOBUS_FAILURE;
- glite_jp_db_FreeStmt(&db_res);
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ("Internal error: backend DB access failed"));
- goto out;
- }
- glite_jp_db_FreeStmt(&db_res);
-
- if (!strcmp(db_row[0], client)) {
- result = GLOBUS_SUCCESS;
- } else {
- result = GLOBUS_FAILURE;
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ("Permission denied"));
- }
-
-out:
- free(db_row[0]);
- return result;
-}
-
-static globus_result_t
-authz_write(authz_jp_system_state_struct *state, char *object, char *client)
-{
- globus_result_t result = GLOBUS_FAILURE;
- int db_retn;
- glite_lbu_Statement db_res;
- char *db_row[1] = { NULL };
- char *p;
-
- /* skip the gsiftp:// or ftp:// prefix */
- p = strstr(object, "ftp://");
- if (p == NULL) {
- result = GLOBUS_FAILURE;
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ("Unsupported file type, access denied"));
- goto out;
- }
- p += 6;
-
- /* find where the filename starts in the URL */
- p = strchr(p, '/');
-
- result = query_db(state->jp_ctx, &db_res,
- "select f.state from files f, users u "
- "where f.int_path='%|Ss' and f.ul_userid=u.userid "
- "and u.cert_subj='%|Ss'",
- p, client);
- if (result != GLOBUS_SUCCESS)
- return result;
-
- db_retn = glite_jp_db_FetchRow(state->jp_ctx, db_res, 1, NULL, db_row);
- if (db_retn != 1) {
- glite_jp_db_FreeStmt(&db_res);
- result = GLOBUS_FAILURE;
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ("Internal error: backend DB access failed"));
- goto out;
- }
- glite_jp_db_FreeStmt(&db_res);
-
- if (!strcmp(db_row[0], "uploading")) {
- result = GLOBUS_SUCCESS;
- } else {
- result = GLOBUS_FAILURE;
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ("Upload not in progress"));
- }
-
-out:
- free(db_row[0]);
- return result;
-}
-
-static globus_result_t
-authz_del(authz_jp_system_state_struct *state, char *object, char *client)
-{
- globus_result_t result = GLOBUS_FAILURE;
-
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_AUTHZ_DENIED_BY_CALLOUT,
- ("Deleting files not supported"));
- return result;
-}
-
-static int
-get_client(gss_ctx_id_t ctx, char **name)
-{
- gss_buffer_desc token = GSS_C_EMPTY_BUFFER;
- OM_uint32 maj_stat, min_stat;
- gss_name_t client_name = GSS_C_NO_NAME;
- int ret;
-
- maj_stat = gss_inquire_context(&min_stat, ctx, &client_name, NULL, NULL,
- NULL, NULL, NULL, NULL);
- if (GSS_ERROR(maj_stat)) {
- ret = -1;
- goto end;
- }
-
- maj_stat = gss_display_name(&min_stat, client_name, &token, NULL);
- if (GSS_ERROR(maj_stat)) {
- ret = -1;
- goto end;
- }
-
- *name = strdup(token.value);
- ret = 0;
-
-end:
- if (token.length)
- gss_release_buffer(&min_stat, &token);
- if (client_name != GSS_C_NO_NAME)
- gss_release_name(&min_stat, &client_name);
-
- return ret;
-}
-
-globus_result_t
-authz_jp_system_init_callout(va_list ap)
-{
- void * authz_system_state;
- authz_jp_system_state_struct *state = NULL;
- char *db_cs = NULL;
- globus_result_t result = GLOBUS_FAILURE;
- glite_jp_context_t jp_ctx;
-
- authz_system_state = va_arg(ap, void *);
-
- db_cs = getenv("FTPBE_DB_CS");
- if (!db_cs) db_cs = FTPBE_DEFAULT_DB_CS;
-
- /* XXX the error messages aren't displayed by ftpd on errors */
-
- glite_jp_init_context(&jp_ctx);
-
- if (glite_lbu_InitDBContext(((glite_lbu_DBContext *)&jp_ctx->dbhandle)) != 0) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_SYSTEM_ERROR,
- ("Internal error: backend DB initialization failed"));
- return GLOBUS_FAILURE;
- }
-
- if (glite_lbu_DBConnect(jp_ctx->dbhandle, db_cs) != 0) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_SYSTEM_ERROR,
- ("Internal error: backend DB access failed"));
- return GLOBUS_FAILURE;
- }
-
- state = globus_libc_calloc(1, sizeof(*state));
- if (state == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERRNO_ERROR(result, errno);
- return GLOBUS_FAILURE;
- }
-
- state->jp_ctx = jp_ctx;
-
- *(authz_jp_system_state_struct **)authz_system_state = state;
- return GLOBUS_SUCCESS;
-}
-
-globus_result_t
-authz_jp_system_destroy_callout(va_list ap)
-{
- void * authz_system_state;
- globus_result_t result = GLOBUS_SUCCESS;
-
- authz_system_state = va_arg(ap, void *);
-
- /* XXX close the DB here, however this call seems not be called by gridftpd */
- return result;
-}
-
-globus_result_t
-authz_jp_handle_init_callout(va_list ap)
-{
- globus_gsi_authz_handle_t *handle;
- char * service_name;
- gss_ctx_id_t context;
- globus_gsi_authz_cb_t callback;
- void * callback_arg;
- void * authz_system_state;
- globus_result_t result = GLOBUS_FAILURE;
-
- handle = va_arg(ap, globus_gsi_authz_handle_t *);
- service_name = va_arg(ap, char *);
- context = va_arg(ap, gss_ctx_id_t);
- callback = va_arg(ap, globus_gsi_authz_cb_t);
- callback_arg = va_arg(ap, void *);
- authz_system_state = va_arg(ap, void *);
-
- if (handle == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("null handle"));
- goto end;
- }
-
- *handle = globus_libc_calloc(1, sizeof(**handle));
- if (*handle == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERRNO_ERROR(result, errno);
- goto end;
- }
-
- (*handle)->gss_ctx = context;
- result = GLOBUS_SUCCESS;
-
-end:
- if (callback)
- callback(callback_arg, callback_arg, result);
-
- return result;
-}
-
-globus_result_t
-authz_jp_authorize_async_callout(va_list ap)
-{
- globus_gsi_authz_handle_t handle;
- char * action;
- char * object;
- globus_gsi_authz_cb_t callback;
- void * callback_arg;
- void * authz_system_state;
- globus_result_t result = GLOBUS_FAILURE;
- char *client = NULL;
-
- handle = va_arg(ap, globus_gsi_authz_handle_t);
- action = va_arg(ap, char *);
- object = va_arg(ap, char *);
- callback = va_arg(ap, globus_gsi_authz_cb_t);
- callback_arg = va_arg(ap, void *);
- authz_system_state = va_arg(ap, void *);
-
- if (action == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("null action"));
- goto end;
- }
-
- if (object == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("null object"));
- goto end;
- }
-
- if (handle == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("null handle"));
- goto end;
- }
-
- if (handle->gss_ctx == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("bad handle"));
- goto end;
- }
-
- if (authz_system_state == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("system state not initialized, probably the GLOBUS_GSI_AUTHZ_SYSTEM_INIT callout isn't handled"));
- goto end;
- }
-
- get_client(handle->gss_ctx, &client);
- if (client == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("cannot identify client"));
- goto end;
- }
-
-// fprintf(stdout, " client \"%s\" asking to \"%s\" on \"%s\"\n", client, action, object);
-
- if (strcmp(action, "create") == 0) {
- result = authz_write(authz_system_state, object, client);
- } else if (strcmp(action, "write") == 0) {
- result = authz_write(authz_system_state, object, client);
- } else if (strcmp(action, "read") == 0) {
- result = authz_read(authz_system_state, object, client);
- } else if (strcmp(action, "delete") == 0) {
- result = authz_del(authz_system_state, object, client);
- } else {
- result = GLOBUS_FAILURE;
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_BAD_ARGUMENT_ERROR,
- ("unsupported operation"));
- }
-
-end:
- if (callback && result == GLOBUS_SUCCESS)
- callback(callback_arg, handle, result);
-
- if (client)
- free(client);
-
- return result;
-}
-
-int
-authz_jp_handle_destroy_callout(va_list ap)
-{
- globus_gsi_authz_handle_t handle;
- void * authz_system_state;
- int result = (int) GLOBUS_SUCCESS;
- globus_gsi_authz_cb_t callback;
- void * callback_arg;
-
- handle = va_arg(ap, globus_gsi_authz_handle_t);
- callback = va_arg(ap, globus_gsi_authz_cb_t);
- callback_arg = va_arg(ap, void *);
- authz_system_state = va_arg(ap, void *);
-
- if (handle != NULL) {
- globus_libc_free(handle);
- }
-
- /* XXX
- glite_jp_db_close((authz_jp_system_state_struct*)authz_system_state->jp_ctx);
- */
-
-#if 0
- if (callback)
- callback(callback_arg, handle, result);
-#endif
- return result;
-}
-
-globus_result_t
-authz_jp_globus_mapping(va_list ap)
-{
- gss_ctx_id_t context;
- char * service;
- char * desired_identity;
- char * identity_buffer;
- unsigned int buffer_length;
- char *logname;
- char *client = NULL;
- int ret;
- globus_result_t result = GLOBUS_FAILURE;
-
- context = va_arg(ap, gss_ctx_id_t);
- service = va_arg(ap, char *);
- desired_identity = va_arg(ap, char *);
- identity_buffer = va_arg(ap, char *);
- buffer_length = va_arg(ap, unsigned int);
-
- logname = getenv("GLITE_USER");
- if (logname == NULL) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_CONFIGURATION_ERROR,
- ("the GLITE_USER variable isn't set, can't map user"));
- return GLOBUS_FAILURE;
- }
-
- if (desired_identity) {
- result = (strcmp(logname, desired_identity) == 0) ?
- GLOBUS_SUCCESS : GLOBUS_FAILURE;
- goto end;
- }
-
- ret = get_client(context, &client);
- if (ret) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_SYSTEM_ERROR,
- ("can't get client's name"));
- goto end;
- }
-
- if (strlen(logname) + 1 > buffer_length) {
- GLOBUS_GSI_AUTHZ_CALLOUT_ERROR(
- result,
- GLOBUS_GSI_AUTHZ_CALLOUT_SYSTEM_ERROR,
- ("Not enough space to store mapped identity"));
- goto end;
- }
-
- strcpy(identity_buffer, logname);
- result = GLOBUS_SUCCESS;
-
-end:
- if (client)
- free(client);
-
- return result;
-}
+++ /dev/null
-#include <gssapi.h>
-#include "glite/jp/context.h"
-
-/* must be named this way to provide the name expected by the globus_gsi_authz
- * header and its typedef of globus_gsi_authz_handle_t */
-typedef struct globus_i_gsi_authz_handle_s {
- gss_ctx_id_t gss_ctx;
-} globus_i_gsi_authz_handle_s;
-
-typedef struct authz_jp_system_state_struct {
- glite_jp_context_t jp_ctx;
-} authz_jp_system_state_struct;
+++ /dev/null
-#include "soap_version.h"
-
-#if GSOAP_VERSION >= 20700
-#define INPUT_SANDBOX jptype__UploadClass__INPUT_SANDBOX
-#define OUTPUT_SANDBOX jptype__UploadClass__OUTPUT_SANDBOX
-#define JOB_LOG jptype__UploadClass__JOB_LOG
-
-#define OWNER jptype__AttributeType__OWNER
-#define TIME jptype__AttributeType__TIME
-#define TAG jptype__AttributeType__TAG
-
-#define EQUAL jptype__queryOp__EQUAL
-#define UNEQUAL jptype__queryOp__UNEQUAL
-#define LESS jptype__queryOp__LESS
-#define GREATER jptype__queryOp__GREATER
-#define WITHIN jptype__queryOp__WITHIN
-
-#else
-
-#define __jpsrv__RegisterJob __ns1__RegisterJob
-#define __jpsrv__StartUpload __ns1__StartUpload
-#define __jpsrv__CommitUpload __ns1__CommitUpload
-#define __jpsrv__RecordTag __ns1__RecordTag
-#define __jpsrv__FeedIndex __ns1__FeedIndex
-#define __jpsrv__FeedIndexRefresh __ns1__FeedIndexRefresh
-#define __jpsrv__GetJob __ns1__GetJob
-
-#define SOAP_TYPE___jpsrv__RegisterJob SOAP_TYPE___ns1__RegisterJob
-#define SOAP_TYPE___jpsrv__StartUpload SOAP_TYPE___ns1__StartUpload
-#define SOAP_TYPE___jpsrv__CommitUpload SOAP_TYPE___ns1__CommitUpload
-#define SOAP_TYPE___jpsrv__GetJob SOAP_TYPE___ns1__GetJob
-
-#endif
-
+++ /dev/null
-#!/usr/bin/perl
-
-$formula = "/* Generated from @ARGV with the help of black magic.\n Do not edit.\n*/\n\n";
-print "${formula}#include \"soap_env_ctx.h\"\n\n";
-
-# XXX: hardcoded
-$prefix = 'ENV';
-
-open EH,">soap_env_ctx.h" or die "soap_env_ctx.h: $!\n";
-open EC,">soap_env_ctx.c" or die "soap_env_ctx.c: $!\n";
-
-print EH "${formula}struct _glite_jp_soap_env_ctx_t {\n";
-
-print EC "${formula}static struct _glite_jp_soap_env_ctx_t my_soap_env_ctx = {\n";
-
-
-while ($_ = <>) {
- if (/^}$/) {
- print;
- $infunc = 0;
- undef @args;
- next;
- }
-
- next if $infunc;
-
- if (/^SOAP_FMAC3\s+(.+)\s+SOAP_FMAC4\s+([^(]+)\(([^)]*)\)/) {
- $type = $1;
- $func = $2;
- @a = split /,/,$3;
- for $a (@a) {
- $a =~ /.*\W(\w+)/;
- push @args,$1;
- }
- print;
-
- next if $func =~ "SOAP_$prefix";
-
- print EH "\t$type (*$func)();\n";
- print EC "\t$func,\n";
- next;
- }
-
- if (/^{/) {
- print;
- next if $func =~ "SOAP_$prefix";
- local $"=',';
- $infunc = 1;
- print "\t";
- print 'return ' unless $type eq 'void';
- print "glite_jp_soap_env_ctx->$func(@args);\n";
-
- next;
- }
-
- print;
-}
-
-print EH "};\n\n";
-print EH "extern struct _glite_jp_soap_env_ctx_t *glite_jp_soap_env_ctx;\n";
-print EC "};\n";
-
-print "struct _glite_jp_soap_env_ctx_t *glite_jp_soap_env_ctx;\n";
+++ /dev/null
-#ident "$Header$"
-
-#include <getopt.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <limits.h>
-#include <dirent.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <zlib.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/lbu/escape.h"
-#include "glite/jobid/strmd5.h"
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/known_attr.h"
-#include "glite/jp/attr.h"
-#include "glite/jp/db.h"
-
-#include "feed.h"
-#include "tags.h"
-#include "backend_private.h"
-
-#include "jpps_H.h" /* XXX: SOAP_TYPE___jpsrv__GetJob */
-
-#include "jptype_map.h"
-
-#define FTPBE_DEFAULT_DB_CS "jpps/@localhost:jpps"
-
-struct ftpbe_config {
- char *internal_path;
- char *external_path;
- char *db_cs;
-// char *gridmap;
- char *logname;
-};
-
-static struct ftpbe_config *config = NULL;
-
-struct fhandle_rec {
- gzFile fd_gz;
- char* filename;
- int filemode;
- char* filedata;
- int offset;
- int eof;
- int modified;
-};
-typedef struct fhandle_rec *fhandle;
-
-static struct option ftpbe_opts[] = {
- { "ftp-internal-path", 1, NULL, 'I' },
- { "ftp-external-path", 1, NULL, 'E' },
- { "ftp-db-cs", 1, NULL, 'D' },
-// { "ftp-gridmap", 1, NULL, 'G' },
- { NULL, 0, NULL, 0 }
-};
-
-/*******************************************************************************
- Internal helpers
-*******************************************************************************/
-
-
-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->db_cs == 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 int store_user(glite_jp_context_t ctx, const char *userid, const char *subj)
-{
- glite_jp_error_t err;
- char *stmt;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- assert(userid != NULL);
- assert(subj != NULL);
-
- trio_asprintf(&stmt,"insert into users(userid,cert_subj) "
- "values ('%|Ss','%|Ss')",userid,subj);
- if (!stmt) {
- err.code = ENOMEM;
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (glite_jp_db_ExecSQL(ctx, stmt, NULL) < 0) {
- if (ctx->error->code == EEXIST)
- glite_jp_clear_error(ctx);
- else {
- free(stmt);
- err.code = EIO;
- err.desc = "DB access failed";
- return glite_jp_stack_error(ctx,&err);
- }
- }
- free(stmt);
-
- return 0;
-}
-
-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) ;
-}
-
-/********************************************************************************
- Backend calls
-********************************************************************************/
-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:D:" /* G: */, ftpbe_opts, NULL)) != EOF) {
- switch (opt) {
- case 'I':
- config->internal_path = optarg;
- int i = strlen(optarg) - 1;
- while (optarg[i] == '/'){
- optarg[i] = 0;
- i--;
- }
- break;
- case 'E': config->external_path = optarg; break;
- case 'D': config->db_cs = optarg; break;
-// case 'G': config->gridmap = optarg; break;
- default: break;
- }
- }
-
- /* Defaults */
- if (!config->db_cs) config->db_cs = strdup(FTPBE_DEFAULT_DB_CS);
-
- if (config_check(ctx, config)) {
- err.code = EINVAL;
- err.desc = "Invalid FTP backend configuration";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (glite_lbu_InitDBContext(((glite_lbu_DBContext *)&ctx->dbhandle)) != 0) {
- err.code = EINVAL;
- err.desc = "Cannot init backend's database";
- return glite_jp_stack_error(ctx,&err);
- }
- if (glite_lbu_DBConnect(ctx->dbhandle, config->db_cs)) {
- err.code = EIO;
- err.desc = "Cannot access backend's database (during init)";
- return glite_jp_stack_error(ctx,&err);
- } else {
- /* slaves open their own connections */
- glite_lbu_DBClose(ctx->dbhandle);
- glite_lbu_FreeDBContext(ctx->dbhandle);
- }
-
- return 0;
-}
-
-int glite_jppsbe_init_slave(
- glite_jp_context_t ctx
-)
-{
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- if (glite_lbu_InitDBContext(((glite_lbu_DBContext *)&ctx->dbhandle)) != 0) {
- err.code = EINVAL;
- err.desc = "Cannot init backend's database";
- return glite_jp_stack_error(ctx,&err);
- }
- if (glite_lbu_DBConnect(ctx->dbhandle, config->db_cs)) {
- err.code = EIO;
- err.desc = "Cannot access backend's database";
- return glite_jp_stack_error(ctx,&err);
- }
-
- return 0;
-}
-
-int glite_jppsbe_register_job(
- glite_jp_context_t ctx,
- const char *job,
- const char *owner
-)
-{
- glite_jp_error_t err;
- char *data_dir = NULL;
- char *ju = NULL;
- char *ju_path = NULL;
- char *ownerhash = NULL;
- struct timeval reg_tv;
- char *stmt = NULL;
- char *dbtime = NULL;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- assert(job != NULL);
- assert(owner != NULL);
-
- gettimeofday(®_tv, 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);
- }
-
- ownerhash = str2md5(owner); /* static buffer */
- if (store_user(ctx, ownerhash, owner)) {
- err.code = EIO;
- err.desc = "Cannot store user entry";
- goto error_out;
- }
-
- glite_lbu_TimeToDB(reg_tv.tv_sec, &dbtime);
- if (!dbtime) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- trio_asprintf(&stmt,"insert into jobs(jobid,dg_jobid,owner,reg_time) "
- "values ('%|Ss','%|Ss','%|Ss', %s)",
- ju, job, ownerhash, dbtime);
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (glite_jp_db_ExecSQL(ctx, stmt, NULL) < 0) {
- if (ctx->error->code == EEXIST) {
- err.code = EEXIST;
- err.desc = "Job already registered";
- }
- else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- 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 (mkdirpath(data_dir, strlen(config->internal_path)) < 0 &&
- errno != EEXIST) {
- err.code = errno;
- err.desc = "Cannot mkdir jobs's data directory";
- goto error_out;
- }
-
-error_out:
- free(data_dir);
- free(stmt); free(dbtime);
- free(ju); free(ju_path);
-
- if (err.code) {
- return glite_jp_stack_error(ctx,&err);
- } else {
- return 0;
- }
-}
-
-#if 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;
-}
-#endif
-
-int glite_jppsbe_start_upload(
- glite_jp_context_t ctx,
- const char *job,
- const char *class,
- const char *name,
- const char *content_type,
- char **destination_out,
- time_t *commit_before_inout
-)
-{
- char *data_basename = NULL;
- char *data_fname = NULL;
- char *ju = NULL;
- char *ju_path = NULL;
- char *peername = NULL;
- char *peerhash = NULL;
- char *commit_before_inout_str;
- time_t now;
- char *now_str = NULL;
-
- char *stmt = NULL;
- glite_lbu_Statement db_res;
- int db_retn;
- char *db_row[2] = { NULL, NULL };
-
- 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 (peername == NULL) {
- err.code = EINVAL;
- err.desc = "Cannot obtain client certificate info";
- goto error_out;
- }
-
- trio_asprintf(&stmt, "select owner, reg_time from jobs"
- " where jobid='%|Ss'", ju);
-
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx, stmt, &db_res)) <= 0) {
- if (db_retn == 0) {
- err.code = ENOENT;
- err.desc = "No such job registered";
- } else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- goto error_out;
- }
-
- db_retn = glite_jp_db_FetchRow(ctx, db_res, sizeof(db_row)/sizeof(db_row[0]), NULL, db_row);
- if (db_retn != 2) {
- glite_jp_db_FreeStmt(&db_res);
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
-
- glite_jp_db_FreeStmt(&db_res);
-
- /* XXX authorization done in soap_ops.c */
-
- /* XXX name length */
- if (asprintf(&data_basename, "%s%s%s", class,
- (name != NULL) ? "." : "",
- (name != NULL) ? name : "") == -1) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (asprintf(&data_fname, "%s/data/%s/%d/%s/%s",
- config->internal_path, db_row[0],
- regtime_trunc(glite_lbu_DBToTime(db_row[1])),
- ju, data_basename) == -1) {
- err.code = ENOMEM;
- goto error_out;
- }
- if (asprintf(destination_out, "%s/data/%s/%d/%s/%s",
- config->external_path, db_row[0],
- regtime_trunc(glite_lbu_DBToTime(db_row[1])),
- ju, data_basename) == -1) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (commit_before_inout != NULL)
- /* XXX no timeout enforced */
- /* XXX: gsoap does not like so much, one year should be enough
- *commit_before_inout = (time_t) LONG_MAX;
- */
- *commit_before_inout = time(NULL) + 5*60;//365*24*60*60;
-
- /*
- if (add_to_gridmap(ctx, peername)) {
- err.code = EIO;
- err.desc = "Cannot add peer DN to ftp server authorization file";
- goto error_out;
- }
- */
- else if (*commit_before_inout > time(NULL) + 5*60)
- *commit_before_inout = time(NULL) + 5*60;
-
- peerhash = str2md5(peername); /* static buffer */
- if (store_user(ctx, peerhash, peername)) {
- err.code = EIO;
- err.desc = "Cannot store upload user entry";
- goto error_out;
- }
-
- free(stmt); stmt = NULL;
-
- time(&now);
- glite_lbu_TimeToDB(now,&now_str);
-
- trio_asprintf(&stmt,"delete from files where jobid = '%|Ss' and state = 'uploading' and deadline < %s", ju, now_str);
- free(now_str);
-
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
- if (glite_jp_db_ExecSQL(ctx, stmt, NULL) < 0) {
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
-
- free(stmt); stmt = NULL;
-
- glite_lbu_TimeToDB(*commit_before_inout, &commit_before_inout_str);
- trio_asprintf(&stmt,"insert into files"
- "(jobid,filename,int_path,ext_url,state,deadline,ul_userid) "
- "values ('%|Ss','%|Ss','%|Ss','%|Ss','%|Ss', %s, '%|Ss')",
- ju, data_basename, data_fname, *destination_out, "uploading",
- commit_before_inout_str, peerhash);
- free(commit_before_inout_str);
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (glite_jp_db_ExecSQL(ctx, stmt, NULL) < 0) {
- if (ctx->error->code == EEXIST) {
- err.code = EEXIST;
- err.desc = "File already stored or upload in progress";
- } else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- goto error_out;
- }
-
-error_out:
- free(db_row[0]); free(db_row[1]);
- free(stmt);
- free(data_basename);
- free(data_fname);
- 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
-)
-{
- char *peername = NULL;
- char *peerhash = NULL;
-
- char *stmt = NULL;
- glite_lbu_Statement db_res;
- int db_retn;
- char *db_row[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL };
- int i;
-
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- assert(destination != NULL);
-
- trio_asprintf(&stmt, "select * from files where "
- "ext_url='%|Ss' and state='uploading'", destination);
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx, stmt, &db_res)) <= 0) {
- if (db_retn == 0) {
- err.code = ENOENT;
- err.desc = "No such upload in progress";
- } else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- goto error_out;
- }
-
- db_retn = glite_jp_db_FetchRow(ctx, db_res, sizeof(db_row)/sizeof(db_row[0]), NULL, db_row);
- if (db_retn != 7) {
- glite_jp_db_FreeStmt(&db_res);
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
- glite_jp_db_FreeStmt(&db_res);
-
- peername = glite_jp_peer_name(ctx);
- if (peername == NULL) {
- err.code = EINVAL;
- err.desc = "Cannot obtain client certificate info";
- goto error_out;
- }
-
- peerhash = str2md5(peername); /* static buffer */
- if (strcmp(peerhash, db_row[6])) {
- err.code = EPERM;
- err.desc = "Upload started by client with different identity";
- goto error_out;
- }
-
- free(stmt);
- trio_asprintf(&stmt,"update files set state='committed', deadline=NULL "
- "where jobid='%|Ss' and filename='%|Ss'", db_row[0], db_row[1]);
-
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (glite_jp_db_ExecSQL(ctx, stmt, NULL) < 0) {
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
-error_out:
- for (i=0; i<7; i++) free(db_row[i]);
- free(peername);
- free(stmt);
- 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
-)
-{
- char *stmt = NULL;
- glite_lbu_Statement db_res;
- int db_retn;
- char *db_row[2] = { NULL, NULL};
- int i;
- char *cp = NULL;
-
- 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__;
-
-
- trio_asprintf(&stmt, "select j.dg_jobid,f.filename from jobs j,files f where "
- "f.ext_url='%|Ss' and j.jobid=f.jobid", destination);
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx, stmt, &db_res)) <= 0) {
- if (db_retn == 0) {
- err.code = ENOENT;
- err.desc = "Invalid destination string";
- } else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- goto error_out;
- }
-
- db_retn = glite_jp_db_FetchRow(ctx, db_res, sizeof(db_row)/sizeof(db_row[0]), NULL, db_row);
- if (db_retn != 2) {
- glite_jp_db_FreeStmt(&db_res);
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
- glite_jp_db_FreeStmt(&db_res);
-
- *job = strdup(db_row[0]);
-
- cp = strchr(db_row[1],'.');
- if (!cp) {
- *name = NULL;
- } else {
- *cp++ = '\0';
- *name = strdup(cp);
- }
- *class = strdup(db_row[1]);
-
- if (!*job || !*class) {
- err.code = ENOMEM;
- goto error_out;
- }
-
-error_out:
- for (i=0; i<2; i++) free(db_row[i]);
- free(stmt);
- 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,
- char **url_out
-)
-{
- char *data_basename = NULL;
- char *ju = NULL;
- char *ju_path = NULL;
-
- char *stmt = NULL;
- glite_lbu_Statement db_res;
- int db_retn;
- char *db_row[3] = { NULL, NULL, NULL };
-
- 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);
- }
-
- trio_asprintf(&stmt, "select j.owner,reg_time,u.cert_subj from jobs j, users u "
- "where j.jobid='%|Ss' and j.owner = u.userid", ju);
-
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx, stmt, &db_res)) <= 0) {
- if (db_retn == 0) {
- err.code = ENOENT;
- err.desc = "No such job registered";
- } else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- goto error_out;
- }
-
- free(stmt); stmt = NULL;
-
- db_retn = glite_jp_db_FetchRow(ctx, db_res, sizeof(db_row)/sizeof(db_row[0]), NULL, db_row);
- if (db_retn != 3) {
- glite_jp_db_FreeStmt(&db_res);
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
-
- glite_jp_db_FreeStmt(&db_res);
-
- if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__GetJobFiles,job,db_row[2])) {
- err.code = EPERM;
- goto error_out;
- }
-
- /* XXX name length */
- if (asprintf(&data_basename, "%s%s%s", class,
- (name != NULL) ? "." : "",
- (name != NULL) ? name : "") == -1) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (asprintf(url_out, "%s/data/%s/%d/%s/%s",
- config->external_path, db_row[0],
- regtime_trunc(glite_lbu_DBToTime(db_row[1])),
- ju, data_basename) == -1) {
- err.code = ENOMEM;
- goto error_out;
- }
-
-// FIXME: relict?
-#if 0
- trio_asprintf(&stmt,"select 'x' from files where jobid='%|Ss' "
- "and ext_url = '%|Ss' "
- "and state='committed' ",ju,*url_out);
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx,stmt,&db_res)) <= 0) {
- if (db_retn == 0) {
- err.code = ENOENT;
- err.desc = "not uploaded yet";
- }
- else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- /* goto error_out; */
- }
-#endif
-
-error_out:
- free(db_row[0]); free(db_row[1]);
- free(stmt);
- free(data_basename);
- 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,
- char **fname_out
-)
-{
- char *data_basename = NULL;
- char *ju = NULL;
- char *ju_path = NULL;
-
- char *stmt = NULL;
- glite_lbu_Statement db_res;
- int db_retn;
- char *db_row[2] = { NULL, NULL };
-
- 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);
- }
-
- trio_asprintf(&stmt, "select owner, reg_time from jobs "
- "where jobid='%|Ss'", ju);
-
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if ((db_retn = glite_jp_db_ExecSQL(ctx, stmt, &db_res)) <= 0) {
- if (db_retn == 0) {
- err.code = ENOENT;
- err.desc = "No such job registered";
- } else {
- err.code = EIO;
- err.desc = "DB access failed";
- }
- goto error_out;
- }
-
- db_retn = glite_jp_db_FetchRow(ctx, db_res, sizeof(db_row)/sizeof(db_row[0]), NULL, db_row);
- if (db_retn != 2) {
- glite_jp_db_FreeStmt(&db_res);
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
-
- glite_jp_db_FreeStmt(&db_res);
-
- /* XXX name length */
- if (asprintf(&data_basename, "%s%s%s", class,
- (name != NULL) ? "." : "", (name != NULL) ? name : "") == -1) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (asprintf(fname_out, "%s/data/%s/%d/%s/%s",
- config->internal_path, db_row[0],
- regtime_trunc(glite_lbu_DBToTime(db_row[1])),
- ju, data_basename) == -1) {
- err.code = ENOMEM;
- goto error_out;
- }
-
-error_out:
- free(db_row[0]); free(db_row[1]);
- free(stmt);
- free(data_basename);
- 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,
- 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;
- }
-
- int error = 0;
- int created = 0;
- if (mode % 4 == O_RDONLY)
- handle->fd_gz = gzopen(fname, "r");
- else if (mode % 4 == O_WRONLY)
- handle->fd_gz = gzopen(fname, "r+");
- else if (mode % 4 == O_RDWR){
- handle->fd_gz = gzopen(fname, "r+");
- if ((handle->fd_gz == NULL) && (mode & O_CREAT)){
- handle->fd_gz = gzopen(fname, "w+");
- created = 1; // when the file is created, gzread returns -2
- }
- }
- if (handle->fd_gz == NULL){
- gzerror(((fhandle)handle)->fd_gz, &(err.code));
- err.desc = "Cannot open requested file";
- free(handle); handle = NULL;
- error = 1;
- goto error_out;
- }
-
- handle->offset = 0;
- handle->eof = 0;
-
- if (! created){
- const int READ_STEP = 8192;
- //handle->filedata = malloc(sizeof(*handle->filedata)*READ_STEP);
- int diff = 0;
- char buf[READ_STEP];
- do{
- diff = gzread(handle->fd_gz, buf/*handle->filedata + handle->eof*/, READ_STEP);
- if (diff < 0){
- gzerror(((fhandle)handle)->fd_gz, &(err.code));
- err.desc = "Error reading file";
- free(handle->filedata);
- error = 1;
- goto error_out;
- }
- handle->eof += diff;
- handle->filedata = realloc(handle->filedata, sizeof(*handle->filedata)*handle->eof);
- memcpy(handle->filedata + handle->eof - diff, buf, sizeof(*buf)*diff);
- } while(diff == READ_STEP);
- }
-
- /*if (gzclose(fd_gz)){
- gzerror(((fhandle)handle)->fd_gz, &(err.code));
- err.desc = "Error closing file descriptor";
- free(handle->filedata);
- goto error_out;
- }*/
-
- handle->filename = strdup(fname);
- handle->filemode = mode;
- handle->modified = 0;
-
- *handle_out = (void*) handle;
-
-error_out:
- free(fname);
- if (error) {
- 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 (gzclose(((fhandle)handle)->fd_gz)){
- gzerror(((fhandle)handle)->fd_gz, &(err.code));
- err.desc = "Error closing file descriptor";
- goto error_out;
- }
-
- if (((fhandle)handle)->modified){
- if ((((fhandle)handle)->fd_gz = gzopen(((fhandle)handle)->filename, "w")) == NULL){
- gzerror(((fhandle)handle)->fd_gz, &(err.code));
- err.desc = "Error opening file for write changes";
- goto error_out;
- }
- if (gzwrite(((fhandle)handle)->fd_gz, ((fhandle)handle)->filedata, ((fhandle)handle)->eof) < 0){
- gzerror(((fhandle)handle)->fd_gz, &(err.code));
- err.desc = "Error writing changes";
- goto error_out;
- }
- if (gzclose(((fhandle)handle)->fd_gz)){
- gzerror(((fhandle)handle)->fd_gz, &(err.code));
- err.desc = "Error closing file descriptor";
- goto error_out;
- }
- }
-
-error_out:
- free(((fhandle)handle)->filedata);
- free(((fhandle)handle)->filename);
- free(handle); handle=NULL;
- if (err.code) {
- return glite_jp_stack_error(ctx,&err);
- } else {
- return 0;
- }
-}
-
-
-int glite_jppsbe_file_attrs(glite_jp_context_t ctx, void *handle, struct stat *buf){
- glite_jp_error_t err;
-
- assert(handle != NULL);
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- if (! stat(((fhandle)handle)->filename, buf)) {
- err.code = errno;
- err.desc = "Error calling fstat";
- return glite_jp_stack_error(ctx,&err);
- }
-
- 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
-)
-{
- 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 (((fhandle)handle)->filename == NULL){
- err.code = 0;
- err.desc = "Cannot read, file not open";
- return glite_jp_stack_error(ctx,&err);
- }
-
- int to_read;
- if (offset + nbytes > ((fhandle)handle)->eof)
- to_read = ((fhandle)handle)->eof - offset;
- else
- to_read = nbytes;
- memcpy(buf, ((fhandle)handle)->filedata + offset, to_read);
- ((fhandle)handle)->offset = offset + to_read;
-
- *nbytes_ret = to_read;
-
- 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 (((fhandle)handle)->filename == NULL){
- err.code = 0;
- err.desc = "Cannot write, file not open";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (((fhandle)handle)->filemode % 4 == 0){
- err.desc = "Cannot write to readonly file";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (offset + nbytes > ((fhandle)handle)->eof){
- ((fhandle)handle)->filedata = realloc(((fhandle)handle)->filedata, offset + nbytes);
- ((fhandle)handle)->eof = offset + nbytes;
- }
-
- memcpy(((fhandle)handle)->filedata + offset, buf, nbytes);
-
- ((fhandle)handle)->modified = 1;
-
- return 0;
-}
-
-int glite_jppsbe_compress_and_remove_file(
- glite_jp_context_t ctx,
- const char *job,
- const char *class,
- const char *name
-){
- glite_jp_error_t err;
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- char *src, *dest;
- get_job_fname(ctx, job, class, name, &src);
-
- dest = malloc(sizeof(*dest)*(strlen(src)+strlen(".gz")+1));
- sprintf(dest, "%s.gz", src);
-
- char buf[8192];
- FILE* s = fopen(src, "r");
- gzFile d = gzopen(dest, "w");
- size_t l;
- while ((l = fread(buf, sizeof(*buf), 8192, s)) > 0)
- gzwrite(d, buf, sizeof(*buf)*l);
- gzclose(d);
- fclose(s);
-
- char *ju, *ju_path;
- if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) {
- err.code = ctx->error->code;
- err.desc = "Cannot obtain jobid unique path/name";
- goto error_out;
- }
-
- rename(dest, src);
-
-error_out:
- if (err.code) {
- return glite_jp_stack_error(ctx,&err);
- } else {
- 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__;
-
- ((fhandle)handle)->filedata = realloc(((fhandle)handle)->filedata, ((fhandle)handle)->eof + nbytes);
- memcpy(((fhandle)handle)->filedata + ((fhandle)handle)->eof, buf, nbytes);
-
- ((fhandle)handle)->eof += nbytes;
- ((fhandle)handle)->modified = 1;
-
- return 0;
-}
-
-static int get_job_info(
- glite_jp_context_t ctx,
- const char *job,
- char **owner,
- struct timeval *tv_reg
-)
-{
- char *qry,*col[2];
- int rows;
- glite_jp_error_t err;
- glite_lbu_Statement s = NULL;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- glite_jp_clear_error(ctx);
-
- trio_asprintf(&qry,"select u.cert_subj,j.reg_time "
- "from jobs j, users u "
- "where j.owner = u.userid "
- "and j.dg_jobid = '%|Ss'",job);
-
- if ((rows = glite_jp_db_ExecSQL(ctx,qry,&s)) <= 0) {
- if (rows == 0) {
- err.code = ENOENT;
- err.desc = "No records for this job";
- }
- else {
- err.code = EIO;
- err.desc = "DB call fail retrieving job files";
- }
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- if (glite_jp_db_FetchRow(ctx,s,sizeof(col)/sizeof(col[0]), NULL, col) < 0) {
- err.code = EIO;
- err.desc = "DB call fail retrieving job files";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- *owner = col[0];
- tv_reg->tv_sec = glite_lbu_DBToTime(col[1]);
- tv_reg->tv_usec = 0;
- free(col[1]);
-
-cleanup:
- free(qry);
- if (s) glite_jp_db_FreeStmt(&s);
- return err.code;
-}
-
-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 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].name; i++) {
-/* must be implemented via filetype plugin
- case GLITE_JP_ATTR_TIME:
- case GLITE_JP_ATTR_TAG:
-*/
- if (!strcmp(attrs_inout[i].name,GLITE_JP_ATTR_OWNER)
- || !strcmp(attrs_inout[i].name,GLITE_JP_ATTR_REGTIME)) {
- 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;
- }
- }
- else {
- err.code = EINVAL;
- err.desc = "Invalid attribute type";
- goto error_out;
- break;
- }
-
- if (!strcmp(attrs_inout[i].name,GLITE_JP_ATTR_OWNER)) {
- attrs_inout[i].value = strdup(owner);
- if (!attrs_inout[i].value) {
- err.code = ENOMEM;
- err.desc = "Cannot copy owner string";
- goto error_out;
- }
- attrs_inout[i].origin = GLITE_JP_ATTR_ORIG_SYSTEM;
- attrs_inout[i].origin_detail = NULL;
-
- /* XXX */
- attrs_inout[i].timestamp = tv_reg.tv_sec;
- }
-
- if (!strcmp(attrs_inout[i].name,GLITE_JP_ATTR_REGTIME)) {
- trio_asprintf(&attrs_inout[i].value,"%ld.%06ld",tv_reg.tv_sec,tv_reg.tv_usec);
- attrs_inout[i].origin = GLITE_JP_ATTR_ORIG_SYSTEM;
- attrs_inout[i].origin_detail = NULL;
- attrs_inout[i].timestamp = tv_reg.tv_sec;
- }
-
-/* must be implemented via filetype plugin
- case GLITE_JP_ATTR_TIME:
- case GLITE_JP_ATTR_TAG:
-*/
- }
-
-error_out:
- free(owner);
- if (err.code) {
- while (i > 0) {
- i--;
- glite_jp_attrval_free(attrs_inout+i,0);
- }
- 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;
-}
-
-
-int glite_jppsbe_query(
- glite_jp_context_t ctx,
- const glite_jp_query_rec_t query[],
- char * attrs[],
- void *arg,
- int (*callback)(
- glite_jp_context_t ctx,
- const char *job,
- const glite_jp_attrval_t metadata[],
- void *arg
- )
-)
-{
- glite_jp_error_t err;
- int i,ret;
- int quser = 0;
- char *where = NULL,*stmt = NULL,*aux = NULL, *cols = NULL;
- char *qres[3] = { NULL, NULL, NULL };
- int cmask = 0, owner_idx = -1, reg_idx = -1;
- glite_lbu_Statement q = NULL;
- glite_jp_attrval_t metadata[3];
-
- memset(&err,0,sizeof err);
- glite_jp_clear_error(ctx);
- err.source = __FUNCTION__;
-
- /* XXX: assuming not more than 2 */
- memset(metadata,0, sizeof metadata);
-
- /* XXX: const discarding is OK */
- for (i=0;attrs[i]; i++) {
- assert(i<2);
- metadata[i].name = (char *) attrs[i];
- }
-
- for (i=0; query[i].attr; i++) {
- char *qitem;
-
- /* XXX: don't assert() */
- assert(!query[i].binary);
-
- if (!strcmp(query[i].attr,GLITE_JP_ATTR_OWNER)) {
- switch (query[i].op) {
- case GLITE_JP_QUERYOP_EQUAL:
- quser = 1;
- trio_asprintf(&qitem,"u.cert_subj = '%|Ss'",query[i].value);
- break;
- default:
- err.code = EINVAL;
- err.desc = "only = allowed for owner queries";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
- }
- else if (!strcmp(query[i].attr,GLITE_JP_ATTR_REGTIME)) {
- time_t t = glite_jp_attr2time(query[i].value);
- char *t1,*t2 = NULL;
-
- glite_lbu_TimeToDB(t, &t1);
- switch (query[i].op) {
- case GLITE_JP_QUERYOP_EQUAL:
- trio_asprintf(&qitem,"j.reg_time = %s",t1);
- break;
- case GLITE_JP_QUERYOP_UNEQUAL:
- trio_asprintf(&qitem,"j.reg_time != %s",t1);
- break;
- case GLITE_JP_QUERYOP_LESS:
- trio_asprintf(&qitem,"j.reg_time < %s",t1);
- break;
- case GLITE_JP_QUERYOP_GREATER:
- trio_asprintf(&qitem,"j.reg_time > %s",t1);
- break;
- case GLITE_JP_QUERYOP_WITHIN:
- free(t2);
- glite_lbu_TimeToDB(glite_jp_attr2time(query[i].value2)+1, &t2);
- trio_asprintf(&qitem,"j.reg_time >= %s and j.reg_time <= %s",t1,t2);
- break;
- default:
- err.code = EINVAL;
- err.desc = "invalid query op";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
- free(t1);
- free(t2);
- }
- trio_asprintf(&aux,"%s%s%s",where ? where : "",where ? " and " : "", qitem);
- free(where);
- free(qitem);
- where = aux;
- aux = NULL;
- }
-
- for (i=0; metadata[i].name; i++) {
- assert (i<2); /* XXX: should never happen */
-
- if (!strcmp(metadata[i].name,GLITE_JP_ATTR_OWNER)) {
- quser = 1;
- cmask |= 1;
- owner_idx = i;
- }
- else if (!strcmp(metadata[i].name,GLITE_JP_ATTR_REGTIME)) {
- cmask |= 2;
- reg_idx = i;
- }
- else {
- err.code = EINVAL;
- err.desc = "invalid query column";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
- }
- switch (cmask) {
- case 1: cols = "j.dg_jobid,u.cert_subj"; break;
- case 2: cols = "j.dg_jobid,j.reg_time"; break;
- case 3: cols = "j.dg_jobid,u.cert_subj,j.reg_time"; break;
- }
-
- trio_asprintf(&stmt,"select %s from jobs j%s where %s %s",
- cols,
- quser ? ",users u" : "",
- where,
- cmask & 1 ? "and u.userid = j.owner" : "");
-
- if ((ret = glite_jp_db_ExecSQL(ctx,stmt,&q)) < 0) {
- err.code = EIO;
- err.desc = "DB call fail";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
- else if (ret == 0) {
- err.code = ENOENT;
- err.desc = "no matching jobs";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- while ((ret = glite_jp_db_FetchRow(ctx,q,sizeof(qres)/sizeof(qres[0]), NULL, qres)) > 0) {
- if (cmask & 1) {
- /* XXX: owner always first */
- metadata[owner_idx].value = qres[1];
- metadata[owner_idx].origin = GLITE_JP_ATTR_ORIG_SYSTEM;
- qres[1] = NULL;
- }
- if (cmask & 2) {
- int qi = cmask == 2 ? 1 : 2;
- time_t t = glite_lbu_DBToTime(qres[qi]);
- metadata[reg_idx].value = glite_jp_time2attr(t);
- metadata[reg_idx].origin = GLITE_JP_ATTR_ORIG_SYSTEM;
- free(qres[qi]);
- qres[qi] = NULL;
- }
- if (callback(ctx,qres[0],metadata,arg)) {
- err.code = EIO;
- err.desc = qres[0];
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- free(qres[0]);
- free(metadata[0].value);
- free(metadata[1].value);
- qres[0] = metadata[0].value = metadata[1].value = NULL;
- }
-
-
- if (ret < 0) {
- err.code = EIO;
- err.desc = "DB call fail";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
-cleanup:
- free(where);
- free(aux);
- free(stmt);
- free(qres[0]); free(qres[1]); free(qres[2]);
- free(metadata[0].value); free(metadata[1].value);
- if (q) glite_jp_db_FreeStmt(&q);
-
- return err.code;
-}
-
-
-int glite_jppsbe_is_metadata(glite_jp_context_t ctx,const char *attr)
-{
- /* XXX: should be more */
- if (!strcmp(attr,GLITE_JP_ATTR_OWNER)) return 1;
- if (!strcmp(attr,GLITE_JP_ATTR_REGTIME)) return 1;
-
- return 0;
-}
-
-
-int glite_jppsbe_get_names(
- glite_jp_context_t ctx,
- const char *job,
- const char *class,
- char ***names_out
-)
-{
- char *qry = NULL,*file = NULL,*dot;
- char **out = NULL;
- glite_lbu_Statement s = NULL;
- int rows,nout = 0;
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- trio_asprintf(&qry,"select filename from files f,jobs j "
- "where j.dg_jobid = '%|Ss' and j.jobid = f.jobid and f.state = 'committed'",job);
-
- if ((rows = glite_jp_db_ExecSQL(ctx,qry,&s)) <= 0) {
- if (rows == 0) {
- err.code = ENOENT;
- err.desc = "No files for this job";
- }
- else {
- err.code = EIO;
- err.desc = "DB call fail retrieving job files";
- }
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- while ((rows = glite_jp_db_FetchRow(ctx,s,1,NULL,&file))) {
- if (rows < 0) {
- err.code = EIO;
- err.desc = "DB call fail retrieving job files";
- goto cleanup;
- }
-
- dot = strchr(file,'.'); /* XXX: can class contain dot? */
-
- if (dot) *dot = 0;
- out = realloc(out,(nout+1) * sizeof *out);
- if (!strcmp(file,class)) out[nout++] = dot ? dot+1 : NULL;
-
- free(file);
- file = NULL;
- }
-
-cleanup:
- if (s) glite_jp_db_FreeStmt(&s);
- free(qry);
- free(file);
-
- if (ctx->error) {
- int i;
- for (i=0; out && out[i]; i++) free(out[i]);
- free(out);
- return -ctx->error->code;
- }
-
- if (nout) *names_out = out;
- return nout;
-}
-
-
-/** mark the job as sent to this feed */
-int glite_jppsbe_set_fed(
- glite_jp_context_t ctx,
- const char *feed,
- const char *job
-)
-{
- char *stmt = NULL,*u = NULL;
- int rows,ret;
- glite_jp_error_t err;
- memset(&err,0,sizeof err);
-
- if ((ret = jobid_unique_pathname(ctx,job,&u,NULL,0))) return ret;
-
- trio_asprintf(&stmt,"insert into fed_jobs(feedid,jobid) "
- "values ('%|Ss','%|Ss')", feed,u);
- free(u);
-
- if ((rows = glite_jp_db_ExecSQL(ctx,stmt,NULL)) < 0) {
- err.source = __FUNCTION__;
- err.code = EIO;
- err.desc = "insert into fed_jobs";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- if (rows != 1) {
- err.source = __FUNCTION__;
- err.code = EIO;
- err.desc = "inserted rows != 1";
- glite_jp_stack_error(ctx,&err);
- }
-
-cleanup:
- free(stmt);
- return err.code;
-}
-
-
-/** check whether the job has been already sent to this feed */
-int glite_jppsbe_check_fed(
- glite_jp_context_t ctx,
- const char *feed,
- const char *job,
- int *result
-)
-{
- char *stmt = NULL,*u = NULL;
- int rows,ret;
- glite_jp_error_t err;
- memset(&err,0,sizeof err);
-
- if ((ret = jobid_unique_pathname(ctx,job,&u,NULL,0))) return ret;
-
- trio_asprintf(&stmt,"select 'x' from fed_jobs "
- "where jobid = '%|Ss' and feedid = '%|Ss'",
- u,feed);
-
- free(u);
-
- if ((rows = glite_jp_db_ExecSQL(ctx,stmt,NULL)) < 0) {
- err.source = __FUNCTION__;
- err.code = EIO;
- err.desc = "select from fed_jobs";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- *result = rows;
-
-cleanup:
- free(stmt);
- return err.code;
-}
-
-
-/** store the feed to database */
-int glite_jppsbe_store_feed(
- glite_jp_context_t ctx,
- struct jpfeed *feed
-)
-{
- char *stmt,*aux,*alist,*qlist,*e;
- int i,rows;
- glite_jp_error_t err;
-
- memset(&err,0,sizeof err);
-
- qlist = alist = stmt = aux = e = NULL;
-
- for (i=0; feed->attrs[i]; i++) {
- char *e;
- trio_asprintf(&aux,"%s%s%s",
- alist ? alist : "",
- alist ? "\n" : "",
- e = glite_lbu_EscapeULM(feed->attrs[i]));
- free(e);
- free(alist);
- alist = aux;
- aux = NULL;
- }
-
- for (i=0; feed->qry[i].attr; i++) {
- char op,*e1,*e2 = NULL;
-
- /* XXX */
- assert(!feed->qry[i].binary);
-
- switch (feed->qry[i].op) {
- case GLITE_JP_QUERYOP_EQUAL: op = '='; break;
- case GLITE_JP_QUERYOP_UNEQUAL: op = '!'; break;
- case GLITE_JP_QUERYOP_LESS: op = '<'; break;
- case GLITE_JP_QUERYOP_GREATER: op = '>'; break;
- case GLITE_JP_QUERYOP_EXISTS: op = 'E'; break;
- default: abort(); /* XXX */
- }
-
- trio_asprintf(&aux,"%s%s%s\n%c\n%s",
- qlist ? qlist : "",
- qlist ? "\n" : "",
- e1 = glite_lbu_EscapeULM(feed->qry[i].attr),
- op,
- op != 'E' ? e2 = glite_lbu_EscapeULM(feed->qry[i].value) : "E");
- free(e1); free(e2);
-
- free(qlist);
- qlist = aux;
- aux = NULL;
- }
-
- glite_lbu_TimeToDB(feed->expires, &e);
- trio_asprintf(&stmt,"insert into feeds(feedid,destination,expires,cols,query) "
- "values ('%|Ss','%|Ss',%s,'%|Ss','%|Ss')",
- feed->id,feed->destination,
- e,
- alist,qlist);
-
- free(alist); free(qlist); free(e);
-
- if ((rows = glite_jp_db_ExecSQL(ctx,stmt,NULL)) < 0) {
- err.source = __FUNCTION__;
- err.code = EIO;
- err.desc = "insert into fed_jobs";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- if (rows != 1) {
- err.source = __FUNCTION__;
- err.code = EIO;
- err.desc = "inserted rows != 1";
- glite_jp_stack_error(ctx,&err);
- }
-
-cleanup:
- free(stmt);
- return err.code;
-
-}
-
-int glite_jppsbe_refresh_feed(
- glite_jp_context_t ctx,
- char *feed_id,
- time_t expires
-)
-{
- glite_jp_error_t err;
- memset(&err,0,sizeof err);
-
- char *stmt = NULL;
- char *e = NULL;
- glite_lbu_TimeToDB(expires, &e);
- trio_asprintf(&stmt, "update feeds set expires=%s where feedid='%s'",
- e, feed_id);
- if (!stmt) {
- err.code = ENOMEM;
- goto error_out;
- }
-
- if (glite_jp_db_ExecSQL(ctx, stmt, NULL) < 0) {
- err.code = EIO;
- err.desc = "DB access failed";
- goto error_out;
- }
-
-error_out:
- free(stmt);
- free(e);
- if (err.code)
- return glite_jp_stack_error(ctx,&err);
- else
- return 0;
-}
-
-/** purge expired feeds */
-int glite_jppsbe_purge_feeds(
- glite_jp_context_t ctx
-)
-{
- char *stmt = NULL,*feed = NULL;
- char *expires;
- glite_jp_error_t err;
- glite_lbu_Statement q = NULL;
- int rows;
-
- glite_lbu_TimeToDB(time(NULL), &expires);
- memset(&err,0,sizeof err);
-
- trio_asprintf(&stmt,"select feedid from feeds where expires < %s",expires);
-
- if ((rows = glite_jp_db_ExecSQL(ctx, stmt, &q)) < 0) {
- err.code = EIO;
- err.desc = "select from feeds";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- while ((rows = glite_jp_db_FetchRow(ctx,q,1,NULL,&feed)) > 0) {
- printf("feed %s has expired.\n", feed);
- free(stmt);
- trio_asprintf(&stmt,"delete from fed_jobs where feedid = '%|Ss'",feed);
- if ((rows = glite_jp_db_ExecSQL(ctx, stmt, NULL)) < 0) {
- err.code = EIO;
- err.desc = "delete from fed_jobs";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
- }
-
- free(stmt);
- trio_asprintf(&stmt,"delete from feeds where expires < %s",expires);
- if ((rows = glite_jp_db_ExecSQL(ctx, stmt, NULL)) < 0) {
- err.code = EIO;
- err.desc = "select from feeds";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
-cleanup:
- glite_jp_db_FreeStmt(&q);
- free(feed);
- free(stmt);
- free(expires);
- return err.code;
-}
-
-
-/** read stored feed into context */
-int glite_jppsbe_read_feeds(
- glite_jp_context_t ctx
-)
-{
- char *stmt,*res[5],*expires;
- glite_jp_error_t err;
- glite_lbu_Statement q = NULL;
- int rows;
-
- stmt = expires = NULL;
- memset(&err,0,sizeof err);
- memset(&res,0,sizeof res);
- err.source = __FUNCTION__;
-
- glite_lbu_TimeToDB(time(NULL), &expires);
- trio_asprintf(&stmt,"select feedid,destination,expires,cols,query "
- "from feeds "
- "where expires > %s",expires);
- free(expires); expires = NULL;
-
- if ((rows = glite_jp_db_ExecSQL(ctx, stmt, &q)) < 0) {
- err.code = EIO;
- err.desc = "select from feeds";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
- free(stmt);
-
- while ((rows = glite_jp_db_FetchRow(ctx,q,sizeof(res)/sizeof(res[0]),NULL, res)) > 0) {
- struct jpfeed *f = calloc(1,sizeof *f);
- int n;
- char *p;
-
- f->id = res[0]; res[0] = NULL;
- f->destination = res[1]; res[1] = NULL;
- f->expires = glite_lbu_DBToTime(res[2]); free(res[2]); res[2] = NULL;
-
- n = 0;
- for (p = strtok(res[3],"\n"); p; p = strtok(NULL,"\n")) {
- f->attrs = realloc(f->attrs,(n+2) * sizeof *f->attrs);
- f->attrs[n] = glite_lbu_UnescapeULM(p);
- f->attrs[++n] = NULL;
- }
-
- n = 0;
- for (p = strtok(res[4],"\n"); p; p = strtok(NULL,"\n")) {
- f->qry = realloc(f->qry,(n+2) * sizeof *f->qry);
- memset(&f->qry[n],0,sizeof *f->qry);
- f->qry[n].attr = glite_lbu_EscapeULM(p);
- p = strtok(NULL,"\n");
- switch (*p) {
- case '=': f->qry[n].op = GLITE_JP_QUERYOP_EQUAL; break;
- case '<': f->qry[n].op = GLITE_JP_QUERYOP_LESS; break;
- case '>': f->qry[n].op = GLITE_JP_QUERYOP_GREATER; break;
- case '!': f->qry[n].op = GLITE_JP_QUERYOP_UNEQUAL; break;
- case 'E': f->qry[n].op = GLITE_JP_QUERYOP_EXISTS; break;
- default: abort(); /* XXX: internal inconsistency */
- }
- p = strtok(NULL,"\n");
- if (f->qry[n].op != GLITE_JP_QUERYOP_EXISTS)
- f->qry[n].value = glite_lbu_EscapeULM(p);
-
- memset(&f->qry[++n],0,sizeof *f->qry);
- }
- f->next = ctx->feeds;
- ctx->feeds = f;
- }
-
- if (rows < 0) {
- err.code = EIO;
- err.desc = "fetch from feeds";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
-cleanup:
- glite_jp_db_FreeStmt(&q);
- free(res[0]); free(res[1]); free(res[2]); free(res[3]); free(res[4]);
- return err.code;
-}
-
-int glite_jppsbe_append_tags(
- void *fpctx,
- char *jobid,
- glite_jp_attrval_t *attr
-)
-{
- void *file_be;
- glite_jp_error_t err;
- glite_jp_context_t ctx = fpctx;
- int i;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- if (glite_jppsbe_open_file(ctx,jobid,"tags",NULL,
- O_RDWR|O_CREAT,&file_be)
- // XXX: tags need reading to check magic number
- ) {
- err.code = EIO;
- err.desc = "cannot open tags file";
- return glite_jp_stack_error(ctx,&err);
- }
-
- for (i=0; attr[i].name; i++) {
- if (tag_append(ctx,file_be,attr+i))
- {
- glite_jp_error_t *e = ctx->error;
- err.code = EIO;
- err.desc = "cannot append tag";
-
- glite_jppsbe_close_file(ctx,file_be);
- glite_jp_clear_error(ctx);
- ctx->error = e;
-
- return glite_jp_stack_error(ctx,&err);
- }
- }
-
- if (glite_jppsbe_close_file(ctx,file_be))
- {
- err.code = EIO;
- err.desc = "cannot close tags file";
- return glite_jp_stack_error(ctx,&err);
- }
-
- return 0;
-}
-
-
-int glite_jppsbe_read_tag(
- void *fpctx,
- const char *jobid,
- const char *attr,
- glite_jp_attrval_t **attrval
-)
-{
- glite_jp_error_t err;
- glite_jp_context_t ctx = fpctx;
- struct tags_handle *h;
- int i;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- h = malloc(sizeof (*h));
- h->tags = NULL;
- h->n = 0;
-
- if (glite_jppsbe_open_file(ctx,jobid,"tags",NULL,
- O_RDONLY,&(h->bhandle))
- // XXX: tags need reading to check magic number
- ) {
- err.code = EIO;
- err.desc = "cannot open tags file";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
- if (tag_attr(ctx,h,attr,attrval)){
- glite_jp_error_t *e;
- err.code = EIO;
- err.desc = "cannot read tag";
- glite_jp_stack_error(ctx,&err);
- e = ctx->error;
- ctx->error = NULL;
- glite_jppsbe_close_file(ctx,h->bhandle);
- ctx->error = e;
- goto cleanup;
- }
-
- if (glite_jppsbe_close_file(ctx,h->bhandle))
- {
- err.code = EIO;
- err.desc = "cannot close tags file";
- glite_jp_stack_error(ctx,&err);
- goto cleanup;
- }
-
-cleanup:
- for (i=0; i < h->n; i++){
- free(h->tags[i].name);
- free(h->tags[i].value);
- }
- free(h->tags);
- free(h);
-
- return err.code;
-}
-
-
-
-/* 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
-*/
+++ /dev/null
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <stdint.h>
-#include <sys/stat.h>
-
-#include <libtar.h>
-#include <fcntl.h>
-
-#include <glite/jp/types.h>
-#include <glite/jp/known_attr.h>
-#include "glite/jp/backend.h"
-
-#include "glite/jp/file_plugin.h"
-#include "glite/jp/builtin_plugins.h"
-
-#define ALLOC_CHUNK 3
-
-
-typedef struct _sb_handle {
- void *bhandle;
- TAR *t;
- tartype_t *tt;
- char **file_names;
-} sb_handle;
-
-// Global data needed for read/write wrappers
-static struct {
- void *bhandle;
- glite_jp_context_t ctx;
- off_t offset;
-} global_data;
-
-
-//static int sandbox_append(void *,void *,int,...);
-static int sandbox_open(void *,void *,const char *uri,void **);
-static int sandbox_close(void *,void *);
-static int sandbox_attr(void *,void *,const char *,glite_jp_attrval_t **);
-static int sandbox_filecom(void *,void *);
-
-int init(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data)
-{
- data->fpctx = ctx;
- global_data.ctx = ctx;
-
- data->uris = calloc(2,sizeof *data->uris);
- data->uris[0] = strdup(GLITE_JP_FILETYPE_ISB);
-
- data->classes = calloc(2,sizeof *data->classes);
- data->classes[0] = strdup("sandbox");
-
- data->namespaces = calloc(5, sizeof *data->namespaces);
- data->namespaces[0] = strdup(GLITE_JP_ISB_NS);
- data->namespaces[1] = strdup(GLITE_JP_OSB_NS);
- data->namespaces[2] = strdup(GLITE_JP_ISB_CONTENT_NS);
- data->namespaces[3] = strdup(GLITE_JP_OSB_CONTENT_NS);
-
- data->ops.open = sandbox_open;
- data->ops.close = sandbox_close;
- data->ops.attr = sandbox_attr;
- data->ops.filecom = sandbox_filecom;
-
- printf("sandbox_plugin: URI: \"%s\"\n",GLITE_JP_FILETYPE_ISB);
-
- return 0;
-}
-
-
-/**
-* Wrappers for tar_open
-*/
-static int my_open(const char *pathname, int flags, ...) {
- // Do not open file, it is opened in ftp_backend
- // returned fd does not matter, read/write/close does ftp_backend
- return 12345;
-}
-
-static int my_close(int fd) {
- // Closed in ftp_backend
- return 0;
-}
-
-static ssize_t my_read(int fd, void *buf, size_t count) {
- // wrapper around glite_jppsbe_pread
- size_t r;
-
- if (glite_jppsbe_pread(global_data.ctx,global_data.bhandle,buf,count,global_data.offset,&r)) {
- errno = global_data.ctx->error->code;
- return -1;
- }
-
- global_data.offset += r;
-
- return r;
-}
-
-static ssize_t my_write(int fd, const void *buf, size_t count) {
- // wrapper around glite_jppsbe_pwrite
- // just stub, not needed here&now
-}
-
-
-
-static int sandbox_open(void *fpctx,void *bhandle,const char *uri,void **handle)
-{
- sb_handle *h = calloc(1,sizeof *h);
-
-
- printf("sandbox_open() called\n");
-
- h->bhandle = bhandle;
- global_data.bhandle = bhandle;
- global_data.offset = 0;
-
- h->tt = malloc(sizeof(*h->tt));
- h->tt->openfunc = my_open;
- h->tt->closefunc = my_close;
- h->tt->readfunc = my_read;
- h->tt->writefunc = my_write;
-
- if (tar_open(&h->t, NULL /* not needed, opened in ftp_backend */, h->tt, O_RDONLY, 0, TAR_GNU) == -1)
- printf("tar_open()\n"); //XXX: use glite_jp_stack_error
-
- *handle = h;
-
- return 0;
-}
-
-
-static int sandbox_close(void *fpctx,void *handle)
-{
- int i;
- sb_handle *h = handle;
-
- tar_close(h->t);
- free(h->tt);
-
- for (i=0; h->file_names; i++) free(h->file_names[i]);
- free(h->file_names);
-
- free(h);
-
- printf("sandbox_close() called\n");
-
- return 0;
-}
-
-
-static int sandbox_attr(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t **attrval)
-{
- glite_jp_error_t err;
- glite_jp_context_t ctx = fpctx;
- glite_jp_attrval_t *out = NULL;
- int i,nout = 0, count = 0;
- sb_handle *h = handle;
-
-
- printf("sandbox_attr() called\n");
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- glite_jp_clear_error(ctx);
-
- *attrval = NULL;
-
- if (!strcmp(attr, GLITE_JP_ATTR_ISB_FILENAME)) {
- while ((i = th_read(h->t)) == 0)
- {
- printf("-- %s\n", th_get_pathname(h->t));
-
- if ( !(count % ALLOC_CHUNK) ) {
- *attrval = realloc(*attrval, (count + ALLOC_CHUNK + 1) * sizeof(**attrval) );
- memset( (*attrval) + count, 0, (ALLOC_CHUNK + 1) * sizeof(**attrval));
- }
- (*attrval)[count].name = strdup(GLITE_JP_ATTR_ISB_FILENAME);
- (*attrval)[count].value = strdup(th_get_pathname(h->t));
- (*attrval)[count].origin = GLITE_JP_ATTR_ORIG_FILE;
- (*attrval)[count].timestamp = th_get_mtime(h->t);
-
- count++;
-
- if (TH_ISREG(h->t) && tar_skip_regfile(h->t) != 0)
- {
- err.code = EIO;
- err.desc = "tar_skip_regfile";
- return glite_jp_stack_error(ctx,&err);
- }
- }
- }
- else if (!strcmp(attr, GLITE_JP_ATTR_OSB_FILENAME)) {
- printf("Namespace %s not implemented yet\n", GLITE_JP_ATTR_OSB_FILENAME);
- }
- else if (strstr(attr,GLITE_JP_OSB_CONTENT_NS)) {
- printf("Namespace %s not implemented yet\n", GLITE_JP_OSB_CONTENT_NS);
- }
- else if (strstr(attr,GLITE_JP_ISB_CONTENT_NS)) {
- char *fileName = (char *) attr + sizeof(GLITE_JP_ISB_CONTENT_NS);
-
- printf("untaring file: %s\n", fileName);
-
- while (th_read(h->t) == 0)
- {
- if ( !strcmp(fileName, th_get_pathname(h->t)) ) {
- /* extract the file */
- int k;
- size_t size;
- char buf[T_BLOCKSIZE];
- char *value;
-
-
- if (!TH_ISREG(h->t)) assert(0); // not a regular file
-
- size = th_get_size(h->t);
- value = (char *) malloc(size * sizeof(char) + 1);
- memset( value, 0, size * sizeof(char) + 1);
-
- for (i = 0; i < size; i += T_BLOCKSIZE)
- {
- k = tar_block_read(h->t, buf);
- if (k == -1)
- {
- err.code = errno;
- err.desc = "tar_block_read";
- return glite_jp_stack_error(ctx,&err);
- }
-
- // tar_block_read calls glite_jppsbe_pread, which usually
- // returns whole block (read from the middle of uploaded
- // tar file
- // so cut k in order to the last chunk had correct size
- if (i + T_BLOCKSIZE > size) {
- k = size - i;
- }
-
- strncpy(value + i, buf, k);
- }
- *attrval = malloc(2 * sizeof(**attrval) );
- memset( (*attrval), 0, 2 * sizeof(**attrval));
-
- (*attrval)[0].name = strdup(attr);
- (*attrval)[0].value = value;
- (*attrval)[0].origin = GLITE_JP_ATTR_ORIG_FILE;
- (*attrval)[0].timestamp = th_get_mtime(h->t);
- }
- else if (TH_ISREG(h->t) && tar_skip_regfile(h->t) != 0)
- {
- err.code = EIO;
- err.desc = "tar_skip_regfile";
- return glite_jp_stack_error(ctx,&err);
- }
- }
- }
-
- return glite_jp_stack_error(ctx,&err);
-}
-
-static int sandbox_filecom(void *fpctx,void *handle){
- return -1;
-}
-
+++ /dev/null
-#include <stdio.h>
-
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-
-#include "jpps_H.h"
-
-extern SOAP_NMAC struct Namespace jpis__namespaces[],jpps__namespaces[];
-
-int main(int argc, char *argv[]) {
- struct soap soap;
- int i, m, s; // master and slave sockets
-
- glite_jp_context_t ctx;
-
- soap_init(&soap);
- soap_set_namespaces(&soap, jpps__namespaces);
-
- glite_jp_init_context(&ctx);
-
- if (glite_jppsbe_init(ctx, &argc, argv)) {
- /* XXX log */
- fputs(glite_jp_error_chain(ctx), stderr);
- exit(1);
- }
-
- soap.user = (void *) ctx;
-
- ctx->other_soap = soap_new();
- soap_init(ctx->other_soap);
- soap_set_namespaces(ctx->other_soap,jpis__namespaces);
-
- srand48(time(NULL)); /* feed id generation */
-
- m = soap_bind(&soap, NULL, 8901, 100);
- if (m < 0)
- soap_print_fault(&soap, stderr);
- else
- {
- fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
- for (i = 1; ; i++) {
- s = soap_accept(&soap);
- if (s < 0) {
- soap_print_fault(&soap, stderr);
- break;
- }
- jpps__serve(&soap); // process RPC request
- soap_destroy(&soap); // clean up class instances
- soap_end(&soap); // clean up everything and close socket
- glite_jp_run_deferred(ctx);
- }
- }
- soap_done(&soap); // close master socket
-
- return 0;
-}
-
-/* XXX: we don't use it */
-SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} };
+++ /dev/null
-#include <stdio.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <sys/stat.h>
-
-#undef SOAP_FMAC1
-#define SOAP_FMAC1 static
-
-#include <stdsoap2.h>
-
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/attr.h"
-#include "glite/jp/known_attr.h"
-
-#include "feed.h"
-#include "attrs.h"
-
-#include "jptype_map.h"
-#include "glite/security/glite_gscompat.h"
-
-#include "glite/jp/file_plugin.h"
-#include "glite/jp/builtin_plugins.h"
-
-/* the same as ServerLib.c but without WITH_NOGLOBAL which breaks the soap_env_ctx trick */
-#define SOAP_FMAC3 static
-#include "jpps_C.c"
-#include "jpps_Server.c"
-
-#include "jpps_.nsmap"
-
-#include "soap_env_ctx.h"
-#include "soap_env_ctx.c"
-
-#include "glite/jp/ws_fault.c"
-#include "soap_util.c"
-
-#define err2fault(CTX, SOAP) glite_jp_server_err2fault((CTX), (SOAP));
-
-#define CONTEXT_FROM_SOAP(soap,ctx) glite_jp_context_t ctx = (glite_jp_context_t) ((soap)->user)
-
-#define SIZE_TO_COMPRESS 1024
-
-int glite_jpps_srv_init(glite_jp_context_t ctx)
-{
- glite_jp_soap_env_ctx = &my_soap_env_ctx;
- return 0;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__RegisterJob(
- struct soap *soap,
- struct _jpelem__RegisterJob *in,
- struct _jpelem__RegisterJobResponse *empty)
-{
- CONTEXT_FROM_SOAP(soap,ctx);
- glite_jp_attrval_t owner_val[2];
-
- printf("%s %s %s\n",__FUNCTION__,in->job,in->owner);
- if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__RegisterJob,in->job,in->owner) ||
- glite_jppsbe_register_job(ctx,in->job,in->owner))
- {
- err2fault(ctx,soap);
- 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;
- owner_val[0].timestamp = time(NULL);
- owner_val[0].origin_detail = NULL;
- owner_val[1].name = NULL;
-
-/* XXX: errrors should be ingored but not silently */
- glite_jpps_match_attr(ctx,in->job,owner_val);
-
- return SOAP_OK;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__StartUpload(
- struct soap *soap,
- struct _jpelem__StartUpload *in,
- struct _jpelem__StartUploadResponse *out)
-{
- CONTEXT_FROM_SOAP(soap,ctx);
- char *destination;
- time_t commit_before = in->commitBefore;
- glite_jp_error_t err;
- glite_jpps_fplug_data_t **pd = NULL;
- int i;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
-
- if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__StartUpload,NULL,NULL)) {
- err2fault(ctx,soap);
- return SOAP_FAULT;
- }
-
- switch (glite_jpps_fplug_lookup(ctx,in->class_,&pd)) {
- case ENOENT:
- err.code = ENOENT;
- err.source = __FUNCTION__;
- err.desc = "unknown file class";
- glite_jp_stack_error(ctx,&err);
- err2fault(ctx,soap);
- return SOAP_FAULT;
- case 0: break;
- default:
- err2fault(ctx,soap);
- return SOAP_FAULT;
- }
-
- for (i=0; pd[0]->uris[i] && strcmp(pd[0]->uris[i],in->class_); i++);
- assert(pd[0]->uris[i]);
-
- if (glite_jppsbe_start_upload(ctx,in->job,pd[0]->classes[i],in->name,in->contentType,
- &destination,&commit_before))
- {
- err2fault(ctx,soap);
- free(pd);
- return SOAP_FAULT;
- }
-
- out->destination = soap_strdup(soap,destination);
- free(destination);
- out->commitBefore = commit_before;
-
- free(pd);
- return SOAP_OK;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__CommitUpload(
- struct soap *soap,
- struct _jpelem__CommitUpload *in,
- struct _jpelem__CommitUploadResponse *out)
-{
- CONTEXT_FROM_SOAP(soap,ctx);
- char *job,*class,*name;
-
- job = class = name = NULL;
-
- if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__CommitUpload,NULL,NULL) ||
- glite_jppsbe_commit_upload(ctx,in->destination))
- {
- err2fault(ctx,soap);
- return SOAP_FAULT;
- }
-
- /* XXX: should not fail when commit_upload was OK */
- assert(glite_jppsbe_destination_info(ctx,in->destination,&job,&class,&name) == 0);
-
- /* XXX: ignore errors but don't fail silenty */
- glite_jpps_match_file(ctx,job,class,name);
-
- // apply plugins to commited file
- glite_jpps_fplug_data_t *pd;
- int i, j;
- void *beh, *ph;
- if (ctx->plugins)
- for (i = 0; ctx->plugins[i]; i++) {
- pd = ctx->plugins[i];
- if (pd->classes)
- for (j = 0; pd->classes[j]; j++)
- if (strcmp(class, pd->classes[j]) == 0){
- if (! glite_jppsbe_open_file(ctx,job,class, name, O_RDONLY, &beh)) {
- if (!pd->ops.open(pd->fpctx,beh,pd->uris[j],&ph)) {
- pd->ops.filecom(pd->fpctx, ph);
- pd->ops.close(pd->fpctx, ph);
- }
- glite_jppsbe_close_file(ctx,beh);
- }
-
- }
- }
-
- char *fname;
- //XXX ignore error
- if (!glite_jppsbe_open_file(ctx,job,class, name, O_RDONLY, &beh)){
- struct stat fattr;
- glite_jppsbe_file_attrs(ctx, beh, &fattr);
- glite_jppsbe_close_file(ctx, beh);
- if (fattr.st_size > SIZE_TO_COMPRESS)
- glite_jppsbe_compress_and_remove_file(ctx,job,class, name);
- }
-
- free(job); free(class); free(name);
-
- return SOAP_OK;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__RecordTag(
- struct soap *soap,
- struct _jpelem__RecordTag *in,
- struct _jpelem__RecordTagResponse *out)
-{
- CONTEXT_FROM_SOAP(soap,ctx);
- void *file_be,*file_p;
- 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 (GSOAP_ISSTRING(in->tag->value)) {
- attr[0].value = GSOAP_STRING(in->tag->value);
- attr[0].binary = 0;
- }
- else {
- attr[0].value = GSOAP_BLOB(in->tag->value)->__ptr;
- attr[0].size = GSOAP_BLOB(in->tag->value)->__size;
- attr[0].binary = 1;
- }
- attr[0].origin = GLITE_JP_ATTR_ORIG_USER;
- attr[0].timestamp = time(NULL);
- attr[0].origin_detail = NULL; /* XXX */
- attr[1].name = NULL;
-
- if (glite_jppsbe_append_tags(ctx,in->jobid,attr)) goto err;
-
- /* XXX: ignore errors but don't fail silenty */
- glite_jpps_match_attr(ctx,in->jobid,attr);
-
- return SOAP_OK;
-err:
- glite_jp_attrval_free(meta,0);
- err2fault(ctx,soap);
- return SOAP_FAULT;
-}
-
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__RecordMultiTags(
- struct soap *soap,
- struct _jpelem__RecordMultiTags *in,
- struct _jpelem__RecordMultiTagsResponse *out
-)
-{
- CONTEXT_FROM_SOAP(soap,ctx);
- int i,j,ret = SOAP_OK;
- char **jobs = NULL;
- glite_jp_attrval_t **attrs = NULL,meta[2];
-
- memset(meta,0,sizeof meta);
- meta[0].name = strdup(GLITE_JP_ATTR_OWNER);
-
- for (i=0; i<in->__sizejobs; i++) {
- struct jptype__jobRecord *jr = GLITE_SECURITY_GSOAP_LIST_GET(in->jobs,i);
-
- if (glite_jppsbe_get_job_metadata(ctx,jr->jobid,meta)) {
- ret = SOAP_FAULT;
- goto cleanup;
- }
-
-/* XXX: the same as single tag */
- if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__RecordTag,jr->jobid,meta[0].value)) {
- ret = SOAP_FAULT;
- goto cleanup;
- }
-
- jobs = realloc(jobs,sizeof(*jobs) * (i+2));
- jobs[i] = jr->jobid;
- jobs[i+1] = NULL;
-
- attrs = realloc(attrs,sizeof(*attrs) * (i+2));
- attrs[i] = calloc(jr->__sizeattributes+1,sizeof attrs[i][0]);
- attrs[i+1] = NULL;
-
- for (j=0; j < jr->__sizeattributes; j++) {
- struct jptype__attrValue *a = GLITE_SECURITY_GSOAP_LIST_GET(jr->attributes,j);
-
- attrs[i][j].name = a->name;
- if (GSOAP_ISSTRING(a->value)) {
- attrs[i][j].value = GSOAP_STRING(a->value);
- attrs[i][j].binary = 0;
- }
- else {
- attrs[i][j].value = GSOAP_BLOB(a->value)->__ptr;
- attrs[i][j].size = GSOAP_BLOB(a->value)->__size;
- attrs[i][j].binary = 1;
- }
- /* XXX input not favoured */
- attrs[i][j].origin = GLITE_JP_ATTR_ORIG_USER;
- attrs[i][j].timestamp = time(NULL);
- attrs[i][j].origin_detail = NULL;
- }
- if (glite_jppsbe_append_tags(ctx,jobs[i],attrs[i])) {
- err2fault(ctx,soap);
- ret = SOAP_FAULT;
- goto cleanup;
- }
- }
-
-/* XXX: ignore error */
- glite_jpps_match_attr_multi(ctx,(const char **) jobs,(const glite_jp_attrval_t **) attrs);
-
-cleanup:
- if (attrs) {
- for (i=0; attrs[i]; i++) {
- for (j=0; attrs[i][j].name; j++) glite_jp_attrval_free(&attrs[i][j],0);
- free(attrs[i]);
- }
- free(attrs);
- }
- free(jobs);
-
- glite_jp_attrval_free(meta,0);
- if (ret == SOAP_FAULT) err2fault(ctx,soap);
- return ret;
-}
-
-static void s2jp_qval(const struct jptype__stringOrBlob *in, char **value, int *binary, size_t *size)
-{
- if (GSOAP_ISSTRING(in)) {
- *value = GSOAP_STRING(in);
- *binary = 0;
- *size = 0;
- }
- else {
- assert(GSOAP_BLOB(in)); /* XXX: should report error instead */
- *value = GSOAP_BLOB(in)->__ptr;
- *binary = 1;
- *size = GSOAP_BLOB(in)->__size;
- }
-}
-
-static void s2jp_query(const struct jptype__primaryQuery *in, glite_jp_query_rec_t *out)
-{
- int b;
-
- out->attr = in->attr;
-
- s2jp_qval(in->value,&out->value,&out->binary,&out->size);
- switch (in->op) {
- case EQUAL: out->op = GLITE_JP_QUERYOP_EQUAL; break;
- case UNEQUAL: out->op = GLITE_JP_QUERYOP_UNEQUAL; break;
- case LESS: out->op = GLITE_JP_QUERYOP_LESS; break;
- case GREATER: out->op = GLITE_JP_QUERYOP_GREATER; break;
- case WITHIN:
- out->op = GLITE_JP_QUERYOP_WITHIN;
- s2jp_qval(in->value2,&out->value2,&b,&out->size2);
- assert(out->binary == b); /* XXX: report error instead */
-
- break;
- }
-
- if (in->origin) switch (*in->origin) {
- case jptype__attrOrig__SYSTEM: out->origin = GLITE_JP_ATTR_ORIG_SYSTEM; break;
- case jptype__attrOrig__USER: out->origin = GLITE_JP_ATTR_ORIG_USER; break;
- case jptype__attrOrig__FILE_: out->origin = GLITE_JP_ATTR_ORIG_FILE; break;
- }
- else out->origin = GLITE_JP_ATTR_ORIG_ANY;
-}
-
-
-static int check_sane_feed(glite_jp_context_t ctx,struct _jpelem__FeedIndex *in)
-{
- glite_jp_error_t err;
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- err.code = EINVAL;
-
- if (!in->destination) {
- err.desc = "destination required";
- return glite_jp_stack_error(ctx,&err);
- }
-
- return 0;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__FeedIndex(
- struct soap *soap,
- struct _jpelem__FeedIndex *in,
- struct _jpelem__FeedIndexResponse *out)
-{
-
-/* deferred processing: return feed_id to the index server first,
- * start feeding it afterwards -- not before the index server actually
- * knows feed_id and is ready to accept the feed.
- *
- * Has to be done within the same server slave,
- * passed through the context */
-
- CONTEXT_FROM_SOAP(soap,ctx);
- char *feed_id = NULL;
- time_t expires = 0;
- int ret = SOAP_OK;
-
- char const **attrs = calloc(in->__sizeattributes+1,sizeof *attrs);
- glite_jp_query_rec_t *qry = calloc(in->__sizeconditions+1,sizeof *qry);
- int i;
-
- glite_jp_clear_error(ctx);
-
- if (check_sane_feed(ctx,in)) {
- err2fault(ctx,soap);
- ret = SOAP_FAULT;
- goto cleanup;
- }
-
- memcpy(attrs,in->attributes,sizeof *attrs * in->__sizeattributes);
- for (i = 0; i<in->__sizeconditions; i++) s2jp_query(GLITE_SECURITY_GSOAP_LIST_GET(in->conditions, i),qry+i);
-
- if (in->history) {
- if (glite_jpps_run_feed(ctx,in->destination,attrs,qry,in->continuous,&feed_id)) {
- err2fault(ctx,soap);
- ret = SOAP_FAULT;
- goto cleanup;
- }
- }
-
- if (in->continuous) {
- if (glite_jpps_register_feed(ctx,in->destination,attrs,qry,&feed_id,&expires)) {
- err2fault(ctx,soap);
- ret = SOAP_FAULT;
- goto cleanup;
- }
- }
-
- if (!in->history && !in->continuous) {
- glite_jp_error_t err;
- memset(&err,0,sizeof err);
- err.code = EINVAL;
- err.source = __FUNCTION__;
- err.desc = "at least one of <history> and <continous> must be true";
- glite_jp_stack_error(ctx,&err);
- err2fault(ctx,soap);
- ret = SOAP_FAULT;
- goto cleanup;
- }
-
- out->feedExpires = expires;
- out->feedId = soap_strdup(soap,feed_id);
-
-cleanup:
- free(feed_id);
- free(attrs);
- free(qry);
-
- return ret;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__FeedIndexRefresh(
- struct soap *soap,
- struct _jpelem__FeedIndexRefresh *in,
- struct _jpelem__FeedIndexRefreshResponse *out)
-{
- CONTEXT_FROM_SOAP(soap,ctx);
-
- time_t expires = 0;
- int ret = SOAP_OK;
-
- glite_jp_clear_error(ctx);
-
- if (glite_jpps_refresh_feed(ctx, in->feedId, &expires)){
- err2fault(ctx,soap);
- ret = SOAP_FAULT;
- return ret;
- }
- out->feedExpires = expires;
-
- return ret;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobFiles(
- struct soap *soap,
- struct _jpelem__GetJobFiles *in,
- struct _jpelem__GetJobFilesResponse *out)
-{
- CONTEXT_FROM_SOAP(soap,ctx);
- char *url;
-
- int i,n;
- glite_jp_error_t err;
- void **pd;
- struct jptype__jppsFile *f = NULL;
- glite_jp_attrval_t meta[2];
-
- memset(&err,0,sizeof err);
- n = 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;
- }
-
- 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;
-
- for (i=0; plugin->uris[i]; i++) {
- glite_jp_clear_error(ctx);
- switch (glite_jppsbe_get_job_url(ctx,in->jobid,plugin->classes[i],NULL,&url)) {
- case 0:
- f = realloc(f,(n + 1) * sizeof *f);
- f[n].class_ = soap_strdup(soap,plugin->uris[i]);
-#warning FIXME: file name required in WSDL
- f[n].name = NULL;
- f[n].url = soap_strdup(soap,url);
- n++;
- free(url);
- break;
- case ENOENT:
- break;
- default:
- err.code = ctx->error->code;
- err.source = "jpsrv__GetJob()";
- err.desc = plugin->uris[i];
- glite_jp_stack_error(ctx,&err);
- err2fault(ctx,soap);
- glite_jp_clear_error(ctx);
- return SOAP_FAULT;
- }
- }
- }
-
- if (!n) {
- glite_jp_clear_error(ctx);
- err.code = ENOENT;
- err.source = __FUNCTION__;
- err.desc = "No file found for this job";
- glite_jp_stack_error(ctx,&err);
- err2fault(ctx,soap);
-// glite_jp_clear_error(ctx);
- return SOAP_FAULT;
- }
-
- GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, files, struct jptype__jppsFile, n);
- for (i = 0; i < n; i++) memcpy(GLITE_SECURITY_GSOAP_LIST_GET(out->files, i), &f[i], sizeof(f[i]));
-
- return SOAP_OK;
-err:
- glite_jp_attrval_free(meta,0);
- err2fault(ctx,soap);
- return SOAP_FAULT;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobAttributes(
- struct soap *soap,
- struct _jpelem__GetJobAttributes *in,
- struct _jpelem__GetJobAttributesResponse *out)
-{
- 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)) {
- err2fault(ctx,soap);
- return SOAP_FAULT;
- }
-
- for (i=0; attr[i].name; i++);
- 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;
-}
+++ /dev/null
-static enum jptype__attrOrig jp2s_origin(glite_jp_attr_orig_t o)
-{
- switch (o) {
- case GLITE_JP_ATTR_ORIG_SYSTEM: return jptype__attrOrig__SYSTEM;
- case GLITE_JP_ATTR_ORIG_USER: return jptype__attrOrig__USER;
- case GLITE_JP_ATTR_ORIG_FILE: return jptype__attrOrig__FILE_;
- default: abort(); /* XXX */
- }
-}
-
-static int jp2s_attrValues(
- struct soap *soap,
- glite_jp_attrval_t *in,
- GLITE_SECURITY_GSOAP_LIST_TYPE(jptype, attrValue) *outp,
- int freeit)
-{
- GLITE_SECURITY_GSOAP_LIST_TYPE(jptype, attrValue) out;
- struct jptype__attrValue a;
- int i,cnt;
-
- for (cnt=0; in[cnt].name; cnt++);
-
- GLITE_SECURITY_GSOAP_LIST_CREATE0(soap, out, cnt, struct jptype__attrValue, cnt);
- for (i=0; in[i].name; i++) {
- memset(&a, 0, sizeof a);
- a.name = soap_strdup(soap,in[i].name);
- if (freeit) free(in[i].name);
- a.value = soap_malloc(soap,sizeof *a.value);
- memset(a.value, 0, sizeof *a.value);
- if (in[i].binary) {
- GSOAP_SETBLOB(a.value, soap_malloc(soap,sizeof *GSOAP_BLOB(a.value)));
- memset(GSOAP_BLOB(a.value),0,sizeof *GSOAP_BLOB(a.value));
- GSOAP_BLOB(a.value)->__ptr = soap_malloc(soap,in[i].size);
- GSOAP_BLOB(a.value)->__size = in[i].size;
- memcpy(GSOAP_BLOB(a.value)->__ptr,in[i].value,in[i].size);
- }
- else {
- GSOAP_SETSTRING(a.value, soap_strdup(soap,in[i].value));
- }
-
- if (freeit) free(in[i].value);
- a.origin = jp2s_origin(in[i].origin);
- a.originDetail = in[i].origin_detail ? soap_strdup(soap,in[i].origin_detail) : NULL;
- if (freeit) free(in[i].origin_detail);
- a.timestamp = in[i].timestamp;
-
- memcpy(GLITE_SECURITY_GSOAP_LIST_GET(out, i), &a, sizeof a);
- }
- if (freeit) free(in);
-
- *outp = out;
- return cnt;
-}
-
-static void attrValues_free(
- struct soap *soap,
- GLITE_SECURITY_GSOAP_LIST_TYPE(jptype, attrValue) a,
- int na)
-{
- int i;
- struct jptype__attrValue *ai;
-
- for (i=0; i<na; i++) {
- ai = GLITE_SECURITY_GSOAP_LIST_GET(a, i);
- if (GSOAP_ISSTRING(ai->value) && GSOAP_STRING(ai->value)) soap_dealloc(soap,GSOAP_STRING(ai->value));
- if (GSOAP_ISBLOB(ai->value) && GSOAP_BLOB(ai->value)) {
- soap_dealloc(soap,GSOAP_BLOB(ai->value)->__ptr);
- soap_dealloc(soap,GSOAP_BLOB(ai->value));
- }
- soap_dealloc(soap,ai->value);
- if (ai->originDetail) soap_dealloc(soap,ai->originDetail);
- }
- GLITE_SECURITY_GSOAP_LIST_DESTROY0(soap, a, na);
-}
+++ /dev/null
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <stdint.h>
-#include <sys/stat.h>
-
-#include <glite/lbu/trio.h>
-#include <glite/jp/types.h>
-#include "glite/jp/backend.h"
-#include "tags.h"
-
-/* magic name_len value_len binary sequence timestamp */
-#define HEADER "JP#TAG# %05u %012lu %c %05u %012lu#"
-#define HEADER_SIZE 48
-#define TAGS_MAGIC 0x74c016f2 /* two middle digits encode version, i.e. 01 */
-
-static int tagsread(void *fpctx,struct tags_handle *h);
-
-/*int glite_jpps_tag_append(
- glite_jp_context_t ctx,
- void *handle,
- const glite_jp_tagval_t *tag
-)
-{
- char hdr[HEADER_SIZE+1];
- glite_jp_error_t err;
-
- unsigned long vlen = tag->binary ? tag->size :
- (tag->value ? strlen(tag->value) : 0);
- int nlen;
-
- memset(&err,0,sizeof err);
- err.source = "glite_jpps_tag_append()";
-
- if (!tag->name) {
- err.code = EINVAL;
- err.desc = "tag name";
- return glite_jp_stack_error(ctx,&err);
- }
-
- nlen = strlen(tag->name);
-
- assert(sprintf(hdr,HEADER,nlen,vlen,
- tag->binary ? "B" : "S",
- tag->sequence, tag->timestamp) == HEADER_SIZE);
-
- if (glite_jppsbe_append(ctx,handle,hdr,HEADER_SIZE)) {
- err.code = EIO;
- err.desc = "write tag header";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (glite_jppsbe_append(ctx,handle,tag->name,nlen)) {
- err.code = EIO;
- err.desc = "write tag name";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (glite_jppsbe_append(ctx,handle,tag->value,vlen)) {
- err.code = EIO;
- err.desc = "write tag value";
- return glite_jp_stack_error(ctx,&err);
- }
-
- return 0;
-}
-
-int glite_jpps_tagval_copy(
- glite_jp_context_t ctx,
- glite_jp_tagval_t *from,
- glite_jp_tagval_t *to
-)
-{
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- to->name = strdup(from->name);
- if (!to->name) {
- err.code = ENOMEM;
- return glite_jp_stack_error(ctx,&err);
- }
- to->sequence = from->sequence;
- to->timestamp = from->timestamp;
- to->binary = from->binary;
- to->size = from->size;
- to->value = (char *) malloc(to->size);
- if (!to->value) {
- free(to->name);
- err.code = ENOMEM;
- return glite_jp_stack_error(ctx,&err);
- }
- memcpy(from->value, to->value, to->size);
-
- return 0;
-}
-
-int glite_jpps_tag_read(
- glite_jp_context_t ctx,
- void *handle,
- off_t offset,
- glite_jp_tagval_t *tagvalue,
- size_t *shift
-)
-{
- char hdr[HEADER_SIZE+1];
- unsigned int nlen;
- unsigned long vlen;
- char binary;
- unsigned sequence;
- unsigned timestamp;
- char * name = NULL;
- char * value = NULL;
- ssize_t ret;
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- hdr[HEADER_SIZE] = '\0';
- if (glite_jppsbe_pread(ctx, handle, hdr, HEADER_SIZE, offset, &ret)) {
- err.code = EIO;
- err.desc = "Cannot read tag header";
- goto error_out;
- }
- if (ret == 0) {
- err.code = ENOENT;
- err.desc = "No more tags in the file";
- goto error_out;
- }
- // #define HEADER "JP#TAG# %05u %012lu %c %05u %012lu#"
- if (sscanf(hdr, HEADER, &nlen, &vlen, &binary, &sequence, ×tamp) < 5) {
- err.code = EILSEQ;
- err.desc = "Incorrect tag header format";
- goto error_out;
- }
- name = (char*) malloc(nlen + 1);
- if (!name) {
- err.code = ENOMEM;
- goto error_out;
- }
- name[nlen] = '\0';
- value = (char*) malloc(vlen + 1);
- if (!value) {
- err.code = ENOMEM;
- goto error_out;
- }
- value[vlen] = '\0';
- if (glite_jppsbe_pread(ctx, handle, name, nlen, offset + HEADER_SIZE, &ret)) {
- err.code = EIO;
- err.desc = "Cannot read tag name";
- goto error_out;
- }
- if (glite_jppsbe_pread(ctx, handle, value, vlen, offset + HEADER_SIZE + nlen, &ret)) {
- err.code = EIO;
- err.desc = "Cannot read tag value";
- goto error_out;
- }
-
- tagvalue->name = name;
- tagvalue->sequence = sequence;
- tagvalue->timestamp = timestamp;
- tagvalue->binary = (binary == 'B') ? 1 : 0;
- tagvalue->size = vlen;
- tagvalue->value = value;
-
- *shift = HEADER_SIZE + nlen + vlen;
-
- return 0;
-error_out:
- free(name);
- free(value);
- return glite_jp_stack_error(ctx,&err);
-}*/
-
-/*
-int glite_jpps_tag_read(glite_jp_context_t, void *, off_t, glite_jp_tagval_t *, size_t);
-int glite_jpps_tag_readall(glite_jp_context_t, void *, glite_jp_tagval_t **);
-*/
-
-/*int glite_jpps_tag_readall(
- glite_jp_context_t ctx,
- void *handle,
- glite_jp_tagval_t **tags_out
-)
-{
- glite_jp_tagval_t * tags = NULL;
- void * newspace;
- int ntags = 0;
- int ntagspace = 0;
- off_t offset = 0;
- int ret;
- size_t shift;
- glite_jp_error_t err;
-
- glite_jp_clear_error(ctx);
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- ntagspace = 1;
- tags = (glite_jp_tagval_t *) calloc(ntagspace + 1, sizeof(*tags));
- if (!tags) {
- err.code = ENOMEM;
- return glite_jp_stack_error(ctx,&err);
- }
- while (!(ret = glite_jpps_tag_read(ctx, handle, offset, &tags[ntags], &shift))) {
- offset += shift;
- ntags++;
- if (ntagspace <= ntags) {
- ntagspace += 1;
- newspace = realloc(tags, (ntagspace + 1) * sizeof(*tags));
- if (!newspace) {
- err.code = ENOMEM;
- goto error_out;
- }
- tags = (glite_jp_tagval_t *) newspace;
- }
- }
- if (ret == ENOENT) {
- *tags_out = tags;
- return 0;
- } else {
- err.code = EIO;
- err.desc = "Error reading tag value";
- }
-
-error_out:
- for (; ntags-- ;) {
- free(tags[ntags].name);
- free(tags[ntags].value);
- }
- free(tags);
- return glite_jp_stack_error(ctx,&err);
-}*/
-
-int tag_append(void *fpctx,void *bhandle,glite_jp_attrval_t * tag)
-{
- //va_list ap;
- char *hdr,*rec;
- glite_jp_context_t ctx = fpctx;
- uint32_t magic,hlen,rlen,rlen_n;
- ssize_t r;
- glite_jp_error_t err;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
- glite_jp_clear_error(ctx);
-
- printf("tagappend: %s,%s\n",tag->name,tag->value);
-
- //assert(oper == GLITE_JP_FPLUG_TAGS_APPEND);
-
- if (glite_jppsbe_pread(ctx,bhandle,&magic,sizeof magic,0,&r)) {
- err.code = EIO;
- err.desc = "reading magic number";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (r == 0) {
- magic = htonl(TAGS_MAGIC);
- if (glite_jppsbe_pwrite(ctx,bhandle,&magic,sizeof magic,0)) {
- err.code = EIO;
- err.desc = "writing magic number";
- return glite_jp_stack_error(ctx,&err);
- }
- }
- else if (r != sizeof magic) {
- err.code = EIO;
- err.desc = "can't read magic number";
- return glite_jp_stack_error(ctx,&err);
- }
- else if (magic != htonl(TAGS_MAGIC)) {
- err.code = EINVAL;
- err.desc = "invalid magic number";
- return glite_jp_stack_error(ctx,&err);
- }
-
-/* XXX: origin is always USER, not recorded */
- trio_asprintf(&hdr,"%ld %c",
- tag->timestamp,tag->binary ? 'B' : 'S');
-
- rlen = strlen(tag->name) + strlen(hdr) + 2 /* \0 after name and after hdr */ +
- (r = tag->binary ? tag->size : (tag->value ? strlen(tag->value) : 0));
-
- rlen_n = htonl(rlen);
-
- rec = malloc(rlen + sizeof rlen_n);
- *((uint32_t *) rec) = rlen_n;
- strcpy(rec + sizeof rlen_n,tag->name);
- strcpy(rec + (hlen = sizeof rlen_n + strlen(tag->name) + 1),hdr);
-
- if (r) memcpy(rec + hlen + strlen(hdr) + 1,tag->value,r);
- free(hdr);
-
-/* record format:
- * - 4B length, net byte order
- * - attr name, \0
- * - %ld %c \0 (timestamp, B/S)
- * - value
- */
- if (glite_jppsbe_append(ctx,bhandle,rec,rlen + sizeof rlen_n)) {
- err.code = EIO;
- err.desc = "writing tag record";
- free(rec);
- return glite_jp_stack_error(ctx,&err);
- }
-
- /* XXX: should add tag also to handle->tags, but it is never used
- * currently */
-
- return 0;
-}
-
-int tag_attr(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t **attrval)
-{
- struct tags_handle *h = handle;
- glite_jp_error_t err;
- glite_jp_context_t ctx = fpctx;
- glite_jp_attrval_t *out = NULL;
- int i,nout = 0;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- if (!h->tags) tagsread(fpctx,handle);
-
- if (!h->tags) {
- err.code = ENOENT;
- err.desc = "no tags for this job";
- return glite_jp_stack_error(ctx,&err);
- }
-
- for (i=0; i<h->n; i++) if (!strcmp(h->tags[i].name,attr)) {
- out = realloc(out,(nout+2) * sizeof *out);
- glite_jp_attrval_copy(out+nout,h->tags+i);
- nout++;
- memset(out+nout,0,sizeof *out);
- }
-
- if (nout) {
- *attrval = out;
- return 0;
- }
- else {
- err.code = ENOENT;
- err.desc = "no value for this tag";
- return glite_jp_stack_error(ctx,&err);
- }
-}
-
-static int tagsread(void *fpctx,struct tags_handle *h)
-{
- glite_jp_context_t ctx = fpctx;
- uint32_t magic,rlen;
- glite_jp_error_t err;
- ssize_t r;
- size_t off = sizeof rlen;
- glite_jp_attrval_t *tp;
- char *rp;
-
- memset(&err,0,sizeof err);
- err.source = __FUNCTION__;
-
- glite_jp_clear_error(ctx);
-
-// read magic number
- if (glite_jppsbe_pread(ctx,h->bhandle,&magic,sizeof magic,0,&r)) {
- err.code = EIO;
- err.desc = "reading magic number";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (r != sizeof magic) {
- err.code = EIO;
- err.desc = "can't read magic number";
- return glite_jp_stack_error(ctx,&err);
- }
- else if (magic != htonl(TAGS_MAGIC)) {
- err.code = EINVAL;
- err.desc = "invalid magic number";
- return glite_jp_stack_error(ctx,&err);
- }
-
-
- while (1) {
- char *rec,type;
- int rd;
-
- // read record header
- if (glite_jppsbe_pread(ctx,h->bhandle,&rlen,sizeof rlen,off,&r)) {
- err.code = EIO;
- err.desc = "reading record header";
- return glite_jp_stack_error(ctx,&err);
- }
- if (r == 0) break;
-
- if (r != sizeof rlen) {
- err.code = EIO;
- err.desc = "can't read record header";
- return glite_jp_stack_error(ctx,&err);
- }
-
- off += r;
- rec = malloc(rlen = ntohl(rlen));
-
- // read whole record body thoroughly
- for (rd=0; rd<rlen; rd+=r) // XXX: will loop on 0 bytes read
- if (glite_jppsbe_pread(ctx,h->bhandle,rec+rd,rlen-rd,off+rd,&r)) {
- err.code = EIO;
- err.desc = "reading record body";
- free(rec);
- return glite_jp_stack_error(ctx,&err);
- }
-
- off += rlen;
-
- // parse the record
- h->tags = realloc(h->tags,(h->n+2) * sizeof *h->tags);
- tp = h->tags+h->n++;
- memset(tp,0,sizeof *tp);
-
- tp->name = strdup(rec);
- rp = rec + strlen(rec) + 1;
-
- sscanf(rp,"%ld %c",&tp->timestamp,&type);
- rp += strlen(rp) + 1;
- switch (type) {
- int i;
-
- case 'B': tp->binary = 1; break;
- case 'S': tp->binary = 0; break;
- default: free(rec);
- for (i=0; i<h->n; i++)
- glite_jp_attrval_free(h->tags+i,0);
- free(h->tags);
- h->tags = NULL;
- h->n = 0;
-
- err.code = EINVAL;
- err.desc = "invalid attr type (B/S)";
- return glite_jp_stack_error(ctx,&err);
- }
- tp->value = malloc((r=rlen - (rp - rec)) + 1);
- memcpy(tp->value,rp,r);
- if (!tp->binary) tp->value[r] = 0;
- tp->origin = GLITE_JP_ATTR_ORIG_USER;
-
- free(rec);
- }
- return 0;
-}
-
+++ /dev/null
-struct tags_handle {
- void *bhandle;
- int n;
- glite_jp_attrval_t *tags;
-};
-
-int tag_append(void *fpctx,void *bhandle,glite_jp_attrval_t * tag);
-//int glite_jpps_tag_append(glite_jp_context_t,void *,const char *, const char *);
-//int glite_jpps_tag_append(glite_jp_context_t,void *,const glite_jp_tagval_t *);
-int tag_attr(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t **attrval);
+++ /dev/null
-jpsrv = http://glite.org/wsdl/services/jp
-jptype = http://glite.org/wsdl/types/jp
-jpelem = http://glite.org/wsdl/elements/jp
+++ /dev/null
-# defaults
-top_srcdir=.
-builddir=build
-top_builddir=${top_srcdir}/${builddir}
-stagedir=.
-distdir=.
-globalprefix=glite
-jpprefix=jp
-package=glite-jp-server-common
-version=0.0.0
-PREFIX=/opt/glite
-
-glite_location=/opt/glite
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-
-CC=gcc
-
--include Makefile.inc
-
-
-VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/test:${top_srcdir}/project:${jpproject}:${stagedir}/interface
-
-DEBUG:=-g -O0 -W -Wall -DDEBUG
-CPPFLAGS:=-I. -I${top_srcdir}/interface -I${top_srcdir}/src -I${stagedir}/include -I${mysql_prefix}/include -I${mysql_prefix}/include/mysql
-CFLAGS:=${DEBUG} -D_GNU_SOURCE
-LDFLAGS:=-L${stagedir}/lib
-
-offset=0
-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} ${CPPFLAGS} ${CFLAGS}
-LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/lib ${LDFLAGS}
-LIBLINK:=${LINK} ${version_info}
-INSTALL:=libtool --mode=install install
-
-STATICLIB:=libglite_jp_server_common.a
-LTLIB:=libglite_jp_server_common.la
-
-
-SRCS:=db.c
-HDRS:=db.h
-OBJS:=${SRCS:.c=.o}
-LOBJS:=${OBJS:.o=.lo}
-
-default all: compile examples
-
-compile: ${LTLIB} ${STATICLIB}
-
-${LTLIB} ${STATICLIB}: ${OBJS}
- ${LIBLINK} -o $@ ${LOBJS} -lglite_lbu_db
-
-examples:
-
-check:
- -echo nothing yet
-
-doc:
-
-stage: compile
- $(MAKE) install PREFIX=${stagedir}
-
-install:
- -mkdir -p ${PREFIX}/lib ${PREFIX}/include/${globalprefix}/${jpprefix}
- ${INSTALL} -m 755 ${LTLIB} ${PREFIX}/lib
- for f in ${HDRS}; do \
- ${INSTALL} -m 644 ${top_srcdir}/interface/"$$f" ${PREFIX}/include/${globalprefix}/${jpprefix}; \
- done
-
-clean:
-
-%.o: %.c
- ${COMPILE} -c $< -o $@
-
-.PHONY: default all compile examples check doc stage dist distsrc distbin install clean
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the gLite JP Server Common module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2005/05/26 15:13:28 zurek
- inserted module.build.file
-
- Revision 1.2 2004/11/22 14:00:37 dimeglio
- Updated to use standard files
- Fixed names (was using common instead of real module name)
-
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
-<project name="server-common" default="dist">
-
- <!-- =========================================
- Builds the GLite JP Common Server Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "db.h"
-
-
-static void print_err(glite_jp_context_t ctx) {
- glite_jp_error_t *e;
-
- e = ctx->error;
- while (e) {
- printf("%s(%s)\n", e->desc, e->source);
- e = e->reason;
- }
- printf("\n");
-}
-
-
-int main() {
- glite_jp_context_t ctx;
- glite_jp_db_stmt_t jpstmt;
-
- glite_jp_init_context(&ctx);
-
- printf("connecting...\n");
- if (glite_jp_db_connect(ctx, "jpis/@localhost:jpis1") != 0) goto fail;
-
- // "trio" queries
-{
- int nr, i;
- char **res;
-
- printf("selecting...\n");
- if ((glite_jp_db_execstmt(ctx, "SELECT uniqueid, feedid, state, source, condition FROM feeds", &jpstmt)) == -1) goto fail;
-
- printf("fetching...\n");
- res = calloc(4, sizeof(char *));
- while ((nr = glite_jp_db_fetchrow(jpstmt, res)) > 0) {
- printf("Result: n=%d, res=%p\n", nr, res);
- i = 0;
- if (res) while(i < nr) {printf("p=%p(%s)\n", res[i], res[i]);free(res[i]);i++;}
- }
- free(res);
- printf("closing stmt...\n");
- glite_jp_db_freestmt(&jpstmt);
-}
-
- // param queries
-{
- char res_feedid[33];
- long int res_state;
- char res_source[256];
- char res_condition[1024];
- unsigned long res_condition_length;
- long int param_state;
-
- void *my_res, *my_param;
-
- glite_jp_db_create_params(&my_param, 1, GLITE_JP_DB_TYPE_INT, ¶m_state);
- glite_jp_db_create_results(&my_res, 4,
- GLITE_JP_DB_TYPE_VARCHAR, NULL, res_feedid, sizeof(res_feedid), NULL,
- GLITE_JP_DB_TYPE_INT, NULL, &res_state,
- GLITE_JP_DB_TYPE_VARCHAR, NULL, res_source, sizeof(res_source), NULL,
- GLITE_JP_DB_TYPE_MEDIUMBLOB, NULL, res_condition, sizeof(res_condition), &res_condition_length
- );
- printf("preparing...\n");
- if ((glite_jp_db_prepare(ctx, "SELECT feedid, state, source, condition FROM feeds WHERE state = ?", &jpstmt, my_param, my_res)) != 0) goto fail_close;
-
- param_state = 1;
- printf("executing state %ld...\n", param_state);
- if (glite_jp_db_execute(jpstmt) == -1) {
- glite_jp_db_freestmt(&jpstmt);
- goto fail_stmtclose;
- }
- printf("fetching...\n");
- while (glite_jp_db_fetch(jpstmt) == 0) {
- printf("feedid:%s, state:%ld, source:%s, condition:%s\n", res_feedid, res_state, res_source, res_condition);
- }
-
- param_state = 2;
- printf("executing state %ld...\n", param_state);
- if (glite_jp_db_execute(jpstmt) == -1) {
- glite_jp_db_freestmt(&jpstmt);
- goto fail_stmtclose;
- }
- printf("fetching...\n");
- while (glite_jp_db_fetch(jpstmt) == 0) {
- printf("feedid:%s, state:%ld, source:%s, condition:%s\n", res_feedid, res_state, res_source, res_condition);
- }
-}
-
- printf("closing stmt...\n");
- glite_jp_db_freestmt(&jpstmt);
- printf("closing...\n");
- glite_jp_db_close(ctx);
-
- glite_jp_free_context(ctx);
- return 0;
-
-fail_stmtclose:
- printf("closing stmt...\n");
- glite_jp_db_freestmt(&jpstmt);
-fail_close:
- printf("closing...\n");
- glite_jp_db_close(ctx);
-fail:
- printf("failed\n");
- print_err(ctx);
- glite_jp_free_context(ctx);
-
- return 1;
-}
+++ /dev/null
-#ifndef _DB_H
-#define _DB_H
-
-#ident "$Header$"
-
-#include "glite/jp/types.h"
-#include "glite/lbu/db.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int glite_jp_db_SetError(glite_jp_context_t ctx, const char *source);
-int glite_jp_db_ExecSQL(glite_jp_context_t ctx, const char *cmd, glite_lbu_Statement *stmt);
-int glite_jp_db_FetchRow(glite_jp_context_t ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results);
-int glite_jp_db_PrepareStmt(glite_jp_context_t ctx, const char *sql, glite_lbu_Statement *stmt);
-int glite_jp_db_ExecPreparedStmt(glite_jp_context_t ctx, glite_lbu_Statement stmt, int n,...);
-void glite_jp_db_FreeStmt(glite_lbu_Statement *stmt);
-int glite_jp_db_Transaction(glite_jp_context_t ctx);
-int glite_jp_db_Commit(glite_jp_context_t ctx);
-int glite_jp_db_Rollback(glite_jp_context_t ctx);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-#Sat Oct 15 06:50:18 CEST 2005
-module.build=3
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Configuration options for the gLite JP Index module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1.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
- - ares clean up (now should be mentioned only in modules that really need it)
- - patch for security.gsoap-plugin not yet in CVS (sent to interation list)
- I do not know what will happen when one try to mix ares with c-ares libs
- => weird things may arise!
-
- Revision 1.1.1.1 2005/09/15 16:53:25 valtri
- Initial import of common module for server side. It depends on mysql.
-
- Revision 1.4 2005/08/12 10:56:25 mmulac
- void IS server
- - seems compiling
-
- Revision 1.3 2004/12/01 18:45:38 zsalvet
- *** empty log message ***
-
- Revision 1.2 2004/11/22 14:00:37 dimeglio
- Updated to use standard files
- Fixed names (was using common instead of real module name)
-
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="JP Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-jpprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-gsoap_prefix=${with.gsoap.prefix}
-mysql_prefix=${with.mysql.prefix}
-mysql_version=${ext.mysql.version}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-cppunit=${with.cppunit.prefix}
-jpproject=${subsystem.project.dir}
-project=${component.project.dir}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP Common Server component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/11/22 14:00:37 dimeglio
- Updated to use standard files
- Fixed names (was using common instead of real module name)
-
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
-<project name="JP Common Server component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="server-common" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-module.version=1.2.0
-module.age=1
+++ /dev/null
-#ident "$Header$"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-#include "glite/jp/types.h"
-#include "glite/jp/context.h"
-
-#include "db.h"
-
-
-int glite_jp_db_SetError(glite_jp_context_t ctx, const char *source) {
- glite_jp_error_t jperr;
- char *desc;
-
- memset(&jperr, 0, sizeof jperr);
- if (ctx->dbhandle) {
- jperr.code = glite_lbu_DBError(ctx->dbhandle, NULL, &desc);
- if (jperr.code && source) jperr.source = source;
- jperr.desc = desc;
- } else {
- asprintf(&desc, "DB context isn't created");
- jperr.code = EINVAL;
- jperr.desc = desc;
- jperr.source = __FUNCTION__;
- }
- if (jperr.code) {
- glite_jp_stack_error(ctx, &jperr);
- free(desc);
- }
-
- return jperr.code;
-}
-
-
-int glite_jp_db_ExecSQL(glite_jp_context_t ctx, const char *cmd, glite_lbu_Statement *stmt) {
- int num;
-
- num = glite_lbu_ExecSQL(ctx->dbhandle, cmd, stmt);
- if (num < 0) glite_jp_db_SetError(ctx, __FUNCTION__);
-
- return num;
-}
-
-
-int glite_jp_db_FetchRow(glite_jp_context_t ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results) {
- int num;
-
- num = glite_lbu_FetchRow(stmt, n, lengths, results);
- if (num < 0) glite_jp_db_SetError(ctx, __FUNCTION__);
- return num;
-}
-
-
-int glite_jp_db_PrepareStmt(glite_jp_context_t ctx, const char *sql, glite_lbu_Statement *stmt) {
- int ret;
-
- ret = glite_lbu_PrepareStmt(ctx->dbhandle, sql, stmt);
- if (ret != 0) glite_jp_db_SetError(ctx, __FUNCTION__);
- return ret;
-}
-
-
-int glite_jp_db_ExecPreparedStmt(glite_jp_context_t ctx, glite_lbu_Statement stmt, int n,...) {
- va_list ap;
- int ret;
-
- va_start(ap, n);
- ret = glite_lbu_ExecPreparedStmt_v(stmt, n, ap);
- va_end(ap);
- if (ret < 0) glite_jp_db_SetError(ctx, __FUNCTION__);
- return ret;
-}
-
-
-void glite_jp_db_FreeStmt(glite_lbu_Statement *stmt) {
- glite_lbu_FreeStmt(stmt);
-}
-
-
-int glite_jp_db_Transaction(glite_jp_context_t ctx) {
- int ret;
-
- ret = glite_lbu_Transaction(ctx->dbhandle);
- if (ret != 0) glite_jp_db_SetError(ctx, __FUNCTION__);
-
- return ret;
-}
-
-
-int glite_jp_db_Commit(glite_jp_context_t ctx) {
- int ret;
-
- ret = glite_lbu_Commit(ctx->dbhandle);
- if (ret != 0) glite_jp_db_SetError(ctx, __FUNCTION__);
-
- return ret;
-}
-
-
-int glite_jp_db_Rollback(glite_jp_context_t ctx) {
- int ret;
-
- ret = glite_lbu_Rollback(ctx->dbhandle);
- if (ret != 0) glite_jp_db_SetError(ctx, __FUNCTION__);
-
- return ret;
-}
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# Default values
-top_srcdir=.
-builddir=build
-top_builddir=${top_srcdir}/${builddir}
-stagedir=.
-globalprefix=glite
-jpprefix=jp
-package=glite-jp-ws-interface
-version=0.0.0
-PREFIX=/opt/glite
-
--include Makefile.inc
-
-VPATH=${top_srcdir}/interface:${top_srcdir}/src
-STAGETO=interface
-
-XSLTPROC=xsltproc --nonet
-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
-
-WSDL=JobProvenancePS.wsdl JobProvenanceIS.wsdl JobProvenanceTypes.wsdl
-WSDL_S=jpdev.wsdl
-XSD=JobProvenanceTypes.xsd
-
-all compile: ${WSDL} ${XSD} JobProvenance.html ${WSDL_S}
-
-check:
- @echo No unit test required for interface-only module.
-
-stage: ${WSDL}
- $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
-
-install:
- -mkdir -p ${PREFIX}/${STAGETO}
- -mkdir -p ${PREFIX}/share/doc/${package}-${version}
- -mkdir -p ${PREFIX}/include/${globalprefix}/${jpprefix}
- install -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
- -install -m 644 JobProvenance.html ${PREFIX}/share/doc/${package}-${version}
-# cd ${top_srcdir}/interface && install -m 644 ${WSDL} ${PREFIX}/${STAGETO}
- install -m 644 ${WSDL} ${WSDL_S} ${XSD} ${PREFIX}/${STAGETO}
- install -m 644 ${top_srcdir}/src/ws_fault.c ${PREFIX}/include/${globalprefix}/${jpprefix}
-
-clean:
- rm -f *.h
-
-%.wsdl: %.xml puke-wsdl.xsl
- ${XSLTPROC} ../src/puke-wsdl.xsl $< >$@
- -${TIDY} -xml -m $@
-
-%.xsd: %.xml puke-schema.xsl
- ${XSLTPROC} ../src/puke-schema.xsl $< >$@
- -${TIDY} -xml -m $@
-
-JobProvenance.html: doc.xml JobProvenancePS.xml JobProvenanceIS.xml JobProvenanceTypes.xml puke-ug.xsl
- -${XSLTPROC} --novalid ../src/puke-ug.xsl $< >doc-html.xml && \
- ${XSLTPROC} --stringparam chapter.autolabel 0 ${docbookxls} doc-html.xml >$@
- -${TIDY} -xml -m doc-html.xml
- -${XMLLINT} --valid --noout doc-html.xml
- -${TIDY} -asxhtml -m $@
-
-jpdev.xml: jpdev.xml.sh JobProvenancePS.xml JobProvenanceIS.xml JobProvenanceTypes.xml
- ${top_srcdir}/src/jpdev.sh $< > $@
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite jp ws-interface component
-
- Authors: Joachim Flammer <Joachim.Flammer@Cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/12/10 09:32:29 akrenek
-
-
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="ws-interface" default="dist">
-
- <!-- ==============================================
- Builds the GLite jp ws-interface component
- ============================================== -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline properties & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <!-- Put your language target (java/c++-ant/c++-autotool/perl) here -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#Sat Oct 15 06:46:41 CEST 2005
-module.build=36
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration build properties file for the GLite jp ws-interface component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
-
-
--->
-<project name="jp ws-interface component configuration properties">
-
-<target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-jpprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
- </echo>
- </target>
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite jp ws-interface component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/16 14:36:49 flammer
-
- Corrected build.properties include.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="jp ws-interface component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="ws-interface" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-module.version=1.3.0
-module.age=1
+++ /dev/null
-<service name="JobProvenanceIS"
- ns="http://glite.org/wsdl/services/jp"
- prefix="jp"
- typeNs="http://glite.org/wsdl/types/jp"
- typePrefix="jpt"
- elemNs="http://glite.org/wsdl/elements/jp"
- elemPrefix="jpe">
-
- <version>CVS revision: <![CDATA[ $Header$ ]]></version>
-
- <import namespace="http://glite.org/wsdl/services/jp" location="JobProvenanceTypes.wsdl"/>
-
- <doc>
- <para>
- The Job Provenance (JP) Index Server is a volatile counterpart to the
- permanent JP Primary Storage. Index servers are populated with subsets
- of data from Primary storage(s) and indexed according to particular user needs.
- </para>
-
- <para>
- The interface to Index server contains three logical parts: administraive
- (control), system and user. The administrative part is used by run-time index
- server configuration tool, the system one allows Primary storage(s) to feed
- data into the Index server, and the user one is available to users for queries.
- </para>
- </doc>
-
- <fault name="genericFault"/>
-
- <operations>
-
- <!-- System operations -->
- <op name="UpdateJobs">
- Called by JP primary storage as a response to FeedIndex request.
- Updates information on jobs in index server, according to what JPPS
- currently knows.
- <input name="feedId" type="xsd:string">Id of the feed, as returned by JPPS FeedIndex operation.</input>
- <input name="feedDone" type="xsd:boolean">Flag of completed batch feed.</input>
- <input name="jobAttributes" type="jobRecord" list="yes">Attributes per job.</input>
-
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <!-- User operations -->
- <op name="QueryJobs">
- User query to index server.
- <input name="conditions" type="indexQuery" list="yes">
- Query conditions, similar to LB.
- </input>
- <input name="attributes" type="xsd:string" list="yes" optional="yes">
- Set of attributes to be retrieved directly from index server (if any).
- </input>
- <output name="jobs" type="jobRecord" list="yes">
- List of jobs matching the query.
- </output>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <!-- Admin operations -->
- <op name="AddFeed">
- Called by JP index serve admin tool to ask new primary storage server to feed it.
- Updates information on PS in index server, according to what JPPS
- currently knows.
- <input name="feed" type="feedSession">
- New feed IS URL, filter and query type.
- </input>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
- <op name="GetFeedIDs">
- Called by JP index serve admin tool to find out IS open feeds
- <input name="feeds" type="feedSession" list="yes">
- List of active feeds on IS.
- </input>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
- <op name="DeleteFeed">
- Called by JP index serve admin tool to remove one feed session.
- <input name="feedId" type="xsd:string">
- ID of feed to be removed.
- </input>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <!-- Config operations -->
- <op name="ServerConfiguration">
- Internal operation used for parsing XML config file.
- Not called at all, only forcing gSoap to generate XML parsers.
- <output name="attrs" type="attrType" list="yes">
- List of attributes which will JPPS send to JPIS.
- </output>
- <output name="indexedAttrs" type="xsd:string" list="yes">
- List of indexed attributes which will JPPS send to JPIS.
- </output>
- <output name="plugins" type="xsd:string" optional="yes" list="yes">
- List of type plugins.
- </output>
- <output name="feeds" type="feedSession" list="yes">
- List of requested feeds.
- </output>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- </operations>
-</service>
+++ /dev/null
-<service name="JobProvenancePS"
- ns="http://glite.org/wsdl/services/jp"
- prefix="jp"
- typeNs="http://glite.org/wsdl/types/jp"
- typePrefix="jpt"
- elemNs="http://glite.org/wsdl/elements/jp"
- elemPrefix="jpe">
-
- <version>CVS revision: <![CDATA[ $Header$ ]]></version>
-
- <import namespace="http://glite.org/wsdl/services/jp" location="JobProvenanceTypes.wsdl"/>
-
- <doc>
- <para>
- The Job Provenance (JP) Primary Storage Service is responsible to keep the JP data
- (definition of submitted jobs, execution conditions and environment, and important
- points of the job life cycle) in a compact and economic form.
- </para>
-
- <para>
- The JP Primary storage, as described in section 8.4 of the
- <ulink url="https://edms.cern.ch/document/594698/">Architecture deliverable DJRA1.1 </ulink>
- provides public interfaces for data storing, retrieval based on basic metadata,
- and registration of Index servers for incremental feed.
- </para>
-
- <para>
- Command interface to JP is completely covered by the WS interface covered here.
- Bulk file transfers are done via specialised protocols, currently gsiftp only.
- </para>
- </doc>
-
- <fault name="genericFault"/>
-
- <operations>
- <op name="RegisterJob">
- Register job with the JP primary storage.
- <input name="job" type="xsd:string">Jobid of the registered job.</input>
- <input name="owner" type="xsd:string">Owner of the job (DN of X509 certificate).</input>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="StartUpload">
- Start uploading a file.
- <input name="job" type="xsd:string">Jobid to which this file is related.</input>
- <input name="class" type="xsd:string">
- Type of the file (URI). The server must have a plugin handing this type.
- </input>
- <input name="name" type="xsd:string">Name of the file (used to distinguish among more files of the same type).</input>
- <input name="commitBefore" type="xsd:dateTime">The client promisses to finish the upload before this time.</input>
- <input name="contentType" type="xsd:string">MIME type of the file.</input>
- <output name="destination" type="xsd:string">URL where the client should upload the file.</output>
- <output name="commitBefore" type="xsd:dateTime">Server's view on when the upload must be finished.</output>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="CommitUpload">
- Confirm a successfully finished file apload.
- <input name="destination" type="xsd:string">Destination URL returned by StartUpload before.</input>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="RecordTag">
- Record an additional user tag.
- <input name="jobid" type="xsd:string">Job to which the tag is added.</input>
- <input name="tag" type="tagValue">Name and value of the tag.</input>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="RecordMultiTags">
- <input name="jobs" type="jobRecord" list="yes">Attributes per job</input>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="FeedIndex">
- Request for feeding a JP Index server (issued by this server).
- <input name="destination" type="xsd:string">Endpoint of the listening index server.</input>
- <input name="attributes" type="xsd:string" list="yes">Which attributes of jobs is the index server interested in.</input>
- <input name="conditions" type="primaryQuery" list="yes">Which jobs is the server interested in.</input>
- <input name="history" type="xsd:boolean">Data on jobs stored at PS in the past are required.</input>
- <input name="continuous" type="xsd:boolean">Data on jobs that will arrive in future are required.</input>
- <output name="feedId" type="xsd:string">Unique ID of the created feed session.</output>
- <output name="feedExpires" type="xsd:dateTime">When the session expires.</output>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="FeedIndexRefresh">
- Refresh an existing feed session.
- <input name="feedId" type="xsd:string">Existing feed session ID to be refreshed.</input>
- <output name="feedExpires" type="xsd:dateTime">New session expiration time.</output>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="GetJobFiles">
- Return URL's of files for a given single job.
- <input name="jobid" type="xsd:string">The job.</input>
- <output name="files" type="jppsFile" list="yes" optional="yes">List of the stored files.</output>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
-
- <op name="GetJobAttributes">
- Query concrete attributes of a given job.
- <input name="jobid" type="xsd:string">The job.</input>
- <input name="attributes" type="xsd:string" list="yes">Which attributes should be retrieved.</input>
- <output name="attrValues" type="attrValue" list="yes">Values of the queried attributes.</output>
- <fault name="genericFault" type="genericFault">Any error.</fault>
- </op>
- </operations>
-
-</service>
+++ /dev/null
-<?xml version="1.0"?>
-
-<service name="JobProvenanceTypes"
- ns="http://glite.org/wsdl/services/jp"
- typePrefix="jpt">
-
- <version>CVS revision: <![CDATA[ $Header$ ]]></version>
-
- <types ns="http://glite.org/wsdl/types/jp">
-
- <enum name="queryOp">
- Operators used in queries. Most are self-explanatory.
- <val name="EQUAL"></val>
- <val name="UNEQUAL"></val>
- <val name="LESS"></val>
- <val name="GREATER"></val>
- <val name="WITHIN">The attribute is between two specified values.</val>
- <val name="EXISTS">The attribute exists (even having a NULL value).</val>
- </enum>
-
- <struct name="tagValue">
- A single user-recorded value for a job attribute.
- <elem name="name" type="xsd:string">Name of the attribute, including namespace.</elem>
- <elem name="value" type="stringOrBlob" optional="yes">Value.</elem>
- </struct>
-
- <struct name="genericFault" fault="yes">
- <elem name="source" type="xsd:string"></elem>
- <elem name="code" type="xsd:int"></elem>
- <elem name="text" type="xsd:string"></elem>
- <elem name="description" type="xsd:string" optional="yes"></elem>
- <elem name="reason" type="genericFault" optional="yes"></elem>
- </struct>
-
- <struct name="primaryQuery">
- A single condition on job.
- <elem name="attr" type="xsd:string">Attribute name to query.</elem>
- <elem name="op" type="queryOp">Operation.</elem>
- <elem name="origin" type="attrOrig" optional="yes">Where the attribute value came from.</elem>
- <elem name="value" type="stringOrBlob" optional="yes">Value to compare the job attribute with.</elem>
- <elem name="value2" type="stringOrBlob" optional="yes">Another value (for op = WITHIN).</elem>
- </struct>
-
- <struct name="feedSession">
- One session between IS and PS (aka feed) charactetristics.
- <elem name="primaryServer" type="xsd:string">URL of primary server.</elem>
- <elem name="condition" type="primaryQuery" list="yes">Filter conditions.</elem>
- <elem name="history" type="xsd:int">Query type.</elem>
- <elem name="continuous" type="xsd:int">Query type</elem>
- <elem name="feedId" type="xsd:string" optional="yes">Unique ID of the feed session.</elem>
- </struct>
-
- <struct name="jppsFile">
- JP primary storage file identification.
- <elem name="class" type="xsd:string">Type of the file (as set on StartUpload).</elem>
- <elem name="name" type="xsd:string">Name of the file (if there are more of the same type per job).</elem>
- <elem name="url" type="xsd:string">Where the file is stored on JP primary storage.</elem>
- </struct>
-
- <struct name="attrValue">
- Single value of an attribute.
- <elem name="name" type="xsd:string">Name of the attribute, including namespace.</elem>
- <elem name="value" type="stringOrBlob" optional="yes">String value.</elem>
- <elem name="timestamp" type="xsd:dateTime">When this value was recorded.</elem>
- <elem name="origin" type="attrOrig">Where this value came from.</elem>
- <elem name="originDetail" type="xsd:string" optional="yes"></elem>
- </struct>
-
- <choice name="stringOrBlob">
- <elem name="string" type="xsd:string">String value.</elem>
- <elem name="blob" type="xsd:base64Binary">Binary value.</elem>
- </choice>
-
- <enum name="attrOrig">
- Specification of attribute origin.
- <val name="SYSTEM">JP system value, e.g. job owner.</val>
- <val name="USER">Explicitely stored by the user via RecordTag operation.</val>
- <val name="FILE">Coming from uploaded file.</val>
- </enum>
-
- <struct name="jobRecord">
- Information on a single job.
- Used for recording tags into JPPS, feeding JPIS from JPPS,
- and to answer user queries on JPIS.
- <elem name="jobid" type="xsd:string">ID of the job.</elem>
- <elem name="owner" type="xsd:string" optional="yes">Job owner.</elem>
- <elem name="attributes" type="attrValue" optional="yes" list="yes">
- Attribute values, required by query/feed and available right now.
- </elem>
- <elem name="primaryStorage" type="xsd:string" list="yes" optional="yes">
- User query only: which primary storage(s) have data on this job.
- </elem>
- <elem name="remove" type="xsd:boolean" optional="yes">
- UpdateJobs only: this job no longer belongs to the feed.
- Attribute values are those which caused the change.
- </elem>
- </struct>
-
- <struct name="indexQuery">
- Single query condition on a job.
- Similarly to LB, these outer conditions are logically ANDed.
- <elem name="attr" type="xsd:string">
- Which attribute the condition refers to.
- </elem>
- <elem name="origin" optional="yes" type="attrOrig">
- Specific attribute origin (if we do care).
- </elem>
- <elem name="record" list="yes" type="indexQueryRecord">
- List of conditions on attribute attr.
- These conditions are logically ORed.
- </elem>
- </struct>
-
- <struct name="indexQueryRecord">
- Single condition on an attribute.
- <elem name="op" type="queryOp">Query operation.</elem>
- <elem name="value" type="stringOrBlob" optional="yes">Value to compare attribute with.</elem>
- <elem name="value2" type="stringOrBlob" optional="yes">Value to compare attribute with.</elem>
- </struct>
-
- <enum name="yesNo">
- <val name="YES" />
- <val name="NO" />
- </enum>
-
- <struct name="attrType">
- Single type of an attribute
- <elem name="name" type="xsd:string">Name of the attribute</elem>
- <elem name="multival" type="yesNo">Cardinality of the attribute</elem>
- <elem name="queriable" type="yesNo">Quariable attribute (indexed)</elem>
- </struct>
-
- <list name="string"/>
- </types>
-
-</service>
-
+++ /dev/null
-<?xml version="1.0"?>
-<book/>
+++ /dev/null
-#! /bin/bash
-
-xmlcut() {
- echo -e "\t<!-- $1 -->"
- echo
- grep "<$2>" $(dirname $0)/JobProvenance$1.xml -A 1000 | grep "</$2>" -B 1000 | grep -v "<$2>\|</$2>"
-}
-
-xmlmerge() {
- xmlcut PS $1
- echo
- xmlcut IS $1
-}
-
-DOC="$(xmlmerge doc)"
-OPERATIONS="$(xmlmerge operations)"
-
-XML_TMPL=$(sed $(dirname $0)/$1 -e 's/"/\\"/g')
-eval "XML_RESULT=\"${XML_TMPL}\""
-echo "$XML_RESULT"
+++ /dev/null
-<service name="JobProvenance"
- ns="http://glite.org/wsdl/services/jp"
- prefix="jp"
- typeNs="http://glite.org/wsdl/types/jp"
- typePrefix="jpt"
- elemNs="http://glite.org/wsdl/elements/jp"
- elemPrefix="jpe">
-
- <version>CVS revision: <![CDATA[ \$Header$: ]]></version>
-
- <import namespace="http://glite.org/wsdl/services/jp" location="JobProvenanceTypes.wsdl"/>
-
- <doc>
-${DOC}
- </doc>
-
- <fault name="genericFault"/>
-
- <operations>
-${OPERATIONS}
- </operations>
-</service>
+++ /dev/null
-<?xml version="1.0"?>
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-
- xmlns:jp="http://glite.org/wsdl/services/jp"
- xmlns:jpe="http://glite.org/wsdl/elements/jp"
- xmlns:jpt="http://glite.org/wsdl/types/jp">
-
-<xsl:output indent="yes"/>
-
-<xsl:template match="/service">
-
- <xsl:apply-templates select="types"/>
-
-</xsl:template>
-
-<xsl:template match="types">
- <xsd:schema targetNamespace="{@ns}"
- elementFormDefault="unqualified"
- attributeFormDefault="unqualified">
-
- <xsl:apply-templates/>
- </xsd:schema>
-</xsl:template>
-
-<xsl:template match="enum">
- <xsd:simpleType name="{@name}">
- <xsd:restriction base="xsd:string">
- <xsl:for-each select="val"><xsd:enumeration value="{@name}"/></xsl:for-each>
- </xsd:restriction>
- </xsd:simpleType>
-</xsl:template>
-
-<xsl:template match="flags">
- <xsd:simpleType name="{@name}Value">
- <xsd:restriction base="xsd:string">
- <xsl:for-each select="val"><xsd:enumeration value="{@name}"/></xsl:for-each>
- </xsd:restriction>
- </xsd:simpleType>
- <xsd:complexType name="{@name}">
- <xsd:sequence>
- <xsd:element name="flag" type="{/service/@typePrefix}:{@name}Value" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-</xsl:template>
-
-<xsl:template match="struct">
- <xsd:complexType name="{@name}">
- <xsd:sequence>
- <xsl:call-template name="inner-struct"/>
- </xsd:sequence>
- </xsd:complexType>
-</xsl:template>
-
-<xsl:template match="choice">
- <xsd:complexType name="{@name}">
- <xsd:choice>
- <xsl:call-template name="inner-struct"/>
- </xsd:choice>
- </xsd:complexType>
-</xsl:template>
-
-
-<xsl:template name="inner-struct">
- <xsl:variable name="nillable">
- <xsl:choose>
- <xsl:when test="local-name(.)='choice'">true</xsl:when>
- <xsl:otherwise>false</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:for-each select="elem">
- <xsl:variable name="type">
- <xsl:choose>
- <xsl:when test="contains(@type,':')">
- <xsl:value-of select="@type"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="/service/@typePrefix"/>:<xsl:value-of select="@type"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="min">
- <xsl:choose>
- <xsl:when test="@optional='yes'">0</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="max">
- <xsl:choose>
- <xsl:when test="@list='yes'">unbounded</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsd:element name="{@name}" type="{$type}" minOccurs="{$min}" maxOccurs="{$max}" nillable="{$nillable}"/>
- </xsl:for-each>
-</xsl:template>
-
-<xsl:template match="op" mode="element">
- <xsd:element name="{@name}">
- <xsd:complexType>
- <xsd:sequence>
- <xsl:for-each select="input">
- <xsl:variable name="prefix">
- <xsl:choose>
- <xsl:when test="starts-with(@type,'xsd:')"/>
- <xsl:otherwise><xsl:value-of select="/service/@typePrefix"/>:</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="max">
- <xsl:choose>
- <xsl:when test="@list='yes'">unbounded</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsd:element name="{@name}" type="{$prefix}{@type}" minOccurs="1" maxOccurs="{$max}"/>
- </xsl:for-each>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="{@name}Response">
- <xsd:complexType>
- <xsd:sequence>
- <xsl:for-each select="output">
- <xsl:variable name="prefix">
- <xsl:choose>
- <xsl:when test="starts-with(@type,'xsd:')"/>
- <xsl:otherwise><xsl:value-of select="/service/@typePrefix"/>:</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="max">
- <xsl:choose>
- <xsl:when test="@list='yes'">unbounded</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsd:element name="{@name}" type="{$prefix}{@type}" minOccurs="1" maxOccurs="{$max}"/>
- </xsl:for-each>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
-</xsl:template>
-
-
-<xsl:template match="operations">
- <xsd:schema targetNamespace="{/service/@elemNs}"
- elementFormDefault="unqualified"
- attributeFormDefault="unqualified">
-
- <xsl:apply-templates select="op" mode="element"/>
-
- <xsl:for-each select="/service/fault">
- <xsd:element name="{@name}" type="{/service/@typePrefix}:{@name}"/>
- </xsl:for-each>
- </xsd:schema>
-
-</xsl:template>
-
-</xsl:stylesheet>
-
+++ /dev/null
-<?xml version="1.0"?>
-
-<!-- $Header$ -->
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-<xsl:output indent="yes" doctype-public="-//OASIS//DTD DocBook XML V4.2//EN"
- doctype-system="http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"/>
-
-<xsl:template match="book">
- <chapter>
- <title>Job Provenance</title>
-
- <sect1>
- <title>Primary Storage -- Overview</title>
- <xsl:copy-of select="document('JobProvenancePS.xml')/service/doc/*"/>
- </sect1>
-
- <sect1>
- <title>Primary Storage -- Operations</title>
- <para> <emphasis><xsl:value-of select="document('JobProvenancePS.xml')/service/version"/></emphasis> </para>
- <!-- xsl:apply-templates select="operations/op" -->
- <xsl:apply-templates select="document('JobProvenancePS.xml')/service/operations/op">
- <xsl:sort select="@name"/>
- </xsl:apply-templates>
- </sect1>
-
- <sect1>
- <title>Index Server -- Overview</title>
- <xsl:copy-of select="document('JobProvenanceIS.xml')/service/doc/*"/>
- </sect1>
-
- <sect1>
- <title>Index Server -- Operations</title>
- <para> <emphasis><xsl:value-of select="document('JobProvenanceIS.xml')/service/version"/></emphasis> </para>
- <!-- xsl:apply-templates select="operations/op" -->
- <xsl:apply-templates select="document('JobProvenanceIS.xml')/service/operations/op">
- <xsl:sort select="@name"/>
- </xsl:apply-templates>
- </sect1>
-
- <sect1>
- <title>JP Common Types</title>
- <!--xsl:apply-templates select="types"/ -->
- <para> <emphasis><xsl:value-of select="document('JobProvenanceTypes.xml')/service/version"/></emphasis> </para>
- <xsl:apply-templates select="document('JobProvenanceTypes.xml')/service/types"/>
- </sect1>
- </chapter>
-</xsl:template>
-
-
-<xsl:template match="input|output|fault">
- <varlistentry>
- <term>
- <!--type-->
- <xsl:if test = "@list = 'yes'">list of </xsl:if>
- <xsl:choose>
- <xsl:when test="not(starts-with(@type,'xsd:'))">
- <link linkend="type:{@type}">
- <type><xsl:value-of select="@type "/> </type> </link>
- </xsl:when>
- <xsl:otherwise><type><xsl:value-of select="@type "/> </type> </xsl:otherwise>
- </xsl:choose>
- <!--/type-->
- <parameter> <xsl:value-of select=" @name"/></parameter>
- </term>
- <listitem>
- <simpara><xsl:value-of select="text()"/></simpara>
- </listitem>
- </varlistentry>
-</xsl:template>
-
-<xsl:template match="op" >
- <sect2 id="op:{@name}">
- <title><xsl:value-of select="@name"/></title>
- <para><xsl:value-of select="text()"/></para>
- <para>
- Inputs:
- <xsl:choose>
- <xsl:when test="count(./input)>0">
- <variablelist>
- <xsl:apply-templates select="./input"/>
- </variablelist>
- </xsl:when>
- <xsl:otherwise>N/A</xsl:otherwise>
- </xsl:choose>
- </para>
- <para>
- Outputs:
- <xsl:choose>
- <xsl:when test="count(./output)>0">
- <variablelist>
- <xsl:apply-templates select="./output"/>
- </variablelist>
- </xsl:when>
- <xsl:otherwise>N/A</xsl:otherwise>
- </xsl:choose>
- </para>
- </sect2>
-</xsl:template>
-
-<xsl:template match="types">
- <xsl:for-each select="flags|enum|struct|choice">
- <xsl:sort select="@name"/>
- <sect2 id="type:{@name}">
- <title> <xsl:value-of select="@name"/> </title>
- <para> <xsl:value-of select="text()"/> </para>
- <xsl:choose>
- <xsl:when test="name(.)='struct'">
- <para> <emphasis>Structure</emphasis> (sequence complex type in WSDL)</para>
- <para> Fields: ( <type>type </type> <structfield>name</structfield> description )</para>
- </xsl:when>
- <xsl:when test="name(.)='choice'">
- <para> <emphasis>Union</emphasis> (choice complex type in WSDL)</para>
- <para> Fields: ( <type>type </type> <structfield>name</structfield> description )</para>
- </xsl:when>
- <xsl:when test="name(.)='enum'">
- <para> <emphasis>Enumeration</emphasis> (restriction of xsd:string in WSDL),
- exactly one of the values must be specified.
- </para>
- <para> Values: </para>
- </xsl:when>
- <xsl:when test="name(.)='flags'">
- <para> <emphasis>Flags</emphasis> (sequence of restricted xsd:string in WSDL),
- any number of values can be specified together.
- </para>
- <para> Values: </para>
- </xsl:when>
- </xsl:choose>
- <variablelist>
- <xsl:for-each select="elem|val">
- <varlistentry>
- <term>
- <xsl:choose>
- <xsl:when test="name(.)='elem'">
- <xsl:if test="@list = 'yes'">list of </xsl:if>
- <xsl:choose>
- <xsl:when test="@type!='string' and @type!='int' and not(starts-with(@type,'xsd:'))">
- <link linkend="type:{@type}">
- <type><xsl:value-of select="@type "/> </type>
- </link>
- </xsl:when>
- <xsl:otherwise><type><xsl:value-of select="@type "/></type></xsl:otherwise>
- </xsl:choose>
- <!-- <type><xsl:value-of select="@type"/></type> -->
- <xsl:value-of select="' '"/>
- <structfield><xsl:value-of select="@name"/></structfield>
- </xsl:when>
- <xsl:otherwise>
- <constant><xsl:value-of select="@name"/></constant>
- </xsl:otherwise>
- </xsl:choose>
- </term>
- <listitem>
- <simpara>
- <xsl:if test="@optional = 'yes'"> (optional) </xsl:if>
- <!-- <xsl:if test="@list = 'yes'"> (multiple occurence) </xsl:if> -->
- <xsl:value-of select=" text()"/>
- </simpara>
- </listitem>
- </varlistentry>
- </xsl:for-each>
- </variablelist>
- </sect2>
- </xsl:for-each>
-</xsl:template>
-
-
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0"?>
-
-<xsl:stylesheet version="1.0"
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
- xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
-
- xmlns:jp="http://glite.org/wsdl/services/jp"
- xmlns:jpe="http://glite.org/wsdl/elements/jp"
- xmlns:jpt="http://glite.org/wsdl/types/jp">
-
-<xsl:output indent="yes"/>
-
-<xsl:template match="/service">
- <definitions
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- name="{@name}"
- targetNamespace="{@ns}">
- <documentation>
- <xsl:value-of select="version"/>
- <xsl:value-of select="text()"/>
- </documentation>
-
- <xsl:apply-templates select="import"/>
-
- <xsl:apply-templates select="types"/>
-
-<!-- <xsl:apply-templates select="fault"/> -->
-
- <xsl:apply-templates select="operations"/>
-
- </definitions>
-</xsl:template>
-
-<xsl:template match="types">
- <wsdl:types>
- <xsd:schema targetNamespace="{@ns}"
- elementFormDefault="unqualified"
- attributeFormDefault="unqualified">
-
- <xsl:apply-templates/>
- </xsd:schema>
- </wsdl:types>
- <!-- <xsl:apply-templates select="struct[@fault='yes']" mode="message"/> -->
-</xsl:template>
-
-<!--
-<xsl:template match="simple">
- <xsd:element name="{@name}" type="xsd:{@name}"/>
- <xsd:complexType name="{@name}List">
- <xsd:sequence>
- <xsd:element name="{@name}" type="xsd:{@name}" minOccurs="0" maxOccurs="unbounded"></xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- <xsd:element name="{@name}List" type="{/service/@typePrefix}:{@name}List"/>
-</xsl:template>
-
-<xsl:template match="list">
- <xsd:complexType name="{@name}List">
- <xsd:sequence>
- <xsd:element name="{@name}" type="xsd:{@name}" minOccurs="0" maxOccurs="unbounded"></xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-</xsl:template>
--->
-
-<xsl:template match="enum">
- <xsd:simpleType name="{@name}">
- <xsd:restriction base="xsd:string">
- <xsl:for-each select="val"><xsd:enumeration value="{@name}"/></xsl:for-each>
- </xsd:restriction>
- </xsd:simpleType>
-<!-- <xsd:element name="{@name}" type="{/service/@typePrefix}:{@name}"/> -->
-</xsl:template>
-
-<xsl:template match="flags">
- <xsd:simpleType name="{@name}Value">
- <xsd:restriction base="xsd:string">
- <xsl:for-each select="val"><xsd:enumeration value="{@name}"/></xsl:for-each>
- </xsd:restriction>
- </xsd:simpleType>
- <xsd:complexType name="{@name}">
- <xsd:sequence>
- <xsd:element name="flag" type="{/service/@typePrefix}:{@name}Value" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-<!-- <xsd:element name="{@name}" type="{/service/@typePrefix}:{@name}"/> -->
-</xsl:template>
-
-<xsl:template match="struct">
- <xsd:complexType name="{@name}">
- <xsd:sequence>
- <xsl:call-template name="inner-struct"/>
- </xsd:sequence>
- </xsd:complexType>
-</xsl:template>
-
-<xsl:template match="choice">
- <xsd:complexType name="{@name}">
- <xsd:choice>
- <xsl:call-template name="inner-struct"/>
- </xsd:choice>
- </xsd:complexType>
-</xsl:template>
-
-
-<xsl:template name="inner-struct">
- <xsl:variable name="nillable">
- <xsl:choose>
- <xsl:when test="local-name(.)='choice'">true</xsl:when>
- <xsl:otherwise>false</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:for-each select="elem">
- <xsl:variable name="type">
- <xsl:choose>
- <xsl:when test="contains(@type,':')">
- <xsl:value-of select="@type"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="/service/@typePrefix"/>:<xsl:value-of select="@type"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="min">
- <xsl:choose>
- <xsl:when test="@optional='yes'">0</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="max">
- <xsl:choose>
- <xsl:when test="@list='yes'">unbounded</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsd:element name="{@name}" type="{$type}" minOccurs="{$min}" maxOccurs="{$max}" nillable="{$nillable}"/>
- </xsl:for-each>
-<!--
- <xsd:complexType name="{@name}List">
- <xsd:sequence>
- <xsd:element name="{@name}" type="{/service/@typePrefix}:{@name}" minOccurs="0" maxOccurs="unbounded"></xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- <xsd:element name="{@name}" type="{/service/@typePrefix}:{@name}"/>
- <xsd:element name="{@name}List" type="{/service/@typePrefix}:{@name}List"/>
--->
-</xsl:template>
-
-<xsl:template match="op" mode="message">
- <wsdl:message name="{@name}Request">
- <wsdl:part name="input" element="{/service/@elemPrefix}:{@name}">
- <wsdl:documentation><xsl:value-of select="text()"/></wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="{@name}Response">
- <wsdl:part name="output" element="{/service/@elemPrefix}:{@name}Response">
- <wsdl:documentation><xsl:value-of select="text()"/></wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
-</xsl:template>
-
-<xsl:template match="op" mode="element">
- <xsd:element name="{@name}">
- <xsd:complexType>
- <xsd:sequence>
- <xsl:for-each select="input">
- <xsl:variable name="prefix">
- <xsl:choose>
- <xsl:when test="starts-with(@type,'xsd:')"/>
- <xsl:otherwise><xsl:value-of select="/service/@typePrefix"/>:</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="max">
- <xsl:choose>
- <xsl:when test="@list='yes'">unbounded</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsd:element name="{@name}" type="{$prefix}{@type}" minOccurs="1" maxOccurs="{$max}"/>
- </xsl:for-each>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
- <xsd:element name="{@name}Response">
- <xsd:complexType>
- <xsd:sequence>
- <xsl:for-each select="output">
- <xsl:variable name="prefix">
- <xsl:choose>
- <xsl:when test="starts-with(@type,'xsd:')"/>
- <xsl:otherwise><xsl:value-of select="/service/@typePrefix"/>:</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="max">
- <xsl:choose>
- <xsl:when test="@list='yes'">unbounded</xsl:when>
- <xsl:otherwise>1</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsd:element name="{@name}" type="{$prefix}{@type}" minOccurs="1" maxOccurs="{$max}"/>
- </xsl:for-each>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
-</xsl:template>
-
-
-<xsl:template match="struct[@fault='yes']" mode="message">
- <wsdl:message name="{@name}">
- <wsdl:part name="{@name}" element="{/service/@typePrefix}:{@name}">
- <wsdl:documentation><xsl:value-of select="text()"/></wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
-</xsl:template>
-
-<xsl:template match="op" mode="port-type">
- <wsdl:operation name="{@name}">
- <wsdl:documentation><xsl:value-of select="text()"/></wsdl:documentation>
- <wsdl:input name="i" message="{/service/@prefix}:{@name}Request"/>
- <wsdl:output name="o" message="{/service/@prefix}:{@name}Response"/>
- <wsdl:fault name="f" message="{/service/@prefix}:{fault/@name}"/>
- </wsdl:operation>
-</xsl:template>
-
-<xsl:template match="op" mode="binding">
- <wsdl:operation name="{@name}">
- <soap:operation style="document"/>
- <wsdl:input name="i">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="o">
- <soap:body use="literal"/>
- </wsdl:output>
- <wsdl:fault name="f">
- <soap:fault name="f" use="literal"/>
- </wsdl:fault>
- </wsdl:operation>
-</xsl:template>
-
-<xsl:template match="import">
- <wsdl:import namespace="{@namespace}" location="{@location}"/>
-</xsl:template>
-
-<xsl:template match="operations">
- <wsdl:types>
- <xsd:schema targetNamespace="{/service/@elemNs}"
- elementFormDefault="unqualified"
- attributeFormDefault="unqualified">
-
- <xsl:apply-templates select="op" mode="element"/>
-
- <xsl:for-each select="/service/fault">
- <xsd:element name="{@name}" type="{/service/@typePrefix}:{@name}"/>
- </xsl:for-each>
- </xsd:schema>
- </wsdl:types>
-
- <xsl:apply-templates select="/service/fault"/>
-
- <xsl:apply-templates select="op" mode="message"/>
-
- <wsdl:portType name="{/service/@name}PortType">
- <xsl:apply-templates select="op" mode="port-type"/>
- </wsdl:portType>
-
- <binding name="{/service/@name}" type="{/service/@prefix}:{/service/@name}PortType">
- <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
- <xsl:apply-templates select="op" mode="binding"/>
- </binding>
-
- <service name="{/service/@name}">
- <documentation><xsl:value-of select="text()"/></documentation>
- <port name="{/service/@name}" binding="{/service/@prefix}:{/service/@name}">
- <soap:address location="http://test.glite.org/{/service/@prefix}:8080"/>
- </port>
-
- </service>
-
-</xsl:template>
-
-<xsl:template match="fault">
- <wsdl:message name="{@name}">
- <wsdl:part name="{@name}" element="{/service/@elemPrefix}:{@name}" />
- </wsdl:message>
-</xsl:template>
-
-
-</xsl:stylesheet>
-
+++ /dev/null
-#ident "$Header: "
-
-#include <syslog.h>
-#include <assert.h>
-#include <glite/jp/types.h>
-#include <glite/security/glite_gscompat.h>
-
-#ifndef UNUSED
- #ifdef __GNUC__
- #define UNUSED __attribute__((unused))
- #else
- #define UNUSED
- #endif
-#endif
-
-#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) UNUSED;
-static int glite_jp_clientGetErrno(struct soap *soap, int err) UNUSED;
-static void glite_jp_server_err2fault(const glite_jp_context_t ctx,struct soap *soap) UNUSED;
-
-static struct jptype__genericFault* jp2s_error(struct soap *soap, const glite_jp_error_t *err);
-static int clientGetFault(struct soap *soap, int err, const char **reason, struct jptype__genericFault **f, const char **fallback);
-
-
-/*
- * get client fault structs
- * err - code got from soap call
- * reason - error text
- * f - extended fault structs or NULL
- * fallback - xml fault description or NULL
- * return values:
- * 0 - OK
- * 1 - got a extended fault info
- * 2 - internal gsoap fault
- */
-static int clientGetFault(struct soap *soap, int err, const char **reason, struct jptype__genericFault **f, const char **fallback) {
- struct SOAP_ENV__Detail *detail;
-
- *f = NULL;
- if (fallback) *fallback = NULL;
-
- switch(err) {
- case SOAP_OK:
- return 0;
-
- case SOAP_FAULT:
- case SOAP_SVR_FAULT:
- detail = GLITE_SECURITY_GSOAP_DETAIL(soap);
- if (reason) *reason = GLITE_SECURITY_GSOAP_REASON(soap);
-
- if (!detail) return 1;
- if (detail->__type != GFNUM && detail->__any) {
- // compatibility with clients gSoaps < 2.7.9b
- if (fallback) *fallback = detail->__any;
- return 1;
- }
- // client is based on gSoap 2.7.9b
- assert(detail->__type == GFNUM);
-#if GSOAP_VERSIO >= 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
- return 1;
-
- default:
- return 2;
- }
-}
-
-
-static int glite_jp_clientGetErrno(struct soap *soap, int err) {
- struct jptype__genericFault *f;
-
- switch(clientGetFault(soap, err, NULL, &f, NULL)) {
- case 0: return 0;
- case 1: return f ? f->code : -2;
- default: return -1;
- }
-}
-
-
-static int glite_jp_clientCheckFault(struct soap *soap, int err, const char *name, int toSyslog)
-{
- struct jptype__genericFault *f;
- const char *reason, *xml;
- char indent[200] = " ";
- char *prefix;
- int retval;
-
- if (name) asprintf(&prefix, "[%s] ", name);
- else prefix = strdup("");
-
- switch(clientGetFault(soap, err, &reason, &f, &xml)) {
- case 0:
- retval = 0;
- dprintf("%sOK\n", prefix);
- break;
-
- case 1:
- retval = -1;
- dprintf("%s%s\n", prefix, reason);
- if (toSyslog) syslog(LOG_ERR, "%s", reason);
- if (!f && xml) {
- dprintf("%s%s%s\n", prefix, indent, xml);
- if (toSyslog) syslog(LOG_ERR, "%s", xml);
- }
- 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)",
- prefix, f->source, f->text, f->description);
- f = f->reason;
- strcat(indent," ");
- }
- break;
-
- case 2:
- fprintf(stderr, "%ssoap err=%d, ", prefix, err);
- soap_print_fault(soap, stderr);
- retval = -1;
- break;
- }
-
- 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 = err->desc ? soap_strdup(soap,err->desc) : NULL;
- 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;
- struct jptype__genericFault *item;
-#if GSOAP_VERSION >= 20709
- struct jptype__genericFault *f;
- item = f = jp2s_error(soap,ctx->error);
-#else
- struct _genericFault *f = soap_malloc(soap, sizeof *f);
- item = f->jpelem__genericFault = jp2s_error(soap,ctx->error);
-#endif
- soap_receiver_fault(soap,"Oh, shit!",NULL);
- // no error in JP context?
- if (!item) return;
-
- detail = (struct SOAP_ENV__Detail *)soap_faultdetail(soap);
-#if GSOAP_VERSION >= 20700
- detail->fault = (void *)f;
-#else
- detail->value = (void *)f;
-#endif
- detail->__type = GFNUM;
- detail->__any = NULL;
-
- if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail;
- else soap->fault->detail = detail;
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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
-
- Build file for the GLite Middleware Job Provenance Subsystem
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.12 2006/05/05 11:52:37 jpospi
- conditional disabling of cross-subsystem builds via "jponly" property
-
- 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.
-
- Revision 1.10 2005/10/14 17:23:07 akrenek
- added jp.client
-
- Revision 1.9 2005/10/11 20:37:50 akrenek
- added dependencies on lb.server-bones and security.gsoap-plugin
-
- Revision 1.8 2005/10/10 11:07:09 valtri
- Make autobuilds happy.
-
- Revision 1.7 2005/09/22 16:49:46 valtri
- More places with dependencies.
-
- Revision 1.6 2005/09/22 10:47:58 valtri
- jp.server-common dependency to build.xml too
-
- Revision 1.5 2005/05/26 15:13:22 zurek
- inserted module.build.file
-
- Revision 1.4 2004/12/17 20:26:46 dimeglio
- Removed index
-
- Revision 1.3 2004/12/10 09:46:41 akrenek
- included ws-interface
-
- Revision 1.2 2004/12/01 18:36:00 zsalvet
- Add component targets.
-
- Revision 1.1 2004/11/22 13:21:49 dimeglio
- First version of this file
-
--->
-
-<project name="jp" default="dist">
-
- <description>
- Ant build file to build the GLite Job Provenance Subsystem
- </description>
-
- <!-- =========================================
- Builds the GLite JP subsystem
- ========================================= -->
-
- <!-- Import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- Import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="./project/properties.xml" />
-
- <!-- Import global build properties and global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependencies properties files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${subsystem.dependencies.file}"/>
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options
- ========================================= -->
- <import file="${global.configure.options.file}"/>
-
- <!-- =========================================
- Import global task definitions
- ========================================= -->
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Import global compiler definitions
- ========================================= -->
- <import file="${global.compilerdefs.file}" />
-
- <!-- =========================================
- Import targets
- ========================================= -->
- <import file="${global.targets-common.file}"/>
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ===============================================
- Public common targets
- =============================================== -->
-
- <target name="localinit" depends="envcheck">
-
- <echo> Preparing directories ... </echo>
-
- <mkdir dir="${stage.bin.dir}" />
- <mkdir dir="${stage.lib.dir}" />
- <mkdir dir="${stage.java.dir}" />
- <mkdir dir="${stage.inc.dir}" />
- <mkdir dir="${stage.int.dir}" />
-
- <mkdir dir="${dist.dir}" />
-
- </target>
-
- <target name="init" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="init"/>
- </antcall>
- </target>
-
- <target name="checkstyle" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="checkstyle"/>
- </antcall>
- </target>
-
- <target name="compile" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compile"/>
- </antcall>
- </target>
-
- <target name="compiletest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compiletest"/>
- </antcall>
- </target>
-
- <target name="unittest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unittest"/>
- </antcall>
- </target>
-
- <target name="unitcoverage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unitcoverage"/>
- </antcall>
- </target>
-
- <target name="stage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="stage"/>
- </antcall>
- </target>
-
- <target name="dist" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="dist"/>
- </antcall>
- </target>
-
- <target name="install" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="install"/>
- </antcall>
- </target>
-
- <target name="doc" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="doc"/>
- </antcall>
- </target>
-
- <target name="all" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="all"/>
- </antcall>
- </target>
-
- <target name="clean" depends="envcheck">
-
- <property name="offline.repository" value="true" />
- <antcall target="buildmodules">
- <param name="target" value="clean"/>
- </antcall>
-
- <delete dir="${module.bin.dir}" />
- <delete dir="${module.lib.dir}" />
- <delete dir="${module.autosrc.dir}" />
- <delete dir="${module.autodoc.dir}" />
- <delete dir="${module.test.reports.dir}" />
-
- </target>
-
- <target name="cleanAll" depends="clean"/>
-
- <!-- ===============================================
- Private targets
- =============================================== -->
-
- <!-- ===============================================
- Modules proxy targets
- =============================================== -->
-
- <!-- component targets definitions tag = do not remove = -->
-
- <target name="security.gsoap-plugin" unless="jponly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${security.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="gsoap-plugin -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${security.subsystem.dir}"
- target="gsoap-plugin"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <target name="lb.server-bones" unless="jponly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${lb.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="server-bones -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}"
- target="server-bones"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <if>
- <isset property="setenvonly"/>
- <then>
- <property name="jponly" value="yes"/>
- </then>
- </if>
-
- <target name="lb.common" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${lb.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="common -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}"
- target="common"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <target name="lb.client-interface" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${lb.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="client-interface -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}"
- target="client-interface"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <target name="ws-interface" unless="setenvonly" depends="envset" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.ws-interface" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.ws-interface"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="common" unless="setenvonly" depends="envset,lb.client-interface" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.common" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.common"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="index" unless="setenvonly" depends="envset, common, server-common,security.gsoap-plugin,lb.server-bones" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.index" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.index"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="primary" unless="setenvonly" depends="envset, ws-interface, common, server-common,security.gsoap-plugin,lb.server-bones" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.primary" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.primary"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="server-common" unless="setenvonly" depends="envset, mysql, common,lb.common" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.server-common" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.server-common"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="client" unless="setenvonly" depends="envset, libtar, common" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.client" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.client"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <!-- Main proxy -->
- <target name="buildmodules" depends="envset,
- ws-interface,
- common,
- primary,
- server-common,
- client,
- index">
- <echo append="true" file="${global.project.dir}/cruisecontrol-stub.xml">
- <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/>
- </echo>
- </target>
-
-</project>
+++ /dev/null
-All JP documentation is now in org.glite.jp.doc module.
+++ /dev/null
-#Fri Oct 14 15:24:20 CEST 2005
-module.build=38
+++ /dev/null
-ext.gsoap.version=2.7.9d
-ext.gsoap.rep.file=gSOAP-2.7.9d.tar.gz
+++ /dev/null
-###################################################################
-# System dependencies
-###################################################################
-
-org.glite.version = glite_branch_3_1_0
-org.glite.jp.version = HEAD
-
-# Component dependencies tag = do not remove this line =
-org.glite.jp.ws-interface.version = HEAD
-org.glite.jp.common.version = HEAD
-org.glite.jp.server-common.version = HEAD
-org.glite.jp.index.version = HEAD
-org.glite.jp.primary.version = HEAD
-org.glite.jp.client.version = HEAD
-
-ext.gsoap.version = 2.7.9d
+++ /dev/null
-<?xml version="1.0"?>
-<!--
- 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 Middleware Job Provenance Configuration Specification File
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.5 2005/11/23 08:24:23 zsalvet
- Add jp.client component.
-
- Revision 1.4.2.2 2005/10/20 06:55:15 zsalvet
- Add libtar and mysql external dependencies.
-
- Revision 1.4.2.1 2005/10/17 09:49:02 akrenek
- added jp.client module targets
-
- Revision 1.4 2005/10/03 17:00:50 valtri
- Automatically checkout the new module yet.
-
- Revision 1.3 2004/12/10 09:46:41 akrenek
- included ws-interface
-
- Revision 1.2 2004/12/01 18:24:25 zsalvet
- common, index, and primary components defined
-
- Revision 1.1 2004/11/22 13:21:49 dimeglio
- First version of this file
-
--->
-
-
-<project name="GLite Middleware JP CSF" default="all">
-
- <!-- ===============================================
- Determine workspace directory
- =============================================== -->
-
- <!-- Relative workspace root directory -->
- <property name="workspace.dir" value="../.." />
-
- <!-- ===============================================
- Load properties
- =============================================== -->
-
- <!-- load baseline and user properties -->
- <import file="${workspace.dir}/org.glite/project/baseline.properties.xml" />
-
- <!-- define build properties file location since we are already in project dir -->
- <property name="subsystem.build.properties.file" value="./build.properties" />
-
- <!-- Load subsystem-specific property file -->
- <property file="./properties.xml"/>
-
- <!-- load global properties -->
- <import file="${global.properties.file}" />
-
- <!-- ===============================================
- Load dependencies
- =============================================== -->
-
- <!-- Load user dependencies file -->
- <property file="${user.dependencies.file}" />
-
- <!-- Load subsystem dependencies file -->
- <property file="./dependencies.properties" />
-
- <!-- Load global dependencies file -->
- <property file="${global.dependencies.file}" />
-
- <!-- ===============================================
- Load targets
- =============================================== -->
- <import file="${global.targets-envchecks.file}" />
- <import file="${global.targets-external-dependencies.file}" />
-
- <!-- ===============================================
- Evaluate CVS tags
- =============================================== -->
-
- <target name="evaluate.cvs.tags" description="Figure out if we need tagged CVS checkout">
-
- <condition property="glite.head">
- <and>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
-
- <condition property="glite.tag">
- <and>
- <not>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- </not>
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
-
- <condition property="glite-jp.head">
- <and>
- <equals arg1="${org.glite.jp.version}" arg2="HEAD" />
- <istrue value="${update}" />
- </and>
- </condition>
-
- <condition property="glite-jp.tag">
- <and>
- <not>
- <equals arg1="${org.glite.jp.version}" arg2="HEAD" />
- </not>
- <istrue value="${update}" />
- </and>
- </condition>
-
- <!-- condition property tag = do not remove = -->
-
- <condition property="common.head">
- <equals arg1="${org.glite.jp.common.version}" arg2="HEAD" />
- </condition>
-
- <condition property="ws-interface.head">
- <equals arg1="${org.glite.jp.ws-interface.version}" arg2="HEAD" />
- </condition>
-
- <condition property="index.head">
- <equals arg1="${org.glite.jp.index.version}" arg2="HEAD" />
- </condition>
-
- <condition property="primary.head">
- <equals arg1="${org.glite.jp.primary.version}" arg2="HEAD" />
- </condition>
-
- <condition property="client.head">
- <equals arg1="${org.glite.jp.client.version}" arg2="HEAD" />
- </condition>
-
- <condition property="server-common.head">
- <equals arg1="${org.glite.jp.server-common.version}" arg2="HEAD" />
- </condition>
-
- <condition property="client.head">
- <equals arg1="${org.glite.jp.client.version}" arg2="HEAD" />
- </condition>
-
- </target>
-
- <presetdef name="cvs-co">
- <cvs command="checkout" dest="${workspace.dir}" />
- </presetdef>
-
- <!-- =====================================================
- Self-update if required
- ===================================================== -->
-
- <!-- Update main GLite module -->
- <target name="org.glite" depends="get.glite.head, get.glite.tag"/>
-
- <target name="get.glite.head" if="glite.head">
- <cvs-co package="org.glite" />
- </target>
-
- <target name="get.glite.tag" if="glite.tag">
- <cvs-co package="org.glite"
- tag="${org.glite.version}" />
- </target>
-
- <!-- Update the current module -->
- <target name="org.glite.jp" depends="get.glite-jp.head,
- get.glite-jp.tag"/>
-
- <target name="get.glite-jp.head" if="glite-jp.head">
- <cvs-co package="org.glite.jp" />
- <fail>The org.glite and org.glite.jp modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <target name="get.glite-jp.tag" if="glite-jp.tag">
- <cvs-co package="org.glite.jp"
- tag="${org.glite.jp.version}" />
- <fail>The org.glite and org.glite.jp modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <!-- *****************************************************-->
- <!-- Development tools -->
- <!-- *****************************************************-->
-
- <!-- All development tools -->
- <target name="devtools" depends="oscheck,
- junitcheck,
- junit,
- chkstyle,
- jalopy,
- ant-contrib,
- cpptasks,
- log4j,
- egee-ant-ext"
- description="Get development tools into repository."/>
-
- <!-- =====================================================
- External libraries
- ===================================================== -->
-
- <!-- All external libraries -->
- <target name="external"
- description="Install external packages" depends="oscheck, libtar, mysql"/>
-
- <!-- =====================================================
- GLite Middleware jp modules
- ===================================================== -->
-
- <!-- component targets tag = do not remove = -->
-
- <!-- ws-interface -->
- <target name="ws-interface" depends="evaluate.cvs.tags, get.ws-interface.head, get.ws-interface.tag"/>
- <target name="get.ws-interface.head" if="ws-interface.head">
- <cvs-co package="org.glite.jp.ws-interface" />
- </target>
- <target name="get.ws-interface.tag" unless="ws-interface.head">
- <cvs-co package="org.glite.jp.ws-interface"
- tag="${org.glite.jp.ws-interface.version}" />
- </target>
-
- <!-- common -->
- <target name="common" depends="evaluate.cvs.tags, get.common.head, get.common.tag"/>
- <target name="get.common.head" if="common.head">
- <cvs-co package="org.glite.jp.common" />
- </target>
- <target name="get.common.tag" unless="common.head">
- <cvs-co package="org.glite.jp.common"
- tag="${org.glite.jp.common.version}" />
- </target>
-
- <!-- index -->
- <target name="index" depends="evaluate.cvs.tags, get.index.head, get.index.tag"/>
- <target name="get.index.head" if="index.head">
- <cvs-co package="org.glite.jp.index" />
- </target>
- <target name="get.index.tag" unless="index.head">
- <cvs-co package="org.glite.jp.index"
- tag="${org.glite.jp.index.version}" />
- </target>
-
- <!-- primary -->
- <target name="primary" depends="evaluate.cvs.tags, get.primary.head, get.primary.tag"/>
- <target name="get.primary.head" if="primary.head">
- <cvs-co package="org.glite.jp.primary" />
- </target>
- <target name="get.primary.tag" unless="primary.head">
- <cvs-co package="org.glite.jp.primary"
- tag="${org.glite.jp.primary.version}" />
- </target>
-
- <!-- client -->
- <target name="client" depends="evaluate.cvs.tags, get.client.head, get.client.tag"/>
- <target name="get.client.head" if="client.head">
- <cvs-co package="org.glite.jp.client" />
- </target>
- <target name="get.client.tag" unless="client.head">
- <cvs-co package="org.glite.jp.client"
- tag="${org.glite.jp.client.version}" />
- </target>
-
- <!-- server-common -->
- <target name="server-common" depends="evaluate.cvs.tags, get.server-common.head, get.server-common.tag"/>
- <target name="get.server-common.head" if="server-common.head">
- <cvs-co package="org.glite.jp.server-common" />
- </target>
- <target name="get.server-common.tag" unless="server-common.head">
- <cvs-co package="org.glite.jp.server-common"
- tag="${org.glite.jp.server-common.version}" />
- </target>
-
- <!-- All project modules -->
- <target name="project" depends="server-common,
- ws-interface,
- common,
- client,
- server-common,
- index,
- primary,
- client" />
-
- <!-- ====================================================
- Checkout all
- ==================================================== -->
-
- <!-- All libraries -->
- <target name="all" depends="oscheck,
- evaluate.cvs.tags,
- defaultenvchecks,
- org.glite,
- org.glite.jp,
- devtools,
- external,
- project" />
-
- <!-- ====================================================
- Print dependecies to console
- ==================================================== -->
-
- <target name="dependencies">
- <concat>
- <fileset dir="." includes="dependencies.properties" />
- </concat>
- </target>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common build properties file for the gLite JP modules
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Job Provenance subsystem common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property name="subsystem.build.properties.file" value="./project/build.properties" />
- <property file="${subsystem.build.properties.file}" />
-
- <!-- ======================================================
- Define subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define general subsystem properties
- ====================================================== -->
-
- <!-- Include common subsystem properties -->
- <import file="${subsystem.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-#!/bin/sh
-
-cd ../..
-
-cvs co org.glite
-cvs co org.glite.jp
-
-cd org.glite.jp/project
-ant -f glite.jp.csf.xml
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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
-
- Common Ant task definition file for the gLite Job Provenance modules
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Job Provenance subsystem common tasks and types definitions">
-
- <!-- ======================================================
- Subsystem task definitions
- ====================================================== -->
-
-</project>
\ No newline at end of file
+++ /dev/null
-module.version=1.4.0
-module.age=1
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite lb-utils context component
-
- Authors: Joachim Flammer <Joachim.Flammer@Cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.7 2006/04/26 11:39:55 flammer
- Corrected wrong template syntax.
-
- Revision 1.6 2005/04/17 10:29:35 dimeglio
- Split module.build from version.properties
-
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="context" default="dist">
-
- <!-- ==============================================
- Builds the GLite lb-utils context component
- ============================================== -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline properties & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <!-- Put your language target (java/c++-ant/c++-autotool/perl) here -->
- <!-- <import file="${global.targets-xxx.file}" /> -->
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-module.build = 0\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration build properties file for the GLite lb-utils context component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
-
-
--->
-<project name="lb-utils context component configuration properties">
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite lb-utils context component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/16 14:36:49 flammer
-
- Corrected build.properties include.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="lb-utils context component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="context" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-module.version = 0.0.0
-module.age = 0
\ No newline at end of file
+++ /dev/null
-.project
-.cdtproject
-build
-doc
-reports
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# 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
-
-archlib:=lib
-host_cpu:=${shell uname -m}
-ifeq (${host_cpu},x86_64)
- archlib:=lib64
-endif
-
-ifneq (${mysql_prefix},/usr)
- ifeq ($(shell echo ${mysql_version} | cut -d. -f1,2),4.1)
- mysqlib := -L${mysql_prefix}/${archlib}/mysql
- else
- mysqlib := -L${mysql_prefix}/${archlib}
- endif
-endif
-
-EXT_LIBS:=${mysqlib} -lmysqlclient -lz -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}
-
-db_expire: db_expire.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 db_expire
-
-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
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite lb-utils db component
-
- Authors: Joachim Flammer <Joachim.Flammer@Cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2006/07/14 06:59:03 akrenek
- module created
-
- Revision 1.7 2006/04/26 11:39:55 flammer
- Corrected wrong template syntax.
-
- Revision 1.6 2005/04/17 10:29:35 dimeglio
- Split module.build from version.properties
-
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="db" default="dist">
-
- <!-- ==============================================
- Builds the GLite lb-utils db component
- ============================================== -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline properties & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <!-- Put your language target (java/c++-ant/c++-autotool/perl) here -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-/*
- * Example (and quick test) of prepared statements expirations.
- * Use 'SET GLOBAL wait_timeout=...' for experimenting.
- *
- * Requires existing database with appropriate access and example table:
- *
- * mysqladmin -u root -p create test
- * mysql -u root -p -e 'GRANT ALL on test.* to testuser@localhost'
- * ./db_test
- *
- * Use CS environment variable when using different user/pwd@machine:dbname.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-
-#define CS "testuser/@localhost:test"
-#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, *user;
- const char *cs;
- glite_lbu_DBContext ctx;
- glite_lbu_Statement stmt;
- int caps, i, nr, c;
- unsigned long lens[3];
- char *res[3];
-
- if ((name = strrchr(argv[0], '/')) != NULL) name++;
- else name = argv[0];
- if ((cs = getenv("CS")) == NULL) cs = CS;
-
- // init
- dprintf(("connecting to %s...\n", cs));
- if (glite_lbu_InitDBContext(&ctx) != 0) goto fail;
- if (glite_lbu_DBConnect(ctx, cs) != 0) goto failctx;
- if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) goto failcon;
- if ((caps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
- dprintf(("can't do prepared commands, exiting."));
- goto failcon;
- }
- // caps
- glite_lbu_DBSetCaps(ctx, caps);
- dprintf(("capabilities: %d\n", caps));
-
- user = NULL;
- dprintf(("preparing '%s'...\n", user));
- if ((glite_lbu_PrepareStmt(ctx, SELECT_CMD, &stmt)) != 0) goto failcon;
-
- do {
- 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));
- break;
- }
- dprintf(("\n"));
-
- c = fgetc(stdin);
- } while (c != -1 && (c == '\r' || c == '\n'));
-
- dprintf(("closing...\n"));
- glite_lbu_DBClose(ctx);
- glite_lbu_FreeDBContext(ctx);
- return 0;
-
-failstmt:
- printf("closing stmt...\n");
- glite_lbu_FreeStmt(&stmt);
-failcon:
- dprintf(("closing...\n"));
- glite_lbu_DBClose(ctx);
-failctx:
- glite_lbu_FreeDBContext(ctx);
-fail:
- dprintf(("failed\n"));
- return 1;
-}
+++ /dev/null
-/*
- * 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 testuser@localhost'
- *
- * Use CS environment variable when using different user/pwd@machine:dbname.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#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_InitDBContext(&ctx) != 0) goto fail;
- if (glite_lbu_DBConnect(ctx, cs) != 0) goto failctx;
- if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) goto failcon;
- if ((caps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
- dprintf(("can't do prepared commands, exiting."));
- goto failcon;
- }
- // caps
- glite_lbu_DBSetCaps(ctx, caps || GLITE_LBU_DB_CAP_ERRORS);
- 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 failcon;
- // trio-insert
- dprintf(("trio-insert...\n"));
- asprintf(&cmd, INSERT_TRIO_CMD, 1, "'hyperochus'", "NULL");
- if (glite_lbu_ExecSQL(ctx, cmd, NULL) != 1) goto failcon;
- free(cmd); cmd = NULL;
- // prepared-insert
- dprintf(("prepare-insert...\n"));
- if (glite_lbu_PrepareStmt(ctx, INSERT_CMD, &stmt) != 0) goto failcon;
- 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 failcon;
- 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 failcon;
- 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 = NULL;
-
- dprintf(("preparing '%s'...\n", user));
- if ((glite_lbu_PrepareStmt(ctx, SELECT_CMD, &stmt)) != 0) goto failcon;
-
- 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);
- glite_lbu_FreeDBContext(ctx);
- return 0;
-
-failstmt:
- printf("closing stmt...\n");
- glite_lbu_FreeStmt(&stmt);
-failcon:
- dprintf(("closing...\n"));
- glite_lbu_DBClose(ctx);
-failctx:
- glite_lbu_FreeDBContext(ctx);
-fail:
- free(cmd);
- dprintf(("failed\n"));
- return 1;
-}
+++ /dev/null
-#ifndef GLITE_LBU_DB_H
-#define GLITE_LBU_DB_H
-
-#ident "$Header$"
-
-
-#include <time.h>
-
-
-#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
-
-
-/**
- * Print all errors.
- *
- * Not returned from detection of capabilities.
- */
-#define GLITE_LBU_DB_CAP_ERRORS 8
-
-
-/**
- * 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);
-
-
-/**
- * Initialize the database context.
- *
- * \param[out] ctx result context
- */
-int glite_lbu_InitDBContext(glite_lbu_DBContext *ctx);
-
-
-/**
- * Free database context.
- */
-void glite_lbu_FreeDBContext(glite_lbu_DBContext ctx);
-
-
-/**
- * Connect to the given 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.
- *
- * \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
+++ /dev/null
-module.build = 0\r
+++ /dev/null
-lb-utils.subsystem.name = org.glite.lb-utils
-lb-utils.subsystem.prefix = lb-utils
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration build properties file for the GLite lb-utils db component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2006/07/20 13:42:51 valtri
- Join properly with build system (it uses lb.common yet), it compiles here now.
-
- Revision 1.1.1.1 2006/07/14 06:59:03 akrenek
- module created
-
- Revision 1.3 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
-
-
--->
-<project name="lb-utils db component configuration properties">
-
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-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}
- </echo>
- <echo file="${module.build.dir}/C.dox">
-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
- </echo>
- </target>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite lb-utils db component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/16 14:36:49 flammer
-
- Corrected build.properties include.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="lb-utils db component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="db" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-module.version = 0.0.0
-module.age = 0
\ No newline at end of file
+++ /dev/null
-#ident "$Header$"
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <time.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include <mysql.h>
-#include <mysqld_error.h>
-#include <errmsg.h>
-
-#include "glite/lbu/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)
-
-#define dprintf(CTX, FMT...) if (CTX->caps & GLITE_LBU_DB_CAP_ERRORS) fprintf(stderr, ##FMT)
-
-
-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_InitDBContext(glite_lbu_DBContext *ctx) {
- *ctx = calloc(1, sizeof **ctx);
- return *ctx == NULL ? ENOMEM : 0;
-}
-
-
-void glite_lbu_FreeDBContext(glite_lbu_DBContext ctx) {
- if (ctx) {
- assert(ctx->mysql == NULL);
- free(ctx->err.desc);
- free(ctx);
- }
-}
-
-
-int glite_lbu_DBConnect(glite_lbu_DBContext ctx, const char *cs) {
- if (db_connect(ctx, cs, &ctx->mysql) != 0) return STATUS(ctx);
- return 0;
-}
-
-
-void glite_lbu_DBClose(glite_lbu_DBContext ctx) {
- db_close(ctx->mysql);
- ctx->mysql = NULL;
-}
-
-
-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<ret; i++)
- if (!strcasecmp(col_names[i],"Key_name")) Key_name = i;
- else if (!strcasecmp(col_names[i],"Seq_in_index")) Seq_in_index = i;
- else if (!strcasecmp(col_names[i],"Column_name")) Column_name = i;
- else if (!strcasecmp(col_names[i],"Sub_part")) Sub_part = i;
-
- assert(Key_name >= 0 && Seq_in_index >= 0 &&
- Column_name >= 0 && Sub_part >= 0);
-
- }
-
- for (i=0; i<nkeys && strcasecmp(showcol[Key_name],keys[i]); i++);
-
- if (i == nkeys) {
- keys = realloc(keys,(i+2) * sizeof keys[0]);
- keys[i] = showcol[Key_name];
-//printf("** KEY [%d] %s\n", i, keys[i]);
- keys[i+1] = NULL;
- cols = realloc(cols,(i+1) * sizeof cols[0]);
- cols[i] = 0;
- idx = realloc(idx,(i+2) * sizeof idx[0]);
- idx[i] = idx[i+1] = NULL;
- showcol[Key_name] = NULL;
- nkeys++;
- }
-
- j = atoi(showcol[Seq_in_index])-1;
- if (cols[i] <= j) {
- cols[i] = j+1;
- idx[i] = realloc(idx[i],(j+2)*sizeof idx[i][0]);
- memset(&idx[i][j+1],0,sizeof idx[i][0]);
- }
- idx[i][j] = strdup(showcol[Column_name]);
-//printf("****** [%d, %d] %s\n", i, j, idx[i][j]);
-//FIXME: needed?idx[i][j].value.i = atoi(showcol[Sub_part]);
- for (i = 0; showcol[i]; i++) free(showcol[i]);
- }
-
- glite_lbu_FreeStmt(&stmt);
- free(cols);
- free(col_names);
-
- if (ret == 0) CLR_ERR(ctx);
- else {
- free(keys);
- keys = NULL;
- for (i = 0; idx[i]; i++) {
- for (j = 0; idx[i][j]; j++) free(idx[i][j]);
- free(idx[i]);
- }
- free(idx);
- idx = NULL;
- }
-
- if (key_names) *key_names = keys;
- else free(keys);
- *column_names = idx;
-
- return STATUS(ctx);
-}
-
-
-/* ---- simple ---- */
-
-int glite_lbu_ExecSQL(glite_lbu_DBContext ctx, const char *cmd, glite_lbu_Statement *stmt) {
- int merr;
- int retry_nr = 0;
- int do_reconnect = 0;
-#ifdef LBS_DB_PROFILE
- struct timeval start,end;
- int pid;
-
- static struct timeval sum = {
- tv_sec: 0,
- tv_usec: 0
- };
-#endif
-
- CLR_ERR(ctx);
-
- if (stmt) *stmt = NULL;
-
-#ifdef LBS_DB_PROFILE
- gettimeofday(&start,NULL);
-#endif
-
- while (retry_nr == 0 || do_reconnect) {
- do_reconnect = 0;
- if (mysql_query(ctx->mysql, 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;
- dprintf(ctx, "[db %d] %s:%d %s\n", getpid(), 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<pid>
- * 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) ENGINE='innodb'", 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; i<nr; i++) {
- if (lengths) lengths[i] = len[i];
- if (len[i]) {
- results[i] = malloc(len[i] + 1);
- memcpy(results[i], row[i], len[i]);
- results[i][len[i]] = '\000';
- } else
- results[i] = strdup("");
- }
-
- return nr;
-}
-
-
-/*
- * prepared version of the fetch
- */
-static int FetchRowPrepared(glite_lbu_DBContext ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results) {
- int ret, retry, i;
- MYSQL_BIND *binds = NULL;
- unsigned long *lens = NULL;
-
- if (n != stmt->nrfields) {
- 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);
- memset(mtime, 0, sizeof *mtime);
- 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);
-}
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# 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 Exception.h JobId.h JobIdExceptions.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 $<
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite lb-utils jobid component
-
- Authors: Joachim Flammer <Joachim.Flammer@Cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2006/07/18 14:24:30 akrenek
- "ant stage" works, "dist" is broken - I don't care yet
-
- Revision 1.1.1.1 2006/07/14 06:59:06 akrenek
- module created
-
- Revision 1.7 2006/04/26 11:39:55 flammer
- Corrected wrong template syntax.
-
- Revision 1.6 2005/04/17 10:29:35 dimeglio
- Split module.build from version.properties
-
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="jobid" default="dist">
-
- <!-- ==============================================
- Builds the GLite lb-utils jobid component
- ============================================== -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline properties & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <!-- Put your language target (java/c++-ant/c++-autotool/perl) here -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#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 <fstream>
-#include <cstdlib>
-//#include <list>
-#include <syslog.h> // For logging exceptions to log file
-#include <errno.h> // list the exception codes
-#include <string>
-#include <vector>
-#include <exception> // base ancestor stl::exception
-
-
-namespace glite {
- namespace lb_utils {
- 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::lb_utils::exception::Exception &exc){ exc.push_back ( __FILE__ , LINE, METHOD ); throw exc ; } catch (std::exception &ex){ glite::lb_utils::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 <alessandro.maraschini@datamat.it>
-*/
-
-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<std::string> 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
+++ /dev/null
-#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 <string>
-#include <iosfwd>
-
-#include "glite/lb-utils/cjobid.h"
-
-typedef struct _glite_lbu_jobid_s* glite_lbu_jobid_t;
-
-namespace glite {
-namespace lb_utils {
-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:
- * <LB address>:<LB port>/<Unique String>
- *
- * @ingroup common
- * @version 0.1
- * @date 15 April 2002
- * @author Alessandro Maraschini <alessandro.maraschini@datamat.it> */
-
-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 glite_lbu_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 glite_lbu_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 glite_lbu_JobId &);
- /** Retrieve the internal id reference
- *@return the JobId internal reference used by some LB methods */
- glite_lbu_JobId getId() const ;
-private:
- // This Variable stores the Job unique identification String
- glite_lbu_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 lb_utils
-} // namespace glite
-
-#endif // GLITE_WMSUTILS_JOBID_JOBID_H
+++ /dev/null
-#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/lb-utils/Exception.h"
-
-namespace glite {
-namespace lb_utils {
-namespace jobid {
-
-/**
- * JobIdException - Exception thrown by JobId Class
- * @ingroup Common
- * @version 0.1
- * @date 15 April 2002
- * @author Alessandro Maraschini <alessandro.maraschini@datamat.it>
-*/
-
-class JobIdException : public glite::lb_utils::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:
-* <LB address>:<LB port>/ <Unique string> */
-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<field name> 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 lb_utils
-} // namespace glite
-
-#endif // GLITE_WMSUTILS_JOBID_EXCEPTIONS_H
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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 */
+++ /dev/null
-module.build = 0\r
+++ /dev/null
-# temporary hack before lb-utils are integrated
-
-lb-utils.subsystem.name = org.glite.lb-utils
-lb-utils.subsystem.prefix = lb-utils
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration build properties file for the GLite lb-utils jobid component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2006/07/18 14:26:17 akrenek
- oops, no double-dash
-
- Revision 1.2 2006/07/18 14:24:30 akrenek
- "ant stage" works, "dist" is broken - I don't care yet
-
- Revision 1.1.1.1 2006/07/14 06:59:06 akrenek
- module created
-
- Revision 1.3 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
-
-
--->
-<project name="lb-utils jobid component configuration properties">
-
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
-
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbuprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-</echo>
- </target>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite lb-utils jobid component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/16 14:36:49 flammer
-
- Corrected build.properties include.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="lb-utils jobid component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="jobid" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-module.version = 1.0.0
-module.age = 0
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#include <netdb.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-#include <ctype.h>
-
-#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;
-}
+++ /dev/null
-#ident "$Header$"
-
-#include <openssl/md5.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#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);
-}
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite lb-utils server-bones component
-
- Authors: Joachim Flammer <Joachim.Flammer@Cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.7 2006/04/26 11:39:55 flammer
- Corrected wrong template syntax.
-
- Revision 1.6 2005/04/17 10:29:35 dimeglio
- Split module.build from version.properties
-
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="server-bones" default="dist">
-
- <!-- ==============================================
- Builds the GLite lb-utils server-bones component
- ============================================== -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline properties & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <!-- Put your language target (java/c++-ant/c++-autotool/perl) here -->
- <!-- <import file="${global.targets-xxx.file}" /> -->
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-module.build = 0\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration build properties file for the GLite lb-utils server-bones component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
-
-
--->
-<project name="lb-utils server-bones component configuration properties">
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite lb-utils server-bones component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/16 14:36:49 flammer
-
- Corrected build.properties include.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="lb-utils server-bones component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="server-bones" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-module.version = 0.0.0
-module.age = 0
\ No newline at end of file
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# 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 $<
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite lb-utils trio component
-
- Authors: Joachim Flammer <Joachim.Flammer@Cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2006/07/14 06:59:12 akrenek
- module created
-
- Revision 1.7 2006/04/26 11:39:55 flammer
- Corrected wrong template syntax.
-
- Revision 1.6 2005/04/17 10:29:35 dimeglio
- Split module.build from version.properties
-
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="trio" default="dist">
-
- <!-- ==============================================
- Builds the GLite lb-utils trio component
- ============================================== -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline properties & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <!-- Put your language target (java/c++-ant/c++-autotool/perl) here -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#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__ */
+++ /dev/null
-/*************************************************************************
- *
- * $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 <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-#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 <stdio.h> 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 */
+++ /dev/null
-module.build = 0\r
+++ /dev/null
-# temporary hack before lb-utils are integrated
-
-lb-utils.subsystem.name = org.glite.lb-utils
-lb-utils.subsystem.prefix = lb-utils
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration build properties file for the GLite lb-utils trio component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2006/07/14 06:59:12 akrenek
- module created
-
- Revision 1.3 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
-
-
--->
-<project name="lb-utils trio component configuration properties">
-
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
-
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbuprefix=${subsystem.prefix}
-package=${module.package.name}
-cppunit_prefix=${with.cppunit.prefix}
-PREFIX=${install.dir}
-</echo>
- </target>
-
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite lb-utils trio component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/16 14:36:49 flammer
-
- Corrected build.properties include.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="lb-utils trio component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="trio" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-module.version = 0.0.0
-module.age = 0
\ No newline at end of file
+++ /dev/null
-#ident "$Header$"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#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<size; i++) {
- if ((str[i] != ULM_BS) && (str[i] != ULM_QM) && (str[i] != ULM_LF)) {
- ret[j] = str[i];
- j++;
- }
- else {
- ret[j] = ULM_BS;
- if (str[i] == ULM_LF) {
- ret[j+1] = 'n';
- }
- else {
- ret[j+1] = str[i];
- }
- j += 2;
- }
-} /* for */
-
-ret[j] = 0;
-
-return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * \fn char *glite_lbu_UnescapeULM(const char *str)
- * \param str a string to unescape
- * \return new (allocated) unescaped string
- * \brief in given string unescape all escaped ULM_QM, ULM_BS and ULM_LF
- *
- * Calls: malloc, strlen
- *
- * Algorithm: array lookup
- * - the new string will be allocated
- *
- *----------------------------------------------------------------------
- */
-
-char *glite_lbu_UnescapeULM(const char *str)
-{
-unsigned int i,j;
-size_t size;
-char *ret;
-
-if (str == NULL) return NULL;
-
-size = strlen(str);
-ret = (char*) malloc(1+size*sizeof(char));
-
-/*
-j = 0;
-for (i=0; i<size; i++) {
- if ( (str[i] != ULM_BS) ||
- ((str[i] == ULM_BS) && ((str[i+1] != ULM_BS) && (str[i+1] != ULM_QM) && (str[i+1] != 'n'))) )
- {
- if (str[i] == ULM_LF) { ret[j] = 'n'; }
- else { ret[j] = str[i]; }
- j++;
- }
-}
-*/
-for (i=j=0; i<size; i++,j++)
- if (str[i] == ULM_BS) switch(str[++i]) {
- case 'n': ret[j] = ULM_LF; break;
- default: ret[j] = str[i]; break;
- } else { ret[j] = str[i]; }
-
-ret[j] = '\0';
-
-return ret;
-}
-
-static const struct {
- const char c,*e;
-} xml_etab[] = {
- { '<',"lt" },
- { '>',"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;
-}
+++ /dev/null
-/*************************************************************************
- *
- * $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 <string.h>
-#include <locale.h>
-#include <ctype.h>
-#include <stdarg.h>
-#include <time.h>
-#include <math.h>
-#ifndef DEBUG
-# define NDEBUG
-#endif
-#include <assert.h>
-
-#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 ::= [ <sign> ]
- * ( <number> |
- * <number> <decimal_point> <number> |
- * <decimal_point> <number> )
- * [ <exponential> [ <sign> ] <number> ]
- * number ::= 1*( <digit> )
- * 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;
-}
+++ /dev/null
-/*************************************************************************
- *
- * $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 <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#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 */
+++ /dev/null
-
-/*************************************************************************
- *
- * $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 <alloc> 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 <assert.h>
-#include <ctype.h>
-#if !defined(TRIO_COMPILER_SUPPORTS_C99) && !defined(isblank)
-# define isblank(x) (((x)==32) || ((x)==9))
-#endif
-#include <math.h>
-#include <limits.h>
-#include <float.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <errno.h>
-
-#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 <unistd.h>
-# include <signal.h>
-# include <locale.h>
-# define USE_LOCALE
-#endif /* PLATFORM_UNIX */
-#if defined(PLATFORM_WIN32)
-# include <io.h>
-# define read _read
-# define write _write
-#endif /* PLATFORM_WIN32 */
-
-#if TRIO_WIDECHAR
-# if defined(TRIO_COMPILER_SUPPORTS_ISO94)
-# include <wchar.h>
-# include <wctype.h>
-# 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 <stdint.h>
-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 <inttypes.h>
-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<bits> 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);
-}
-
+++ /dev/null
-/*************************************************************************
- *
- * $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 <stdlib.h>
-
-#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 */
+++ /dev/null
-#include <iostream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/TestFixture.h>
-
-#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 <tag> containing &something; </tag>"),
- 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 <assert.h>
-#include <fstream>
-
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/XmlOutputter.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-
-int main (int argc,const char *argv[])
-{
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-
- assert(argc == 2);
- std::ofstream xml(argv[1]);
-
- CppUnit::TestResult controller;
- CppUnit::TestResultCollector result;
- controller.addListener( &result );
-
- CppUnit::TestRunner runner;
- runner.addTest(suite);
- runner.run(controller);
-
- CppUnit::XmlOutputter xout( &result, xml );
- CppUnit::CompilerOutputter tout( &result, std::cout);
- xout.write();
- tout.write();
-
- return result.wasSuccessful() ? 0 : 1 ;
-}
+++ /dev/null
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 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
-
- Build file for the lb-utils subsystem.
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
-
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.10 2005/04/17 10:30:50 dimeglio
- Added envset dependency
-
- Revision 1.9 2005/04/17 10:29:26 dimeglio
- Split module.build from version.properties
-
- Revision 1.8 2004/12/19 19:02:18 dimeglio
- Updated (tag target is not needed anymore)
-
- Revision 1.7 2004/10/25 21:04:05 dimeglio
- New copyright
-
- Revision 1.6 2004/09/29 12:55:17 flammer
- Update of subsystem template.
-
- Revision 1.5 2004/07/20 16:08:02 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.3 2004/07/06 20:35:31 flammer
- Update of configure & targets.
-
- Revision 1.2 2004/06/18 12:30:12 flammer
- Updating tags to be able to automatically add component via script.
-
- Revision 1.1.1.1 2004/06/07 16:00:38 flammer
- Added template for org.glite subsystem.
-
-
--->
-
-<project name="lb-utils" default="dist">
-
- <description>
- Ant build file to build the lb-utils subsystem.
- </description>
-
- <!-- =========================================
- Builds the GLite lb-utils subsystem
- ========================================= -->
-
- <!-- Import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- Import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="./project/properties.xml" />
-
- <!-- Import global build properties and global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependencies properties files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${subsystem.dependencies.file}"/>
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions
- ========================================= -->
- <import file="${global.configure.options.file}"/>
-
- <!-- =========================================
- Import global task definitions
- ========================================= -->
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Import global compiler definitions
- ========================================= -->
- <import file="${global.compilerdefs.file}" />
-
- <!-- =========================================
- Import targets
- ========================================= -->
- <import file="${global.targets-common.file}"/>
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
-
- <!-- ===============================================
- Public common targets
- =============================================== -->
-
- <target name="localinit" depends="envcheck">
-
- <echo> Preparing directories ... </echo>
-
- <mkdir dir="${stage.bin.dir}" />
- <mkdir dir="${stage.lib.dir}" />
- <mkdir dir="${stage.java.dir}" />
- <mkdir dir="${stage.inc.dir}" />
- <mkdir dir="${stage.int.dir}" />
-
- <mkdir dir="${dist.dir}" />
-
- </target>
-
- <target name="init" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="init"/>
- </antcall>
- </target>
-
- <target name="checkstyle" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="checkstyle"/>
- </antcall>
- </target>
-
- <target name="compile" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compile"/>
- </antcall>
- </target>
-
- <target name="compiletest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compiletest"/>
- </antcall>
- </target>
-
- <target name="unittest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unittest"/>
- </antcall>
- </target>
-
- <target name="unitcoverage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unitcoverage"/>
- </antcall>
- </target>
-
- <target name="stage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="stage"/>
- </antcall>
- </target>
-
- <target name="dist" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="dist"/>
- </antcall>
- </target>
-
- <target name="install" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="install"/>
- </antcall>
- </target>
-
- <target name="doc" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="doc"/>
- </antcall>
- </target>
-
- <target name="all" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="all"/>
- </antcall>
- </target>
-
- <target name="clean">
-
- <property name="offline.repository" value="true" />
- <antcall target="buildmodules">
- <param name="target" value="clean"/>
- </antcall>
-
- <delete dir="${module.bin.dir}" />
- <delete dir="${module.lib.dir}" />
- <delete dir="${module.autosrc.dir}" />
- <delete dir="${module.autodoc.dir}" />
- <delete dir="${module.test.reports.dir}" />
-
- </target>
-
- <target name="cleanAll" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="cleanAll"/>
- </antcall>
- </target>
-
- <!-- ===============================================
- Private targets
- =============================================== -->
-
- <!-- ===============================================
- Modules proxy targets
- =============================================== -->
-
- <!-- component targets definitions tag = do not remove = -->
-
- <if>
- <isset property="setenvonly"/>
- <then>
- <property name="lbonly" value="yes"/>
- </then>
- </if>
-
- <target name="db" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb-utils.subsystem.dir}.db" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb-utils.subsystem.dir}.db"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
-<!-- <target name="server-bones" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb-utils.subsystem.dir}.server-bones" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb-utils.subsystem.dir}.server-bones"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="jobid" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb-utils.subsystem.dir}.jobid" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb-utils.subsystem.dir}.jobid"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="trio" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb-utils.subsystem.dir}.trio" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb-utils.subsystem.dir}.trio"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>-->
-
- <!-- Main proxy -->
-<!-- <target name="buildmodules" depends="envset,
- db,
- jobid,
- trio,
- server-bones">-->
- <target name="buildmodules" depends="envset,
- db">
- <echo append="true" file="${global.project.dir}/cruisecontrol-stub.xml">
- <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/>
- </echo>
- </target>
-
-</project>
+++ /dev/null
-module.build = 0\r
+++ /dev/null
-
-###################################################################
-# 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
+++ /dev/null
-<?xml version="1.0"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- GLite Middleware lb-utils Configuration Specification File
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2004/10/19 20:20:30 dimeglio
- Updte template
-
-
--->
-
-
-<project name="GLite Middleware lb-utils CSF" default="all">
-
- <!-- ===============================================
- Determine workspace directory
- =============================================== -->
-
- <!-- Relative workspace root directory -->
- <property name="workspace.dir" value="../.." />
-
- <!-- ===============================================
- Load properties
- =============================================== -->
-
- <!-- load baseline and user properties -->
- <import file="${workspace.dir}/org.glite/project/baseline.properties.xml" />
-
- <!-- define build properties file location since we are already in project dir -->
- <property name="subsystem.build.properties.file" value="./build.properties" />
-
- <!-- Load subsystem-specific property file -->
- <property file="./properties.xml"/>
-
- <!-- load global properties -->
- <import file="${global.properties.file}" />
-
- <!-- ===============================================
- Load dependencies
- =============================================== -->
-
- <!-- Load user dependencies file -->
- <property file="${user.dependencies.file}" />
-
- <!-- Load subsystem dependencies file -->
- <property file="./dependencies.properties" />
-
- <!-- Load global dependencies file -->
- <property file="${global.dependencies.file}" />
-
- <!-- ===============================================
- Load targets
- =============================================== -->
- <import file="${global.targets-envchecks.file}" />
- <import file="${global.targets-external-dependencies.file}" />
-
- <!-- ===============================================
- Evaluate CVS tags
- =============================================== -->
-
- <target name="evaluate.cvs.tags" description="Figure out if we need tagged CVS checkout">
-
- <condition property="glite.head">
- <and>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
-
- <condition property="glite.tag">
- <and>
- <not>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- </not>
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
-
- <condition property="glite-lb-utils.head">
- <and>
- <equals arg1="${org.glite.lb-utils.version}" arg2="HEAD" />
- <istrue value="${update}" />
- </and>
- </condition>
-
- <condition property="glite-lb-utils.tag">
- <and>
- <not>
- <equals arg1="${org.glite.lb-utils.version}" arg2="HEAD" />
- </not>
- <istrue value="${update}" />
- </and>
- </condition>
-
- <!-- condition property tag = do not remove = -->
-
- </target>
-
- <presetdef name="cvs-co">
- <cvs command="checkout" dest="${workspace.dir}" />
- </presetdef>
-
- <!-- =====================================================
- Self-update if required
- ===================================================== -->
-
- <!-- Update main GLite module -->
- <target name="org.glite" depends="get.glite.head, get.glite.tag"/>
-
- <target name="get.glite.head" if="glite.head">
- <cvs-co package="org.glite" />
- </target>
-
- <target name="get.glite.tag" if="glite.tag">
- <cvs-co package="org.glite"
- tag="${org.glite.version}" />
- </target>
-
- <!-- Update the current module -->
- <target name="org.glite.lb-utils" depends="get.glite-lb-utils.head,
- get.glite-lb-utils.tag"/>
-
- <target name="get.glite-lb-utils.head" if="glite-lb-utils.head">
- <cvs-co package="org.glite.lb-utils" />
- <fail>The org.glite and org.glite.lb-utils modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <target name="get.glite-lb-utils.tag" if="glite-lb-utils.tag">
- <cvs-co package="org.glite.lb-utils"
- tag="${org.glite.lb-utils.version}" />
- <fail>The org.glite and org.glite.lb-utils modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <!-- *****************************************************-->
- <!-- Development tools -->
- <!-- *****************************************************-->
-
- <!-- All development tools -->
- <target name="devtools" depends="oscheck,
- junitcheck,
- junit,
- chkstyle,
- jalopy,
- ant-contrib,
- cpptasks,
- log4j,
- egee-ant-ext"
- description="Get development tools into repository."/>
-
- <!-- =====================================================
- External libraries
- ===================================================== -->
-
- <!-- All external libraries -->
- <target name="external" depends="oscheck"
- description="Install external packages"/>
-
- <!-- =====================================================
- GLite Middleware lb-utils modules
- ===================================================== -->
-
- <!-- component targets tag = do not remove = -->
-
- <!-- All project modules -->
- <target name="project" depends="" />
-
- <!-- ====================================================
- Checkout all
- ==================================================== -->
-
- <!-- All libraries -->
- <target name="all" depends="oscheck,
- evaluate.cvs.tags,
- defaultenvchecks,
- org.glite,
- org.glite.lb-utils,
- devtools,
- external,
- project" />
-
- <!-- ====================================================
- Print dependecies to console
- ==================================================== -->
-
- <target name="dependencies">
- <concat>
- <fileset dir="." includes="dependencies.properties" />
- </concat>
- </target>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite lb-utils subsystem.
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2004/07/20 16:08:02 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1.1.1 2004/06/07 16:00:38 flammer
- Added template for org.glite subsystem.
-
-
--->
-
-<project name="lb-utils subsystem common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property name="subsystem.build.properties.file" value="./project/build.properties" />
- <property file="${subsystem.build.properties.file}" />
-
- <!-- ======================================================
- Define subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define general subsystem properties
- ====================================================== -->
-
- <!-- Include common subsystem properties -->
- <import file="${subsystem.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common Ant task definition file for the glite lb-utils subsystem
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/08/02 10:33:38 flammer
- Corrected name in documentation part.
-
- Revision 1.1.1.1 2004/06/07 16:00:38 flammer
- Added template for org.glite subsystem.
-
-
--->
-
-<project name="lb-utils subsystem common tasks and types definitions">
-
- <!-- ======================================================
- Subsystem task definitions
- ====================================================== -->
-
-</project>
+++ /dev/null
-module.version = 0.0.0
-module.age = 0
\ No newline at end of file
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-This module is now obsolete.
-
-Files moved from ./interface to org.glite.lb.client/interface:
-
-consumer_fake.h
-consumer.h
-dump.h
-Job.h
-JobStatus.h.T
-load.h
-notification.h
-Notification.h
-producer_fake.h
-producer.h.T
-purge.h
-ServerConnection.h
-statistics.h
-
-
-Files moved from ./interface to org.glite.lb.common/interface:
-
-context.h
-CountRef.h
-Event.h.T
-events.h.T
-jobstat.h.T
-LoggingExceptions.h
-notifid.h
-
-
-Files moved form ./doc to org.glite.lb.client/doc:
-
-C.dox
-CPP.dox
-api/api.tex
-api/Makefile
-api/fig/logging-arch.eps
-api/fig/logging-arch.pdf
-
+++ /dev/null
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
+++ /dev/null
-# Default values
-all compile:
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite LB Client Interface module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.7 2005/05/26 15:13:43 zurek
- inserted module.build.file
-
- Revision 1.6.2.1 2005/02/12 01:38:33 glbuild
- Changed start time
-
- Revision 1.6 2004/10/18 19:16:09 zsalvet
- RPM descriptions
-
- Revision 1.5 2004/08/05 15:22:34 dimeglio
- Changed default target from compile to dist
-
- Revision 1.4 2004/07/06 17:47:31 flammer
- Update of classpath definitions, targets & configure file.
-
- Revision 1.3 2004/06/22 15:51:36 dimeglio
- Added handling of *.T, *.pm and at3
-
- Revision 1.2 2004/06/21 16:02:16 dimeglio
- Modified to search support files in module project directory
-
--->
-
-<project name="client-interface" default="dist">
-
- <!-- =========================================
- Builds the GLite LB Client Interface Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <!-- Copy support files from the subsystem project to the component project-->
- <copy toDir="${module.project.dir}">
- <fileset dir="${subsystem.project.dir}">
- <include name="at3" />
- <include name="*.T" />
- <include name="*.pm" />
- </fileset>
- </copy>
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- <delete>
- <fileset dir="${module.project.dir}">
- <include name="at3" />
- <include name="*.T" />
- <include name="*.pm" />
- </fileset>
- </delete>
- </target>
-
- <!-- =========================================
- RPM settings
- ========================================= -->
-
- <property name="build.package.summary" value="L&B client library header files" />
- <property name="build.package.description" value="
-Logging & Bookkeeping (L&B) client library C/C++ header files." />
-
-</project>
+++ /dev/null
-#Fri Aug 18 12:25:13 CEST 2006
-module.build=0245
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration options for the GLite LB Client Interface module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.6.2.1 2007/04/29 15:54:38 jpospi
- cleanup: fix wrong staging, skip make doc in LB_STANDALONE
-
- Revision 1.6 2007/02/03 19:27:15 jpospi
- first step to remove the ant dependency
-
- Revision 1.5 2005/08/03 09:30:10 akrenek
- Merged the release 1.0 branch
-
- Revision 1.4 2005/02/25 09:37:43 mmulac
- generate doxygen doc for notification.h
-
- Revision 1.3 2005/01/17 11:40:09 jpospi
- Documentation update.
-
- Revision 1.2.2.6 2005/02/25 18:12:17 jpospi
- Added MACRO_EXPANSION option to doxygen conf to be able to expand _EDG_WLL_EVENT_COMMON in the generated documentation.
-
- Revision 1.2.2.5 2005/02/25 13:39:29 mmulac
- remove duplicate notifid in configure.properties.xml
-
- Revision 1.2.2.4 2005/02/25 13:37:11 mmulac
- add notifid to doxygen
- see -> ref
-
- Revision 1.2.2.3 2005/02/25 12:03:11 jpospi
- Added PDF options to doxygen conf.
-
- Revision 1.2.2.2 2005/02/25 09:37:52 mmulac
- generate doxygen doc for notification.h
-
- Revision 1.2.2.1 2005/02/18 14:00:16 jpospi
- - Removed all L&B Proxy related things
- - Documentation update
-
- Revision 1.2 2004/12/08 13:04:29 jpospi
- first attemtp to generate documentation using doxygen
-
- Revision 1.1 2004/07/06 17:47:31 flammer
- Update of classpath definitions, targets & configure file.
-
- Revision 1.3 2004/06/23 00:16:08 dimeglio
- Added globalprefix and lbprefix parameters
-
- Revision 1.2 2004/06/22 15:49:56 dimeglio
- Added configuration options
-
- Revision 1.1 2004/06/21 16:00:23 dimeglio
- First version of this file
-
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="LB Client Interface configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-package=${module.package.name}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-PREFIX=${install.dir}
-version=${module.version}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Glite LB Client Interface component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/06/21 14:21:07 dimeglio
- Updated format
-
--->
-
-<project name="LB Client Interface component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="client-interface" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-# $Id$
-# $Name$
-module.version=2.3.2
-module.age=1
+++ /dev/null
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
+++ /dev/null
-# defaults
-top_srcdir=.
-stagedir=.
-globalprefix=glite
-lbprefix=lb
-package=glite-lb-server
-version=0.2.0
-PREFIX=/opt/glite
-
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-expat_prefix=/opt/expat
-
--include Makefile.inc
--include ../project/version.properties
-
-version=${module.version}
-
-CC=gcc
-YACC=bison -y
-
-VPATH=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/examples:${top_srcdir}/project
-
-TEST_LIBS:=-L${cppunit_prefix}/lib -lcppunit
-TEST_INC:=-I${cppunit_prefix}/include
-
-ifdef LB_PERF
- STATIC_LIB_BK:=${stagedir}/lib/libglite_lb_bkserver_perf.a
- LB_PERF_FLAGS:=-DLB_PERF
-else
- STATIC_LIB_BK:=${stagedir}/lib/libglite_lb_bkserver.a
-endif
-
-SUFFIXES = .T
-
-DEBUG:=-g -O0 -Wall
-
-ifdef LB_STANDALONE
- LB_STANDALONE_FLAGS:=-DLB_STANDALONE
-endif
-
-CFLAGS:= ${DEBUG} \
- -DVERSION=\"${version}\" \
- -I${stagedir}/include -I${top_srcdir}/src -I. \
- -I${expat_prefix}/include \
- ${COVERAGE_FLAGS} \
- -I${gridsite_prefix}/include \
- -D_GNU_SOURCE ${LB_STANDALONE_FLAGS} ${LB_PERF_FLAGS}
-
-
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-LINKXX:=libtool --mode=link ${CXX} -rpath ${stagedir}/lib ${LDFLAGS}
-
-archlib:=lib
-host_cpu:=${shell uname -m}
-ifeq (${host_cpu},x86_64)
- archlib:=lib64
-endif
-
-ifneq (${expat_prefix},/usr)
- expatlib := -L${expat_prefix}/lib
-endif
-
-
-SRVBONES_LIB:= -L${stagedir}/lib -lglite_lbu_server_bones
-GRIDSITE_LIBS = -lgridsite_globus `xml2-config --libs`
-
-vomsflavour := _${nothrflavour}
-ifeq (${nothrflavour},gcc32)
- vomsflavour :=
-endif
-ifeq (${nothrflavour},gcc32dbg)
- vomsflavour :=
-endif
-
-VOMS_LIBS:=-L${voms_prefix}/lib -lvomsc${vomsflavour}
-EXT_LIBS:= \
- ${expatlib} -lexpat \
- ${GRIDSITE_LIBS} \
- ${VOMS_LIBS}
-
-
-
-LB_PROXY_LIBS:= \
- ${STATIC_LIB_BK} \
- ${SRVBONES_LIB} \
- -lglite_lb_common_${nothrflavour} \
- -lglite_lbu_db \
- -lglite_security_gss_${nothrflavour} \
- ${EXT_LIBS}
-
-
-
-glite-lb-proxy: lbproxy.o fake_write2rgma.o ${STATIC_LIB_BK}
- @echo DEBUG: mysql_version=${mysql_version} mysql_prefix=${mysql_prefix}
- @echo DEBUG: shell: x$(shell echo ${mysql_version} | cut -d. -f1,2)x
- ${LINK} -o $@ lbproxy.o fake_write2rgma.o ${LB_PROXY_LIBS}
-
-glite-lb-proxy-perf: lbproxy.o fake_write2rgma.o ${STATIC_LIB_BK}
- ${LINK} -o $@ lbproxy.o fake_write2rgma.o ${LB_PROXY_LIBS}
-
-default all: compile
-
-compile: glite-lb-proxy
-
-check: compile
- -echo No test so far
-
-examples:
-
-doc:
-
-stage: compile
- $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
-
-install:
- -mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/etc/init.d
- -mkdir -p ${PREFIX}/share/doc/${package}-${version}
- ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
- ${INSTALL} -m 644 ${top_srcdir}/doc/README ${top_srcdir}/doc/README.deploy ${PREFIX}/share/doc/${package}-${version}
- ${INSTALL} -m 755 glite-lb-proxy ${PREFIX}/bin/glite-lb-proxy
- ${INSTALL} -m 644 ${top_srcdir}/config/glite-lb-dbsetup-proxy.sql ${PREFIX}/etc
- ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-proxy
-
-# don't do it due to RPM conflict
-# if [ x${DOSTAGE} != xyes ]; then \
-# ${INSTALL} -m 755 ${stagedir}/bin/glite-lb-interlogd ${PREFIX}/bin; \
-# fi
-
-
-clean:
- rm -rvf *.o .libs glite-lb-proxy
- rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
-
-%.o: %.y
- ${YACC} -d ${YFLAGS} $<
- mv y.tab.c $*.c
- mv y.tab.h $*.h
- ${CC} -c ${CFLAGS} $*.c
- rm $*.c
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite LB Proxy module
-
- Authors: Jiri Skrabal <nykolas@ics.muni.cz>
- Release: $Name$
-
- Revision history:
-
--->
-
-<project name="proxy" default="dist">
-
- <!-- =========================================
- Builds the GLite LB Proxy Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <!-- Copy support files from the subsystem project to the component project-->
- <copy toDir="${module.project.dir}">
- <fileset dir="${subsystem.project.dir}">
- <include name="at3" />
- <include name="*.T" />
- <include name="*.pm" />
- </fileset>
- </copy>
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- <delete>
- <fileset dir="${module.project.dir}">
- <include name="at3" />
- <include name="*.T" />
- <include name="*.pm" />
- </fileset>
- </delete>
- </target>
-
- <!-- =========================================
- RPM settings
- ========================================= -->
-
- <property name="build.package.summary" value="L&B Proxy server" />
- <property name="build.package.description" value=" The daemon
-installed at the ??? machine.
It is responsible for accepting events from
-???, storing them in RDBMS, forwarding then to the real L&B server
and performing queries on client requests
-(job status, job log etc.).
Also includes purge utilities
-to remove (and optionally archive) inactive
data from
-the database and to change database index configuration." />
-
-</project>
+++ /dev/null
-create table jobs (
- jobid char(32) binary not null,
- dg_jobid varchar(255) binary not null,
- userid char(32) binary not null,
- aclid char(32) binary null,
-
- primary key (jobid),
- unique (dg_jobid),
- index (userid)
-) engine=innodb;
-
-create table users (
- userid char(32) binary not null,
- cert_subj varchar(255) binary not null,
-
- primary key (userid),
- unique (cert_subj)
-) engine=innodb;
-
-create table events (
- jobid char(32) binary not null,
- event int not null,
- code int not null,
- prog varchar(255) binary not null,
- host varchar(255) binary not null,
- time_stamp datetime not null,
- userid char(32) binary null,
- usec int null,
- level int null,
-
- arrived datetime not null,
-
-
- primary key (jobid,event),
- index (time_stamp),
- index (host),
- index (arrived)
-) engine=innodb;
-
-create table short_fields (
- jobid char(32) binary not null,
- event int not null,
- name varchar(200) binary not null,
- value varchar(255) binary null,
-
- primary key (jobid,event,name)
-) engine=innodb;
-
-create table long_fields (
- jobid char(32) binary not null,
- event int not null,
- name varchar(200) binary not null,
- value mediumblob null,
-
- primary key (jobid,event,name)
-) engine=innodb;
-
-create table states (
- jobid char(32) binary not null,
- status int not null,
- seq int not null,
- int_status mediumblob not null,
- version varchar(32) not null,
- parent_job varchar(32) binary not null,
-
- primary key (jobid),
- index (parent_job)
-
-) engine=innodb;
-
-create table status_tags (
- jobid char(32) binary not null,
- seq int not null,
- name varchar(200) binary not null,
- value varchar(255) binary null,
-
- primary key (jobid,seq,name)
-) engine=innodb;
-
-create table server_state (
- prefix varchar(100) not null,
- name varchar(100) binary not null,
- value varchar(255) binary not null,
-
- primary key (prefix,name)
-) engine=innodb;
-
-create table acls (
- aclid char(32) binary not null,
- value mediumblob not null,
- refcnt int not null,
-
- primary key (aclid)
-) engine=innodb;
-
-create table notif_registrations (
- notifid char(32) binary not null,
- destination varchar(200) not null,
- valid datetime not null,
- userid char(32) binary not null,
- conditions mediumblob not null,
-
- primary key (notifid)
-) engine=innodb;
-
-create table notif_jobs (
- notifid char(32) binary not null,
- jobid char(32) binary not null,
-
- primary key (notifid,jobid),
- index (jobid)
-) engine=innodb;
+++ /dev/null
-#!/bin/sh
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-
-[ -f $GLITE_LOCATION/etc/lb.conf ] && . $GLITE_LOCATION/etc/lb.conf
-[ -f $GLITE_LOCATION_VAR/etc/lb.conf ] && . $GLITE_LOCATION_VAR/etc/lb.conf
-
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-[ -n "$GLITE_LB_PROXY_PIDFILE" ] && pidfile=$GLITE_LB_PROXY_PIDFILE ||
- pidfile=$GLITE_LOCATION_VAR/glite-lb-proxy.pid
-
-start()
-{
- if test -z "$GLITE_USER" ;then
- echo 'Error: GLITE_USER is not set'
- echo FAILED
- return 1
- fi
-
- #
- # XXX: Starting proxy only with default socket paths
- #
- echo -n Starting glite-lb-proxy ...
- su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-proxy \
- -i $pidfile " && echo " done" || echo " FAILED"
-}
-
-stop()
-{
- if [ -f $pidfile ]; then
- pid=`cat $pidfile`
- kill $pid
- echo -n Stopping glite-lb-proxy \($pid\) ...
- try=0
- while ps p $pid >/dev/null 2>&1; do
- sleep 1;
- try=`expr $try + 1`
- if [ $try = 20 ]; then
- echo " giving up after $try retries"
- return 1
- fi
- done
- echo " done"
- rm -f $pidfile
- else
- echo $pidfile does not exist - glite-lb-proxy not running? >&2
- return 1
- fi
-}
-
-status()
-{
- if [ -f $pidfile ]; then
- pid=`cat $pidfile`
- if ps p $pid >/dev/null 2>&1; then
- echo glite-lb-proxy running as $pid
- return 0
- fi
- fi
-
- echo glite-lb-proxy not running
- return 1
-}
-
-case x$1 in
- xstart) start;;
- xstop) stop;;
- xrestart) stop; start;;
- xstatus) status;;
- x*) echo usage: $0 start,stop,restart,status >&2
- exit 1;;
-esac
+++ /dev/null
-LB proxy usage
-==============
-
-LB proxy accepts LB events, passes them to the full-featured LB servers, and
-serves both event and job state queries similarly to the LB server. However,
-the results of the queries reflect ONLY LOCAL VIEW of the proxy, i.e. the
-events that were logged through it, not regarding other events which may affect
-job state too. On the other hand, all the LB proxy operation is synchronous,
-i.e. it is guaranteed that a successfully logged event is visible in a query
-result immediately, unlike the standard LB logging chain.
-
-LB proxy is supposed to run on the RB machine, providing the WMS daemons
-with optimal LB performance, while offloading the user LB queries to
-a dedicated LB server.
-
-Events are logged to the LB proxy through local UNIX socket. The connection to
-the LB proxy is not encrypted, and no SSL-like authentication/authorisation is
-used, relying completely on UNIX security mechanism. Because of the missing
-SSL authentication the logging user identity has to be specified explicitely
-via LB proxy API.
-
-Due to the synchornous operation LB proxy can help with management of LB
-sequence codes. It records the most recent sequence code which can be retrieved
-and used later, even by another WMS component. However, this mechanism works
-for the "one job instance at time" model only. Once multiple instances of the
-same job may co-exist (which may be the case of shallow resubmission), these
-are distinguished exactly with the LB seqence code, hence LB proxy cannot
-do the job. For this case LB proxy API still provides means of specifying
-the sequence code explicitely.
-
-All jobs are recorded localy in the LB proxy database until job gets into
-CLEARED, ABORTED, CANCELED, DONE state. These jobs are then purged from LB
-proxy (but they are still available on the LB server).
->>A timeout should be set also, after which job should be purged from LB proxy.
-This has to be done by external purge client. <<
-
-Using API
-=========
-LB proxy uses same API functions for consumer and producer as LB does except the
-function names are postfixed with 'Proxy'. I.e. edg_wll_SetLoggingJob()
-has its own LB proxy variant edg_wll_SetLoggingJobProxy().
-
-For LB proxy comunication are used two separated local unix sockets. One for
-consumer other for producer API calls. Their values are set when the LB context
-is initialized according to unix enironment variables EDG_WL_LBPROXY_STORE_SOCK
-(producer API) and EDG_WL_LBPROXY_SERVE_SOCK (consumer API). If these variables
-are not set, default values are used (producer: "/tmp/lb_proxy_store.sock",
-consumer: "/tmp/lb_proxy_serve.sock"). After all you can overwrite them with
-edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_STORE_SOCK, "path_to_store_socket");
-and
-edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_SERVE_SOCK, "path_to_serve_socket");
-
-Other important difference is in edg_wll_SetLoggingJobProxy(), where it is not
-neccessary to give the sequence code parameter. If user do not specify it, LB
-proxy gets the actual one from its database. The 'user' attribute of this call
-should be the user certificate DN string. If not set, it is set from the unix
-environment by default.
-
-For example you could use:
-char *user = "/O=CESNET/O=Masaryk University/CN=Jiri Skrabal";
-edg_wll_SetLoggingJobProxy(ctx, jobid, NULL, user, EDG_WLL_SEQ_NORMAL);
-
-Only very different LB Proxy call is the 'RegisterJob'. The current
-implementation of RegisterJobProxy() talks both to the LB server
-bypassing interlogger, and to the LB proxy at once. So for job
-registration you should supply the user's credentials to the
-context in the same way as it was done until now. The other proxy calls
-don't need it.
+++ /dev/null
-The LB Proxy RPM package contains following files:
-bin/glite-lb-interlogd
-bin/glite-lb-proxy
-etc/glite-lb-dbsetup-proxy.sql
-etc/init.d/glite-lb-proxy
-share/doc/glite-lb-proxy-1.1.1/LICENSE
-
-The LB Proxy RPM package depends on glite-lb-client-interface and
-glite-lb-common RPM packages. In addition, a reasonable run-time functionality
-depends also on glite-lb-logger and running interlogger.
-
-LB Proxu is supposed to run on RB machine and its outgoing communication goes through
-interlogger. As a interlogger could be used that one which is used for any other
-logging calls. In fact, using more than one standard interlogger on one machine
-has usually not a valid reason. For full LB Proxy functionality you need to
-have running LB server (on any location).
-
-LB Proxy install should follow several steps described bellow:
-
-0) LB Proxy RPM package install
-
-1) Create new database in same way as it is done for bkserver.
- Database name: lbproxy
- Grant privileges to user: lbserver
- Database has the same structure as bkserver has (you can use
- sql script etc/glite-lb-dbsetup-proxy.sql to create propper tables).
-
- For better performance it's recommended to use database backend with
- transactions. It's set up by default, existing database can be migrated
- with etc/glite-lb-dbsetup-migrate2transaction.sql (lb-server package).
-
-2) Start servers with scripts from distribution
- /opt/glite/etc/init.d/glite-lb-locallogger start
- /opt/glite/etc/init.d/glite-lb-proxy start
-
- The glite-lb-locallogger script goes with the glite-lb-logger RPM package.
- and runs locallogger and interlogger as well. This is not neccessary to run
- locallogger if you do not use direct LB server logging calls, so you can
- simply start everythink you need from command line.
-
- The options to the LB proxy server:
- -p, --sock path-name to the local socket
- This is the path prefix for both LB Proxy unix
- sockets. Default value is "/tmp/lb_proxy_".
- -m, --mysql database connect string
- This has the same functionality as it is described in LB server
- Default value is "lbserver/@localhost:lbproxy".
- -d, --debug don't run as daemon, additional diagnostics
- -s, --slaves number of slave servers to fork
- -l, --semaphores number of semaphores (job locks) to use
- -i, --pidfile file to store master pid
- --proxy-il-sock socket to send events to interlogger
- Default value is "/tmp/interlogger.sock".
- --proxy-il-fprefix file prefix for events
- Default value is "/tmp/notif_events".
-
-4) Test the environment basic functionality:
- # job_reg uses direct access to the bkserver at `hostname -f`:9000
- # and to the LBProxy store socket (env. var EDG_WL_LBPROXY_STORE_SOCK)
- # at once
- ./glite-lb-job_reg -m `hostname -f`:9000 -x -s UserInterface
- # log usertag COLOR = red to the proxy
- ./glite-lb-log_usertag_proxy -s /tmp/lb_proxy_store.sock -j <jobid> -u test -n color -v red
- # and check lbserver values with job_stat
+++ /dev/null
-#!/bin/sh
-
-# XXX: add path to the stage area
-PATH=/home/michal/shared/egee/jra1-head/stage/bin:/home/michal/shared/egee/jra1-head/stage/examples:$PATH
-
-#set -x
-
-# Binaries
-LOGEV=${LOGEV:-glite-lb-logevent}
-JOBLOG=${JOBLOG:-glite-lb-job_log}
-JOBREG=${JOBREG:-glite-lb-job_reg}
-USERJOBS=${USERJOBS:-glite-lb-user_jobs}
-JOBSTAT=${JOBSTAT:-glite-lb-job_status}
-PURGE=${PURGE:-glite-lb-purge}
-
-# -m host
-BKSERVER_HOST=${BKSERVER_HOST:-`hostname -f`:9000}
-TEST_LBPROXY_STORE_SOCK=${EDG_WL_LBPROXY_STORE_SOCK:-/tmp/lb_proxy_store.sock}
-TEST_LBPROXY_SERVE_SOCK=${EDG_WL_LBPROXY_SERVE_SOCK:-/tmp/lb_proxy_serve.sock}
-
-STATES="aborted cancelled done ready running scheduled waiting"
-LBPROXY_PURGE_STATES="cleared done aborted cancelled"
-JOBS_ARRAY_SIZE=10
-SAMPLE_JOBS_ARRAY[0]=
-SAMPLE_JOBS_STATES[0]=
-SAMPLE_JOBS_RESPONSES[0]=
-
-# some defaults
-DEBUG=2
-LOGFD=${LOGFD:-1}
-LARGE_STRESS=${LARGE_STRESS:-}
-
-# timeouts for polling the bkserver
-timeout=10
-maxtimeout=300
-
-#
-# Procedures
-#
-
-# print help message
-show_help()
-{
- echo "Usage: $0 [OPTIONS] "
- echo "Options:"
- echo " -h | --help Show this help message."
- echo " -x | --proxy-sockpath-pref LBProxy socket path prefix."
- echo " -j | --jobs-count Count of test(ed) jobs."
- echo " -s | --states List of states in which could tested jobs fall."
- echo " -p | --proxy-purge-states List of states in which LBProxy purges the job."
- echo " -l | --large-stress 'size' Do a large stress logging ('size' random data added to the messages."
- echo " -g | --log 'logfile' Redirect all output to the 'logfile'."
- echo ""
- echo "For proper operation check your grid-proxy-info"
- grid-proxy-info
-}
-
-check_exec()
-{
- [ $DEBUG -gt 0 ] && [ -n "$2" ] && echo -n -e "$2\t" || echo -n -e "$1\t"
- eval $1
- RV=$?
- [ $DEBUG -gt 0 ] && [ $RV -eq 0 ] && echo "OK" || echo "FAILED"
- return $RV
-}
-
-# check for existance of needed executable(s)
-check_utils()
-{
- check_exec 'JOBREG=`which $JOBREG`' "Checkig $JOBREG utility" || exit 1
- check_exec 'JOBLOG=`which $JOBLOG`' "Checkig $JOBLOG utility" || exit 1
- check_exec 'LOGEV=`which $LOGEV`' "Checkig $LOGEV utility" || exit 1
- check_exec 'USERJOBS=`which $USERJOBS`' "Checkig $USERJOBS utility" || exit 1
- check_exec 'JOBSTAT=`which $JOBSTAT`' "Checkig $JOBSTAT utility" || exit 1
-}
-
-log_ev()
-{
-# $LOGEV -j $EDG_JOBID -s NetworkServer -e UserTag --name color --value red
- [ $DEBUG -gt 2 ] && echo "$LOGEV -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-log_ev_proxy()
-{
-# $LOGEV -x -j $EDG_JOBID -s NetworkServer -e UserTag --name color --value red
-
- [ $DEBUG -gt 2 ] && echo "$LOGEV -x -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV -x $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-purge()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-purge_proxy()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -x -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -x -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-
-db_clear_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Purging test jobs from db\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- LARGE_STRESS=""
- EDG_WL_SEQUENCE="UI=999999:NS=9999999999:WM=999999:BH=9999999999:JSS=999999:LM=999999:LRMS=999999:APP=999999"
-# log_ev_proxy -e Clear --reason=PurgingDB
-# purge_proxy
-# log_ev -e Clear --reason=PurgingDB
-# purge
-
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
-}
-
-# Test thet registers jobs
-# and checks against lbproxy and bkserver
-#
-test_gen_sample_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Registering sample jobs\t\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
-# eval `$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1 | tail -n 2`
- TMP=`$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1`
- [ $? -ne 0 ] && echo -e "ERROR\n\t$JOBREG error!"
- eval `echo "$TMP" | tail -n 2`
- test -z "$EDG_JOBID" && echo "test_gen_sample_jobs: $JOBREG failed" && exit 2
- SAMPLE_JOBS_ARRAY[$job]=$EDG_JOBID
-
- state=`$JOBSTAT $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
- proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
- if test "$state" != "submitted" ; then
- echo -e "ERROR\n\tjob ${SAMPLE_JOBS_ARRAY[$job]} not submitted succesfully!"
- exit 1;
- fi
- if test "$state" != "$proxy_state" ; then
- echo -e "ERROR\n\tjob $job (${SAMPLE_JOBS_ARRAY[$job]}) records on lbproxy and bkserver differs!"
-# exit 1;
- fi
- SAMPLE_JOBS_STATES[$job]=$state
-
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
- [ $DEBUG -gt 1 ] && {
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- echo ${SAMPLE_JOBS_ARRAY[$job]}
- job=$(($job + 1))
- done
- }
-}
-
-# Test that logs random set of events (for registered jobs) to lbproxy
-# and chcecks the state in lbproxy
-# and measures the time it takes the state to propagate to bkserver
-#
-test_logging_events()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Logging events to the lbproxy\t\t"
- st_count=`echo $STATES | wc -w`
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- tmp=`echo $RANDOM % $st_count + 1 | bc`
- state=`echo $STATES | cut -d " " -f $tmp | tr A-Z a-z`
-
- source glite-lb-$state.sh $LARGE_STRESS -X $TEST_LBPROXY_STORE_SOCK -m $BKSERVER_HOST -j ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 1>/dev/null
- [ $? -ne 0 ] && echo -e "ERROR\n\tglite-lb-$state.sh ${SAMPLE_JOBS_ARRAY[$job]} error!"
- proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
- purged=`echo $LBPROXY_PURGE_STATES | grep $state`
- bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-
- if test -n "$purged" ; then
- echo $proxy_state | grep "No such file or directory"
- if test $? -eq 0 ; then
- echo -e "ERROR\n\tJob ${SAMPLE_JOBS_ARRAY[$job]} was not purged out from LBProxy!"
- exit 1;
- fi
- fi
- if test -z "$purged" ; then
- if test "$state" != "$proxy_state" ; then
- echo -e "ERROR\n\tevents for job ${SAMPLE_JOBS_ARRAY[$job]} were not logged succesfully!"
- exit 1;
- fi
- fi
-
- response=0
- while [ "$state" != "$bkserver_state" ] ; do
- bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
- [ $DEBUG -gt 0 ] && echo -n "."
- sleep $timeout
- response=$(($response + $timeout ))
- if test $response -gt $maxtimeout ; then
- echo -e "ERROR\n\tstatus of job ${SAMPLE_JOBS_ARRAY[$job]} as queried from bkserver ($bkserver_state) has not become $state for more than $response seconds!"
- exit 1;
- fi
- done
-
- SAMPLE_JOBS_STATES[$job]=$state
- SAMPLE_JOBS_RESPONSES[$job]=$response
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
- [ $DEBUG -gt 1 ] && {
- job=0
- echo "Polling the bkserver took for individual jobs the following time"
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- echo -e "${SAMPLE_JOBS_ARRAY[$job]} (${SAMPLE_JOBS_STATES[$job]})\t${SAMPLE_JOBS_RESPONSES[$job]} seconds"
- job=$(($job + 1))
- done
- }
-}
-
-
-#
-# shell starting code
-
-# without parameters show help message
-# test -z "$1" && show_help
-
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") show_help && exit 0 ;;
- "-x" | "--proxy-sockpath-pref")
- shift
- export TEST_LBPROXY_STORE_SOCK=$1store.sock
- export TEST_LBPROXY_SERVE_SOCK=$1serve.sock
- ;;
- "-m" | "--bkserver") shift ; BKSERVER_HOST=$1 ;;
- "-j" | "--jobs-count") shift; JOBS_ARRAY_SIZE=$1 ;;
- "-s" | "--states") shift; STATES="$1" ;;
- "-p" | "--proxy-purge-states") shift; LBPROXY_PURGE_STATES="$1" ;;
- "-l" | "--large-stress") shift ; LARGE_STRESS="-l $1" ;;
- "-g" | "--log") shift ; logfile=$1 ;;
-
- *) echo "Unrecognized option $1" ;;
-
- esac
- shift
-done
-
-if test -n "$logfile" ; then
- LOGFD=3
- exec 3>$logfile
-fi
-
-
-echo "STATES = $STATES"
-echo "LBPROXY_PURGE_STATES = $LBPROXY_PURGE_STATES"
-
-check_utils
-
-test_gen_sample_jobs
-test_logging_events
-
-db_clear_jobs
+++ /dev/null
-#!/bin/sh
-
-# XXX: add path to the stage area
-PATH=/home/michal/shared/egee/jra1/stage/bin:/home/michal/shared/egee/jra1/stage/examples:$PATH
-
-#set -x
-
-# Binaries
-LOGEV=${LOGEV:-glite-lb-logevent}
-JOBLOG=${JOBLOG:-glite-lb-job_log}
-JOBREG=${JOBREG:-glite-lb-job_reg}
-USERJOBS=${USERJOBS:-glite-lb-user_jobs}
-JOBSTAT=${JOBSTAT:-glite-lb-job_status}
-PURGE=${PURGE:-glite-lb-purge}
-
-# -m host
-BKSERVER_HOST=${BKSERVER_HOST:-`hostname -f`:9000}
-TEST_LBPROXY_STORE_SOCK=${EDG_WL_LBPROXY_STORE_SOCK:-/tmp/lb_proxy_store.sock}
-TEST_LBPROXY_SERVE_SOCK=${EDG_WL_LBPROXY_SERVE_SOCK:-/tmp/lb_proxy_serve.sock}
-
-STATES="aborted cancelled done ready running scheduled waiting"
-LBPROXY_PURGE_STATES="cleared done aborted cancelled"
-JOBS_ARRAY_SIZE=10
-SAMPLE_JOBS_ARRAY[0]=
-SAMPLE_JOBS_STATES[0]=
-SAMPLE_JOBS_RESPONSES[0]=
-
-# some defaults
-DEBUG=2
-LOGFD=${LOGFD:-1}
-LARGE_STRESS=${LARGE_STRESS:-}
-
-# timeouts for polling the bkserver
-timeout=10
-maxtimeout=300
-
-#
-# Procedures
-#
-
-# print help message
-show_help()
-{
- echo "Usage: $0 [OPTIONS] "
- echo "Options:"
- echo " -h | --help Show this help message."
- echo " -x | --proxy-sockpath-pref LBProxy socket path prefix."
- echo " -j | --jobs-count Count of test(ed) jobs."
- echo " -s | --states List of states in which could tested jobs fall."
- echo " -p | --proxy-purge-states List of states in which LBProxy purges the job."
- echo " -l | --large-stress 'size' Do a large stress logging ('size' random data added to the messages."
- echo " -g | --log 'logfile' Redirect all output to the 'logfile'."
- echo ""
- echo "For proper operation check your grid-proxy-info"
- grid-proxy-info
-}
-
-get_time()
-{
- sec=`date +%s`
- nsec=`date +%N`
- time=`echo "1000000000*$sec + $nsec"|bc`
-# time=$sec
- return 0
-}
-
-check_exec()
-{
- [ $DEBUG -gt 0 ] && [ -n "$2" ] && echo -n -e "$2\t" || echo -n -e "$1\t"
- eval $1
- RV=$?
- [ $DEBUG -gt 0 ] && [ $RV -eq 0 ] && echo "OK" || echo "FAILED"
- return $RV
-}
-
-# check for existance of needed executable(s)
-check_utils()
-{
- check_exec 'JOBREG=`which $JOBREG`' "Checkig $JOBREG utility" || exit 1
- check_exec 'JOBLOG=`which $JOBLOG`' "Checkig $JOBLOG utility" || exit 1
- check_exec 'LOGEV=`which $LOGEV`' "Checkig $LOGEV utility" || exit 1
- check_exec 'USERJOBS=`which $USERJOBS`' "Checkig $USERJOBS utility" || exit 1
- check_exec 'JOBSTAT=`which $JOBSTAT`' "Checkig $JOBSTAT utility" || exit 1
-}
-
-log_ev()
-{
-# $LOGEV -j $EDG_JOBID -s NetworkServer -n $1 -e UserTag --name color --value red
- [ $DEBUG -gt 2 ] && echo "$LOGEV -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-log_ev_proxy()
-{
-# $LOGEV -x -j $EDG_JOBID -s NetworkServer -n $1 -e UserTag --name color --value red
-
- [ $DEBUG -gt 2 ] && echo "$LOGEV -x -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV -x $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-purge()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-purge_proxy()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -x -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -x -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-
-db_clear_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Purging test jobs from db\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- LARGE_STRESS=""
- EDG_WL_SEQUENCE="UI=999999:NS=9999999999:WM=999999:BH=9999999999:JSS=999999:LM=999999:LRMS=999999:APP=999999"
-# log_ev_proxy -e Clear --reason=PurgingDB
-# purge_proxy
-# log_ev -e Clear --reason=PurgingDB
-# purge
-
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
-}
-
-# Test thet registers jobs
-# and checks against lbproxy and bkserver
-#
-test_gen_sample_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Registering sample jobs\t\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
-# eval `$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1 | tail -n 2`
- TMP=`$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1`
- [ $? -ne 0 ] && echo -e "ERROR\n\t$JOBREG error!"
- eval `echo "$TMP" | tail -n 2`
- if test -z "$EDG_JOBID" ; then
- echo "test_gen_sample_jobs: $JOBREG failed"
- else
- SAMPLE_JOBS_ARRAY[$job]=$EDG_JOBID
- fi
-
-# state=`$JOBSTAT $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# if test "$state" != "submitted" ; then
-# echo -e "ERROR\n\tjob ${SAMPLE_JOBS_ARRAY[$job]} not submitted succesfully!"
-# fi
-# if test "$state" != "$proxy_state" ; then
-# echo -e "ERROR\n\tjob (${SAMPLE_JOBS_ARRAY[$job]}) records on lbproxy and bkserver differs!"
-# fi
-# SAMPLE_JOBS_STATES[$job]=$state
- echo -n "."
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
-# [ $DEBUG -gt 1 ] && {
-# job=0
-# while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
-# echo ${SAMPLE_JOBS_ARRAY[$job]}
-# job=$(($job + 1))
-# done
-# }
-}
-
-# Test that logs random set of events (for registered jobs) to lbproxy
-# and checks the state in lbproxy
-# and measures the time it takes the state to propagate to bkserver
-#
-test_logging_events()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Logging events to the lbproxy\t\t"
- st_count=`echo $STATES | wc -w`
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- echo -n "."
- if test -z "${SAMPLE_JOBS_ARRAY[$job]}" ; then
- job=$(($job + 1))
- continue
- fi
-# tmp=`echo $RANDOM % $st_count + 1 | bc`
-# state=`echo $STATES | cut -d " " -f $tmp | tr A-Z a-z`
- get_time
- start=$time
-
-# source glite-lb-$state.sh $LARGE_STRESS -X $TEST_LBPROXY_STORE_SOCK -m $BKSERVER_HOST -j ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 1>/dev/null
-# [ $? -ne 0 ] && echo -e "ERROR\n\tglite-lb-$state.sh ${SAMPLE_JOBS_ARRAY[$job]} error!"
- log_ev_proxy -n 100 -e UserTag --tag=color --value=red
-
-# proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# purged=`echo $LBPROXY_PURGE_STATES | grep $state`
-# bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-#
-# if test -n "$purged" ; then
-# echo $proxy_state | grep "No such file or directory"
-# if test $? -eq 0 ; then
-# echo -e "ERROR\n\tJob ${SAMPLE_JOBS_ARRAY[$job]} was not purged out from LBProxy!"
-# exit 1;
-# fi
-# fi
-# if test -z "$purged" ; then
-# if test "$state" != "$proxy_state" ; then
-# echo -e "ERROR\n\tevents for job ${SAMPLE_JOBS_ARRAY[$job]} were not logged succesfully!"
-# exit 1;
-# fi
-# fi
-
-# response=0
-# while [ "$state" != "$bkserver_state" ] ; do
-# bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# [ $DEBUG -gt 0 ] && echo -n "."
-# sleep $timeout
-# response=$(($response + $timeout ))
-# if test $response -gt $maxtimeout ; then
-# echo -e "ERROR\n\tstatus of job ${SAMPLE_JOBS_ARRAY[$job]} as queried from bkserver ($bkserver_state) has not become $state for more than $response seconds!"
-# exit 1;
-# fi
-# done
-#
-# SAMPLE_JOBS_STATES[$job]=$state
- get_time
- response=`echo "scale=9; ($time - $start)/1000000000"|bc`
- SAMPLE_JOBS_RESPONSES[$job]=$response
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
- [ $DEBUG -gt 1 ] && {
- job=0
- total=0
-# echo "Sending events took for individual jobs the following time"
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- total=`echo "scale=9; $total + ${SAMPLE_JOBS_RESPONSES[$job]}" |bc`
-# echo -e "${SAMPLE_JOBS_ARRAY[$job]} \t${SAMPLE_JOBS_RESPONSES[$job]} seconds"
- job=$(($job + 1))
- done
- echo -e "Total time for $JOBS_ARRAY_SIZE jobs: \t$total"
- echo -e -n "Average time for job: \t"
- echo "scale=9; $total / $JOBS_ARRAY_SIZE"|bc
- echo -e -n "Job throughput (jobs/sec): \t"
- echo "scale=9; $JOBS_ARRAY_SIZE / $total"|bc
-
- }
-}
-
-
-#
-# shell starting code
-
-# without parameters show help message
-# test -z "$1" && show_help
-
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") show_help && exit 0 ;;
- "-x" | "--proxy-sockpath-pref")
- shift
- export TEST_LBPROXY_STORE_SOCK=$1store.sock
- export TEST_LBPROXY_SERVE_SOCK=$1serve.sock
- ;;
- "-m" | "--bkserver") shift ; BKSERVER_HOST=$1 ;;
- "-j" | "--jobs-count") shift; JOBS_ARRAY_SIZE=$1 ;;
- "-s" | "--states") shift; STATES="$1" ;;
- "-p" | "--proxy-purge-states") shift; LBPROXY_PURGE_STATES="$1" ;;
- "-l" | "--large-stress") shift ; LARGE_STRESS="-l $1" ;;
- "-g" | "--log") shift ; logfile=$1 ;;
-
- *) echo "Unrecognized option $1" ;;
-
- esac
- shift
-done
-
-if test -n "$logfile" ; then
- LOGFD=3
- exec 3>$logfile
-fi
-
-
-echo "STATES = $STATES"
-echo "LBPROXY_PURGE_STATES = $LBPROXY_PURGE_STATES"
-
-check_utils
-
-test_gen_sample_jobs
-test_logging_events
-
-db_clear_jobs
+++ /dev/null
-#!/bin/sh
-
-# XXX: add path to the stage area
-PATH=/home/michal/shared/egee/jra1/stage/bin:/home/michal/shared/egee/jra1/stage/examples:$PATH
-
-#set -x
-
-# Binaries
-LOGEV=${LOGEV:-glite-lb-logevent}
-JOBLOG=${JOBLOG:-glite-lb-job_log}
-JOBREG=${JOBREG:-glite-lb-job_reg}
-USERJOBS=${USERJOBS:-glite-lb-user_jobs}
-JOBSTAT=${JOBSTAT:-glite-lb-job_status}
-PURGE=${PURGE:-glite-lb-purge}
-
-# -m host
-BKSERVER_HOST=${BKSERVER_HOST:-`hostname -f`:9000}
-TEST_LBPROXY_STORE_SOCK=${EDG_WL_LBPROXY_STORE_SOCK:-/tmp/lb_proxy_store.sock}
-TEST_LBPROXY_SERVE_SOCK=${EDG_WL_LBPROXY_SERVE_SOCK:-/tmp/lb_proxy_serve.sock}
-
-STATES="aborted cancelled done ready running scheduled waiting"
-LBPROXY_PURGE_STATES="cleared done aborted cancelled"
-JOBS_ARRAY_SIZE=10
-EVENT_NUMBER=50
-SAMPLE_JOBS_ARRAY[0]=
-SAMPLE_JOBS_STATES[0]=
-SAMPLE_JOBS_RESPONSES[0]=
-
-# some defaults
-DEBUG=2
-LOGFD=${LOGFD:-1}
-LARGE_STRESS=${LARGE_STRESS:-}
-
-# timeouts for polling the bkserver
-timeout=10
-maxtimeout=300
-
-#
-# Procedures
-#
-
-# print help message
-show_help()
-{
- echo "Usage: $0 [OPTIONS] "
- echo "Options:"
- echo " -h | --help Show this help message."
- echo " -x | --proxy-sockpath-pref LBProxy socket path prefix."
- echo " -j | --jobs-count Count of test(ed) jobs."
- echo " -n | --event-count Number of events per job."
- echo " -s | --states List of states in which could tested jobs fall."
- echo " -p | --proxy-purge-states List of states in which LBProxy purges the job."
- echo " -l | --large-stress 'size' Do a large stress logging ('size' random data added to the messages."
- echo " -g | --log 'logfile' Redirect all output to the 'logfile'."
- echo ""
- echo "For proper operation check your grid-proxy-info"
- grid-proxy-info
-}
-
-get_time()
-{
- sec=`date +%s`
- nsec=`date +%N`
- time=`echo "1000000000*$sec + $nsec"|bc`
-# time=$sec
- return 0
-}
-
-check_exec()
-{
- [ $DEBUG -gt 0 ] && [ -n "$2" ] && echo -n -e "$2\t" || echo -n -e "$1\t"
- eval $1
- RV=$?
- [ $DEBUG -gt 0 ] && [ $RV -eq 0 ] && echo "OK" || echo "FAILED"
- return $RV
-}
-
-# check for existance of needed executable(s)
-check_utils()
-{
- check_exec 'JOBREG=`which $JOBREG`' "Checkig $JOBREG utility" || exit 1
- check_exec 'JOBLOG=`which $JOBLOG`' "Checkig $JOBLOG utility" || exit 1
- check_exec 'LOGEV=`which $LOGEV`' "Checkig $LOGEV utility" || exit 1
- check_exec 'USERJOBS=`which $USERJOBS`' "Checkig $USERJOBS utility" || exit 1
- check_exec 'JOBSTAT=`which $JOBSTAT`' "Checkig $JOBSTAT utility" || exit 1
-}
-
-log_ev()
-{
-# $LOGEV -j $EDG_JOBID -s NetworkServer -n $1 -e UserTag --name color --value red
- [ $DEBUG -gt 2 ] && echo "$LOGEV -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-log_ev_proxy()
-{
-# $LOGEV -x -j $EDG_JOBID -s NetworkServer -n $1 -e UserTag --name color --value red
-
- [ $DEBUG -gt 2 ] && echo "$LOGEV -x -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV -x $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-purge()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-purge_proxy()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -x -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -x -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-
-db_clear_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Purging test jobs from db\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- LARGE_STRESS=""
- EDG_WL_SEQUENCE="UI=999999:NS=9999999999:WM=999999:BH=9999999999:JSS=999999:LM=999999:LRMS=999999:APP=999999"
-# log_ev_proxy -e Clear --reason=PurgingDB
-# purge_proxy
-# log_ev -e Clear --reason=PurgingDB
-# purge
-
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
-}
-
-# Test thet registers jobs
-# and checks against lbproxy and bkserver
-#
-test_gen_sample_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Registering sample jobs\t\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
-# eval `$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1 | tail -n 2`
- TMP=`$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1`
- [ $? -ne 0 ] && echo -e "ERROR\n\t$JOBREG error!"
- eval `echo "$TMP" | tail -n 2`
- if test -z "$EDG_JOBID" ; then
- echo "test_gen_sample_jobs: $JOBREG failed"
- else
- SAMPLE_JOBS_ARRAY[$job]=$EDG_JOBID
- fi
-
-# state=`$JOBSTAT $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# if test "$state" != "submitted" ; then
-# echo -e "ERROR\n\tjob ${SAMPLE_JOBS_ARRAY[$job]} not submitted succesfully!"
-# fi
-# if test "$state" != "$proxy_state" ; then
-# echo -e "ERROR\n\tjob (${SAMPLE_JOBS_ARRAY[$job]}) records on lbproxy and bkserver differs!"
-# fi
-# SAMPLE_JOBS_STATES[$job]=$state
- echo -n "."
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
-# [ $DEBUG -gt 1 ] && {
-# job=0
-# while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
-# echo ${SAMPLE_JOBS_ARRAY[$job]}
-# job=$(($job + 1))
-# done
-# }
-}
-
-# Test that logs random set of events (for registered jobs) to lbproxy
-# and checks the state in lbproxy
-# and measures the time it takes the state to propagate to bkserver
-#
-test_logging_events()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Logging events to the lbproxy\t\t"
- st_count=`echo $STATES | wc -w`
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- echo -n "."
- if test -z "${SAMPLE_JOBS_ARRAY[$job]}" ; then
- job=$(($job + 1))
- continue
- fi
-# tmp=`echo $RANDOM % $st_count + 1 | bc`
-# state=`echo $STATES | cut -d " " -f $tmp | tr A-Z a-z`
- get_time
- start=$time
-
-# source glite-lb-$state.sh $LARGE_STRESS -X $TEST_LBPROXY_STORE_SOCK -m $BKSERVER_HOST -j ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 1>/dev/null
-# [ $? -ne 0 ] && echo -e "ERROR\n\tglite-lb-$state.sh ${SAMPLE_JOBS_ARRAY[$job]} error!"
- log_ev_proxy -n $EVENT_NUMBER -e UserTag --tag=color --value=red
-
-# proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# purged=`echo $LBPROXY_PURGE_STATES | grep $state`
-# bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-#
-# if test -n "$purged" ; then
-# echo $proxy_state | grep "No such file or directory"
-# if test $? -eq 0 ; then
-# echo -e "ERROR\n\tJob ${SAMPLE_JOBS_ARRAY[$job]} was not purged out from LBProxy!"
-# exit 1;
-# fi
-# fi
-# if test -z "$purged" ; then
-# if test "$state" != "$proxy_state" ; then
-# echo -e "ERROR\n\tevents for job ${SAMPLE_JOBS_ARRAY[$job]} were not logged succesfully!"
-# exit 1;
-# fi
-# fi
-
-# response=0
-# while [ "$state" != "$bkserver_state" ] ; do
-# bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# [ $DEBUG -gt 0 ] && echo -n "."
-# sleep $timeout
-# response=$(($response + $timeout ))
-# if test $response -gt $maxtimeout ; then
-# echo -e "ERROR\n\tstatus of job ${SAMPLE_JOBS_ARRAY[$job]} as queried from bkserver ($bkserver_state) has not become $state for more than $response seconds!"
-# exit 1;
-# fi
-# done
-#
-# SAMPLE_JOBS_STATES[$job]=$state
- get_time
- response=`echo "scale=9; ($time - $start)/1000000000"|bc`
- SAMPLE_JOBS_RESPONSES[$job]=$response
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
- [ $DEBUG -gt 1 ] && {
- job=0
- total=0
-# echo "Sending events took for individual jobs the following time"
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- total=`echo "scale=9; $total + ${SAMPLE_JOBS_RESPONSES[$job]}" |bc`
-# echo -e "${SAMPLE_JOBS_ARRAY[$job]} \t${SAMPLE_JOBS_RESPONSES[$job]} seconds"
- job=$(($job + 1))
- done
- echo -e "Total time for $JOBS_ARRAY_SIZE jobs: \t$total"
- echo -e -n "Average time for event: \t"
- echo "scale=9; $total / $JOBS_ARRAY_SIZE / $EVENT_NUMBER"|bc
- echo -e -n "Event throughput (events/sec): \t"
- echo "scale=9; $EVENT_NUMBER * $JOBS_ARRAY_SIZE / $total"|bc
-
- }
-}
-
-
-#
-# shell starting code
-
-# without parameters show help message
-# test -z "$1" && show_help
-
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") show_help && exit 0 ;;
- "-x" | "--proxy-sockpath-pref")
- shift
- export TEST_LBPROXY_STORE_SOCK=$1store.sock
- export TEST_LBPROXY_SERVE_SOCK=$1serve.sock
- ;;
- "-m" | "--bkserver") shift ; BKSERVER_HOST=$1 ;;
- "-j" | "--jobs-count") shift; JOBS_ARRAY_SIZE=$1 ;;
- "-n" | "--event-count") shift; EVENT_NUMBER=$1 ;;
- "-s" | "--states") shift; STATES="$1" ;;
- "-p" | "--proxy-purge-states") shift; LBPROXY_PURGE_STATES="$1" ;;
- "-l" | "--large-stress") shift ; LARGE_STRESS="-l $1" ;;
- "-g" | "--log") shift ; logfile=$1 ;;
-
- *) echo "Unrecognized option $1" ;;
-
- esac
- shift
-done
-
-if test -n "$logfile" ; then
- LOGFD=3
- exec 3>$logfile
-fi
-
-
-echo "STATES = $STATES"
-echo "LBPROXY_PURGE_STATES = $LBPROXY_PURGE_STATES"
-
-check_utils
-
-test_gen_sample_jobs
-test_logging_events
-
-db_clear_jobs
+++ /dev/null
-#!/bin/sh
-
-# XXX: add path to the stage area
-PATH=/home/michal/shared/egee/jra1/stage/bin:/home/michal/shared/egee/jra1/stage/examples:$PATH
-
-#set -x
-
-# Binaries
-LOGEV=${LOGEV:-glite-lb-logevent}
-JOBLOG=${JOBLOG:-glite-lb-job_log}
-JOBREG=${JOBREG:-glite-lb-job_reg}
-USERJOBS=${USERJOBS:-glite-lb-user_jobs}
-JOBSTAT=${JOBSTAT:-glite-lb-job_status}
-PURGE=${PURGE:-glite-lb-purge}
-
-# -m host
-BKSERVER_HOST=${BKSERVER_HOST:-`hostname -f`:9000}
-TEST_LBPROXY_STORE_SOCK=${EDG_WL_LBPROXY_STORE_SOCK:-/tmp/lb_proxy_store.sock}
-TEST_LBPROXY_SERVE_SOCK=${EDG_WL_LBPROXY_SERVE_SOCK:-/tmp/lb_proxy_serve.sock}
-
-STATES="aborted cancelled done ready running scheduled waiting"
-LBPROXY_PURGE_STATES="cleared done aborted cancelled"
-JOBS_ARRAY_SIZE=10
-SAMPLE_JOBS_ARRAY[0]=
-SAMPLE_JOBS_STATES[0]=
-SAMPLE_JOBS_RESPONSES[0]=
-
-# some defaults
-DEBUG=2
-LOGFD=${LOGFD:-1}
-LARGE_STRESS=${LARGE_STRESS:-}
-
-# timeouts for polling the bkserver
-timeout=10
-maxtimeout=300
-
-#
-# Procedures
-#
-
-# print help message
-show_help()
-{
- echo "Usage: $0 [OPTIONS] "
- echo "Options:"
- echo " -h | --help Show this help message."
- echo " -x | --proxy-sockpath-pref LBProxy socket path prefix."
- echo " -j | --jobs-count Count of test(ed) jobs."
- echo " -n | --subjobs Number of subjobs."
- echo " -s | --states List of states in which could tested jobs fall."
- echo " -p | --proxy-purge-states List of states in which LBProxy purges the job."
- echo " -l | --large-stress 'size' Do a large stress logging ('size' random data added to the messages."
- echo " -g | --log 'logfile' Redirect all output to the 'logfile'."
- echo ""
- echo "For proper operation check your grid-proxy-info"
- grid-proxy-info
-}
-
-get_time()
-{
- sec=`date +%s`
- nsec=`date +%N`
- time=`echo "1000000000*$sec + $nsec"|bc`
-# time=$sec
- return 0
-}
-
-check_exec()
-{
- [ $DEBUG -gt 0 ] && [ -n "$2" ] && echo -n -e "$2\t" || echo -n -e "$1\t"
- eval $1
- RV=$?
- [ $DEBUG -gt 0 ] && [ $RV -eq 0 ] && echo "OK" || echo "FAILED"
- return $RV
-}
-
-# check for existance of needed executable(s)
-check_utils()
-{
- check_exec 'JOBREG=`which $JOBREG`' "Checkig $JOBREG utility" || exit 1
- check_exec 'JOBLOG=`which $JOBLOG`' "Checkig $JOBLOG utility" || exit 1
- check_exec 'LOGEV=`which $LOGEV`' "Checkig $LOGEV utility" || exit 1
- check_exec 'USERJOBS=`which $USERJOBS`' "Checkig $USERJOBS utility" || exit 1
- check_exec 'JOBSTAT=`which $JOBSTAT`' "Checkig $JOBSTAT utility" || exit 1
-}
-
-log_ev()
-{
-# $LOGEV -j $EDG_JOBID -s NetworkServer -n $1 -e UserTag --name color --value red
- [ $DEBUG -gt 2 ] && echo "$LOGEV -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-log_ev_proxy()
-{
-# $LOGEV -x -j $EDG_JOBID -s NetworkServer -n $1 -e UserTag --name color --value red
-
- [ $DEBUG -gt 2 ] && echo "$LOGEV -x -j \"$EDG_JOBID\" -s UserInterface -c \"$EDG_WL_SEQUENCE\" $@"
- EDG_WL_SEQUENCE=`$LOGEV -x $LARGE_STRESS -j $EDG_JOBID -s UserInterface -c $EDG_WL_SEQUENCE "$@"`
- test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && echo "missing EDG_WL_SEQUENCE from $LOGEV"
-}
-
-purge()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-purge_proxy()
-{
- [ $DEBUG -gt 2 ] && echo "$PURGE -x -a 0 -c 0 -n 0 -o 0 $@"
- $PURGE -x -a 0 -c 0 -n 0 -o 0 "$@"
-}
-
-
-db_clear_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Purging test jobs from db\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- LARGE_STRESS=""
- EDG_WL_SEQUENCE="UI=999999:NS=9999999999:WM=999999:BH=9999999999:JSS=999999:LM=999999:LRMS=999999:APP=999999"
-# log_ev_proxy -e Clear --reason=PurgingDB
-# purge_proxy
-# log_ev -e Clear --reason=PurgingDB
-# purge
-
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
-}
-
-# Test thet registers jobs
-# and checks against lbproxy and bkserver
-#
-test_gen_sample_jobs()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Registering sample jobs\t\t\t"
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
-# eval `$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1 | tail -n 2`
- get_time
- start=$time
- [ $? -ne 0 ] && echo -e "ERROR\n\t$JOBREG error!"
- if [[ -z $SUBJOBS ]] ; then
- TMP=`$JOBREG -x -m $BKSERVER_HOST -s UserInterface 2>&1`
- get_time
- eval `echo "$TMP" | tail -n 2`
- else
- TMP=`$JOBREG -x -m $BKSERVER_HOST -s UserInterface -n $SUBJOBS 2>&1`
- get_time
- eval `echo "$TMP" | grep DAG_JOBID`
- EDG_JOBID=$EDG_WL_DAG_JOBID
- fi
- if test -z "$EDG_JOBID" ; then
- echo "test_gen_sample_jobs: $JOBREG failed"
- else
- SAMPLE_JOBS_ARRAY[$job]=$EDG_JOBID
- response=`echo "scale=9; ($time - $start)/1000000000"|bc`
- SAMPLE_JOBS_RESPONSES[$job]=$response
- fi
-
-# state=`$JOBSTAT $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK $EDG_JOBID 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# if test "$state" != "submitted" ; then
-# echo -e "ERROR\n\tjob ${SAMPLE_JOBS_ARRAY[$job]} not submitted succesfully!"
-# fi
-# if test "$state" != "$proxy_state" ; then
-# echo -e "ERROR\n\tjob (${SAMPLE_JOBS_ARRAY[$job]}) records on lbproxy and bkserver differs!"
-# fi
-# SAMPLE_JOBS_STATES[$job]=$state
- echo -n "."
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
- [ $DEBUG -gt 1 ] && {
- job=0
- total=0
-# echo "Registration took for individual jobs the following time"
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- total=`echo "scale=9; $total + ${SAMPLE_JOBS_RESPONSES[$job]}" |bc`
-# echo -e "${SAMPLE_JOBS_ARRAY[$job]} \t${SAMPLE_JOBS_RESPONSES[$job]} seconds"
- job=$(($job + 1))
- done
- echo "Registration results:"
- echo -e "Total time for $JOBS_ARRAY_SIZE jobs with $SUBJOBS subjobs: \t$total"
- echo -e -n "Average time for registration: \t"
- echo "scale=9; $total / $JOBS_ARRAY_SIZE / $SUBJOBS"|bc
- echo -e -n "Registration throughput (jobs/sec): \t"
- echo "scale=9; $SUBJOBS * $JOBS_ARRAY_SIZE / $total"|bc
-
- }
-# [ $DEBUG -gt 1 ] && {
-# job=0
-# while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
-# echo ${SAMPLE_JOBS_ARRAY[$job]}
-# job=$(($job + 1))
-# done
-# }
-}
-
-# Test that logs random set of events (for registered jobs) to lbproxy
-# and checks the state in lbproxy
-# and measures the time it takes the state to propagate to bkserver
-#
-test_logging_events()
-{
- [ $DEBUG -gt 0 ] && echo -n -e "Logging events to the lbproxy\t\t"
- st_count=`echo $STATES | wc -w`
- job=0
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- echo -n "."
- if test -z "${SAMPLE_JOBS_ARRAY[$job]}" ; then
- job=$(($job + 1))
- continue
- fi
-# tmp=`echo $RANDOM % $st_count + 1 | bc`
-# state=`echo $STATES | cut -d " " -f $tmp | tr A-Z a-z`
- get_time
- start=$time
-
-# source glite-lb-$state.sh $LARGE_STRESS -X $TEST_LBPROXY_STORE_SOCK -m $BKSERVER_HOST -j ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 1>/dev/null
-# [ $? -ne 0 ] && echo -e "ERROR\n\tglite-lb-$state.sh ${SAMPLE_JOBS_ARRAY[$job]} error!"
- log_ev_proxy -n 100 -e UserTag --tag=color --value=red
-
-# proxy_state=`$JOBSTAT -x $TEST_LBPROXY_SERVE_SOCK ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# purged=`echo $LBPROXY_PURGE_STATES | grep $state`
-# bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-#
-# if test -n "$purged" ; then
-# echo $proxy_state | grep "No such file or directory"
-# if test $? -eq 0 ; then
-# echo -e "ERROR\n\tJob ${SAMPLE_JOBS_ARRAY[$job]} was not purged out from LBProxy!"
-# exit 1;
-# fi
-# fi
-# if test -z "$purged" ; then
-# if test "$state" != "$proxy_state" ; then
-# echo -e "ERROR\n\tevents for job ${SAMPLE_JOBS_ARRAY[$job]} were not logged succesfully!"
-# exit 1;
-# fi
-# fi
-
-# response=0
-# while [ "$state" != "$bkserver_state" ] ; do
-# bkserver_state=`$JOBSTAT ${SAMPLE_JOBS_ARRAY[$job]} 2>&1 | grep "state :" | cut -d " " -f 3 | tr A-Z a-z`
-# [ $DEBUG -gt 0 ] && echo -n "."
-# sleep $timeout
-# response=$(($response + $timeout ))
-# if test $response -gt $maxtimeout ; then
-# echo -e "ERROR\n\tstatus of job ${SAMPLE_JOBS_ARRAY[$job]} as queried from bkserver ($bkserver_state) has not become $state for more than $response seconds!"
-# exit 1;
-# fi
-# done
-#
-# SAMPLE_JOBS_STATES[$job]=$state
- get_time
- response=`echo "scale=9; ($time - $start)/1000000000"|bc`
- SAMPLE_JOBS_RESPONSES[$job]=$response
- job=$(($job + 1))
- done
- [ $DEBUG -gt 0 ] && echo "OK"
- [ $DEBUG -gt 1 ] && {
- job=0
- total=0
-# echo "Sending events took for individual jobs the following time"
- while [ $job -lt $JOBS_ARRAY_SIZE ] ; do
- total=`echo "scale=9; $total + ${SAMPLE_JOBS_RESPONSES[$job]}" |bc`
-# echo -e "${SAMPLE_JOBS_ARRAY[$job]} \t${SAMPLE_JOBS_RESPONSES[$job]} seconds"
- job=$(($job + 1))
- done
- echo -e "Total time for $JOBS_ARRAY_SIZE jobs: \t$total"
- echo -e -n "Average time for job: \t"
- echo "scale=9; $total / $JOBS_ARRAY_SIZE"|bc
- echo -e -n "Job throughput (jobs/sec): \t"
- echo "scale=9; $JOBS_ARRAY_SIZE / $total"|bc
-
- }
-}
-
-
-#
-# shell starting code
-
-# without parameters show help message
-# test -z "$1" && show_help
-
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") show_help && exit 0 ;;
- "-x" | "--proxy-sockpath-pref")
- shift
- export TEST_LBPROXY_STORE_SOCK=$1store.sock
- export TEST_LBPROXY_SERVE_SOCK=$1serve.sock
- ;;
- "-m" | "--bkserver") shift ; BKSERVER_HOST=$1 ;;
- "-j" | "--jobs-count") shift; JOBS_ARRAY_SIZE=$1 ;;
- "-n" | "--subjobs") shift; SUBJOBS="$1" ;;
- "-s" | "--states") shift; STATES="$1" ;;
- "-p" | "--proxy-purge-states") shift; LBPROXY_PURGE_STATES="$1" ;;
- "-l" | "--large-stress") shift ; LARGE_STRESS="-l $1" ;;
- "-g" | "--log") shift ; logfile=$1 ;;
-
- *) echo "Unrecognized option $1" ;;
-
- esac
- shift
-done
-
-if test -n "$logfile" ; then
- LOGFD=3
- exec 3>$logfile
-fi
-
-
-echo "STATES = $STATES"
-echo "LBPROXY_PURGE_STATES = $LBPROXY_PURGE_STATES"
-
-check_utils
-
-test_gen_sample_jobs
-#test_logging_events
-
-db_clear_jobs
+++ /dev/null
-#Fri Aug 18 12:34:06 CEST 2006
-module.build=0100
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration options for the GLite LB Proxy module
-
- Authors: Jiri Skrabal <nykolas@ics.muni.cz>
-
- Revision history:
-
-
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="LB Server configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-mysql_prefix=${with.mysql.prefix}
-mysql_version=${ext.mysql.version}
-gridsite_prefix=${with.gridsite.prefix}
-gsoap_prefix=${with.gsoap.prefix}
-cppunit_prefix=${with.cppunit.prefix}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Glite LB Proxy component
-
- Authors: Jiri Skrabal <nykolas@ics.muni.cz>
-
- Revision history:
-
--->
-
-<project name="LB Proxy component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="proxy" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure-options.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-#Fri Sep 02 14:18:53 CEST 2005
-module.version=1.4.1
-module.age=3
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-
-#include "glite/lb/jobstat.h"
-
-char* write2rgma_statline(edg_wll_JobStat *stat)
-{
- fputs("fake write2rgma_statline()\n",stderr);
- return NULL;
-}
-
-void write2rgma_status(edg_wll_JobStat *stat)
-{
- fputs("fake write2rgma_statline()\n",stderr);
-}
-
-void write2rgma_chgstatus(edg_wll_JobStat *stat, char *prev_statline)
-{
- fputs("fake write2rgma_chgstatus()\n",stderr);
-}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <linux/limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <sys/un.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <errno.h>
-#include <netdb.h>
-#include <limits.h>
-#include <syslog.h>
-#include <sys/time.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <sys/ipc.h>
-#include <sys/sem.h>
-
-#include "glite/lb/srvbones.h"
-#include "glite/lb/context.h"
-#include "glite/lb/context-int.h"
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#include "glite/lb/srv_perf.h"
-
-enum lb_srv_perf_sink sink_mode;
-#endif
-
-extern int edg_wll_DBCheckVersion(edg_wll_Context, const char *);
-extern edg_wll_ErrorCode edg_wll_Open(edg_wll_Context ctx, char *cs);
-extern edg_wll_ErrorCode edg_wll_Close(edg_wll_Context);
-extern int edg_wll_StoreProtoProxy(edg_wll_Context ctx);
-extern int edg_wll_ServerHTTP(edg_wll_Context ctx);
-
-extern char *lbproxy_ilog_socket_path;
-extern char *lbproxy_ilog_file_prefix;
-
-
-#define DEFAULTCS "lbserver/@localhost:lbproxy"
-
-#define CON_QUEUE 20 /* accept() */
-#define SLAVE_OVERLOAD 10 /* queue items per slave */
-#define IDLE_TIMEOUT 10 /* keep idle connection that many seconds */
-#define REQUEST_TIMEOUT 120 /* one client may ask one slave multiple times */
-#define SLAVE_CONNS_MAX 500 /* commit suicide after that many connections */
-
-/* file to store pid and generate semaphores key
- */
-#ifndef GLITE_LBPROXY_PIDFILE
-#define GLITE_LBPROXY_PIDFILE "/var/run/glite-lbproxy.pid"
-#endif
-
-#ifndef GLITE_LBPROXY_SOCK_PREFIX
-#define GLITE_LBPROXY_SOCK_PREFIX "/tmp/lb_proxy_"
-#endif
-
-#ifndef dprintf
-#define dprintf(x) { if (debug) printf x; }
-#endif
-
-#define sizofa(a) (sizeof(a)/sizeof((a)[0]))
-
-
-int debug = 0;
-static const int one = 1;
-static char *dbstring = NULL;
-static char sock_store[PATH_MAX],
- sock_serve[PATH_MAX];
-static int slaves = 10,
- semaphores = -1,
- con_queue = CON_QUEUE,
- semset;
-static char host[300];
-static char * port;
-int transactions = -1;
-int use_dbcaps = 0;
-
-
-static struct option opts[] = {
- {"port", 1, NULL, 'p'},
- {"con-queue", 1, NULL, 'c'},
- {"debug", 0, NULL, 'd'},
- {"silent", 0, NULL, 'z'},
- {"mysql", 1, NULL, 'm'},
- {"slaves", 1, NULL, 's'},
- {"semaphores", 1, NULL, 'l'},
- {"pidfile", 1, NULL, 'i'},
- {"proxy-il-sock", 1, NULL, 'X'},
- {"proxy-il-fprefix", 1, NULL, 'Y'},
-#ifdef LB_PERF
- {"perf-sink", 1, NULL, 'K'},
-#endif
- {"transactions", 1, NULL, 'b'},
- {NULL,0,NULL,0}
-};
-
-static const char *get_opt_string = "p:c:dm:s:l:i:X:Y:zb:"
-#ifdef LB_PERF
- "K:"
-#endif
-;
-
-static void usage(char *me)
-{
- fprintf(stderr,"usage: %s [option]\n"
- "\t-p, --sock\t\t path-name to the local socket\n"
- "\t-c, --con-queue\t\t size of the connection queue (accept)\n"
- "\t-m, --mysql\t\t database connect string\n"
- "\t-d, --debug\t\t don't run as daemon, additional diagnostics\n"
- "\t-s, --slaves\t\t number of slave servers to fork\n"
- "\t-l, --semaphores\t number of semaphores (job locks) to use\n"
- "\t-i, --pidfile\t\t file to store master pid\n"
- "\t-X, --proxy-il-sock\t socket to send events to\n"
- "\t-Y, --proxy-il-fprefix\t file prefix for events\n"
- "\t-z, --silent\t\t don't print diagnostic, even if -d is on\n"
-#ifdef LB_PERF
- "\t-K, --perf-sink\t where to sink events\n"
-#endif
- "\t-b, --transactions\t transactions force switch\n"
- ,me);
-}
-
-static void wait_for_open(edg_wll_Context,const char *);
-static int decrement_timeout(struct timeval *, struct timeval, struct timeval);
-
-
-
-/*
- * SERVER BONES structures and handlers
- */
-int clnt_data_init(void **);
-
- /*
- * Serve & Store handlers
- */
-int clnt_reject(int);
-int handle_conn(int, struct timeval *, void *);
-int accept_serve(int, struct timeval *, void *);
-int accept_store(int, struct timeval *, void *);
-int clnt_disconnect(int, struct timeval *, void *);
-
-#define SRV_SERVE 0
-#define SRV_STORE 1
-static struct glite_srvbones_service service_table[] = {
- { "serve", -1, handle_conn, accept_serve, clnt_reject, clnt_disconnect },
- { "store", -1, handle_conn, accept_store, clnt_reject, clnt_disconnect },
-};
-
-struct clnt_data_t {
- edg_wll_Context ctx;
- glite_lbu_DBContext dbctx;
- int dbcaps;
-};
-
-
-
-int main(int argc, char *argv[])
-{
- int i;
- struct sockaddr_un a;
- int opt;
- char pidfile[PATH_MAX] = GLITE_LBPROXY_PIDFILE,
- socket_path_prefix[PATH_MAX] = GLITE_LBPROXY_SOCK_PREFIX,
- *name;
- FILE *fpid;
- key_t semkey;
- edg_wll_Context ctx;
- struct timeval to;
- int silent = 0;
-
-
- name = strrchr(argv[0],'/');
- if (name) name++; else name = argv[0];
-
- if (geteuid()) snprintf(pidfile,sizeof pidfile,"%s/glite_lb_proxy.pid", getenv("HOME"));
-
- while ((opt = getopt_long(argc, argv, get_opt_string, opts, NULL)) != EOF) switch (opt) {
- case 'p': strcpy(socket_path_prefix, optarg); break;
- case 'b': transactions = atoi(optarg); break;
- case 'c': con_queue = atoi(optarg); break;
- case 'd': debug = 1; break;
- case 'z': silent = 1; break;
- case 'm': dbstring = optarg; break;
- case 's': slaves = atoi(optarg); break;
- case 'l': semaphores = atoi(optarg); break;
- case 'X': lbproxy_ilog_socket_path = strdup(optarg); break;
- case 'Y': lbproxy_ilog_file_prefix = strdup(optarg); break;
- case 'i': strcpy(pidfile, optarg); break;
-#ifdef LB_PERF
- case 'K': sink_mode = atoi(optarg); break;
-#endif
- case '?': usage(name); return 1;
- }
-
- if ( optind < argc ) { usage(name); return 1; }
-
- setlinebuf(stdout);
- setlinebuf(stderr);
-
- fpid = fopen(pidfile,"r");
- if ( fpid ) {
- int opid = -1;
-
- if ( fscanf(fpid,"%d",&opid) == 1 ) {
- if ( !kill(opid,0) ) {
- fprintf(stderr,"%s: another instance running, pid = %d\n",name,opid);
- return 1;
- }
- else if (errno != ESRCH) { perror("kill()"); return 1; }
- }
- fclose(fpid);
- } else if (errno != ENOENT) { perror(pidfile); return 1; }
-
- fpid = fopen(pidfile, "w");
- if ( !fpid ) { perror(pidfile); return 1; }
- if (fprintf(fpid, "%d", getpid()) <= 0) { perror(pidfile); return 1; }
- if (fclose(fpid) != 0) { perror(pidfile); return 1; }
-
- semkey = ftok(pidfile,0);
-
- if ( semaphores == -1 ) semaphores = slaves;
- semset = semget(semkey, 0, 0);
- if ( semset >= 0 ) semctl(semset, 0, IPC_RMID);
- semset = semget(semkey, semaphores, IPC_CREAT | 0600);
- if ( semset < 0 ) { perror("semget()"); return 1; }
- dprintf(("Using %d semaphores, set id %d\n", semaphores, semset));
- for ( i = 0; i < semaphores; i++ ) {
- struct sembuf s;
-
- s.sem_num = i; s.sem_op = 1; s.sem_flg = 0;
- if (semop(semset,&s,1) == -1) { perror("semop()"); return 1; }
- }
-
- gethostname(host, sizeof host);
- host[sizeof host - 1] = 0;
- asprintf(&port, "%d", GLITE_JOBID_DEFAULT_PORT);
- dprintf(("server address: %s:%s\n", host, port));
-
- service_table[SRV_SERVE].conn = socket(PF_UNIX, SOCK_STREAM, 0);
- if ( service_table[SRV_SERVE].conn < 0 ) { perror("socket()"); return 1; }
- memset(&a, 0, sizeof(a));
- a.sun_family = AF_UNIX;
- sprintf(sock_serve, "%s%s", socket_path_prefix, "serve.sock");
- strcpy(a.sun_path, sock_serve);
-
- if( connect(service_table[SRV_SERVE].conn, (struct sockaddr *)&a, sizeof(a.sun_path)) < 0) {
- if( errno == ECONNREFUSED ) {
- dprintf(("removing stale input socket %s\n", sock_serve));
- unlink(sock_serve);
- }
- } else { perror("another instance of lb-proxy is running"); return 1; }
-
- if ( bind(service_table[SRV_SERVE].conn, (struct sockaddr *) &a, sizeof(a)) < 0 ) {
- char buf[100];
-
- snprintf(buf, sizeof(buf), "bind(%s)", sock_serve);
- perror(buf);
- return 1;
- }
-
- if ( listen(service_table[SRV_SERVE].conn, con_queue) ) { perror("listen()"); return 1; }
-
- service_table[SRV_STORE].conn = socket(PF_UNIX, SOCK_STREAM, 0);
- if ( service_table[SRV_STORE].conn < 0 ) { perror("socket()"); return 1; }
- memset(&a, 0, sizeof(a));
- a.sun_family = AF_UNIX;
- sprintf(sock_store, "%s%s", socket_path_prefix, "store.sock");
- strcpy(a.sun_path, sock_store);
-
- if( connect(service_table[SRV_STORE].conn, (struct sockaddr *)&a, sizeof(a.sun_path)) < 0) {
- if( errno == ECONNREFUSED ) {
- dprintf(("removing stale input socket %s\n", sock_store));
- unlink(sock_store);
- }
- } else { perror("another instance of lb-proxy is running"); return 1; }
-
- if ( bind(service_table[SRV_STORE].conn, (struct sockaddr *) &a, sizeof(a))) {
- char buf[100];
-
- snprintf(buf, sizeof(buf), "bind(%s)", sock_store);
- perror(buf);
- return 1;
- }
- if ( listen(service_table[SRV_STORE].conn, con_queue) ) { perror("listen()"); return 1; }
-
- dprintf(("Listening at %s, %s ...\n", sock_store, sock_serve));
-
- if (!dbstring) dbstring = getenv("LBPROXYDB");
- if (!dbstring) dbstring = DEFAULTCS;
-
-
- /* Just check the database and let it be. The slaves do the job. */
- edg_wll_InitContext(&ctx);
- /* XXX: obsolete
- * edg_wll_InitContext(&ctx) used to cause segfault
- if ( !(ctx = (edg_wll_Context) malloc(sizeof(*ctx))) ) {
- perror("InitContext()");
- return -1;
- }
- memset(ctx, 0, sizeof(*ctx));
- */
- wait_for_open(ctx, dbstring);
- if ((ctx->dbcaps = glite_lbu_DBQueryCaps(ctx->dbctx)) == -1)
- {
- char *et,*ed;
- glite_lbu_DBError(ctx->dbctx,&et,&ed);
-
- fprintf(stderr,"%s: open database: %s (%s)\n",argv[0],et,ed);
- free(et); free(ed);
- return 1;
- }
- edg_wll_Close(ctx);
- ctx->dbctx = NULL;
- fprintf(stderr, "[%d]: DB '%s'\n", getpid(), dbstring);
-
- if ((ctx->dbcaps & GLITE_LBU_DB_CAP_INDEX) == 0) {
- fprintf(stderr,"%s: missing index support in DB layer\n",argv[0]);
- return 1;
- }
- if ((ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS) == 0)
- fprintf(stderr, "[%d]: transactions aren't supported!\n", getpid());
- if (transactions >= 0) {
- fprintf(stderr, "[%d]: transactions forced from %d to %d\n", getpid(), ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS ? 1 : 0, transactions);
- ctx->dbcaps &= ~GLITE_LBU_DB_CAP_TRANSACTIONS;
- ctx->dbcaps |= transactions ? GLITE_LBU_DB_CAP_TRANSACTIONS : 0;
- }
- use_dbcaps = ctx->dbcaps;
- edg_wll_FreeContext(ctx);
-
- if ( !debug ) {
- if ( daemon(1,0) == -1 ) { perror("deamon()"); exit(1); }
-
- fpid = fopen(pidfile,"w");
- if ( !fpid ) { perror(pidfile); return 1; }
- fprintf(fpid, "%d", getpid());
- fclose(fpid);
- openlog(name, LOG_PID, LOG_DAEMON);
- } else { setpgid(0, getpid()); }
-
- if (silent) debug = 0;
-
- glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT, slaves);
- glite_srvbones_set_param(GLITE_SBPARAM_SLAVE_OVERLOAD, SLAVE_OVERLOAD);
- glite_srvbones_set_param(GLITE_SBPARAM_SLAVE_CONNS_MAX, SLAVE_CONNS_MAX);
- to = (struct timeval){REQUEST_TIMEOUT, 0};
- glite_srvbones_set_param(GLITE_SBPARAM_REQUEST_TIMEOUT, &to);
- to = (struct timeval){IDLE_TIMEOUT, 0};
- glite_srvbones_set_param(GLITE_SBPARAM_IDLE_TIMEOUT, &to);
-
- glite_srvbones_run(clnt_data_init, service_table, sizofa(service_table), debug);
-
- semctl(semset, 0, IPC_RMID, 0);
- unlink(pidfile);
- for ( i = 0; i < sizofa(service_table); i++ )
- if ( service_table[i].conn >= 0 ) close(service_table[i].conn);
- unlink(sock_serve);
- unlink(sock_store);
- if (port) free(port);
-
- return 0;
-}
-
-
-int clnt_data_init(void **data)
-{
- edg_wll_Context ctx;
- struct clnt_data_t *cdata;
-
-
- if ( !(cdata = calloc(1, sizeof(*cdata))) )
- return -1;
-
- if ( !(ctx = (edg_wll_Context) malloc(sizeof(*ctx))) ) { free(cdata); return -1; }
- memset(ctx, 0, sizeof(*ctx));
-
- dprintf(("[%d] opening database ...\n", getpid()));
- wait_for_open(ctx, dbstring);
- cdata->dbctx = ctx->dbctx;
- cdata->dbcaps = use_dbcaps;
- edg_wll_FreeContext(ctx);
-
-#ifdef LB_PERF
- glite_wll_perftest_init(NULL, NULL, NULL, NULL, 0);
-#endif
-
- *data = cdata;
- return 0;
-}
-
-
-int handle_conn(int conn, struct timeval *timeout, void *data)
-{
- struct clnt_data_t *cdata = (struct clnt_data_t *)data;
- edg_wll_Context ctx;
- struct timeval conn_start, now;
-
- if ( edg_wll_InitContext(&ctx) ) {
- dprintf(("Couldn't create context"));
- return -1;
- }
- cdata->ctx = ctx;
-
- /* Shared structures (pointers)
- */
- ctx->dbctx = cdata->dbctx;
- ctx->dbcaps = cdata->dbcaps;
-
- /* set globals
- */
- ctx->allowAnonymous = 1;
- ctx->isProxy = 1;
- ctx->noAuth = 1;
- ctx->noIndex = 1;
- ctx->semset = semset;
- ctx->semaphores = semaphores;
-
- ctx->srvName = strdup(host);
- ctx->srvPort = atoi(port);
-
- ctx->connProxy = (edg_wll_ConnProxy *) calloc(1, sizeof(edg_wll_ConnProxy));
- if ( !ctx->connProxy ) {
- perror("calloc");
- edg_wll_FreeContext(ctx);
-
- return -1;
- }
-
- gettimeofday(&conn_start, 0);
- if ( edg_wll_plain_accept(conn, &ctx->connProxy->conn) ) {
- perror("accept");
- edg_wll_FreeContext(ctx);
-
- return -1;
- }
-
- gettimeofday(&now, 0);
- if ( decrement_timeout(timeout, conn_start, now) ) {
- if (debug) fprintf(stderr, "edg_wll_plain_accept() timeout");
- else syslog(LOG_ERR, "edg_wll_plain_accept(): timeout");
-
- return -1;
- }
-
-
- return 0;
-}
-
-
-int accept_store(int conn, struct timeval *timeout, void *cdata)
-{
- edg_wll_Context ctx = ((struct clnt_data_t *) cdata)->ctx;
- struct timeval before, after;
- char *errt, *errd;
- int err;
-
- memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout));
- gettimeofday(&before, NULL);
- errt = errd = NULL;
- if ( edg_wll_StoreProtoProxy(ctx) ) {
- switch ( (err = edg_wll_Error(ctx, &errt, &errd)) ) {
- case ETIMEDOUT:
- case EPIPE:
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- if (!debug) syslog(LOG_ERR,"%s (%s)", errt, errd);
- /* fallthrough
- */
- case ENOTCONN:
- free(errt); free(errd);
- return err;
- break;
-
- case ENOENT:
- case EINVAL:
- case EPERM:
- case EEXIST:
- case EDG_WLL_ERROR_NOINDEX:
- case E2BIG:
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- if ( !debug ) syslog(LOG_ERR, "%s (%s)", errt, errd);
- break;
-
- default:
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- if ( !debug ) syslog(LOG_CRIT, "%s (%s)", errt, errd);
- return -1;
- }
- free(errt); free(errd);
- } else if ( edg_wll_Error(ctx, &errt, &errd) ) {
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- if ( !debug ) syslog(LOG_ERR, "%s (%s)", errt, errd);
- free(errt); free(errd);
- edg_wll_ResetError(ctx);
- }
- gettimeofday(&after, NULL);
- if ( decrement_timeout(timeout, before, after) ) {
- if (debug) fprintf(stderr, "Serving store connection timed out");
- else syslog(LOG_ERR, "Serving store connection timed out");
- return ETIMEDOUT;
- }
-
- return 0;
-}
-
-int accept_serve(int conn, struct timeval *timeout, void *cdata)
-{
- edg_wll_Context ctx = ((struct clnt_data_t *) cdata)->ctx;
- struct timeval before, after;
-
-
- /*
- * serve the request
- */
- memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout));
- gettimeofday(&before, NULL);
- if ( edg_wll_ServerHTTP(ctx) ) {
- char *errt, *errd;
- int err;
-
-
- errt = errd = NULL;
- switch ( (err = edg_wll_Error(ctx, &errt, &errd)) ) {
- case ETIMEDOUT:
- case EPIPE:
- case EIO:
- case EDG_WLL_IL_PROTO:
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- if (!debug) syslog(LOG_ERR,"%s (%s)", errt, errd);
- /* fallthrough
- */
- case ENOTCONN:
- free(errt); free(errd);
- return err;
- break;
-
- case ENOENT:
- case EPERM:
- case EEXIST:
- case EDG_WLL_ERROR_NOINDEX:
- case E2BIG:
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- break;
- case EINVAL:
- case EDG_WLL_ERROR_PARSE_BROKEN_ULM:
- case EDG_WLL_ERROR_PARSE_EVENT_UNDEF:
- case EDG_WLL_ERROR_PARSE_MSG_INCOMPLETE:
- case EDG_WLL_ERROR_PARSE_KEY_DUPLICITY:
- case EDG_WLL_ERROR_PARSE_KEY_MISUSE:
- case EDG_WLL_ERROR_PARSE_OK_WITH_EXTRA_FIELDS:
- case EDG_WLL_ERROR_JOBID_FORMAT:
- case EDG_WLL_ERROR_MD5_CLASH:
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- if ( !debug ) syslog(LOG_ERR,"%s (%s)", errt, errd);
- /*
- * no action for non-fatal errors
- */
- break;
-
- case EDG_WLL_ERROR_DB_CALL:
- case EDG_WLL_ERROR_SERVER_RESPONSE:
- default:
- dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
- if (!debug) syslog(LOG_CRIT,"%s (%s)",errt,errd);
- /*
- * unknown error - do rather return (<0) (slave will be killed)
- */
- return -1;
- }
- free(errt); free(errd);
- }
- gettimeofday(&after, NULL);
- if ( decrement_timeout(timeout, before, after) ) {
- if (debug) fprintf(stderr, "Serving store connection timed out");
- else syslog(LOG_ERR, "Serving store connection timed out");
- return ETIMEDOUT;
- }
-
- return 0;
-}
-
-
-int clnt_disconnect(int conn, struct timeval *timeout, void *cdata)
-{
- edg_wll_Context ctx = ((struct clnt_data_t *) cdata)->ctx;
-
- /* XXX: handle the timeout
- */
- if ( ctx->connProxy && ctx->connProxy->conn.sock >= 0 )
- edg_wll_plain_close(&ctx->connProxy->conn);
-
- edg_wll_FreeContext(ctx);
- ctx = NULL;
-
- return 0;
-}
-
-int clnt_reject(int conn)
-{
- return 0;
-}
-
-static void wait_for_open(edg_wll_Context ctx, const char *dbstring)
-{
- char *dbfail_string1, *dbfail_string2;
-
- dbfail_string1 = dbfail_string2 = NULL;
-
- while (edg_wll_Open(ctx, (char *) dbstring)) {
- char *errt,*errd;
-
- if (dbfail_string1) free(dbfail_string1);
- glite_lbu_DBError(ctx->dbctx,&errt,&errd);
- asprintf(&dbfail_string1,"%s (%s)\n",errt,errd);
- if (dbfail_string1 != NULL) {
- if (dbfail_string2 == NULL || strcmp(dbfail_string1,dbfail_string2)) {
- if (dbfail_string2) free(dbfail_string2);
- dbfail_string2 = dbfail_string1;
- dbfail_string1 = NULL;
- dprintf(("[%d]: %s\nStill trying ...\n",getpid(),dbfail_string2));
- if (!debug) syslog(LOG_ERR,dbfail_string2);
- }
- }
- sleep(5);
- }
-
- if (dbfail_string1) free(dbfail_string1);
- if (dbfail_string2 != NULL) {
- free(dbfail_string2);
- dprintf(("[%d]: DB connection established\n",getpid()));
- if (!debug) syslog(LOG_INFO,"DB connection established\n");
- }
-}
-
-static int decrement_timeout(struct timeval *timeout, struct timeval before, struct timeval after)
-{
- (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec);
- (*timeout).tv_usec = (*timeout).tv_usec - (after.tv_usec - before.tv_usec);
- while ( (*timeout).tv_usec < 0) {
- (*timeout).tv_sec--;
- (*timeout).tv_usec += 1000000;
- }
- if ( ((*timeout).tv_sec < 0) || (((*timeout).tv_sec == 0) && ((*timeout).tv_usec == 0)) ) return(1);
- else return(0);
-}
-
+++ /dev/null
-#!/bin/bash
-
-numjobs=10
-
-# XXX - there must be better way to find stage
-STAGEDIR=/home/michal/shared/egee/jra1-head/stage
-. $STAGEDIR/sbin/perftest_common.sh
-
-LOGEVENT=${LOGEVENT:-$STAGEDIR/bin/glite-lb-logevent}
-
-DEBUG=${DEBUG:-0}
-
-SILENT=0
-while getopts "t:n:s" OPTION
-do
- case "$OPTION" in
- "t") TEST_VARIANT=$OPTARG
- ;;
-
- "n") numjobs=$OPTARG
- ;;
-
- "s") SILENT=1
- ;;
-
- esac
-done
-
-# CONSUMER_ARGS=
-# PERFTEST_COMPONENT=
-# COMPONENT_ARGS=
-#LOGJOBS_ARGS=""
-
-check_test_files || exit 1
-check_file_executable $LOGEVENT || exit 1
-
-SEQCODE="UI=999990:NS=9999999990:WM=999990:BH=9999999990:JSS=999990:LM=999990:LRMS=999990:APP=999990"
-
-purge_proxy ()
-{
- for jobid in $@
- do
- $LOGEVENT -x -S /tmp/proxy.perfstore.sock -c $SEQCODE -j $jobid -s UserInterface -e Abort --reason Purge > /dev/null 2>&1
- done
-}
-
-group_a () {
-echo "----------------------------------"
-echo "LB Proxy test"
-echo "----------------------------------"
-echo "Events are consumed:"
-echo "1) before parsing"
-echo "2) after parsing, before storing into database"
-echo "3) after storing into db, before computing state"
-echo "4) after computing state, before sending to IL"
-echo "5) by IL"
-echo ""
-LOGJOBS_ARGS="-s /tmp/proxy.perf"
-}
-
-echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-
-
-group_a_test_n ()
-{
- PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-proxy
- i=$1
- CONSUMER_ARGS="-d --perf-sink $i -p /tmp/proxy.perf"
- export PERFTEST_NAME="proxy_test_$i"
- echo -n "${i})"
- run_test proxy $numjobs
- print_result
- # purge jobs from database
- # we have to start proxy again
- $PERFTEST_CONSUMER -d -p /tmp/proxy.perf -s 1 >/dev/null 2>&1 &
- PID=$!
- purge_proxy `$LOGJOBS -n $numjobs`
- sleep 2
- shutdown $PID
-}
-
-group_a_test_5 ()
-{
- PERFTEST_COMPONENT="$STAGEDIR/bin/glite-lb-proxy"
- COMPONENT_ARGS="-d -p /tmp/proxy.perf --proxy-il-sock /tmp/interlogger.perf --proxy-il-fprefix /tmp/perftest.log"
-
- PERFTEST_CONSUMER="$STAGEDIR/bin/glite-lb-interlogd-perf-empty"
- CONSUMER_ARGS="-d -s /tmp/interlogger.perf --file-prefix=/tmp/perftest.log"
- export PERFTEST_NAME="proxy_test_5"
- echo -n "5)"
- run_test proxy $numjobs
- print_result
- $PERFTEST_COMPONENT -d -p /tmp/proxy.perf -s 1 >/dev/null 2>&1 &
- PID=$!
- purge_proxy `$LOGJOBS -n $numjobs`
- sleep 2
- shutdown $PID
- rm -f /tmp/perftest.log.*
-}
-
-group="a"
-
-group_$group
-
-if [[ $SILENT -eq 0 ]]
-then
- while [[ -z $TEST_VARIANT ]]
- do
- echo -n "Your choice: "
- read -e TEST_VARIANT
- done
- echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-fi
-
-if [[ "x$TEST_VARIANT" = "x*" ]]
-then
- TEST_VARIANT="1 2 3 4 5"
-fi
-
-for variant in $TEST_VARIANT
-do
- if [[ "$variant" = "5" ]]
- then
- group_${group}_test_${variant}
- else
- group_${group}_test_n $variant
- fi
-done
+++ /dev/null
-# defaults
-top_srcdir=.
-stagedir=.
-globalprefix=glite
-lbprefix=lb
-package=glite-lb-server-bones
-version=0.0.1
-PREFIX=/opt/glite
-
-CC=gcc
-
--include Makefile.inc
--include ../project/version.properties
-
-version=${module.version}
-
-VPATH=${top_srcdir}/src:${top_srcdir}/examples
-
-DEBUG:=-g -O0 -Wall
-CFLAGS:= ${DEBUG} -I${top_srcdir}/interface
-LDFLAGS:=
-
-ifdef LB_PROF
- CFLAGS:= ${CFLAGS} -pg -g
- LDFLAGS:= ${LDFLAGS} -pg
-endif
-
-COMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/lib ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-STATICLIB:=libglite_lbu_server_bones.a
-LTLIB:=libglite_lbu_server_bones.la
-
-OBJS:=srvbones.o
-LOBJS:=${OBJS:.o=.lo}
-
-HDRS:=srvbones.h
-
-default all: compile
-
-compile: ${STATICLIB} ${LTLIB} example
-
-${STATICLIB}: ${OBJS}
- ar crv $@ ${OBJS}
- ranlib $@
-
-${LTLIB}: ${LOBJS}
- ${LINK} -o $@ ${LOBJS}
-
-stage: compile
- $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
-
-check:
- -echo "No unit tests so far."
-
-example: srv_example cnt_example
-
-srv_example: srv_example.o
- ${LINK} -o $@ ${LTLIB} srv_example.o
-
-cnt_example: cnt_example.o
- ${LINK} -o $@ cnt_example.o
-
-doc:
-
-install:
- mkdir -p ${PREFIX}/include/${globalprefix}/${lbprefix}
- mkdir -p ${PREFIX}/lib
- ${INSTALL} -m 644 ${LTLIB} ${PREFIX}/lib
- if [ x${DOSTAGE} = xyes ]; then \
- ${INSTALL} -m 644 ${STATICLIB} ${PREFIX}/lib ; \
- cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${lbprefix} ; \
- fi
-
-clean:
- rm -rvf *.o *.lo .libs lib* srv_example cnt_example
- rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
-
-%.o: %.c
- ${COMPILE} -c $<
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite LB Client module
-
- Authors: Jiri Skrabal <nykolas@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/10/18 19:16:09 zsalvet
- RPM descriptions
-
- Revision 1.1 2004/09/22 15:41:24 jskrabal
- - sorry! Forgot to add
-
- Revision 1.0 2004/09/07 00:00:01 nykolas
- First shot
-
--->
-
-<project name="server-bones" default="dist">
-
- <!-- =========================================
- Builds the GLite LB Server-Bones Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
- <!-- =========================================
- RPM settings
- ========================================= -->
-
- <property name="build.package.summary" value="L&B server bones" />
- <property name="build.package.description" value="
-Library of common routines used by Logging & Bookkeeping (L&B) servers." />
-
-</project>
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#ifndef dprintf
-#define dprintf(x) { if (debug) printf x; fflush(stdout); }
-#endif
-
-#define DEF_MSG "Test message\n"
-#define DEF_PORT 9999
-
-static struct option opts[] = {
- { "help", no_argument, NULL, 'h'},
- { "debug", no_argument, NULL, 'd'},
- { "msg", required_argument, NULL, 'm'},
- { "port", required_argument, NULL, 'p'},
- { "repeat", required_argument, NULL, 'r'},
-};
-
-int debug = 0;
-int port = DEF_PORT;
-char *msg = NULL;
-
-static int writen(int fd, char *ptr, int nbytes);
-static int readln(int fd, char *out);
-
-static void usage(char *me)
-{
- fprintf(stderr,
- "usage: %s [option]\n"
- " -h, --help print this screen\n"
- " -d, --debug prints debug messages\n"
- " -m, --msg <text> message to send\n"
- " -p, --port <num> service port\n", me);
-}
-
-
-int main(int argc, char **argv)
-{
- struct sockaddr_in addr;
- char buff[512],
- *me;
- int opt,
- sock,
- n;
- int repeat = 1;
-
- me = strrchr(argv[0], '/');
- if ( me ) me++; else me = argv[0];
- while ( (opt = getopt_long(argc, argv,"p:m:hdr:", opts, NULL)) != EOF )
- {
- switch ( opt )
- {
- case 'm':
- msg = strdup(optarg);
- break;
- case 'p':
- port = atoi(optarg);
- break;
- case 'd': debug = 1; break;
- case 'r': repeat = atoi(optarg); break;
- case 'h': usage(me); return 0;
- case '?': usage(me); return 1;
- }
- }
-
- bzero((char *) &addr, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- addr.sin_port = htons(port);
- if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
- {
- perror("socket");
- exit(1);
- }
- if ( connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0 )
- {
- perror("connect");
- exit(1);
- }
- n = strlen(msg? msg: DEF_MSG);
- for (;repeat; repeat--) {
- if ( writen(sock, msg? msg: DEF_MSG, n) != n )
- {
- dprintf(("error writing message\n"));
- exit(1);
- }
- printf("reply: "); fflush(stdout);
- n = readln(sock, buff);
- if ( n < 0 )
- {
- perror("read() reply error");
- return 1;
- }
- writen(0, buff, n);
- }
- close(sock);
-
- return 0;
-}
-
-int writen(int fd, char *ptr, int nbytes)
-{
- int nleft, nwritten;
-
- nleft = nbytes;
- dprintf(("start writing %d bytes\n", nbytes));
- while ( nleft > 0 )
- {
- nwritten = write(fd, ptr, nleft);
- dprintf(("written %d bytes", nwritten));
- if ( nwritten <= 0 )
- return (nwritten);
-
- nleft -= nwritten;
- ptr += nwritten;
- dprintf((" (left %d bytes)\n", nleft));
- }
-
- dprintf(("written %d bytes (return: %d)\n", nwritten, nbytes - nleft));
- return (nbytes - nleft);
-}
-
-#define BUFFER_SZ 512
-
-int readln(int fd, char *out)
-{
- static char buffer[BUFFER_SZ];
- static char *buffer_end = buffer;
- int n;
-
-
- dprintf(("reading line\n"));
- while ( 1 ) {
- if ( buffer_end - buffer ) {
- /* buffer contains data
- */
- char *endl;
-
- dprintf(("nonempty buffer\n"));
- if ( (endl = memchr(buffer, '\n', buffer_end-buffer)) ) {
- int linesz = endl-buffer+1;
-
- dprintf(("using buffer data\n"));
- memcpy(out, buffer, linesz);
- if ( endl+1 != buffer_end )
- memmove(buffer, endl+1, buffer_end-endl-1);
- buffer_end -= linesz;
- return linesz;
- }
- }
- dprintf(("reading...\n"));
- n = read(fd, buffer_end, BUFFER_SZ-(buffer_end-buffer));
- if ( n < 0 ) {
- if ( errno == EAGAIN ) continue;
- dprintf(("reading error\n"));
- return n;
- }
- else if ( n == 0 ) {
- int ret = buffer_end-buffer;
- dprintf(("end of reading - returning %d bytes\n", ret));
- memcpy(out, buffer, ret);
- buffer_end = buffer;
- return ret;
- }
-
- dprintf(("read %d bytes\n", n));
- buffer_end += n;
- }
-
- return 0;
-}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include "srvbones.h"
-
-#ifndef dprintf
-#define dprintf(x) { if (debug) printf x; fflush(stdout); }
-#endif
-
-#define sizofa(a) (sizeof(a)/sizeof((a)[0]))
-
-int debug = 1;
-
-static int writen(int fd, char *ptr, int nbytes);
-static int readln(int fd, char *out, int nbytes);
-
-static int new_conn(int, struct timeval *, void *);
-static int reject(int);
-static int disconnect(int, struct timeval *, void *);
-
-static int echo(int, struct timeval *, void *);
-static int upper_echo(int, struct timeval *, void *);
-
-#define ECHO_PORT 9999
-#define UPPER_ECHO_PORT 9998
-
-#define SRV_ECHO 0
-#define SRV_UPPER_ECHO 1
-
-static struct glite_srvbones_service service_table[] = {
- { "Echo Service", -1, new_conn, echo, reject, disconnect },
- { "Upper Echo Service", -1, new_conn, upper_echo, reject, disconnect }
-};
-
-int main(void)
-{
- struct sockaddr_in myaddr;
-
-
- if ( ((service_table[SRV_ECHO].conn = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- || ((service_table[SRV_UPPER_ECHO].conn = socket(AF_INET, SOCK_STREAM, 0)) == -1) )
- {
- perror("socket");
- exit(1);
- }
-
- bzero((char *) &myaddr, sizeof(myaddr));
- myaddr.sin_family = AF_INET;
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- myaddr.sin_port = htons(ECHO_PORT);
- if ( bind(service_table[SRV_ECHO].conn, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1 )
- {
- perror("bind");
- exit(1);
- }
- bzero((char *) &myaddr, sizeof(myaddr));
- myaddr.sin_family = AF_INET;
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- myaddr.sin_port = htons(UPPER_ECHO_PORT);
- if ( bind(service_table[SRV_UPPER_ECHO].conn, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1 )
- {
- perror("bind");
- exit(1);
- }
-
- if ( listen(service_table[SRV_ECHO].conn, 10)
- || listen(service_table[SRV_UPPER_ECHO].conn, 10) )
- {
- perror("listen()");
- exit(1);
- }
-
-
- glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT, 1);
- glite_srvbones_run(NULL, service_table, sizofa(service_table), 1);
-
-
- return 0;
-}
-
-int upper_echo(int fd, struct timeval *to, void *data)
-{
- int n, i;
- char line[80];
-
- n = readln(fd, line, 80);
- if ( n < 0 )
- {
- perror("read() message");
- return n;
- }
- else if ( n == 0 )
- return ENOTCONN;
-
- for ( i = 0; i < n; i++ )
- line[i] = toupper(line[i]);
-
- if ( writen(fd, line, n) != n )
- {
- perror("write() message back");
- return -1;
- }
-
- return 0;
-}
-
-int echo(int fd, struct timeval *to, void *data)
-{
- int n;
- char line[80];
-
- n = readln(fd, line, 80);
- dprintf(("%d bytes read\n", n));
- if ( n < 0 )
- {
- perror("read() message");
- return n;
- }
- else if ( n == 0 )
- return ENOTCONN;
-
- if ( writen(fd, line, n) != n )
- {
- perror("write() message back");
- return -1;
- }
-
- return 0;
-}
-
-int new_conn(int conn, struct timeval *to, void *cdata)
-{
- dprintf(("srv-bones example: new_conn handler\n"));
- return 0;
-}
-
-int reject(int conn)
-{
- dprintf(("srv-bones example: reject handler\n"));
- return 0;
-}
-
-int disconnect(int conn, struct timeval *to, void *cdata)
-{
- dprintf(("srv-bones example: disconnect handler\n"));
- return 0;
-}
-
-int writen(int fd, char *ptr, int nbytes)
-{
- int nleft, nwritten;
-
- nleft = nbytes;
- dprintf(("start writing %d bytes\n", nbytes));
- while ( nleft > 0 ) {
- nwritten = write(fd, ptr, nleft);
- dprintf(("written %d bytes", nwritten));
- if ( nwritten <= 0 )
- return (nwritten);
-
- nleft -= nwritten;
- ptr += nwritten;
- dprintf((" (left %d bytes)\n", nleft));
- }
-
- dprintf(("written %d bytes (return: %d)\n", nwritten, nbytes - nleft));
- return (nbytes - nleft);
-}
-
-#define BUFFER_SZ 512
-
-int readln(int fd, char *out, int nbytes)
-{
- static char buffer[BUFFER_SZ];
- static char *buffer_end = buffer;
- int n;
-
-
- dprintf(("reading line\n"));
- while ( 1 ) {
- if ( buffer_end - buffer ) {
- /* buffer contains data
- */
- char *endl;
-
- dprintf(("nonempty buffer\n"));
- if ( (endl = memchr(buffer, '\n', buffer_end-buffer)) ) {
- int linesz = endl-buffer+1;
-
- memcpy(out, buffer, linesz);
- if ( endl+1 != buffer_end ) memmove(buffer, endl+1, buffer_end-endl-1);
- buffer_end -= linesz;
- return linesz;
- }
- }
-
- dprintf(("reding...\n"));
- n = read(fd, buffer_end, BUFFER_SZ-(buffer_end-buffer));
- if ( n < 0 ) {
- if ( errno == EAGAIN ) n = 0;
- else return n;
- }
- if ( n == 0 ) {
- int ret = buffer_end-buffer;
- dprintf(("end of reading - returning %d bytes\n", ret));
- memcpy(out, buffer, ret);
- buffer_end = buffer;
- return ret;
- }
- dprintf(("read %d bytes\n", n));
-
- buffer_end += n;
- }
-
- return 0;
-}
+++ /dev/null
-#ifndef __ORG_GLITE_LB_SERVER_BONES_BONES_H__
-#define __ORG_GLITE_LB_SERVER_BONES_BONES_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef enum _glite_srvbones_param_t {
- GLITE_SBPARAM_SLAVES_COUNT, /**< number of slaves */
- GLITE_SBPARAM_SLAVE_OVERLOAD, /**< queue items per slave */
- GLITE_SBPARAM_SLAVE_CONNS_MAX, /**< commit suicide after that many connections */
-
-/* NULL for timeouts means infinity */
- GLITE_SBPARAM_IDLE_TIMEOUT, /**< keep idle connection that long (timeval) */
- GLITE_SBPARAM_CONNECT_TIMEOUT, /**< timeout for establishing a connection (timeval) */
- GLITE_SBPARAM_REQUEST_TIMEOUT, /**< timeout for a single request (timeval)*/
-} glite_srvbones_param_t;
-
-typedef int (*slave_data_init_hnd)(void **);
-
-struct glite_srvbones_service {
- char *id; /**< name of the service */
- int conn; /**< listening socket */
-
-/** Handler called by slave on a newly established connection,
- * i.e. after accept(2).
- * \param[in] conn the accepted connection
- * \param[inout] timeout don't consume more, update with the remaining time
- * \param[inout] user_data arbitrary user data passed among the functions
- */
- int (*on_new_conn_hnd)(
- int conn,
- struct timeval *timeout,
- void *user_data
- );
-
-
-/** Handler called by slave to serve each request.
- * \param[in] conn connection to work with
- * \param[inout] timeout don't consume more, update with the remaining time
- * \param[inout] user_data arbitrary user data passed among the functions
- *
- * \retval 0 OK, connection remains open
- * \retval ENOTCON terminated gracefully, bones will clean up
- * \retval >0 other POSIX errno, non-fatal error
- * \retval <0 fatal error, terminate slave
- */
- int (*on_request_hnd)(
- int conn,
- struct timeval *timeout,
- void *user_data
- );
-
-/** Handler called by master to reject connection on server overload.
- * Should kick off the client quickly, not imposing aditional load
- * on server or blocking long time.
- */
- int (*on_reject_hnd)(int conn);
-
-/** Handler called by slave before closing the connection.
- * Perform server-side cleanup, and terminate the connection gracefully
- * if there is a way to do so (the disconnect is server-initiated).
- * close(conn) is called by bones then.
- * \param[in] conn connection to work with
- * \param[inout] timeout don't consume more time
- * \param[inout] user_data arbitrary user data passed among the functions
- */
- int (*on_disconnect_hnd)(
- int conn,
- struct timeval *timeout,
- void *user_data
- );
-};
-
-extern int glite_srvbones_set_param(glite_srvbones_param_t param, ...);
-
-
-/** Main server function.
- *
- * \param[in] slave_data_init_hnd callback initializing user data on every slave
- */
-extern int glite_srvbones_run(
- slave_data_init_hnd slave_data_init,
- struct glite_srvbones_service *service_table,
- size_t table_sz,
- int dbg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ORG_GLITE_LB_SERVER_BONES_BONES_H__ */
+++ /dev/null
-#Fri Aug 18 12:29:52 CEST 2006
-module.build=0201
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration options for the GLite LB Client module
-
- Authors: Jiri Skrabal <nykolas@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1 2004/09/08 12:08:09 nykolas
- First shot
-
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="LB Server-Bones configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-expat_prefix=${with.expat.prefix}
-ares_prefix=${with.ares.prefix}
-mysql_prefix=${with.mysql.prefix}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Glite LB Server component
-
- Authors: Jiri Skrabal <nykolas@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.0 2004/09/07 00:00:01 nykolas
- First shot
-
--->
-
-<project name="LB Server-Bones component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="server-bones" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure-options.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-#Fri Sep 02 14:17:59 CEST 2005
-module.version=2.2.5
-module.age=1
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <netdb.h>
-#include <assert.h>
-#include <syslog.h>
-#include <sys/time.h>
-#include <time.h>
-#include <stdarg.h>
-#include <signal.h>
-
-#include "srvbones.h"
-
-/* defaults for GLITE_SBPARAM_* */
-
-#define SLAVES_COUNT 5 /* default number of slaves */
-#define SLAVE_OVERLOAD 10 /* queue items per slave */
-#define SLAVE_REQS_MAX 500 /* commit suicide after that many connections */
-#define IDLE_TIMEOUT 30 /* keep idle connection that many seconds */
-#define CONNECT_TIMEOUT 5 /* timeout for establishing a connection */
-#define REQUEST_TIMEOUT 10 /* timeout for a single request */
-#define NEW_CLIENT_DURATION 10 /* how long a client is considered new, i.e. busy
- connection is not closed to serve other clients */
-
-#ifndef dprintf
-#define dprintf(x) { if (debug) printf x; }
-#endif
-
-#ifdef LB_PROF
-extern void _start (void), etext (void);
-#endif
-
-static int running = 0;
-static int debug = 0;
-static volatile int die = 0,
- child_died = 0;
-static unsigned long clnt_dispatched = 0,
- clnt_accepted = 0;
-
-static struct glite_srvbones_service *services;
-static int services_ct;
-
-static int set_slaves_ct = SLAVES_COUNT;
-static int set_slave_overload = SLAVE_OVERLOAD;
-static int set_slave_reqs_max = SLAVE_REQS_MAX;
-static struct timeval set_idle_to = {IDLE_TIMEOUT, 0};
-static struct timeval set_connect_to = {CONNECT_TIMEOUT, 0};
-static struct timeval set_request_to = {REQUEST_TIMEOUT, 0};
-
-static int dispatchit(int, int, int);
-static int do_sendmsg(int, int, unsigned long, int);
-static int do_recvmsg(int, int *, unsigned long *, int *);
-static int check_timeout(struct timeval, struct timeval, struct timeval);
-static void catchsig(int);
-static void catch_chld(int sig);
-static int slave(int (*)(void **), int);
-
-static void glite_srvbones_set_slaves_ct(int);
-static void glite_srvbones_set_slave_overload(int);
-static void glite_srvbones_set_slave_conns_max(int);
-static void set_timeout(struct timeval *,struct timeval *);
-
-int glite_srvbones_set_param(glite_srvbones_param_t param, ...)
-{
- va_list ap;
-
- if ( running ) {
- dprintf(("Attempting to set srv-bones parameter on running server"));
- return -1;
- }
-
- va_start(ap, param);
- switch ( param ) {
- case GLITE_SBPARAM_SLAVES_COUNT:
- glite_srvbones_set_slaves_ct(va_arg(ap,int)); break;
- case GLITE_SBPARAM_SLAVE_OVERLOAD:
- glite_srvbones_set_slave_overload(va_arg(ap,int)); break;
- case GLITE_SBPARAM_SLAVE_CONNS_MAX:
- glite_srvbones_set_slave_conns_max(va_arg(ap,int)); break;
- case GLITE_SBPARAM_IDLE_TIMEOUT:
- set_timeout(&set_idle_to,va_arg(ap,struct timeval *)); break;
- case GLITE_SBPARAM_CONNECT_TIMEOUT:
- set_timeout(&set_connect_to,va_arg(ap,struct timeval *)); break;
- case GLITE_SBPARAM_REQUEST_TIMEOUT:
- set_timeout(&set_request_to,va_arg(ap,struct timeval *)); break;
- }
- va_end(ap);
-
- return 0;
-}
-
-int glite_srvbones_run(
- slave_data_init_hnd slave_data_init,
- struct glite_srvbones_service *service_table,
- size_t table_sz,
- int dbg)
-{
- struct sigaction sa;
- sigset_t sset;
- int sock_slave[2], i;
- int pstat;
-
-
- assert(service_table);
- assert(table_sz > 0);
-
- services = service_table;
- services_ct = table_sz;
- debug = dbg;
-
- setlinebuf(stdout);
- setlinebuf(stderr);
- dprintf(("Master pid %d\n", getpid()));
-
- if ( socketpair(AF_UNIX, SOCK_STREAM, 0, sock_slave) )
- {
- perror("socketpair()");
- return 1;
- }
-
- memset(&sa, 0, sizeof(sa)); assert(sa.sa_handler == NULL);
- sa.sa_handler = catchsig;
- sigaction(SIGINT, &sa, NULL);
- sigaction(SIGTERM, &sa, NULL);
-
- sa.sa_handler = catch_chld;
- sigaction(SIGCHLD, &sa, NULL);
-
- sa.sa_handler = SIG_IGN;
- sigaction(SIGUSR1, &sa, NULL);
-
- sigemptyset(&sset);
- sigaddset(&sset, SIGCHLD);
- sigaddset(&sset, SIGTERM);
- sigaddset(&sset, SIGINT);
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- for ( i = 0; i < set_slaves_ct; i++ )
- slave(slave_data_init, sock_slave[1]);
-
- while ( !die )
- {
- fd_set fds;
- int ret, mx;
-
-
- FD_ZERO(&fds);
- FD_SET(sock_slave[0], &fds);
- for ( i = 0, mx = sock_slave[0]; i < services_ct; i++ )
- {
- FD_SET(services[i].conn, &fds);
- if ( mx < services[i].conn ) mx = services[i].conn;
- }
-
- sigprocmask(SIG_UNBLOCK, &sset, NULL);
- ret = select(mx+1, &fds, NULL, NULL, NULL);
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- if ( ret == -1 && errno != EINTR )
- {
- if ( debug ) perror("select()");
- else syslog(LOG_CRIT,"select(): %m");
-
- return 1;
- }
-
- if ( child_died )
- {
- int pid;
-
- while ( (pid = waitpid(-1, &pstat, WNOHANG)) > 0 )
- {
- if (WIFEXITED(pstat)) {
- dprintf(("[master] Slave %d exited with return code %d.\n", pid, WEXITSTATUS(pstat)));
- if (WEXITSTATUS(pstat)) {
- syslog(LOG_ERR, "Slave %d exited with return code %d.\n", pid, WEXITSTATUS(pstat));
- }
- }
- if (WIFSIGNALED(pstat)) {
- dprintf(("[master] Slave %d terminated with signal %d.\n", pid, WTERMSIG(pstat)));
- switch (WTERMSIG(pstat)) {
- case SIGINT:
- case SIGTERM:
- case SIGUSR1: if (die) break;
- default:
- syslog(LOG_ERR, "Slave %d terminated with signal %d.\n", pid, WTERMSIG(pstat));
- break;
- }
- }
- if ( !die )
- {
- int newpid = slave(slave_data_init, sock_slave[1]);
- dprintf(("[master] Servus mortuus [%d] miraculo resurrexit [%d]\n", pid, newpid));
- }
- }
- child_died = 0;
- continue;
- }
-
- if ( die ) continue;
-
-
- if (FD_ISSET(sock_slave[0],&fds)) {
- /* slave accepted a request
- */
- unsigned long a;
-
- if ( (recv(sock_slave[0], &a, sizeof(a), MSG_WAITALL) == sizeof(a))
- && (a <= clnt_dispatched)
- && (a > clnt_accepted || clnt_accepted > clnt_dispatched) )
- clnt_accepted = a;
- }
-
- for ( i = 0; i < services_ct; i++ )
- if ( FD_ISSET(services[i].conn, &fds)
- && dispatchit(sock_slave[0], services[i].conn ,i) )
- /* Be carefull!!!
- * This must break this for cykle but start the
- * while (!die) master cykle from the top also
- */
- break;
- }
-
- dprintf(("[master] Terminating on signal %d\n", die));
- if (!debug) syslog(LOG_INFO, "Terminating on signal %d\n", die);
- kill(0, die);
-
- return 0;
-}
-
-static int dispatchit(int sock_slave, int sock, int sidx)
-{
- struct sockaddr_in a;
- unsigned char *pom;
- int conn,
- alen, ret;
-
-
- alen = sizeof(a);
- if ( (conn = accept(sock, (struct sockaddr *)&a, &alen)) < 0 )
- {
- if (debug)
- {
- perror("accept()");
- return 1;
- }
- else
- {
- syslog(LOG_ERR, "accept(): %m");
- sleep(5);
- return -1;
- }
- }
-
- getpeername(conn, (struct sockaddr *)&a, &alen);
- pom = (char *) &a.sin_addr.s_addr;
- dprintf(("[master] %s connection from %d.%d.%d.%d:%d\n",
- services[sidx].id? services[sidx].id: "",
- (int)pom[0], (int)pom[1], (int)pom[2], (int)pom[3],
- ntohs(a.sin_port)));
-
- ret = 0;
- if ( ( clnt_dispatched < clnt_accepted /* wraparound */
- || clnt_dispatched - clnt_accepted < set_slaves_ct * set_slave_overload)
- && !(ret = do_sendmsg(sock_slave, conn, clnt_dispatched++, sidx)) )
- {
- /* all done
- */
- dprintf(("[master] Dispatched %lu, last known served %lu\n",
- clnt_dispatched-1, clnt_accepted));
- }
- else
- {
- services[sidx].on_reject_hnd(conn);
- dprintf(("[master] Rejected new connection due to overload\n"));
- if ( !debug ) syslog(LOG_ERR, "Rejected new connection due to overload\n");
- }
-
- close(conn);
- if (ret)
- {
- perror("sendmsg()");
- if ( !debug ) syslog(LOG_ERR, "sendmsg(): %m");
- }
-
-
- return 0;
-}
-
-
-static int slave(slave_data_init_hnd data_init_hnd, int sock)
-{
- sigset_t sset;
- struct sigaction sa;
- struct timeval client_done,
- client_start,
- new_client_duration = { NEW_CLIENT_DURATION, 0 };
-
- void *clnt_data = NULL;
- int conn = -1,
- srv = -1,
- req_cnt = 0,
- sockflags,
- h_errno,
- pid, i,
- first_request = 0; /* 1 -> first request from connected client expected */
-
-
-
- if ( (pid = fork()) ) return pid;
-
-#ifdef LB_PROF
- monstartup((u_long)&_start, (u_long)&etext);
-#endif
-
- srandom(getpid()+time(NULL));
-
- for ( i = 0; i < services_ct; i++ )
- close(services[i].conn);
-
- sigemptyset(&sset);
- sigaddset(&sset, SIGTERM);
- sigaddset(&sset, SIGINT);
- sigaddset(&sset, SIGUSR1);
-
- memset(&sa, 0, sizeof(sa));
- sa.sa_handler = catchsig;
- sigaction(SIGUSR1, &sa, NULL);
-
- if ( (sockflags = fcntl(sock, F_GETFL, 0)) < 0
- || fcntl(sock, F_SETFL, sockflags | O_NONBLOCK) < 0 )
- {
- dprintf(("[%d] fcntl(master_sock): %s\n", getpid(), strerror(errno)));
- if ( !debug ) syslog(LOG_CRIT, "fcntl(master_sock): %m");
- exit(1);
- }
-
- if ( data_init_hnd && data_init_hnd(&clnt_data) )
- /*
- * XXX: what if the error remains and master will start new slave
- * again and again?
- *
- * Then we are in a deep shit.
- */
- exit(1);
-
- while ( !die && (req_cnt < set_slave_reqs_max || (conn >= 0 && first_request)))
- {
- fd_set fds;
- int max = sock,
- connflags,
- newconn = -1,
- newsrv = -1;
-
- enum { KICK_DONT = 0, KICK_IDLE, KICK_LOAD, KICK_HANDLER, KICK_COUNT }
- kick_client = KICK_DONT;
-
- static char * kicks[] = {
- "don't kick",
- "idle client",
- "high load",
- "no request handler",
- "request count limit reached",
- };
- unsigned long seq;
- struct timeval now,to;
-
-
- FD_ZERO(&fds);
- if ( conn < 0 || !first_request) FD_SET(sock, &fds);
- if ( conn >= 0 ) FD_SET(conn, &fds);
- if ( conn > sock ) max = conn;
-
- to = set_idle_to;
- sigprocmask(SIG_UNBLOCK, &sset, NULL);
- switch (select(max+1, &fds, NULL, NULL, to.tv_sec >= 0 ? &to : NULL))
- {
- case -1:
- if ( errno != EINTR )
- {
- dprintf(("[%d] select(): %s\n", getpid(), strerror(errno)));
- if ( !debug ) syslog(LOG_CRIT, "select(): %m");
- exit(1);
- }
- continue;
-
- case 0:
- if ( conn < 0 ) continue;
-
- default:
- break;
- }
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- gettimeofday(&now,NULL);
-
- if ( conn >= 0 && FD_ISSET(conn, &fds) )
- {
- /*
- * serve the request
- */
- int rv;
-
- dprintf(("[%d] incoming request\n", getpid()));
-
- if ( !services[srv].on_request_hnd )
- {
- kick_client = KICK_HANDLER;
- } else {
- req_cnt++;
- first_request = 0;
- to = set_request_to;
- if ((rv = services[srv].on_request_hnd(conn,to.tv_sec>=0 ? &to : NULL,clnt_data)) == ENOTCONN) {
- if (services[srv].on_disconnect_hnd
- && (rv = services[srv].on_disconnect_hnd(conn,NULL,clnt_data)))
- {
- dprintf(("[%d] disconnect handler: %s, terminating\n",getpid(),strerror(rv)));
- exit(1);
- }
- close(conn);
- conn = -1;
- srv = -1;
- dprintf(("[%d] Connection closed\n", getpid()));
- }
- else if (rv > 0) {
- /* non-fatal error -> close connection and contiue
- * XXX: likely to leak resources but can we call on_disconnect_hnd() on error?
- */
- close(conn);
- conn = -1;
- srv = -1;
- dprintf(("[%d] %s, connection closed\n",getpid(),strerror(rv)));
- continue;
- }
- else if ( rv < 0 ) {
- /* unknown error -> clasified as FATAL -> kill slave
- */
- dprintf(("[%d] %s, terminating\n",getpid(),strerror(-rv)));
- exit(1);
- }
- else {
- dprintf(("[%d] request done\n", getpid()));
- gettimeofday(&client_done, NULL);
- }
-
- if (!check_timeout(new_client_duration,client_start,now)) continue;
-
- }
- } else {
- if (conn >= 0 && check_timeout(set_idle_to, client_done, now))
- kick_client = KICK_IDLE;
- }
-
- if ( (conn < 0 || !first_request) && FD_ISSET(sock, &fds) && req_cnt < set_slave_reqs_max )
- {
- /* Prefer slaves with no connection, then kick idle clients,
- * active ones last. Wait less if we have serviced a request in the meantime.
- * Tuned for HZ=100 timer. */
- if ( conn >= 0 ) usleep( kick_client || FD_ISSET(conn, &fds) ? 11000 : 21000);
- if ( do_recvmsg(sock, &newconn, &seq, &newsrv) ) switch ( errno )
- {
- case EINTR: /* XXX: signals are blocked */
- case EAGAIN:
- continue;
- default: dprintf(("[%d] recvmsg(): %s\n", getpid(), strerror(errno)));
- if (!debug) syslog(LOG_CRIT,"recvmsg(): %m\n");
- exit(1);
- }
- kick_client = KICK_LOAD;
- }
-
- if (req_cnt >= set_slave_reqs_max && !first_request) kick_client = KICK_COUNT;
-
- if ( kick_client && conn >= 0 )
- {
- if ( services[srv].on_disconnect_hnd )
- services[srv].on_disconnect_hnd(conn, NULL, clnt_data);
- close(conn);
- conn = -1;
- srv = -1;
- dprintf(("[%d] Connection closed, %s\n", getpid(), kicks[kick_client]));
- }
-
- if ( newconn >= 0 )
- {
- int ret;
-
- conn = newconn;
- srv = newsrv;
- gettimeofday(&client_start, NULL);
-
- switch ( send(sock, &seq, sizeof(seq), 0) )
- {
- case -1:
- if (debug) perror("send()");
- else syslog(LOG_CRIT, "send(): %m\n");
- exit(1);
-
- case sizeof(seq):
- break;
-
- default: dprintf(("[%d] send(): incomplete message\n", getpid()));
- exit(1);
- }
-
- req_cnt++;
- dprintf(("[%d] serving %s connection %lu\n", getpid(),
- services[srv].id? services[srv].id: "", seq));
-
- connflags = fcntl(conn, F_GETFL, 0);
- if ( fcntl(conn, F_SETFL, connflags | O_NONBLOCK) < 0 )
- {
- dprintf(("[%d] can't set O_NONBLOCK mode (%s), closing.\n", getpid(), strerror(errno)));
- if ( !debug ) syslog(LOG_ERR, "can't set O_NONBLOCK mode (%s), closing.\n", strerror(errno));
- close(conn);
- conn = srv = -1;
- continue;
- }
-
- to = set_connect_to;
- if ( services[srv].on_new_conn_hnd
- && (ret = services[srv].on_new_conn_hnd(conn, to.tv_sec >= 0 ? &to : NULL, clnt_data)) )
- {
- dprintf(("[%d] Connection not established, err = %d.\n", getpid(),ret));
- if ( !debug ) syslog(LOG_ERR, "Connection not established, err = %d.\n",ret);
- close(conn);
- conn = srv = -1;
- if (ret < 0) exit(1);
- continue;
- }
- gettimeofday(&client_done, NULL);
- first_request = 1;
- }
- }
-
- if ( die )
- {
- dprintf(("[%d] Terminating on signal %d\n", getpid(), die));
- if ( !debug ) syslog(LOG_INFO, "Terminating on signal %d", die);
- }
-
- if (conn >= 0 && services[srv].on_disconnect_hnd )
- services[srv].on_disconnect_hnd(conn, NULL, clnt_data);
-
- dprintf(("[%d] Terminating after %d requests\n", getpid(), req_cnt));
- if ( !debug ) syslog(LOG_INFO, "Terminating after %d requests", req_cnt);
-
-
- exit(0);
-}
-
-static void catchsig(int sig)
-{
- die = sig;
-}
-
-static void catch_chld(int sig)
-{
- child_died = 1;
-}
-
-static int check_timeout(struct timeval timeout, struct timeval before, struct timeval after)
-{
- return (timeout.tv_usec <= after.tv_usec - before.tv_usec) ?
- (timeout.tv_sec <= after.tv_sec - before.tv_sec) :
- (timeout.tv_sec < after.tv_sec - before.tv_sec);
-}
-
-#define MSG_BUFSIZ 30
-
-/*
- * send socket sock through socket to_sock
- */
-static int do_sendmsg(int to_sock, int sock, unsigned long clnt_dispatched, int srv)
-{
- struct msghdr msg = {0};
- struct cmsghdr *cmsg;
- struct iovec sendiov;
- int myfds, /* file descriptors to pass. */
- *fdptr;
- char buf[CMSG_SPACE(sizeof myfds)]; /* ancillary data buffer */
- char sendbuf[MSG_BUFSIZ]; /* to store unsigned int + \0 */
-
-
- memset(sendbuf, 0, sizeof(sendbuf));
- snprintf(sendbuf, sizeof(sendbuf), "%u %lu", srv, clnt_dispatched);
-
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_iov = &sendiov;
- msg.msg_iovlen = 1;
- sendiov.iov_base = sendbuf;
- sendiov.iov_len = sizeof(sendbuf);
-
- msg.msg_control = buf;
- msg.msg_controllen = sizeof buf;
-
- cmsg = CMSG_FIRSTHDR(&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
- fdptr = (int *)CMSG_DATA(cmsg);
- *fdptr = sock;
-
- msg.msg_controllen = cmsg->cmsg_len;
- /* send fd to server-slave to do rest of communication */
- if (sendmsg(to_sock, &msg, 0) < 0)
- return 1;
-
- return 0;
-}
-
-
-/* receive socket sock through socket from_sock */
-static int do_recvmsg(int from_sock, int *sock, unsigned long *clnt_accepted,int *srv)
-{
- struct msghdr msg = {0};
- struct cmsghdr *cmsg;
- struct iovec recviov;
- int myfds; /* file descriptors to pass. */
- char buf[CMSG_SPACE(sizeof(myfds))]; /* ancillary data buffer */
- char recvbuf[MSG_BUFSIZ];
-
-
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_iov = &recviov;
- msg.msg_iovlen = 1;
- recviov.iov_base = recvbuf;
- recviov.iov_len = sizeof(recvbuf);
-
- msg.msg_control = buf;
- msg.msg_controllen = sizeof buf;
-
- cmsg = CMSG_FIRSTHDR(&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
- msg.msg_controllen = cmsg->cmsg_len;
-
- if (recvmsg(from_sock, &msg, 0) < 0)
- return 1;
-
- *sock = *((int *)CMSG_DATA(cmsg));
- sscanf(recvbuf, "%u %lu", srv, clnt_accepted);
-
- return 0;
-}
-
-static void glite_srvbones_set_slaves_ct(int n)
-{
- set_slaves_ct = (n == -1)? SLAVES_COUNT: n;
-}
-
-static void glite_srvbones_set_slave_overload(int n)
-{
- set_slave_overload = (n == -1)? SLAVE_OVERLOAD: n;
-}
-
-static void glite_srvbones_set_slave_conns_max(int n)
-{
- set_slave_reqs_max = (n == -1)? SLAVE_REQS_MAX: n;
-}
-
-static void set_timeout(struct timeval *to, struct timeval *val)
-{
- if (val) {
- /* XXX: why not, negative timeouts don't make any sense, IMHO */
- assert(val->tv_sec >= 0);
- *to = *val;
- }
- else to->tv_sec = -1;
-}
+++ /dev/null
-build
-doc
-reports
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# 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
-
-archlib:=lib
-host_cpu:=${shell uname -m}
-ifeq (${host_cpu},x86_64)
- archlib:=lib64
-endif
-
-ifneq (${mysql_prefix},/usr)
- ifeq ($(shell echo ${mysql_version} | cut -d. -f1,2),4.1)
- mysqlib := -L${mysql_prefix}/${archlib}/mysql
- else
- mysqlib := -L${mysql_prefix}/${archlib}
- endif
-endif
-
-EXT_LIBS:=${mysqlib} -lmysqlclient -lz -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}
-
-db_expire: db_expire.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 db_expire
-
-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
+++ /dev/null
-/*
- * Example (and quick test) of prepared statements expirations.
- * Use 'SET GLOBAL wait_timeout=...' for experimenting.
- *
- * Requires existing database with appropriate access and example table:
- *
- * mysqladmin -u root -p create test
- * mysql -u root -p -e 'GRANT ALL on test.* to testuser@localhost'
- * ./db_test
- *
- * Use CS environment variable when using different user/pwd@machine:dbname.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-
-#define CS "testuser/@localhost:test"
-#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, *user;
- const char *cs;
- glite_lbu_DBContext ctx;
- glite_lbu_Statement stmt;
- int caps, i, nr, c;
- unsigned long lens[3];
- char *res[3];
-
- if ((name = strrchr(argv[0], '/')) != NULL) name++;
- else name = argv[0];
- if ((cs = getenv("CS")) == NULL) cs = CS;
-
- // init
- dprintf(("connecting to %s...\n", cs));
- if (glite_lbu_InitDBContext(&ctx) != 0) goto fail;
- if (glite_lbu_DBConnect(ctx, cs) != 0) goto failctx;
- if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) goto failcon;
- if ((caps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
- dprintf(("can't do prepared commands, exiting."));
- goto failcon;
- }
- // caps
- glite_lbu_DBSetCaps(ctx, caps);
- dprintf(("capabilities: %d\n", caps));
-
- user = NULL;
- dprintf(("preparing '%s'...\n", user));
- if ((glite_lbu_PrepareStmt(ctx, SELECT_CMD, &stmt)) != 0) goto failcon;
-
- do {
- 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));
- break;
- }
- dprintf(("\n"));
-
- c = fgetc(stdin);
- } while (c != -1 && (c == '\r' || c == '\n'));
-
- dprintf(("closing...\n"));
- glite_lbu_DBClose(ctx);
- glite_lbu_FreeDBContext(ctx);
- return 0;
-
-failstmt:
- printf("closing stmt...\n");
- glite_lbu_FreeStmt(&stmt);
-failcon:
- dprintf(("closing...\n"));
- glite_lbu_DBClose(ctx);
-failctx:
- glite_lbu_FreeDBContext(ctx);
-fail:
- dprintf(("failed\n"));
- return 1;
-}
+++ /dev/null
-/*
- * 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 testuser@localhost'
- *
- * Use CS environment variable when using different user/pwd@machine:dbname.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#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_InitDBContext(&ctx) != 0) goto fail;
- if (glite_lbu_DBConnect(ctx, cs) != 0) goto failctx;
- if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) goto failcon;
- if ((caps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
- dprintf(("can't do prepared commands, exiting."));
- goto failcon;
- }
- // caps
- glite_lbu_DBSetCaps(ctx, caps || GLITE_LBU_DB_CAP_ERRORS);
- 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 failcon;
- // trio-insert
- dprintf(("trio-insert...\n"));
- asprintf(&cmd, INSERT_TRIO_CMD, 1, "'hyperochus'", "NULL");
- if (glite_lbu_ExecSQL(ctx, cmd, NULL) != 1) goto failcon;
- free(cmd); cmd = NULL;
- // prepared-insert
- dprintf(("prepare-insert...\n"));
- if (glite_lbu_PrepareStmt(ctx, INSERT_CMD, &stmt) != 0) goto failcon;
- 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 failcon;
- 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 failcon;
- 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 = NULL;
-
- dprintf(("preparing '%s'...\n", user));
- if ((glite_lbu_PrepareStmt(ctx, SELECT_CMD, &stmt)) != 0) goto failcon;
-
- 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);
- glite_lbu_FreeDBContext(ctx);
- return 0;
-
-failstmt:
- printf("closing stmt...\n");
- glite_lbu_FreeStmt(&stmt);
-failcon:
- dprintf(("closing...\n"));
- glite_lbu_DBClose(ctx);
-failctx:
- glite_lbu_FreeDBContext(ctx);
-fail:
- free(cmd);
- dprintf(("failed\n"));
- return 1;
-}
+++ /dev/null
-#ifndef GLITE_LBU_DB_H
-#define GLITE_LBU_DB_H
-
-#ident "$Header$"
-
-
-#include <time.h>
-
-
-#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
-
-
-/**
- * Print all errors.
- *
- * Not returned from detection of capabilities.
- */
-#define GLITE_LBU_DB_CAP_ERRORS 8
-
-
-/**
- * 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);
-
-
-/**
- * Initialize the database context.
- *
- * \param[out] ctx result context
- */
-int glite_lbu_InitDBContext(glite_lbu_DBContext *ctx);
-
-
-/**
- * Free database context.
- */
-void glite_lbu_FreeDBContext(glite_lbu_DBContext ctx);
-
-
-/**
- * Connect to the given 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.
- *
- * \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
+++ /dev/null
-#ident "$Header$"
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <time.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include <mysql.h>
-#include <mysqld_error.h>
-#include <errmsg.h>
-
-#include "glite/lbu/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)
-
-#define dprintf(CTX, FMT...) if (CTX->caps & GLITE_LBU_DB_CAP_ERRORS) fprintf(stderr, ##FMT)
-
-
-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_InitDBContext(glite_lbu_DBContext *ctx) {
- *ctx = calloc(1, sizeof **ctx);
- return *ctx == NULL ? ENOMEM : 0;
-}
-
-
-void glite_lbu_FreeDBContext(glite_lbu_DBContext ctx) {
- if (ctx) {
- assert(ctx->mysql == NULL);
- free(ctx->err.desc);
- free(ctx);
- }
-}
-
-
-int glite_lbu_DBConnect(glite_lbu_DBContext ctx, const char *cs) {
- if (db_connect(ctx, cs, &ctx->mysql) != 0) return STATUS(ctx);
- return 0;
-}
-
-
-void glite_lbu_DBClose(glite_lbu_DBContext ctx) {
- db_close(ctx->mysql);
- ctx->mysql = NULL;
-}
-
-
-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<ret; i++)
- if (!strcasecmp(col_names[i],"Key_name")) Key_name = i;
- else if (!strcasecmp(col_names[i],"Seq_in_index")) Seq_in_index = i;
- else if (!strcasecmp(col_names[i],"Column_name")) Column_name = i;
- else if (!strcasecmp(col_names[i],"Sub_part")) Sub_part = i;
-
- assert(Key_name >= 0 && Seq_in_index >= 0 &&
- Column_name >= 0 && Sub_part >= 0);
-
- }
-
- for (i=0; i<nkeys && strcasecmp(showcol[Key_name],keys[i]); i++);
-
- if (i == nkeys) {
- keys = realloc(keys,(i+2) * sizeof keys[0]);
- keys[i] = showcol[Key_name];
-//printf("** KEY [%d] %s\n", i, keys[i]);
- keys[i+1] = NULL;
- cols = realloc(cols,(i+1) * sizeof cols[0]);
- cols[i] = 0;
- idx = realloc(idx,(i+2) * sizeof idx[0]);
- idx[i] = idx[i+1] = NULL;
- showcol[Key_name] = NULL;
- nkeys++;
- }
-
- j = atoi(showcol[Seq_in_index])-1;
- if (cols[i] <= j) {
- cols[i] = j+1;
- idx[i] = realloc(idx[i],(j+2)*sizeof idx[i][0]);
- memset(&idx[i][j+1],0,sizeof idx[i][0]);
- }
- idx[i][j] = strdup(showcol[Column_name]);
-//printf("****** [%d, %d] %s\n", i, j, idx[i][j]);
-//FIXME: needed?idx[i][j].value.i = atoi(showcol[Sub_part]);
- for (i = 0; showcol[i]; i++) free(showcol[i]);
- }
-
- glite_lbu_FreeStmt(&stmt);
- free(cols);
- free(col_names);
-
- if (ret == 0) CLR_ERR(ctx);
- else {
- free(keys);
- keys = NULL;
- for (i = 0; idx[i]; i++) {
- for (j = 0; idx[i][j]; j++) free(idx[i][j]);
- free(idx[i]);
- }
- free(idx);
- idx = NULL;
- }
-
- if (key_names) *key_names = keys;
- else free(keys);
- *column_names = idx;
-
- return STATUS(ctx);
-}
-
-
-/* ---- simple ---- */
-
-int glite_lbu_ExecSQL(glite_lbu_DBContext ctx, const char *cmd, glite_lbu_Statement *stmt) {
- int merr;
- int retry_nr = 0;
- int do_reconnect = 0;
-#ifdef LBS_DB_PROFILE
- struct timeval start,end;
- int pid;
-
- static struct timeval sum = {
- tv_sec: 0,
- tv_usec: 0
- };
-#endif
-
- CLR_ERR(ctx);
-
- if (stmt) *stmt = NULL;
-
-#ifdef LBS_DB_PROFILE
- gettimeofday(&start,NULL);
-#endif
-
- while (retry_nr == 0 || do_reconnect) {
- do_reconnect = 0;
- if (mysql_query(ctx->mysql, 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;
- dprintf(ctx, "[db %d] %s:%d %s\n", getpid(), 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<pid>
- * 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) ENGINE='innodb'", 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; i<nr; i++) {
- if (lengths) lengths[i] = len[i];
- if (len[i]) {
- results[i] = malloc(len[i] + 1);
- memcpy(results[i], row[i], len[i]);
- results[i][len[i]] = '\000';
- } else
- results[i] = strdup("");
- }
-
- return nr;
-}
-
-
-/*
- * prepared version of the fetch
- */
-static int FetchRowPrepared(glite_lbu_DBContext ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results) {
- int ret, retry, i;
- MYSQL_BIND *binds = NULL;
- unsigned long *lens = NULL;
-
- if (n != stmt->nrfields) {
- 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);
- memset(mtime, 0, sizeof *mtime);
- 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);
-}
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# 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 Exception.h JobId.h JobIdExceptions.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 $<
+++ /dev/null
-#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 <fstream>
-#include <cstdlib>
-//#include <list>
-#include <syslog.h> // For logging exceptions to log file
-#include <errno.h> // list the exception codes
-#include <string>
-#include <vector>
-#include <exception> // base ancestor stl::exception
-
-
-namespace glite {
- namespace lb_utils {
- 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::lb_utils::exception::Exception &exc){ exc.push_back ( __FILE__ , LINE, METHOD ); throw exc ; } catch (std::exception &ex){ glite::lb_utils::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 <alessandro.maraschini@datamat.it>
-*/
-
-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<std::string> 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
+++ /dev/null
-#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 <string>
-#include <iosfwd>
-
-#include "glite/lb-utils/cjobid.h"
-
-typedef struct _glite_lbu_jobid_s* glite_lbu_jobid_t;
-
-namespace glite {
-namespace lb_utils {
-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:
- * <LB address>:<LB port>/<Unique String>
- *
- * @ingroup common
- * @version 0.1
- * @date 15 April 2002
- * @author Alessandro Maraschini <alessandro.maraschini@datamat.it> */
-
-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 glite_lbu_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 glite_lbu_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 glite_lbu_JobId &);
- /** Retrieve the internal id reference
- *@return the JobId internal reference used by some LB methods */
- glite_lbu_JobId getId() const ;
-private:
- // This Variable stores the Job unique identification String
- glite_lbu_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 lb_utils
-} // namespace glite
-
-#endif // GLITE_WMSUTILS_JOBID_JOBID_H
+++ /dev/null
-#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/lb-utils/Exception.h"
-
-namespace glite {
-namespace lb_utils {
-namespace jobid {
-
-/**
- * JobIdException - Exception thrown by JobId Class
- * @ingroup Common
- * @version 0.1
- * @date 15 April 2002
- * @author Alessandro Maraschini <alessandro.maraschini@datamat.it>
-*/
-
-class JobIdException : public glite::lb_utils::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:
-* <LB address>:<LB port>/ <Unique string> */
-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<field name> 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 lb_utils
-} // namespace glite
-
-#endif // GLITE_WMSUTILS_JOBID_EXCEPTIONS_H
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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 */
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#include <netdb.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-#include <ctype.h>
-
-#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;
-}
+++ /dev/null
-#ident "$Header$"
-
-#include <openssl/md5.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#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);
-}
+++ /dev/null
-# defaults
-top_srcdir=.
-stagedir=.
-distdir=.
-globalprefix=glite
-lbprefix=lb
-package=glite-lb-server-bones
-version=0.0.1
-PREFIX=/opt/glite
-
-glite_location=/opt/glite
-
-CC=gcc
-
--include Makefile.inc
--include ../project/version.properties
-
-version=${module.version}
-
-VPATH=${top_srcdir}/src:${top_srcdir}/examples
-
-DEBUG:=-g -O0 -Wall
-CFLAGS:= ${DEBUG} -I${top_srcdir}/interface
-LDFLAGS:=
-
-ifdef LB_PROF
- CFLAGS:= ${CFLAGS} -pg -g
- LDFLAGS:= ${LDFLAGS} -pg
-endif
-
-COMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/lib ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-STATICLIB:=libglite_lb_server_bones.a
-LTLIB:=libglite_lb_server_bones.la
-
-OBJS:=srvbones.o
-LOBJS:=${OBJS:.o=.lo}
-
-HDRS:=srvbones.h
-
-default all: compile
-
-compile: ${STATICLIB} ${LTLIB} example
-
-${STATICLIB}: ${OBJS}
- ar crv $@ ${OBJS}
- ranlib $@
-
-${LTLIB}: ${LOBJS}
- ${LINK} -o $@ ${LOBJS}
-
-stage: compile
- $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
-
-check:
- -echo "No unit tests so far."
-
-example: srv_example cnt_example
-
-srv_example: srv_example.o
- ${LINK} -o $@ ${LTLIB} srv_example.o
-
-cnt_example: cnt_example.o
- ${LINK} -o $@ cnt_example.o
-
-doc:
-
-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}/include/${globalprefix}/${lbprefix}
- mkdir -p ${PREFIX}/lib
- ${INSTALL} -m 644 ${LTLIB} ${PREFIX}/lib
- if [ x${DOSTAGE} = xyes ]; then \
- ${INSTALL} -m 644 ${STATICLIB} ${PREFIX}/lib ; \
- cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${lbprefix} ; \
- fi
-
-clean:
-
-%.o: %.c
- ${COMPILE} -c $<
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#ifndef dprintf
-#define dprintf(x) { if (debug) printf x; fflush(stdout); }
-#endif
-
-#define DEF_MSG "Test message\n"
-#define DEF_PORT 9999
-
-static struct option opts[] = {
- { "help", no_argument, NULL, 'h'},
- { "debug", no_argument, NULL, 'd'},
- { "msg", required_argument, NULL, 'm'},
- { "port", required_argument, NULL, 'p'},
- { "repeat", required_argument, NULL, 'r'},
-};
-
-int debug = 0;
-int port = DEF_PORT;
-char *msg = NULL;
-
-static int writen(int fd, char *ptr, int nbytes);
-static int readln(int fd, char *out);
-
-static void usage(char *me)
-{
- fprintf(stderr,
- "usage: %s [option]\n"
- " -h, --help print this screen\n"
- " -d, --debug prints debug messages\n"
- " -m, --msg <text> message to send\n"
- " -p, --port <num> service port\n", me);
-}
-
-
-int main(int argc, char **argv)
-{
- struct sockaddr_in addr;
- char buff[512],
- *me;
- int opt,
- sock,
- n;
- int repeat = 1;
-
- me = strrchr(argv[0], '/');
- if ( me ) me++; else me = argv[0];
- while ( (opt = getopt_long(argc, argv,"p:m:hdr:", opts, NULL)) != EOF )
- {
- switch ( opt )
- {
- case 'm':
- msg = strdup(optarg);
- break;
- case 'p':
- port = atoi(optarg);
- break;
- case 'd': debug = 1; break;
- case 'r': repeat = atoi(optarg); break;
- case 'h': usage(me); return 0;
- case '?': usage(me); return 1;
- }
- }
-
- bzero((char *) &addr, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- addr.sin_port = htons(port);
- if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
- {
- perror("socket");
- exit(1);
- }
- if ( connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0 )
- {
- perror("connect");
- exit(1);
- }
- n = strlen(msg? msg: DEF_MSG);
- for (;repeat; repeat--) {
- if ( writen(sock, msg? msg: DEF_MSG, n) != n )
- {
- dprintf(("error writing message\n"));
- exit(1);
- }
- printf("reply: "); fflush(stdout);
- n = readln(sock, buff);
- if ( n < 0 )
- {
- perror("read() reply error");
- return 1;
- }
- writen(0, buff, n);
- }
- close(sock);
-
- return 0;
-}
-
-int writen(int fd, char *ptr, int nbytes)
-{
- int nleft, nwritten;
-
- nleft = nbytes;
- dprintf(("start writing %d bytes\n", nbytes));
- while ( nleft > 0 )
- {
- nwritten = write(fd, ptr, nleft);
- dprintf(("written %d bytes", nwritten));
- if ( nwritten <= 0 )
- return (nwritten);
-
- nleft -= nwritten;
- ptr += nwritten;
- dprintf((" (left %d bytes)\n", nleft));
- }
-
- dprintf(("written %d bytes (return: %d)\n", nwritten, nbytes - nleft));
- return (nbytes - nleft);
-}
-
-#define BUFFER_SZ 512
-
-int readln(int fd, char *out)
-{
- static char buffer[BUFFER_SZ];
- static char *buffer_end = buffer;
- int n;
-
-
- dprintf(("reading line\n"));
- while ( 1 ) {
- if ( buffer_end - buffer ) {
- /* buffer contains data
- */
- char *endl;
-
- dprintf(("nonempty buffer\n"));
- if ( (endl = memchr(buffer, '\n', buffer_end-buffer)) ) {
- int linesz = endl-buffer+1;
-
- dprintf(("using buffer data\n"));
- memcpy(out, buffer, linesz);
- if ( endl+1 != buffer_end )
- memmove(buffer, endl+1, buffer_end-endl-1);
- buffer_end -= linesz;
- return linesz;
- }
- }
- dprintf(("reading...\n"));
- n = read(fd, buffer_end, BUFFER_SZ-(buffer_end-buffer));
- if ( n < 0 ) {
- if ( errno == EAGAIN ) continue;
- dprintf(("reading error\n"));
- return n;
- }
- else if ( n == 0 ) {
- int ret = buffer_end-buffer;
- dprintf(("end of reading - returning %d bytes\n", ret));
- memcpy(out, buffer, ret);
- buffer_end = buffer;
- return ret;
- }
-
- dprintf(("read %d bytes\n", n));
- buffer_end += n;
- }
-
- return 0;
-}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include "srvbones.h"
-
-#ifndef dprintf
-#define dprintf(x) { if (debug) printf x; fflush(stdout); }
-#endif
-
-#define sizofa(a) (sizeof(a)/sizeof((a)[0]))
-
-int debug = 1;
-
-static int writen(int fd, char *ptr, int nbytes);
-static int readln(int fd, char *out, int nbytes);
-
-static int new_conn(int, struct timeval *, void *);
-static int reject(int);
-static int disconnect(int, struct timeval *, void *);
-
-static int echo(int, struct timeval *, void *);
-static int upper_echo(int, struct timeval *, void *);
-
-#define ECHO_PORT 9999
-#define UPPER_ECHO_PORT 9998
-
-#define SRV_ECHO 0
-#define SRV_UPPER_ECHO 1
-
-static struct glite_srvbones_service service_table[] = {
- { "Echo Service", -1, new_conn, echo, reject, disconnect },
- { "Upper Echo Service", -1, new_conn, upper_echo, reject, disconnect }
-};
-
-int main(void)
-{
- struct sockaddr_in myaddr;
-
-
- if ( ((service_table[SRV_ECHO].conn = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- || ((service_table[SRV_UPPER_ECHO].conn = socket(AF_INET, SOCK_STREAM, 0)) == -1) )
- {
- perror("socket");
- exit(1);
- }
-
- bzero((char *) &myaddr, sizeof(myaddr));
- myaddr.sin_family = AF_INET;
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- myaddr.sin_port = htons(ECHO_PORT);
- if ( bind(service_table[SRV_ECHO].conn, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1 )
- {
- perror("bind");
- exit(1);
- }
- bzero((char *) &myaddr, sizeof(myaddr));
- myaddr.sin_family = AF_INET;
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- myaddr.sin_port = htons(UPPER_ECHO_PORT);
- if ( bind(service_table[SRV_UPPER_ECHO].conn, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1 )
- {
- perror("bind");
- exit(1);
- }
-
- if ( listen(service_table[SRV_ECHO].conn, 10)
- || listen(service_table[SRV_UPPER_ECHO].conn, 10) )
- {
- perror("listen()");
- exit(1);
- }
-
-
- glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT, 1);
- glite_srvbones_run(NULL, service_table, sizofa(service_table), 1);
-
-
- return 0;
-}
-
-int upper_echo(int fd, struct timeval *to, void *data)
-{
- int n, i;
- char line[80];
-
- n = readln(fd, line, 80);
- if ( n < 0 )
- {
- perror("read() message");
- return n;
- }
- else if ( n == 0 )
- return ENOTCONN;
-
- for ( i = 0; i < n; i++ )
- line[i] = toupper(line[i]);
-
- if ( writen(fd, line, n) != n )
- {
- perror("write() message back");
- return -1;
- }
-
- return 0;
-}
-
-int echo(int fd, struct timeval *to, void *data)
-{
- int n;
- char line[80];
-
- n = readln(fd, line, 80);
- dprintf(("%d bytes read\n", n));
- if ( n < 0 )
- {
- perror("read() message");
- return n;
- }
- else if ( n == 0 )
- return ENOTCONN;
-
- if ( writen(fd, line, n) != n )
- {
- perror("write() message back");
- return -1;
- }
-
- return 0;
-}
-
-int new_conn(int conn, struct timeval *to, void *cdata)
-{
- dprintf(("srv-bones example: new_conn handler\n"));
- return 0;
-}
-
-int reject(int conn)
-{
- dprintf(("srv-bones example: reject handler\n"));
- return 0;
-}
-
-int disconnect(int conn, struct timeval *to, void *cdata)
-{
- dprintf(("srv-bones example: disconnect handler\n"));
- return 0;
-}
-
-int writen(int fd, char *ptr, int nbytes)
-{
- int nleft, nwritten;
-
- nleft = nbytes;
- dprintf(("start writing %d bytes\n", nbytes));
- while ( nleft > 0 ) {
- nwritten = write(fd, ptr, nleft);
- dprintf(("written %d bytes", nwritten));
- if ( nwritten <= 0 )
- return (nwritten);
-
- nleft -= nwritten;
- ptr += nwritten;
- dprintf((" (left %d bytes)\n", nleft));
- }
-
- dprintf(("written %d bytes (return: %d)\n", nwritten, nbytes - nleft));
- return (nbytes - nleft);
-}
-
-#define BUFFER_SZ 512
-
-int readln(int fd, char *out, int nbytes)
-{
- static char buffer[BUFFER_SZ];
- static char *buffer_end = buffer;
- int n;
-
-
- dprintf(("reading line\n"));
- while ( 1 ) {
- if ( buffer_end - buffer ) {
- /* buffer contains data
- */
- char *endl;
-
- dprintf(("nonempty buffer\n"));
- if ( (endl = memchr(buffer, '\n', buffer_end-buffer)) ) {
- int linesz = endl-buffer+1;
-
- memcpy(out, buffer, linesz);
- if ( endl+1 != buffer_end ) memmove(buffer, endl+1, buffer_end-endl-1);
- buffer_end -= linesz;
- return linesz;
- }
- }
-
- dprintf(("reding...\n"));
- n = read(fd, buffer_end, BUFFER_SZ-(buffer_end-buffer));
- if ( n < 0 ) {
- if ( errno == EAGAIN ) n = 0;
- else return n;
- }
- if ( n == 0 ) {
- int ret = buffer_end-buffer;
- dprintf(("end of reading - returning %d bytes\n", ret));
- memcpy(out, buffer, ret);
- buffer_end = buffer;
- return ret;
- }
- dprintf(("read %d bytes\n", n));
-
- buffer_end += n;
- }
-
- return 0;
-}
+++ /dev/null
-#ifndef __ORG_GLITE_LB_SERVER_BONES_BONES_H__
-#define __ORG_GLITE_LB_SERVER_BONES_BONES_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef enum _glite_srvbones_param_t {
- GLITE_SBPARAM_SLAVES_COUNT, /**< number of slaves */
- GLITE_SBPARAM_SLAVE_OVERLOAD, /**< queue items per slave */
- GLITE_SBPARAM_SLAVE_CONNS_MAX, /**< commit suicide after that many connections */
-
-/* NULL for timeouts means infinity */
- GLITE_SBPARAM_IDLE_TIMEOUT, /**< keep idle connection that long (timeval) */
- GLITE_SBPARAM_CONNECT_TIMEOUT, /**< timeout for establishing a connection (timeval) */
- GLITE_SBPARAM_REQUEST_TIMEOUT, /**< timeout for a single request (timeval)*/
-} glite_srvbones_param_t;
-
-typedef int (*slave_data_init_hnd)(void **);
-
-struct glite_srvbones_service {
- char *id; /**< name of the service */
- int conn; /**< listening socket */
-
-/** Handler called by slave on a newly established connection,
- * i.e. after accept(2).
- * \param[in] conn the accepted connection
- * \param[inout] timeout don't consume more, update with the remaining time
- * \param[inout] user_data arbitrary user data passed among the functions
- */
- int (*on_new_conn_hnd)(
- int conn,
- struct timeval *timeout,
- void *user_data
- );
-
-
-/** Handler called by slave to serve each request.
- * \param[in] conn connection to work with
- * \param[inout] timeout don't consume more, update with the remaining time
- * \param[inout] user_data arbitrary user data passed among the functions
- *
- * \retval 0 OK, connection remains open
- * \retval ENOTCON terminated gracefully, bones will clean up
- * \retval >0 other POSIX errno, non-fatal error
- * \retval <0 fatal error, terminate slave
- */
- int (*on_request_hnd)(
- int conn,
- struct timeval *timeout,
- void *user_data
- );
-
-/** Handler called by master to reject connection on server overload.
- * Should kick off the client quickly, not imposing aditional load
- * on server or blocking long time.
- */
- int (*on_reject_hnd)(int conn);
-
-/** Handler called by slave before closing the connection.
- * Perform server-side cleanup, and terminate the connection gracefully
- * if there is a way to do so (the disconnect is server-initiated).
- * close(conn) is called by bones then.
- * \param[in] conn connection to work with
- * \param[inout] timeout don't consume more time
- * \param[inout] user_data arbitrary user data passed among the functions
- */
- int (*on_disconnect_hnd)(
- int conn,
- struct timeval *timeout,
- void *user_data
- );
-};
-
-extern int glite_srvbones_set_param(glite_srvbones_param_t param, ...);
-
-
-/** Main server function.
- *
- * \param[in] slave_data_init_hnd callback initializing user data on every slave
- */
-extern int glite_srvbones_run(
- slave_data_init_hnd slave_data_init,
- struct glite_srvbones_service *service_table,
- size_t table_sz,
- int dbg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ORG_GLITE_LB_SERVER_BONES_BONES_H__ */
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <netdb.h>
-#include <assert.h>
-#include <syslog.h>
-#include <sys/time.h>
-#include <time.h>
-#include <stdarg.h>
-#include <signal.h>
-
-#include "srvbones.h"
-
-/* defaults for GLITE_SBPARAM_* */
-
-#define SLAVES_COUNT 5 /* default number of slaves */
-#define SLAVE_OVERLOAD 10 /* queue items per slave */
-#define SLAVE_REQS_MAX 500 /* commit suicide after that many connections */
-#define IDLE_TIMEOUT 30 /* keep idle connection that many seconds */
-#define CONNECT_TIMEOUT 5 /* timeout for establishing a connection */
-#define REQUEST_TIMEOUT 10 /* timeout for a single request */
-#define NEW_CLIENT_DURATION 10 /* how long a client is considered new, i.e. busy
- connection is not closed to serve other clients */
-
-#ifndef dprintf
-#define dprintf(x) { if (debug) printf x; }
-#endif
-
-#ifdef LB_PROF
-extern void _start (void), etext (void);
-#endif
-
-static int running = 0;
-static int debug = 0;
-static volatile int die = 0,
- child_died = 0;
-static unsigned long clnt_dispatched = 0,
- clnt_accepted = 0;
-
-static struct glite_srvbones_service *services;
-static int services_ct;
-
-static int set_slaves_ct = SLAVES_COUNT;
-static int set_slave_overload = SLAVE_OVERLOAD;
-static int set_slave_reqs_max = SLAVE_REQS_MAX;
-static struct timeval set_idle_to = {IDLE_TIMEOUT, 0};
-static struct timeval set_connect_to = {CONNECT_TIMEOUT, 0};
-static struct timeval set_request_to = {REQUEST_TIMEOUT, 0};
-
-static int dispatchit(int, int, int);
-static int do_sendmsg(int, int, unsigned long, int);
-static int do_recvmsg(int, int *, unsigned long *, int *);
-static int check_timeout(struct timeval, struct timeval, struct timeval);
-static void catchsig(int);
-static void catch_chld(int sig);
-static int slave(int (*)(void **), int);
-
-static void glite_srvbones_set_slaves_ct(int);
-static void glite_srvbones_set_slave_overload(int);
-static void glite_srvbones_set_slave_conns_max(int);
-static void set_timeout(struct timeval *,struct timeval *);
-
-int glite_srvbones_set_param(glite_srvbones_param_t param, ...)
-{
- va_list ap;
-
- if ( running ) {
- dprintf(("Attempting to set srv-bones parameter on running server"));
- return -1;
- }
-
- va_start(ap, param);
- switch ( param ) {
- case GLITE_SBPARAM_SLAVES_COUNT:
- glite_srvbones_set_slaves_ct(va_arg(ap,int)); break;
- case GLITE_SBPARAM_SLAVE_OVERLOAD:
- glite_srvbones_set_slave_overload(va_arg(ap,int)); break;
- case GLITE_SBPARAM_SLAVE_CONNS_MAX:
- glite_srvbones_set_slave_conns_max(va_arg(ap,int)); break;
- case GLITE_SBPARAM_IDLE_TIMEOUT:
- set_timeout(&set_idle_to,va_arg(ap,struct timeval *)); break;
- case GLITE_SBPARAM_CONNECT_TIMEOUT:
- set_timeout(&set_connect_to,va_arg(ap,struct timeval *)); break;
- case GLITE_SBPARAM_REQUEST_TIMEOUT:
- set_timeout(&set_request_to,va_arg(ap,struct timeval *)); break;
- }
- va_end(ap);
-
- return 0;
-}
-
-int glite_srvbones_run(
- slave_data_init_hnd slave_data_init,
- struct glite_srvbones_service *service_table,
- size_t table_sz,
- int dbg)
-{
- struct sigaction sa;
- sigset_t sset;
- int sock_slave[2], i;
-
-
- assert(service_table);
- assert(table_sz > 0);
-
- services = service_table;
- services_ct = table_sz;
- debug = dbg;
-
- setlinebuf(stdout);
- setlinebuf(stderr);
- dprintf(("Master pid %d\n", getpid()));
-
- if ( socketpair(AF_UNIX, SOCK_STREAM, 0, sock_slave) )
- {
- perror("socketpair()");
- return 1;
- }
-
- memset(&sa, 0, sizeof(sa)); assert(sa.sa_handler == NULL);
- sa.sa_handler = catchsig;
- sigaction(SIGINT, &sa, NULL);
- sigaction(SIGTERM, &sa, NULL);
-
- sa.sa_handler = catch_chld;
- sigaction(SIGCHLD, &sa, NULL);
-
- sa.sa_handler = SIG_IGN;
- sigaction(SIGUSR1, &sa, NULL);
-
- sigemptyset(&sset);
- sigaddset(&sset, SIGCHLD);
- sigaddset(&sset, SIGTERM);
- sigaddset(&sset, SIGINT);
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- for ( i = 0; i < set_slaves_ct; i++ )
- slave(slave_data_init, sock_slave[1]);
-
- while ( !die )
- {
- fd_set fds;
- int ret, mx;
-
-
- FD_ZERO(&fds);
- FD_SET(sock_slave[0], &fds);
- for ( i = 0, mx = sock_slave[0]; i < services_ct; i++ )
- {
- FD_SET(services[i].conn, &fds);
- if ( mx < services[i].conn ) mx = services[i].conn;
- }
-
- sigprocmask(SIG_UNBLOCK, &sset, NULL);
- ret = select(mx+1, &fds, NULL, NULL, NULL);
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- if ( ret == -1 && errno != EINTR )
- {
- if ( debug ) perror("select()");
- else syslog(LOG_CRIT,"select(): %m");
-
- return 1;
- }
-
- if ( child_died )
- {
- int pid;
-
- while ( (pid = waitpid(-1, NULL, WNOHANG)) > 0 )
- {
- if ( !die )
- {
- int newpid = slave(slave_data_init, sock_slave[1]);
- dprintf(("[master] Servus mortuus [%d] miraculo resurrexit [%d]\n", pid, newpid));
- }
- }
- child_died = 0;
- continue;
- }
-
- if ( die ) continue;
-
-
- if (FD_ISSET(sock_slave[0],&fds)) {
- /* slave accepted a request
- */
- unsigned long a;
-
- if ( (recv(sock_slave[0], &a, sizeof(a), MSG_WAITALL) == sizeof(a))
- && (a <= clnt_dispatched)
- && (a > clnt_accepted || clnt_accepted > clnt_dispatched) )
- clnt_accepted = a;
- }
-
- for ( i = 0; i < services_ct; i++ )
- if ( FD_ISSET(services[i].conn, &fds)
- && dispatchit(sock_slave[0], services[i].conn ,i) )
- /* Be carefull!!!
- * This must break this for cykle but start the
- * while (!die) master cykle from the top also
- */
- break;
- }
-
- dprintf(("[master] Terminating on signal %d\n", die));
- if (!debug) syslog(LOG_INFO, "Terminating on signal %d\n", die);
- kill(0, die);
-
- return 0;
-}
-
-static int dispatchit(int sock_slave, int sock, int sidx)
-{
- struct sockaddr_in a;
- unsigned char *pom;
- int conn,
- alen, ret;
-
-
- alen = sizeof(a);
- if ( (conn = accept(sock, (struct sockaddr *)&a, &alen)) < 0 )
- {
- if (debug)
- {
- perror("accept()");
- return 1;
- }
- else
- {
- syslog(LOG_ERR, "accept(): %m");
- sleep(5);
- return -1;
- }
- }
-
- getpeername(conn, (struct sockaddr *)&a, &alen);
- pom = (char *) &a.sin_addr.s_addr;
- dprintf(("[master] %s connection from %d.%d.%d.%d:%d\n",
- services[sidx].id? services[sidx].id: "",
- (int)pom[0], (int)pom[1], (int)pom[2], (int)pom[3],
- ntohs(a.sin_port)));
-
- ret = 0;
- if ( ( clnt_dispatched < clnt_accepted /* wraparound */
- || clnt_dispatched - clnt_accepted < set_slaves_ct * set_slave_overload)
- && !(ret = do_sendmsg(sock_slave, conn, clnt_dispatched++, sidx)) )
- {
- /* all done
- */
- dprintf(("[master] Dispatched %lu, last known served %lu\n",
- clnt_dispatched-1, clnt_accepted));
- }
- else
- {
- services[sidx].on_reject_hnd(conn);
- dprintf(("[master] Rejected new connection due to overload\n"));
- if ( !debug ) syslog(LOG_ERR, "Rejected new connection due to overload\n");
- }
-
- close(conn);
- if (ret)
- {
- perror("sendmsg()");
- if ( !debug ) syslog(LOG_ERR, "sendmsg(): %m");
- }
-
-
- return 0;
-}
-
-
-static int slave(slave_data_init_hnd data_init_hnd, int sock)
-{
- sigset_t sset;
- struct sigaction sa;
- struct timeval client_done,
- client_start,
- new_client_duration = { NEW_CLIENT_DURATION, 0 };
-
- void *clnt_data = NULL;
- int conn = -1,
- srv = -1,
- req_cnt = 0,
- sockflags,
- h_errno,
- pid, i,
- first_request = 0; /* 1 -> first request from connected client expected */
-
-
-
- if ( (pid = fork()) ) return pid;
-
-#ifdef LB_PROF
- monstartup((u_long)&_start, (u_long)&etext);
-#endif
-
- srandom(getpid()+time(NULL));
-
- for ( i = 0; i < services_ct; i++ )
- close(services[i].conn);
-
- sigemptyset(&sset);
- sigaddset(&sset, SIGTERM);
- sigaddset(&sset, SIGINT);
- sigaddset(&sset, SIGUSR1);
-
- memset(&sa, 0, sizeof(sa));
- sa.sa_handler = catchsig;
- sigaction(SIGUSR1, &sa, NULL);
-
- if ( (sockflags = fcntl(sock, F_GETFL, 0)) < 0
- || fcntl(sock, F_SETFL, sockflags | O_NONBLOCK) < 0 )
- {
- dprintf(("[%d] fcntl(master_sock): %s\n", getpid(), strerror(errno)));
- if ( !debug ) syslog(LOG_CRIT, "fcntl(master_sock): %m");
- exit(1);
- }
-
- if ( data_init_hnd && data_init_hnd(&clnt_data) )
- /*
- * XXX: what if the error remains and master will start new slave
- * again and again?
- *
- * Then we are in a deep shit.
- */
- exit(1);
-
- while ( !die && (req_cnt < set_slave_reqs_max || (conn >= 0 && first_request)))
- {
- fd_set fds;
- int max = sock,
- connflags,
- newconn = -1,
- newsrv = -1;
-
- enum { KICK_DONT = 0, KICK_IDLE, KICK_LOAD, KICK_HANDLER, KICK_COUNT }
- kick_client = KICK_DONT;
-
- static char * kicks[] = {
- "don't kick",
- "idle client",
- "high load",
- "no request handler",
- "request count limit reached",
- };
- unsigned long seq;
- struct timeval now,to;
-
-
- FD_ZERO(&fds);
- FD_SET(sock, &fds);
- if ( conn >= 0 ) FD_SET(conn, &fds);
- if ( conn > sock ) max = conn;
-
- to = set_idle_to;
- sigprocmask(SIG_UNBLOCK, &sset, NULL);
- switch (select(max+1, &fds, NULL, NULL, to.tv_sec >= 0 ? &to : NULL))
- {
- case -1:
- if ( errno != EINTR )
- {
- dprintf(("[%d] select(): %s\n", getpid(), strerror(errno)));
- if ( !debug ) syslog(LOG_CRIT, "select(): %m");
- exit(1);
- }
- continue;
-
- case 0:
- if ( conn < 0 ) continue;
-
- default:
- break;
- }
- sigprocmask(SIG_BLOCK, &sset, NULL);
-
- gettimeofday(&now,NULL);
-
- if ( conn >= 0 && FD_ISSET(conn, &fds) )
- {
- /*
- * serve the request
- */
- int rv;
-
- dprintf(("[%d] incoming request\n", getpid()));
-
- if ( !services[srv].on_request_hnd )
- {
- kick_client = KICK_HANDLER;
- } else {
- first_request = 0;
- to = set_request_to;
- if ((rv = services[srv].on_request_hnd(conn,to.tv_sec>=0 ? &to : NULL,clnt_data)) == ENOTCONN) {
- if (services[srv].on_disconnect_hnd
- && (rv = services[srv].on_disconnect_hnd(conn,NULL,clnt_data)))
- {
- dprintf(("[%d] disconnect handler: %s, terminating\n",getpid(),strerror(rv)));
- exit(1);
- }
- close(conn);
- conn = -1;
- srv = -1;
- dprintf(("[%d] Connection closed\n", getpid()));
- }
- else if (rv > 0) {
- /* non-fatal error -> close connection and contiue
- * XXX: likely to leak resources but can we call on_disconnect_hnd() on error?
- */
- close(conn);
- conn = -1;
- srv = -1;
- dprintf(("[%d] %s, connection closed\n",getpid(),strerror(rv)));
- continue;
- }
- else if ( rv < 0 ) {
- /* unknown error -> clasified as FATAL -> kill slave
- */
- dprintf(("[%d] %s, terminating\n",getpid(),strerror(-rv)));
- exit(1);
- }
- else {
- dprintf(("[%d] request done\n", getpid()));
- gettimeofday(&client_done, NULL);
- }
-
- if (!check_timeout(new_client_duration,client_start,now)) continue;
-
- }
- } else {
- if (conn >= 0 && check_timeout(set_idle_to, client_done, now))
- kick_client = KICK_IDLE;
- }
-
- if ( (conn < 0 || !first_request) && FD_ISSET(sock, &fds) && req_cnt < set_slave_reqs_max )
- {
- /* Prefer slaves with no connection, then kick idle clients,
- * active ones last. Wait less if we have serviced a request in the meantime.
- * Tuned for HZ=100 timer. */
- if ( conn >= 0 ) usleep( kick_client || FD_ISSET(conn, &fds) ? 11000 : 21000);
- if ( do_recvmsg(sock, &newconn, &seq, &newsrv) ) switch ( errno )
- {
- case EINTR: /* XXX: signals are blocked */
- case EAGAIN:
- continue;
- default: dprintf(("[%d] recvmsg(): %s\n", getpid(), strerror(errno)));
- if (!debug) syslog(LOG_CRIT,"recvmsg(): %m\n");
- exit(1);
- }
- kick_client = KICK_LOAD;
- }
-
- if (req_cnt >= set_slave_reqs_max && !first_request) kick_client = KICK_COUNT;
-
- if ( kick_client && conn >= 0 )
- {
- if ( services[srv].on_disconnect_hnd )
- services[srv].on_disconnect_hnd(conn, NULL, clnt_data);
- close(conn);
- conn = -1;
- srv = -1;
- dprintf(("[%d] Connection closed, %s\n", getpid(), kicks[kick_client]));
- }
-
- if ( newconn >= 0 )
- {
- int ret;
-
- conn = newconn;
- srv = newsrv;
- gettimeofday(&client_start, NULL);
-
- switch ( send(sock, &seq, sizeof(seq), 0) )
- {
- case -1:
- if (debug) perror("send()");
- else syslog(LOG_CRIT, "send(): %m\n");
- exit(1);
-
- case sizeof(seq):
- break;
-
- default: dprintf(("[%d] send(): incomplete message\n", getpid()));
- exit(1);
- }
-
- req_cnt++;
- dprintf(("[%d] serving %s connection %lu\n", getpid(),
- services[srv].id? services[srv].id: "", seq));
-
- connflags = fcntl(conn, F_GETFL, 0);
- if ( fcntl(conn, F_SETFL, connflags | O_NONBLOCK) < 0 )
- {
- dprintf(("[%d] can't set O_NONBLOCK mode (%s), closing.\n", getpid(), strerror(errno)));
- if ( !debug ) syslog(LOG_ERR, "can't set O_NONBLOCK mode (%s), closing.\n", strerror(errno));
- close(conn);
- conn = srv = -1;
- continue;
- }
-
- to = set_connect_to;
- if ( services[srv].on_new_conn_hnd
- && (ret = services[srv].on_new_conn_hnd(conn, to.tv_sec >= 0 ? &to : NULL, clnt_data)) )
- {
- 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);
- first_request = 1;
- }
- }
-
- if ( die )
- {
- dprintf(("[%d] Terminating on signal %d\n", getpid(), die));
- if ( !debug ) syslog(LOG_INFO, "Terminating on signal %d", die);
- }
-
- if (conn >= 0 && services[srv].on_disconnect_hnd )
- services[srv].on_disconnect_hnd(conn, NULL, clnt_data);
-
- dprintf(("[%d] Terminating after %d requests\n", getpid(), req_cnt));
- if ( !debug ) syslog(LOG_INFO, "Terminating after %d requests", req_cnt);
-
-
- exit(0);
-}
-
-static void catchsig(int sig)
-{
- die = sig;
-}
-
-static void catch_chld(int sig)
-{
- child_died = 1;
-}
-
-static int check_timeout(struct timeval timeout, struct timeval before, struct timeval after)
-{
- return (timeout.tv_usec <= after.tv_usec - before.tv_usec) ?
- (timeout.tv_sec <= after.tv_sec - before.tv_sec) :
- (timeout.tv_sec < after.tv_sec - before.tv_sec);
-}
-
-#define MSG_BUFSIZ 30
-
-/*
- * send socket sock through socket to_sock
- */
-static int do_sendmsg(int to_sock, int sock, unsigned long clnt_dispatched, int srv)
-{
- struct msghdr msg = {0};
- struct cmsghdr *cmsg;
- struct iovec sendiov;
- int myfds, /* file descriptors to pass. */
- *fdptr;
- char buf[CMSG_SPACE(sizeof myfds)]; /* ancillary data buffer */
- char sendbuf[MSG_BUFSIZ]; /* to store unsigned int + \0 */
-
-
- memset(sendbuf, 0, sizeof(sendbuf));
- snprintf(sendbuf, sizeof(sendbuf), "%u %lu", srv, clnt_dispatched);
-
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_iov = &sendiov;
- msg.msg_iovlen = 1;
- sendiov.iov_base = sendbuf;
- sendiov.iov_len = sizeof(sendbuf);
-
- msg.msg_control = buf;
- msg.msg_controllen = sizeof buf;
-
- cmsg = CMSG_FIRSTHDR(&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
- fdptr = (int *)CMSG_DATA(cmsg);
- *fdptr = sock;
-
- msg.msg_controllen = cmsg->cmsg_len;
- /* send fd to server-slave to do rest of communication */
- if (sendmsg(to_sock, &msg, 0) < 0)
- return 1;
-
- return 0;
-}
-
-
-/* receive socket sock through socket from_sock */
-static int do_recvmsg(int from_sock, int *sock, unsigned long *clnt_accepted,int *srv)
-{
- struct msghdr msg = {0};
- struct cmsghdr *cmsg;
- struct iovec recviov;
- int myfds; /* file descriptors to pass. */
- char buf[CMSG_SPACE(sizeof(myfds))]; /* ancillary data buffer */
- char recvbuf[MSG_BUFSIZ];
-
-
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_iov = &recviov;
- msg.msg_iovlen = 1;
- recviov.iov_base = recvbuf;
- recviov.iov_len = sizeof(recvbuf);
-
- msg.msg_control = buf;
- msg.msg_controllen = sizeof buf;
-
- cmsg = CMSG_FIRSTHDR(&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
- msg.msg_controllen = cmsg->cmsg_len;
-
- if (recvmsg(from_sock, &msg, 0) < 0)
- return 1;
-
- *sock = *((int *)CMSG_DATA(cmsg));
- sscanf(recvbuf, "%u %lu", srv, clnt_accepted);
-
- return 0;
-}
-
-static void glite_srvbones_set_slaves_ct(int n)
-{
- set_slaves_ct = (n == -1)? SLAVES_COUNT: n;
-}
-
-static void glite_srvbones_set_slave_overload(int n)
-{
- set_slave_overload = (n == -1)? SLAVE_OVERLOAD: n;
-}
-
-static void glite_srvbones_set_slave_conns_max(int n)
-{
- set_slave_reqs_max = (n == -1)? SLAVE_REQS_MAX: n;
-}
-
-static void set_timeout(struct timeval *to, struct timeval *val)
-{
- if (val) {
- /* XXX: why not, negative timeouts don't make any sense, IMHO */
- assert(val->tv_sec >= 0);
- *to = *val;
- }
- else to->tv_sec = -1;
-}
+++ /dev/null
-build
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# 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 $<
+++ /dev/null
-#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__ */
+++ /dev/null
-/*************************************************************************
- *
- * $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 <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-#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 <stdio.h> 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 */
+++ /dev/null
-#ident "$Header$"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#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<size; i++) {
- if ((str[i] != ULM_BS) && (str[i] != ULM_QM) && (str[i] != ULM_LF)) {
- ret[j] = str[i];
- j++;
- }
- else {
- ret[j] = ULM_BS;
- if (str[i] == ULM_LF) {
- ret[j+1] = 'n';
- }
- else {
- ret[j+1] = str[i];
- }
- j += 2;
- }
-} /* for */
-
-ret[j] = 0;
-
-return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * \fn char *glite_lbu_UnescapeULM(const char *str)
- * \param str a string to unescape
- * \return new (allocated) unescaped string
- * \brief in given string unescape all escaped ULM_QM, ULM_BS and ULM_LF
- *
- * Calls: malloc, strlen
- *
- * Algorithm: array lookup
- * - the new string will be allocated
- *
- *----------------------------------------------------------------------
- */
-
-char *glite_lbu_UnescapeULM(const char *str)
-{
-unsigned int i,j;
-size_t size;
-char *ret;
-
-if (str == NULL) return NULL;
-
-size = strlen(str);
-ret = (char*) malloc(1+size*sizeof(char));
-
-/*
-j = 0;
-for (i=0; i<size; i++) {
- if ( (str[i] != ULM_BS) ||
- ((str[i] == ULM_BS) && ((str[i+1] != ULM_BS) && (str[i+1] != ULM_QM) && (str[i+1] != 'n'))) )
- {
- if (str[i] == ULM_LF) { ret[j] = 'n'; }
- else { ret[j] = str[i]; }
- j++;
- }
-}
-*/
-for (i=j=0; i<size; i++,j++)
- if (str[i] == ULM_BS) switch(str[++i]) {
- case 'n': ret[j] = ULM_LF; break;
- default: ret[j] = str[i]; break;
- } else { ret[j] = str[i]; }
-
-ret[j] = '\0';
-
-return ret;
-}
-
-static const struct {
- const char c,*e;
-} xml_etab[] = {
- { '<',"lt" },
- { '>',"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;
-}
+++ /dev/null
-/*************************************************************************
- *
- * $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 <string.h>
-#include <locale.h>
-#include <ctype.h>
-#include <stdarg.h>
-#include <time.h>
-#include <math.h>
-#ifndef DEBUG
-# define NDEBUG
-#endif
-#include <assert.h>
-
-#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 ::= [ <sign> ]
- * ( <number> |
- * <number> <decimal_point> <number> |
- * <decimal_point> <number> )
- * [ <exponential> [ <sign> ] <number> ]
- * number ::= 1*( <digit> )
- * 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;
-}
+++ /dev/null
-/*************************************************************************
- *
- * $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 <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#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 */
+++ /dev/null
-
-/*************************************************************************
- *
- * $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 <alloc> 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 <assert.h>
-#include <ctype.h>
-#if !defined(TRIO_COMPILER_SUPPORTS_C99) && !defined(isblank)
-# define isblank(x) (((x)==32) || ((x)==9))
-#endif
-#include <math.h>
-#include <limits.h>
-#include <float.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <errno.h>
-
-#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 <unistd.h>
-# include <signal.h>
-# include <locale.h>
-# define USE_LOCALE
-#endif /* PLATFORM_UNIX */
-#if defined(PLATFORM_WIN32)
-# include <io.h>
-# define read _read
-# define write _write
-#endif /* PLATFORM_WIN32 */
-
-#if TRIO_WIDECHAR
-# if defined(TRIO_COMPILER_SUPPORTS_ISO94)
-# include <wchar.h>
-# include <wctype.h>
-# 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 <stdint.h>
-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 <inttypes.h>
-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<bits> 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);
-}
-
+++ /dev/null
-/*************************************************************************
- *
- * $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 <stdlib.h>
-
-#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 */
+++ /dev/null
-#include <iostream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/TestFixture.h>
-
-#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 <tag> containing &something; </tag>"),
- 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 <assert.h>
-#include <fstream>
-
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/XmlOutputter.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-
-int main (int argc,const char *argv[])
-{
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-
- assert(argc == 2);
- std::ofstream xml(argv[1]);
-
- CppUnit::TestResult controller;
- CppUnit::TestResultCollector result;
- controller.addListener( &result );
-
- CppUnit::TestRunner runner;
- runner.addTest(suite);
- runner.run(controller);
-
- CppUnit::XmlOutputter xout( &result, xml );
- CppUnit::CompilerOutputter tout( &result, std::cout);
- xout.write();
- tout.write();
-
- return result.wasSuccessful() ? 0 : 1 ;
-}
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-#
-# 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 <ljocha@ics.muni.cz>
-# 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
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite LB Client module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.5 2005/05/26 15:18:36 zurek
- inserted module.build.file
-
- Revision 1.4 2004/11/02 15:10:43 dkouril
- RPM description
-
- Revision 1.3 2004/07/30 08:31:07 dimeglio
- Changed default Ant target from compile to dist
-
- Revision 1.2 2004/07/12 16:18:37 dimeglio
- Modified to use myproxy from the repository if available
-
- Revision 1.1.1.1 2004/07/09 10:16:25 akrenek
- initial import
-
- Revision 1.2 2004/07/07 09:24:57 akrenek
- thr/nonthr flavours used correctly
-
- Revision 1.3 2004/07/06 17:45:30 flammer
- Update of classpath definitions, targets & configure file.
-
- Revision 1.2 2004/06/23 00:29:33 dimeglio
- Added standard comments and handling of support files
-
--->
-
-<project name="proxyrenewal" default="dist">
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
- <property file="${module.build.file}" />
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="secmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
- <!-- =========================================
- RPM settings
- ========================================= -->
-
- <property name="build.package.summary" value="Proxy renewal daemon" />
- <property name="build.package.description" value="The daemon is responsible for secure and controled way of periodical renewal
of users' proxy certificates. Its primary goal is to support long-time jobs
running on the grid. This package also contains a library and header file
that allow to develop C/C++ applications accessing the daemon." />
-
-</project>
+++ /dev/null
-#!/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
+++ /dev/null
-#include <stdlib.h>
-#include <stdio.h>
-#include <getopt.h>
-#include <glite/security/proxyrenewal/renewal_core.h>
-
-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 <myproxy server> --proxy <filename>\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;
-}
+++ /dev/null
-/**
- * \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$"
-
-#ifdef RENEWAL_HAVE_JOBID
-#include "glite/wmsutils/jobid/cjobid.h"
-#endif
-
-#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 */
+++ /dev/null
-#ifndef RENEWAL_CORE_H
-#define RENEWAL_CORE_H
-
-#ident "$Id$"
-
-#include <sys/syslog.h>
-
-#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 */
+++ /dev/null
-module.build=137
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration options for the GLite Security Proxyrenewal module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2005/03/08 12:51:23 dkouril
- - Removed unused code
- - enabled (and partly rewritten) support for renewal of VOMS attributes
- - internal VOMS headers added - they are necessary to work with ASN.1 encoded
- VOMS attribures (hopefully new version of the VOMS API will provide better
- support)
-
- Revision 1.2 2004/07/12 16:18:37 dimeglio
- Modified to use myproxy from the repository if available
-
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="Security Proxyrenewal configuration options">
- <target name="secmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-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}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Glite Security Proxyrenewal component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/07/12 16:18:37 dimeglio
- Modified to use myproxy from the repository if available
-
--->
-
-<project name="Security Proxyrenewal component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${security.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${security.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="proxyrenewal" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="tasks and types definitions">
-</project>
+++ /dev/null
-module.version=1.3.0
-module.age=1
+++ /dev/null
-#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 */
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <string.h>
-#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 <fqdn> address of myproxy server\n"
- "-p, --port <num> port of myproxy server\n"
- "-f, --file <file> filename with proxy\n"
- "-j, --jobid <str> 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;
-}
+++ /dev/null
-#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=<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;
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#include <myproxy.h>
-#include <myproxy_delegation.h>
-
-#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;
-}
+++ /dev/null
-#ifndef RENEWAL_LOCL_H
-#define RENEWAL_LOCL_H
-
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdarg.h>
-#include <string.h>
-#include <time.h>
-#include <errno.h>
-#include <syslog.h>
-#include <linux/limits.h>
-#include <signal.h>
-#include <assert.h>
-#include <getopt.h>
-#include <dirent.h>
-#include <sys/un.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#include <sys/wait.h>
-#include <poll.h>
-#ifndef INFTIM
-#define INFTIM (-1)
-#endif
-
-#include <openssl/md5.h>
-#include <openssl/x509.h>
-#include <openssl/pem.h>
-#include <openssl/err.h>
-
-#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 */
+++ /dev/null
-#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;
-}
+++ /dev/null
-#ifndef RENEWALD_LOCL_H
-#define RENEWALD_LOCL_H
-
-#ident "$Header$"
-
-#include <globus_gsi_credential.h>
-#include <globus_gsi_proxy.h>
-#include <globus_gsi_cert_utils_constants.h>
-
-#include "renewal.h"
-#include "renewal_core.h"
-
-#ifdef HAVE_DMALLOC_H
-#include <dmalloc.h>
-#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 */
+++ /dev/null
-#include "renewal_locl.h"
-#include "renewd_locl.h"
-
-#include <string.h>
-#include <openssl/x509.h>
-
-#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
+++ /dev/null
-CC=gcc
-CFLAGS=
-EXEC=testSocket
-
-all: $(EXEC)
-
-testSocket: testSocket.c
- $(CC) -o $@ $< $(CFLAGS)
-
-clean:
- rm -rf *.o
-
-mrproper: clean
- rm -rf $(EXEC)
+++ /dev/null
-
-
-Readme file for lb1 v1.0*************************************
-Date: 19.03.2007 *
-Author: *
-*************************************************************
-
-lb-l1.sh
-********
-
-Script for testing of LB services
-
-* Prerequisities: All services running (user does not have to get any credentials)
-
-* Basic test: PING
- check LB binaries
- check running services
-* Options:
- -h | --help Show this help message.
- -m | --m lb_host
- -g | --log 'logfile' Redirect all output to the 'logfile'.
-
-* The name of the bkserver has to be specified everytime
-
-
-Examples
-********
-
-[ui] /home/fmunster> ./lb-l1.sh -g log
-USAGE: TCPecho <server_ip> <port>
-
-[ui] /home/fmunster> ./lb-l1.sh -g log -m gliterb.iihe.ac.be
-
-[ui] /home/fmunster> cat log
-
-Basic services test......
-Checking binary glite-lb-job_reg ? OK
-Checking binary glite-lb-job_log ? OK
-Checking binary glite-lb-logevent ? OK
-Checking binary glite-lb-user_jobs ? OK
-Checking binary glite-lb-job_status ? OK
-Checking binary glite-lb-change_acl ? OK
-Checking binary glite-lb-lbmon OK
-Listening to locallogger port (9002)
-Connecting a socket with : 193.190.246.245,9002 [OK]
-glite-lb-logd running ? - [OK]
-Listening to interlogger ports (9000-9001-9003)
-Connecting a socket with : 193.190.246.245,9000 [OK]
-Connecting a socket with : 193.190.246.245,9001 [OK]
-Connecting a socket with : 193.190.246.245,9003 [OK]
-Interlogd running ? - [OK]
-
-
+++ /dev/null
-Readme file for lb2 v1.0*************************************
-Date: 19.03.2007 *
-Author: *
-*************************************************************
-
-lb-l2.sh
-********
-
-Normal event delivery and Normal Job States
-
-* Prerequisities: All services running (LBProxy not used), user must have a valid proxy on the UI
-
-* Test:
-Registers jobs with glite-lb-job-reg preferably pointing to remote LB Server
-Check of the job status
-Logs sequences of events with glite-lb-..... sh scripts (ex: gite-lb-ready.sh)
-Checks with glite-lb-job_log that the events got delivered aftewards
-Checks with glite-lb-job_status that the status of the jobs are correct
-
-* Options:
-echo " -h | --help Show this help message."
-echo " -r | --retries Number of test retries (2 by default)"
-echo " -n | --nbjobs Number of jobs (10 by default)"
-echo " -m | --bkserver Host address of the BKServer ex:pc900.iihe.ac.be "
-echo " -s | --states List of states in which could tested jobs fall."
-echo " -l | --large-stress 'size' Do a large stress logging ('size' random data added to the messages."
-
-
-* The name of the bkserver has to be specified everytime
-
-* The option -l 'size' addes random data to the messages send to the BKServer with glite-lb-logevent.
-
-* With the option -s you can specify the list of states that will be submitted randomly to the jobs created
-
-* When you specify a state, the script will send all the events the job has to pass trough.
-
-
-
-lb-l2Stat.sh
-************
-
-* This script is mainly the same than lb-l2.sh but it includes a mesure of time.
-
-* You can specify one more option
-
- echo " -t | --tags Number of user tags to load to each job."
-
-
-
-
-
-examples
-********
-
-./lb-l2.sh -n 4 -m gliterb.iihe.ac.be -s "Running Done"
-
-Registering 4 jobs....................
-https://pc900.iihe.ac.be:9000/3E8xyyH_FCb4z1rN5TymFw
-https://pc900.iihe.ac.be:9000/aTLnW6Mmm_whpt_tbxHjPQ
-https://pc900.iihe.ac.be:9000/TnuSJvVZCLcYDDv1GXdocw
-https://pc900.iihe.ac.be:9000/WW-0FU8g4tID1TMMPZCEBg
-Logging events to the 4 jobs....................................
-
-Logging tags to the 4 jobs....................................
-
-Checking the Events.............................................
-Job 0 ....................[OK]
-Job 1 ....................[OK]
-Job 2 ....................[OK]
-Job 3 ....................[OK]
-
-A detailed list of the sequence of events logged to each job has been printed to 1174296170.log
-
-Checking the Jobs Status........................................
-
-Job: 0 ..Logged state:running-Recorded state : Running.......[OK]
-Job: 1 ..Logged state:done-Recorded state : Done.......[OK]
-Job: 2 ..Logged state:done-Recorded state : Done.......[OK]
-Job: 3 ..Logged state:done-Recorded state : Done.......[OK]
-
-Final test result .........................................[OK]
-
-
-1174296170.log (this file contains a detailed list of the sequence of events logged to each job during the test)
-
-...
-Events Sent.....
- 1 UserTag
- 2 RegJob
- 3 Accepted
- 4 EnQueued
- 5 DeQueued
- 6 HelperCall
- 7 Match
- 8 HelperReturn
- 9 EnQueued
- 10 DeQueued
- 11 Transfer
- 12 Accepted
- 13 Transfer
- 14 Running
- 15 Done
-Events recorded in the LB server.....
- 1 UserTag
- 2 RegJob
- 3 Accepted
- 4 EnQueued
- 5 DeQueued
- 6 HelperCall
- 7 Match
- 8 HelperReturn
- 9 EnQueued
- 10 DeQueued
- 11 Transfer
- 12 Accepted
- 13 Transfer
- 14 Running
- 15 Done
-...
-
-
-
-./lb-l2Stat.sh -n 3 -m gliterb.iihe.ac.be
-...
-Sending events took for individual jobs the following time
-https://pc900.iihe.ac.be:9000/QZUecSg86IXtZeMmU4Rd6Q 11.061101000 seconds
-https://pc900.iihe.ac.be:9000/-R0CDDoicKdwqAZHEI32gA 9.438249000 seconds
-https://pc900.iihe.ac.be:9000/x6qFebsaNOR1a31NlAhJIQ 3.167140000 seconds
-Total time for 3 jobs: 23.666490000
-Average time for event: 7.888830000
-Average time for event and tags: .157776600
-Event throughput (events/sec): 6.338075481
-...
-
-
-List of possible job Status
-***************************
-
-"Submitted Waiting Ready Cancelled Scheduled Aborted Running Done Cleared"
-
-* Submitted: The job has been submitted by the user but not yet processed by the Network Server
-
-* Waiting: The job has been accepted by the Network Server but not yet processed by the workload manager
-
-* Ready: The job has been assigned to a Computing Element but not yet transferred to it
-
-* Scheduled: The job is wainting in the CE's queue
-
-* Running: The job is running
-
-* Done: The job has finished
-
-* Aborted: The job has been aborted by the WMS (it was too long or the proxy certificate expired)
-
-* Cancelled: The job has been cancelled by the user
-
-* Cleared: The output sandbox has been transferred to the UserInterface
-
+++ /dev/null
-#!/bin/bash
-##########################################################################################
-# Script for testing of LB services
-# Basic test: PING
-# check LB binaries
-# check running services with sockets
-#####################################################################################
-# #
-# Returned values: #
-# #
-# Exit TEST_OK: Test Passed #
-# Exit TEST_ERROR: Test Failed #
-# Exit 2: Wrong Input #
-# #
-# Authors: Shkelzen Rugovac, Frederic Munster, Othmane Bouhali #
-################################################################
-
-##
-# defining variables
-########################"
-PATH=/opt/glite/examples:$PATH
-#echo $PATH
-LBLOGEV=${LBLOGEV:-glite-lb-logevent}
-LBJOBLOG=${LBJOBLOG:-glite-lb-job_log}
-LBJOBREG=${LBJOBREG:-glite-lb-job_reg}
-LBUSERJOBS=${LBUSERJOBS:-glite-lb-user_jobs}
-LBJOBSTAT=${LBJOBSTAT:-glite-lb-job_status}
-LBPURGE=${LBPURGE:-glite-lb-purge}
-LBCHANGEACL=${LBCHANGEACL:-glite-lb-change_acl}
-LBMON=${LBMON:-glite-lb-lbmon}
-LB_INTERLOGD=glite-lb-interlogd
-LB_LOGD=glite-lb-logd
-DEBUG=2
-##
-# show help and usage
-######################"
-showHelp()
-{
- echo "Usage: $0 [OPTIONS] "
- echo "Options:"
- echo " -h | --help Show this help message."
- echo " -m | --m lb_host hostName or IPV4 adress "
- echo " -g | --log 'logfile' Redirect all output to the 'logfile'."
- echo "-html | --html Format output for html."
- echo ""
-# echo "For proper operation check your grid-proxy-info"
-# grid-proxy-info
-}
-if [ -z "$1" ]; then
- showHelp
- exit 2
-fi
-logfile=output.log
-flag=0
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") showHelp && exit 2 ;;
- "-m" | "--bkserver") shift ; LB_HOST=$1 ;;
- "-g" | "--log") shift ; logfile=$1 flag=1 ;;
- "-html" | "--html") newline="<br>" ;;
- *) echo "Unrecognized option $1 try -h for help"; exit 2 ;;
-
- esac
- shift
-done
-
-
-##
-# Ping the LB_HOST
-######################
-
-function ping_host
-{
- echo "${newline:-} Testing ping to $LB_HOST " >> $logfile
- result=`ping -c 5 $LB_HOST 2>/dev/null | grep "0% packet loss"| wc -l`
- if [ $result -gt 0 ]; then
- echo "${newline:-}Pinging $LB_HOST OK$ " >> $logfile
- else
- echo "${newline:-}" >> $logfile
- echo "${newline:-}Ping failed: The $LB_HOST is not accessible! " >> $logfile
- echo "${newline:-}" >> $logfile
- echo "${newline:-} LB Basic Test: Failed. " >> $logfile
- exit $TEST_ERROR
- fi
-# echo "<font color="green"> - OK </font>"
-}
-
-check_exec()
-{
- [ $DEBUG -gt 0 ] && [ -n "$2" ] && echo -n -e "$2\t" >> $logfile || echo -n -e "$1\t" >> $logfile
- eval $1
- RV=$?
- [ $DEBUG -gt 0 ] && [ $RV -eq 0 ] && echo "${newline:-}OK" >> $logfile || echo "${newline:-}FAILED" >> $logfile
- return $RV
-}
-
-#
-# check the binaries
-#########################
-check_binaries()
-{
- check_exec 'LBJOBREG=`which $LBJOBREG`' "${newline:-}Checking binary $LBJOBREG ? " || exit 1
- check_exec 'LBJOBLOG=`which $LBJOBLOG`' "${newline:-}Checking binary $LBJOBLOG ? " || exit 1
- check_exec 'LBLOGEV=`which $LBLOGEV`' "${newline:-}Checking binary $LBLOGEV ?" || exit 1
- check_exec 'LBUSERJOBS=`which $LBUSERJOBS`' "${newline:-}Checking binary $LBUSERJOBS ?" || exit 1
- check_exec 'LBJOBSTAT=`which $LBJOBSTAT`' "${newline:-}Checking binary $LBJOBSTAT ? " || exit 1
- check_exec 'LBCHANGEACL=`which $LBCHANGEACL`' "${newline:-}Checking binary $LBCHANGEACL ?" || exit 1
- check_exec 'LBMON=`which $LBMON`' "${newline:-}Checking binary $LBMON " || exit 1
-}
-#
-# check the services
-##################"
-check_services()
-{
-echo "${newline:-}Listening to locallogger port (9002)" >> $logfile
-$SAME_SENSOR_HOME/tests/testSocket $LB_HOST 9002 >> $logfile
-if [ $? -eq 0 ]; then
- echo "${newline:-}logd running ? - [OK]" >> $logfile
- else
- echo "${newline:-}logd running ? - [FAILED]" >> $logfile
- exit $TEST_ERROR
- fi
-echo "${newline:-}Listening to interlogger ports (9000-9001-9003)${linebreak:-}" >> $logfile
-$SAME_SENSOR_HOME/tests/testSocket $LB_HOST 9000 >> $logfile &&
-$SAME_SENSOR_HOME/tests/testSocket $LB_HOST 9001 >> $logfile &&
-$SAME_SENSOR_HOME/tests/testSocket $LB_HOST 9003 >> $logfile
-if [ $? -eq 0 ]; then
- echo "${newline:-}Interlogd running ? - [OK]" >> $logfile
- else
- echo "${newline:-}interlogd running ? - [FAILED]" >> $logfile
- exit $TEST_ERROR
- fi
-}
-
-#####################
-# Starting the test
-#####################
-ping_host
-check_binaries
-check_services
-if [ $flag -ne 1 ];then
- cat $logfile
- rm $logfile
-fi
-exit $TEST_OK
+++ /dev/null
-#!/bin/bash
-#3.1.4 et 3.2.1: Normal event delivery and Normal Job States
-
-#Prerequisities: All services running
-
-#Actions:
-#Registers jobs with glite-lb-job-reg prferably pointing to remote LB Server
-#Check of the job status
-#Logs sequences of events with glite-lb-logevent
-#Checks with glite-lb-job_log that the events got delivered aftewards
-#Checks with glite-lb-job_status that the status of the jobs are correct
-
-
-PATH=/opt/glite/examples:$PATH
-#echo $PATH
-LBJOBREG=${LBJOBREG:-glite-lb-job_reg}
-LBLOGEVENT=${LBLOGEVENT:-glite-lb-logevent}
-LBJOBSTATUS=${LBJOBSTATUS:-glite-lb-job_status}
-LBJOBLOG=${LBJOBLOG:-glite-lb-job_log}
-LBJOBSTAT=${LBJOBSTAT:-glite-lb-job_status}
-LBPURGE=${PURGE:-glite-lb-purge}
-
-BKSERVER="localhost"
-STATES="aborted cancelled done ready running scheduled waiting submitted "
-SOURCES="NetworkServer WorkloadManager BigHelper JobController LogMonitor LRMS Application UserInterface"
-
-dtest=1
-i=0
-JOBS_ARRAY_SIZE=10
-INTERVAL=2
-DATE_S=`date +"%s"`
-DATE=`date`
-LOG_FILE="$DATE_S.log"
-
-
-init()
-{
-echo "Date: $DATE" > $LOG_FILE
-export EDG_WL_QUERY_SERVER="$BKSERVER:9000"
-export EDG_WL_LOG_DESTINATION="$BKSERVER:9002"
-BKSERVER_HOST="$BKSERVER:9000"
-BKSERVER_OPT="-m $BKSERVER"
-}
-
-
-getJobId()
-{
-cat jobreg |grep "EDG_JOBID" |cut -c12- > jobList2
-res=`cat jobList2 |wc -c`
-res=$[$res-2]
-cat jobList2 |cut -c1-`echo $res` > jobreg
-rm jobList2
-}
-
-#registrating a job
-job_reg()
-{
-eval $LBJOBREG $BKSERVER_OPT -s $1 > jobreg
-getJobId
-job=`cat jobreg`
-rm jobreg
-}
-
-#registering a list of jobs which jobid's are placed in an array
-array_job_reg()
-{
-echo "Registering $JOBS_ARRAY_SIZE jobs...................."
-job_id=0
-st_count=`echo $SOURCES | wc -w`
-while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- tmp=`echo $RANDOM % $st_count + 1 | bc`
- jsource=`echo $SOURCES | cut -d " " -f $tmp | tr A-Z a-z`
- job_reg $jsource
- echo $job
- SAMPLE_JOBS_ARRAY[$job_id]=$job
- job_id=$[$job_id+1]
- done
-}
-
-#Event delivery test
-testLB()
-{
-echo "Checking the Events............................................."
-echo
-job_id=0
-while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- #sleep 2
- #out is the list of events sent, we count the number of events and then we extract the job status
- nbEvents=`cat out[$job_id] |grep glite-lb-logevent | wc -l`
- nbEvents=$[$nbEvents+1]
- cat out[$job_id] |gawk -F"-e " '{ print $2 }' > eventsTemp
- echo "UserTag"> events
- echo "RegJob">> events
- cat eventsTemp|gawk -F" --" '{ print $1 }'>> events
- rm eventsTemp
- events3="blank"
- i=0
- cmp -s events events3
- while [ $? -ne 0 ] && [ $i -lt $INTERVAL ] ; do
-
-
- #we use glite-lb-job_log and apply the same treatment as above to the output
- eval $LBJOBLOG -r $INTERVAL -d 2 ${SAMPLE_JOBS_ARRAY[$job_id]} > joblog2
- nbevents=`cat joblog2 | grep DATE | wc -l`
- cat joblog2|gawk -F"DG.EVNT=\"" '{ print $2 }' > eventsTemp2
- cat eventsTemp2|gawk -F"\"" '{ print $1 }'> events2
- cat events2|sed /^$/d > events3
- rm eventsTemp2 events2 joblog2
- #Comparison of the outputs and intermediary printout
- echo "Events Sent....." >> $LOG_FILE
- cat -n events >> $LOG_FILE
-# cat -n events
- echo "Events recorded in the LB server....." >> $LOG_FILE
- cat -n events3 >> $LOG_FILE
-# cat -n events3
- i=$[$i+1]
- cmp -s events events3
- done
- cmp -s events events3
- if [ $? -eq 0 ]; then
- echo "Job $job_id ....................[OK]"
- i=0
-
- else
- echo "Job $job_id.....................[FAILED]"
- dtest=0
- fi
- rm events events3 out[$job_id]
- job_id=$[$job_id+1]
-done
-echo
-echo "A detailed list of events logged has been printed to $LOG_FILE"
-echo
-}
-
-#job status test
-testLB2()
-{
-echo "Checking the Jobs Status........................................"
-echo
-job_id=0
- while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- #sleep 1
- eval $LBJOBSTATUS ${SAMPLE_JOBS_ARRAY[$job_id]} > status
- testStatus=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}|wc -l`
- i=0
- while [ $testStatus -ne 1 ] && [ $i -lt $INTERVAL ] ; do
- bkserver_state=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`
- testStatus=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}|wc -l`
- i=$[$i+1]
- done
- if [$testStatus -eq 1 ] ; then
- echo "Job: $job_id ..Logged state:${SAMPLE_JOBS_STATES[$job_id]}-Recorded `cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`.......[OK]"
- else
- echo "Job: $job_id ..Logged state:${SAMPLE_JOBS_STATES[$job_id]}-Recorded `cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`.......[FAILED]"
- cat status > errorStatus.tmp
- echo "Detailed status has been copied to errorStatus.tmp"
- echo
- dtest=0
- fi
- rm status
-job_id=$[$job_id+1]
-done
-}
-
-#logging events to the jobs. Events are selected randomly from a list.
-logEvents()
-{
-echo "Logging events to the $JOBS_ARRAY_SIZE jobs...................................."
-echo
-job_id2=0
-st_count=`echo $STATES | wc -w`
- while [ $job_id2 -lt $JOBS_ARRAY_SIZE ] ; do
- tmp=`echo $RANDOM % $st_count + 1 | bc`
- state=`echo $STATES | cut -d " " -f $tmp | tr A-Z a-z`
- SAMPLE_JOBS_STATES[$job_id2]=$state
- echo >> $LOG_FILE
- echo "Submitting events to the job: ${SAMPLE_JOBS_ARRAY[$job_id2]} " >> $LOG_FILE
- echo >> $LOG_FILE
-
- echo "event submitted.......................................[$state]" >> $LOG_FILE
- eval glite-lb-$state.sh $LARGE_STRESS -j ${SAMPLE_JOBS_ARRAY[$job_id2]} 2>out[$job_id2]
- job_id2=$(($job_id2 + 1))
-done
-}
-
-#logging tags to the jobs
-logTags()
-{
-echo "Logging tags to the $JOBS_ARRAY_SIZE jobs...................................."
-echo
-
-job_id=0
-while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- eval $LBLOGEVENT -s Application -e UserTag -j ${SAMPLE_JOBS_ARRAY[$job_id]} -name testTag -value 12345 >> $LOG_FILE
-job_id=$[$job_id+1]
-done
-}
-
-showHelp()
-{
-echo "Usage: $0 [OPTIONS] "
-echo "Options:"
-echo " -h | --help Show this help message."
-echo " -r | --retries Number of test retries (2 by default)"
-echo " -n | --nbjobs Number of jobs (10 by default)"
-echo " -m | --bkserver Host address of the BKServer ex:pc900.iihe.ac.be "
-echo " -s | --states List of states in which could tested jobs fall."
-echo " -l | --large-stress 'size' Do a large stress logging ('size' random data added to the messages."
-echo ""
-
-# echo "For proper operation check your grid-proxy-info"
-# grid-proxy-info
-}
-
-
-#input
-if [ -z "$1" ]; then
- showHelp
- exit 2
-fi
-BK=0
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") showHelp && exit 2 ;;
- "-r" | "--retries") shift ; INTERVAL=$1 ;;
- "-n" | "--nbjobs") shift ; JOBS_ARRAY_SIZE=$1 ;;
- "-m" | "--bkserver") shift ; BKSERVER=$1 BK=1;;
- "-s" | "--states") shift; STATES="$1" ;;
- "-l" | "--large-stress") shift ; LARGE_STRESS="-l $1" ;;
-# "-g" | "--log") shift ; logfile=$1 ;;
-
- *) echo "Unrecognized option $1 try -h for help"; exit 2 ;;
-
- esac
- shift
-done
-if [ $BK -ne 1 ]; then
- echo
- echo "You must specify the hostname of the LB Server with the option -m (ex: -m pf435.ulb.ac.be)"
- echo
- exit 2
-fi
-echo
-
-
-#main..................................................................
-init
-array_job_reg
-logEvents
-logTags
-testLB
-testLB2
-#testProxy
-#eval $LBPURGE -h
-echo
-if [ $dtest -eq 1 ];then
- echo "Final test result .........................................[OK]"
- exit 1
-else echo "Final test result .........................................[FAILED]"
- exit 0
- fi
-echo
+++ /dev/null
-#3.1.3: Interlogger Recovery
-##############################################################################################
-#Prerequisities: locallogger(glite-lb-logd) and BKServer (glite-lb-bkserv) must be running.
-#The interlogger(glite-lb-interl) must be stopped. (kill the process manually on the LB machine)
-
-#Actions:
-#Registers jobs with glite-lb-job-reg
-#Logs sequences of events with glite-lb-logevent
-#User starts the interlogger daemon
-#(/opt/glite/etc/config/scripts/glite-lb-cofig.py --start on your LB machine (as root))
-#Checks with glite-lb-job_log that the events got delivered aftewards
-#by the interloger to the bookkeeping server. (from the localloger which is linked to the WMS)
-#Checks with glite-lb-job_status that the status of the jobs are correct in the BKserver
-###############################################################################################
-
-PATH=/opt/glite/examples:$PATH
-#echo $PATH
-LBJOBREG=${LBJOBREG:-glite-lb-job_reg}
-LBLOGEVENT=${LBLOGEVENT:-glite-lb-logevent}
-LBJOBSTATUS=${LBJOBSTATUS:-glite-lb-job_status}
-LBJOBLOG=${LBJOBLOG:-glite-lb-job_log}
-LBJOBSTAT=${LBJOBSTAT:-glite-lb-job_status}
-LBPURGE=${PURGE:-glite-lb-purge}
-
-STATES="aborted cancelled done ready running scheduled waiting submitted "
-SOURCES="NetworkServer WorkloadManager BigHelper JobController LogMonitor LRMS Application UserInterface"
-dtest=1
-i=0
-JOBS_ARRAY_SIZE=10
-INTERVAL=2
-DATE_S=`date +"%s"`
-DATE=`date`
-LOG_FILE="$DATE_S.log"
-
-#initialisation
-init()
-{
-echo "Date: $DATE" > $LOG_FILE
-export EDG_WL_QUERY_SERVER="$BKSERVER:9000"
-export EDG_WL_LOG_DESTINATION="$BKSERVER:9002"
-BKSERVER_HOST="$BKSERVER:9000"
-BKSERVER_OPT="-m $BKSERVER"
-}
-
-#extracting the job id
-getJobId()
-{
-cat jobreg |grep "EDG_JOBID" |cut -c12- > jobList2
-res=`cat jobList2 |wc -c`
-res=$[$res-2]
-cat jobList2 |cut -c1-`echo $res` > jobreg
-rm jobList2
-}
-
-#registrating a job
-job_reg()
-{
-eval $LBJOBREG $BKSERVER_OPT -s $1 > jobreg
-getJobId
-job=`cat jobreg`
-rm jobreg
-}
-
-#registering a list of jobs which jobid's are placed in an array
-array_job_reg()
-{
-echo "Registering $JOBS_ARRAY_SIZE jobs...................."
-job_id=0
-st_count=`echo $SOURCES | wc -w`
-while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- tmp=`echo $RANDOM % $st_count + 1 | bc`
- jsource=`echo $SOURCES | cut -d " " -f $tmp | tr A-Z a-z`
- job_reg $jsource
- echo $job
- SAMPLE_JOBS_ARRAY[$job_id]=$job
- job_id=$[$job_id+1]
- done
-}
-
-#Event delivery test
-testLB()
-{
-echo "Checking the Events............................................."
-echo
-job_id=0
-while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- #sleep 2
- #out is the list of events sent, we count the number of events and then we extract the job status
- nbEvents=`cat out[$job_id] |grep glite-lb-logevent | wc -l`
- nbEvents=$[$nbEvents+1]
- cat out[$job_id] |gawk -F"-e " '{ print $2 }' > eventsTemp
- echo "RegJob">> events
- cat eventsTemp|gawk -F" --" '{ print $1 }'>> events
- rm eventsTemp
- events3="blank"
- i=0
- cmp -s events events3
- while [ $? -ne 0 ] && [ $i -lt $INTERVAL ] ; do
-
-
- #we use glite-lb-job_log and apply the same treatment as above to the output
- eval $LBJOBLOG -r $INTERVAL -d 2 ${SAMPLE_JOBS_ARRAY[$job_id]} > joblog2
- nbevents=`cat joblog2 | grep DATE | wc -l`
- cat joblog2|gawk -F"DG.EVNT=\"" '{ print $2 }' > eventsTemp2
- cat eventsTemp2|gawk -F"\"" '{ print $1 }'> events2
- cat events2|sed /^$/d > events3
- rm eventsTemp2 events2 joblog2
- #Comparison of the outputs and intermediary printout
- echo "Events Sent....." >> $LOG_FILE
- cat -n events >> $LOG_FILE
-# cat -n events
- echo "Events recorded in the LB server....." >> $LOG_FILE
- cat -n events3 >> $LOG_FILE
-# cat -n events3
- i=$[$i+1]
- cmp -s events events3
- done
- cmp -s events events3
- if [ $? -eq 0 ]; then
- echo "Job $job_id ....................[OK]"
- i=0
-
- else
- echo "Job $job_id.....................[FAILED]"
- dtest=0
- fi
- rm events events3 out[$job_id]
- job_id=$[$job_id+1]
-done
-echo
-echo "A detailed list of events logged has been printed to $LOG_FILE"
-echo
-}
-
-#job status test
-testLB2()
-{
-echo "Checking the Jobs Status........................................"
-echo
-job_id=0
- while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- #sleep 1
- eval $LBJOBSTATUS ${SAMPLE_JOBS_ARRAY[$job_id]} > status
- testStatus=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}|wc -l`
- i=0
- while [ $testStatus -ne 1 ] && [ $i -lt $INTERVAL ] ; do
- bkserver_state=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`
- testStatus=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}|wc -l`
- i=$[$i+1]
- done
- if [$testStatus -eq 1 ] ; then
- echo "Job: $job_id ..Logged state:${SAMPLE_JOBS_STATES[$job_id]}-Recorded `cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`.......[OK]"
- else
- echo "Job: $job_id ..Logged state:${SAMPLE_JOBS_STATES[$job_id]}-Recorded `cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`.......[FAILED]"
- cat status > errorStatus.tmp
- echo "Detailed status has been copied to errorStatus.tmp"
- echo
- dtest=0
- fi
- rm status
-job_id=$[$job_id+1]
-done
-}
-
-#logging events to the jobs. Events are selected randomly from a list.
-logEvents()
-{
-echo "Logging events to the $JOBS_ARRAY_SIZE jobs...................................."
-echo
-job_id2=0
-st_count=`echo $STATES | wc -w`
- while [ $job_id2 -lt $JOBS_ARRAY_SIZE ] ; do
- tmp=`echo $RANDOM % $st_count + 1 | bc`
- state=`echo $STATES | cut -d " " -f $tmp | tr A-Z a-z`
- SAMPLE_JOBS_STATES[$job_id2]=$state
- echo >> $LOG_FILE
- echo "Submitting events to the job: ${SAMPLE_JOBS_ARRAY[$job_id2]} " >> $LOG_FILE
- echo >> $LOG_FILE
-
- echo "event submitted.......................................[$state]" >> $LOG_FILE
- eval glite-lb-$state.sh $LARGE_STRESS -j ${SAMPLE_JOBS_ARRAY[$job_id2]} 2>out[$job_id2]
- job_id2=$(($job_id2 + 1))
-done
-}
-
-
-showHelp()
-{
-echo "Usage: $0 [OPTIONS] "
-echo "Options:"
-echo " -h | --help Show this help message."
-echo " -r | --retries Number of test retries (2 by default)"
-echo " -n | --nbjobs Number of jobs (10 by default)"
-echo " -m | --bkserver Host address of the BKServer ex:pc900.iihe.ac.be "
-echo " -s | --states List of states in which could tested jobs fall."
-echo " -l | --large-stress 'size' Do a large stress logging ('size' random data added to the messages."
-echo ""
-
-# echo "For proper operation check your grid-proxy-info"
-# grid-proxy-info
-}
-
-
-#input
-if [ -z "$1" ]; then
- showHelp
- exit 2
-fi
-BK=0
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") showHelp && exit 2 ;;
- "-r" | "--retries") shift ; INTERVAL=$1 ;;
- "-n" | "--nbjobs") shift ; JOBS_ARRAY_SIZE=$1 ;;
- "-m" | "--bkserver") shift ; BKSERVER=$1 BK=1;;
- "-s" | "--states") shift; STATES="$1" ;;
- "-l" | "--large-stress") shift ; LARGE_STRESS="-l $1" ;;
-# "-g" | "--log") shift ; logfile=$1 ;;
-
- *) echo "Unrecognized option $1 try -h for help"; exit 2 ;;
-
- esac
- shift
-done
-if [ $BK -ne 1 ]; then
- echo
- echo "You must specify the hostname of the LB Server with the option -m (ex: -m pf435.ulb.ac.be)"
- echo
- exit 2
-fi
-echo
-
-
-#main..................................................................
-
-#main..................................................................
-init
-echo "Be sure you have stopped glite-lb-interlogd .........................."
-echo "You have to log on on your LB machine and kill the process manually..."
-echo "Press any key........................................................."
-read x
-array_job_reg
-logEvents
-echo "Please start the glite-lb-interlogd..................................."
-echo "Please use /opt/glite/etc/config/scripts/glite-lb-cofig.py --start...."
-echo "Press any key........................................................."
-read x
-echo "Sleeping 10 seconds......................................................"
-sleep 10
-testLB
-testLB2
-#testProxy
-#eval $LBPURGE -h
-echo
-if [ $dtest -eq 1 ];then
- echo "Final test result .........................................[OK]"
- exit 1
-else echo "Final test result .........................................[FAILED]"
- exit 0
- fi
-echo
+++ /dev/null
-#!/bin/bash
-# Normal event delivery and Normal Job States with internal BKsrever performance
-
-#Prerequisities: All services running
-#Actions:
-#Registers jobs with glite-lb-job-reg prferably pointing to remote LB Server
-#Check of the job status
-#Logs sequences of events with glite-lb-logevent
-#Check with glite-lb-job_status that the status of the jobs are correct and mesures how long it took to get results
-
-
-PATH=/opt/glite/examples:$PATH
-#echo $PATH
-LBJOBREG=${LBJOBREG:-glite-lb-job_reg}
-LBLOGEVENT=${LBLOGEVENT:-glite-lb-logevent}
-LBJOBSTATUS=${LBJOBSTATUS:-glite-lb-job_status}
-LBJOBLOG=${LBJOBLOG:-glite-lb-job_log}
-LBJOBSTAT=${LBJOBSTAT:-glite-lb-job_status}
-LBPURGE=${PURGE:-glite-lb-purge}
-
-
-STATES="aborted cancelled done ready running scheduled waiting submitted "
-SOURCES="NetworkServer WorkloadManager BigHelper JobController LogMonitor LRMS Application UserInterface"
-dtest=1
-i=0
-JOBS_ARRAY_SIZE=10
-# timeouts for polling the bkserver
-timeout=10
-maxtimeout=300
-NB_TAGS=50
-INTERVAL=2
-DATE_S=`date +"%s"`
-DATE=`date`
-LOG_FILE="$DATE_S.log"
-
-init()
-{
-echo "Date: $DATE" > $LOG_FILE
-export EDG_WL_QUERY_SERVER="$BKSERVER:9000"
-export EDG_WL_LOG_DESTINATION="$BKSERVER:9002"
-BKSERVER_HOST="$BKSERVER:9000"
-BKSERVER_OPT="-m $BKSERVER"
-}
-
-get_time()
-{
- sec=`date +%s`
- nsec=`date +%N`
- time=`echo "1000000000*$sec + $nsec"|bc`
-# time=$sec
- return 0
-}
-
-getJobId()
-{
-cat jobreg |grep "EDG_JOBID" |cut -c12- > jobList2
-res=`cat jobList2 |wc -c`
-res=$[$res-2]
-cat jobList2 |cut -c1-`echo $res` > jobreg
-rm jobList2
-}
-
-#registrating a job
-job_reg()
-{
-eval $LBJOBREG $BKSERVER_OPT -s $1 > jobreg
-getJobId
-job=`cat jobreg`
-rm jobreg
-}
-
-array_job_reg()
-{
-echo "Registering $JOBS_ARRAY_SIZE jobs...................."
-job_id=0
-st_count=`echo $SOURCES | wc -w`
-while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- tmp=`echo $RANDOM % $st_count + 1 | bc`
- jsource=`echo $SOURCES | cut -d " " -f $tmp | tr A-Z a-z`
- job_reg $jsource
- echo $job
- SAMPLE_JOBS_ARRAY[$job_id]=$job
- job_id=$[$job_id+1]
- done
-}
-
-#job status test
-testLBP()
-{
-echo "Checking the Events............................................."
-echo
-job_id=0
-while [ $job_id -lt $JOBS_ARRAY_SIZE ] ; do
- get_time
- start=$time
- logEvent $job_id
- logTag $job_id
-
-
- eval $LBJOBSTATUS ${SAMPLE_JOBS_ARRAY[$job_id]} > status
- testStatus=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}|wc -l`
- response=0
- while [ $testStatus -ne 1 ];do
- bkserver_state=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`
- testStatus=`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}|wc -l`
- echo "**Retrying**"
- sleep $timeout
- response=$(($response + $timeout ))
- if test $response -gt $maxtimeout ; then
- echo -e "ERROR\n\tstatus of job ${SAMPLE_JOBS_ARRAY[$job_id]} as queried from bkserver ($bkserver_state) has not become ${SAMPLE_JOBS_STATES[$job_id]} for more than $response seconds!"
- echo "Detailed status has been copied to errorStatus.tmp"
- echo
- dtest=0
- fi
- done
- get_time
- response=`echo "scale=9; ($time - $start)/1000000000"|bc`
- SAMPLE_JOBS_RESPONSES[$job_id]=$response
- echo "Job: $job_id ....[`cat status |grep -i state.*${SAMPLE_JOBS_STATES[$job_id]}`].......[OK]"
- echo
- rm status
- job_id=$[$job_id+1]
- done
- j=0
- total=0
- echo "Sending events took for individual jobs the following time"
- while [ $j -lt $JOBS_ARRAY_SIZE ] ; do
- total=`echo "scale=9; $total + ${SAMPLE_JOBS_RESPONSES[$j]}" |bc`
- echo -e "${SAMPLE_JOBS_ARRAY[$j]} \t${SAMPLE_JOBS_RESPONSES[$j]} seconds"
- j=$(($j + 1))
- done
- echo -e "Total time for $JOBS_ARRAY_SIZE jobs: \t$total"
- echo -e -n "Average time for event: \t"
- echo "scale=9; $total / $JOBS_ARRAY_SIZE "|bc
- echo -e -n "Average time for event and tags: \t"
- echo "scale=9; $total / $JOBS_ARRAY_SIZE / $NB_TAGS"|bc
- echo -e -n "Event throughput (events/sec): \t"
- echo "scale=9; $NB_TAGS * $JOBS_ARRAY_SIZE / $total"|bc
- echo
- echo "A detailed list of events logged has been printed to $LOG_FILE"
- echo
-}
-
-logEvent()
-#ARG1: Number of the job considered in the jobs array
-{
-st_count=`echo $STATES | wc -w`
-tmp=`echo $RANDOM % $st_count + 1 | bc`
-state=`echo $STATES | cut -d " " -f $tmp | tr A-Z a-z`
-SAMPLE_JOBS_STATES[$1]=$state
-echo "Logging event to the job($1).........................[$state]"
-echo > LoggedEvents.log
-echo "Submitting events to the job: ${SAMPLE_JOBS_ARRAY[$1]} " >> $LOG_FILE
-echo >> LoggedEvents.log
-echo "event submitted.......................................[$state]" >> $LOG_FILE
-eval glite-lb-$state.sh $LARGE_STRESS -j ${SAMPLE_JOBS_ARRAY[$1]} 2>out
-}
-logTag()
-{
-i=0
-echo "Logging $NB_TAGS tags to the job................"
-eval $LBLOGEVENT -s Application -n $NB_TAGS -e UserTag -j ${SAMPLE_JOBS_ARRAY[$1]} -name testTag -value 12345 >> $LOG_FILE
-}
-
-showHelp()
-{
- echo "Usage: $0 [OPTIONS] "
- echo "Options:"
- echo " -h | --help Show this help message."
- echo " -n | --nbjobs Number of jobs"
- echo " -s | --states List of states in which could tested jobs fall."
- echo " -m | --bkserver Host address of the BKServer "
- echo " -t | --tags Number of user tags to load to each job."
- echo " -l | --large-stress 'size' Do a large stress logging ('size' rand om data added to the messages."
- echo ""
-
-# echo "For proper operation check your grid-proxy-info"
-# grid-proxy-info
-}
-
-#input
-if [ -z "$1" ]; then
- showHelp
- exit 2
-fi
-BK=0
-while test -n "$1"
-do
- case "$1" in
- "-h" | "--help") showHelp && exit 2 ;;
- "-n" | "--nbjobs") shift ; JOBS_ARRAY_SIZE=$1 ;;
- "-s" | "--states") shift; STATES="$1" ;;
- "-m" | "--bkserver") shift ; BKSERVER=$1 BK=1 ;;
- "-t" | "--tags") shift ; NB_TAGS=$1 ;;
- "-l" | "--large-stress") shift ; LARGE_STRESS="-l $1" ;;
-# "-g" | "--log") shift ; logfile=$1 ;;
-
- *) echo "Unrecognized option $1 try -h for help"; exit 2 ;;
-
- esac
- shift
-done
-if [ $BK -ne 1 ]; then
- echo
- echo "You must specify the hostname of the LB Server with the option -m (ex: -m pf435.ulb.ac.be)"
- echo
- exit 2
-fi
-
-echo
-init
-array_job_reg
-testLBP
-echo
-if [ $dtest -eq 1 ];then
- echo "Final test result .........................................[OK]"
- exit 1
-else echo "Final test result .........................................[FAILED]"
- exit 0
- fi
-echo
-
-
+++ /dev/null
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <netdb.h>
-
-#define BUFFSIZE 32
-void Die(char *mess) {
-perror(mess);
-exit(1); }
-int main(int argc, char *argv[]) {
-int sock;
-struct hostent *hip;
-char *adrIPp;
-struct in_addr adrIP;
-struct sockaddr_in echoserver;
-char buffer[BUFFSIZE];
-unsigned int echolen;
-int received = 0;
-if (argc != 3) {
- fprintf(stderr, "USAGE: TCPecho <server_ip> <port>\n");
- exit(1);
- }
-//conversion from DNS to IPv4
-if((hip=gethostbyname(argv[1]))==NULL)
-{
-printf("Erreur avec gethostbyname\n");
-// exit(1);
-}
-adrIP.s_addr=*(int *)hip->h_addr;
-adrIPp =(char *)inet_ntoa(adrIP);
-/* Create the TCP socket */
-if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- Die("Failed to create socket");
- }
-/* Construct the server sockaddr_in structure */
-memset(&echoserver, 0, sizeof(echoserver)); /* Clear struct */
-echoserver.sin_family = AF_INET; /* Internet/IP */
-echoserver.sin_addr.s_addr = inet_addr(adrIPp); /* IP address */
-echoserver.sin_port = htons(atoi(argv[2])); /* server port */
-printf("Connecting a socket with : %s,%s", adrIPp,argv[2]);
-/* Establish connection */
-if (connect(sock,
- (struct sockaddr *) &echoserver,
- sizeof(echoserver)) < 0) {
- Die("Failed to connect with server");
- }
-else
- {
- shutdown(sock,2);
- printf(" [OK]\n");
- exit(0);
- }
-}
+++ /dev/null
-.project
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-## *********************************************************************
-## *
-## * 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
-
+++ /dev/null
-#! /bin/sh
-
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-
-[ $# -ne 0 ] && ac_dir="-I $1"
-
-mkdir -p src/autogen
-set -x
-aclocal ${ac_dir} -I project
-libtoolize --force
-autoheader
-automake --foreign --add-missing --copy
-autoconf
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite WMS jobid module
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/07/21 18:16:57 eronchie
- Moved out exception from org.glite.wms.common/src/utilitiesY
-
-
--->
-
-<project name="exception" default="dist">
-
- <!-- =========================================
- Builds the GLite WMS Utils Exception Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-
-# $Id$
-
-# Process this file with autoconf to produce a configure script.
-
-AC_PREREQ(2.57)
-AC_INIT([org.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$])
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_CXX
-AC_PROG_LIBTOOL
-
-# Checks for libraries.
-
-# Checks for header files.
-
-# Checks for typedefs, structures, and compiler characteristics.
-
-# Checks for library functions.
-
-GLITE_BASE
-
-# 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
-
+++ /dev/null
-## *********************************************************************
-## *
-## * 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
+++ /dev/null
-#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 <fstream>
-#include <cstdlib>
-//#include <list>
-#include <syslog.h> // For logging exceptions to log file
-#include <errno.h> // list the exception codes
-#include <string>
-#include <vector>
-#include <exception> // 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 <alessandro.maraschini@datamat.it>
-*/
-
-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<std::string> 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
+++ /dev/null
-#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
+++ /dev/null
-#Sat Oct 15 02:08:14 CEST 2005
-module.build=154
+++ /dev/null
-build.package.summary="files for gLite wms utils exception"
-build.package.description="exception api"
+++ /dev/null
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="configure options">
- <property name="configure.args"
- value="--prefix=${workspace.abs.dir}/stage --with-globus-prefix=${with.globus.prefix} --with-globus-thr-flavor=${with.globus.thr.flavor} --with-globus-nothr-flavor=${with.globus.nothr.flavor} --with-cppunit-prefix=${with.cppunit.prefix} --with-glite-location=${with.glite.location} --with-dist-location=${with.dist.location} --disable-optimization"/>
-
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Glite WMS Common component
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.5 2004/08/04 07:40:02 eronchie
- Added cppunit
-
- Revision 1.4 2004/07/28 07:26:45 eronchie
- Added /
-
- Revision 1.3 2004/07/28 07:19:56 eronchie
- Added m4files.list
-
- Revision 1.2 2004/07/23 15:37:26 eronchie
- Commit
-
- Revision 1.1.1.1 2004/07/21 18:16:57 eronchie
- Moved out exception from org.glite.wms.common/src/utilitiesY
-
- Revision 1.2 2004/07/16 14:56:56 flammer
- Corrected input path of build.properties.
-
- Revision 1.1.1.1 2004/05/26 18:45:05 eronchie
- Import of wms jobid
-
-
--->
-
-<project name="WMS Utils Exception component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${wms-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${wms-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="exception" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <property name="m4files.list" value="glite.m4 cppunit optimize.m4"/>
-
-</project>
+++ /dev/null
-module.version=3.1.1
-module.age=1
+++ /dev/null
-/* **************************************************************************
-* filename : Exceptions.cpp
-* author : Alessandro Maraschini <alessandro.maraschini@datamat.it>
-* 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<string> Exception::getStackTrace(){
- // make a copy of the stack
- vector<string> 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
-
+++ /dev/null
-## *********************************************************************
-## *
-## * 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 *.*~
+++ /dev/null
-## *********************************************************************
-## *
-## * 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 *~
-
+++ /dev/null
-#include <iostream>
-#include <fstream>
-
-#include "exception_cu_suite.h"
-
-#include <cppunit/TestResult.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResultCollector.h>
-#include <cppunit/TextOutputter.h>
-#include <cppunit/XmlOutputter.h>
-
-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 ;
-}
+++ /dev/null
-#include "exception_cu_suite.h"
-#include "glite/wmsutils/exception/Exception.h"
-#include <string>
-#include <vector>
-
-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"<<endl;
- glite::wmsutils::exception::Exception exc_5("TEST_Class", 3, "test_method", 1, "exception_test");
- cout << exc_5.dbgMessage() << endl;
- cout << exc_5.printStackTrace() << endl;
- exc_5.log("exception_file");
-
- cout<<"END TEST TO STRING"<<endl;
-}
-
-void Exception_test::stackTrace_case()
-{
- glite::wmsutils::exception::Exception exc_5("TEST_Class", 3, "test_method", 1, "exception_test");
-
- exc_5.push_back("Second_Class", 5, "second_method");
-
- vector<string> msgvec = exc_5.getStackTrace();
-
- for (int i=0; i<msgvec.size(); i++)
- {
- cout << msgvec[i] << endl;
- }
-
-}
-
-
+++ /dev/null
-#include<iostream>
-#include<string>
-#include<pthread.h>
-
-#include <cppunit/extensions/HelperMacros.h>
-
-
-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();
-
-};
-
-
-
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-## *********************************************************************
-## *
-## * 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
-
+++ /dev/null
-#! /bin/sh
-
-mkdir -p src/autogen
-set -x
-aclocal -I project
-libtoolize --force
-autoheader
-automake --foreign --add-missing --copy
-autoconf
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite WMS jobid module
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/21 17:53:36 eronchie
- Moved out org.glite.wms.jobid from org.glite.wms and put in org.glite.wms-utils
-
-
--->
-
-<project name="jobid" default="dist">
-
- <!-- =========================================
- Builds the GLite WMS Utils Jobid Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#
-# 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 <alberto.di.meglio@cern.ch>
-# 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
-
+++ /dev/null
-## *********************************************************************
-## *
-## * 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 *~
-
+++ /dev/null
-/* test code for jobid routines */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#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;
-}
+++ /dev/null
-## *********************************************************************
-## *
-## * 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
+++ /dev/null
-#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 <string>
-#include <iosfwd>
-
-#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:
- * <LB address>:<LB port>/<Unique String>
- *
- * @ingroup common
- * @version 0.1
- * @date 15 April 2002
- * @author Alessandro Maraschini <alessandro.maraschini@datamat.it> */
-
-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
+++ /dev/null
-#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 <alessandro.maraschini@datamat.it>
-*/
-
-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:
-* <LB address>:<LB port>/ <Unique string> */
-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<field name> 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(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
-
+++ /dev/null
-#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 */
+++ /dev/null
-#ifndef GLITE_WMSUTILS_JOBID_MANIPULATION_H
-#define GLITE_WMSUTILS_JOBID_MANIPULATION_H
-
-#include <string>
-
-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:
+++ /dev/null
-#Sat Oct 15 02:12:40 CEST 2005
-module.build=152
+++ /dev/null
-build.package.summary="files for gLite wms utils jobid"
-build.package.description="jobid api"
+++ /dev/null
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="configure options">
- <property name="configure.args"
- value="--prefix=${workspace.abs.dir}/stage --with-globus-prefix=${with.globus.prefix} --with-globus-thr-flavor=${with.globus.thr.flavor} --with-globus-nothr-flavor=${with.globus.nothr.flavor} --with-cppunit-prefix=${with.cppunit.prefix} --with-glite-location=${with.glite.location} --with-dist-location=${with.dist.location} --disable-optimization"/>
-
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Glite WMS Common component
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.8 2004/08/04 07:42:42 eronchie
- Added cppunit.m4
-
- Revision 1.7 2004/08/04 07:38:27 eronchie
- Added cppunit
-
- Revision 1.6 2004/07/28 07:27:22 eronchie
- Added /
-
- Revision 1.5 2004/07/28 07:21:58 eronchie
- Added m4files.list property
-
- Revision 1.4 2004/07/23 14:47:01 eronchie
- Removed....
-
- Revision 1.3 2004/07/21 18:22:38 eronchie
- Changed wms in wms-utils
-
- Revision 1.2 2004/07/16 14:56:56 flammer
- Corrected input path of build.properties.
-
- Revision 1.1.1.1 2004/05/26 18:45:05 eronchie
- Import of wms jobid
-
-
--->
-
-<project name="WMS Utils jobid component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${wms-utils.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${wms-utils.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="jobid" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <property name="m4files.list" value="globus.m4 glite.m4 cppunit.m4 optimize.m4"/>
-
-</project>
+++ /dev/null
-module.version=3.1.1
-module.age=1
+++ /dev/null
-## *********************************************************************
-## *
-## * 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
+++ /dev/null
-/* **************************************************************************
- * filename : JobId.cpp
- * author : Alessandro Maraschini <alessandro.maraschini@datamat.it>
- * copyright : (C) 2002 by DATAMAT
- ***************************************************************************/
-
-#include "glite/wmsutils/jobid/JobId.h"
-
-#include <iostream>
-
-#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
+++ /dev/null
-/* **************************************************************************
-* filename : JobIdExecptions.cpp
-* author : Alessandro Maraschini <alessandro.maraschini@datamat.it>
-* 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
-
+++ /dev/null
-## *********************************************************************
-## *
-## * 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
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#include <netdb.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-#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;
-}
+++ /dev/null
-#include <cctype>
-
-#include <string>
-#include <algorithm>
-
-#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
+++ /dev/null
-#ident "$Header$"
-
-#include <openssl/md5.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#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);
-}
+++ /dev/null
-#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 */
+++ /dev/null
-## *********************************************************************
-## *
-## * 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 *~
-
+++ /dev/null
-#include <iostream>
-#include <fstream>
-
-#include "jobid_cu_suite.h"
-
-#include <cppunit/TestResult.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResultCollector.h>
-#include <cppunit/TextOutputter.h>
-#include <cppunit/XmlOutputter.h>
-
-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 ;
-}
+++ /dev/null
-#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 <<endl;
- cout << "!!! END TEST toString() METHOD!!!"<< endl;
-
- JobId wrongelement;
- CPPUNIT_ASSERT_THROW(string server=wrongelement.getServer(), EmptyIdException);
- CPPUNIT_ASSERT_THROW(string server=wrongelement.getUnique(), EmptyIdException);
-
-}
+++ /dev/null
-#include<iostream>
-#include<string>
-#include<pthread.h>
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#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();
-
-};
-
-
-
+++ /dev/null
-#include <iostream>
-#include <fstream>
-
-#include "manipulation_cu_suite.h"
-
-#include <cppunit/TestResult.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResultCollector.h>
-#include <cppunit/TextOutputter.h>
-#include <cppunit/XmlOutputter.h>
-
-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 ;
-}
+++ /dev/null
-#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);
-}
-
+++ /dev/null
-#include<iostream>
-#include<string>
-#include<pthread.h>
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#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();
-
-};
-
-
-
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-prefix=/opt/glite
-package=glite-yaim-lb
-name=$Name$
-tag:=$(shell echo $(name) | sed 's/^[^:]*: //' )
-version:=$(shell echo "$(tag)" | sed 's/^.*R_//' | sed 's/_/\./g')
-release:=$(shell echo "$(version)" | sed 's/.*\.//')
-version:=$(shell echo "$(version)" | sed 's/\(.*\)\.[0-9]*/\1/')
-
-.PHONY: configure install clean rpm
-
-all: configure
-
-install:
- @echo installing ...
- @mkdir -p $(prefix)/yaim/functions/
- @mkdir -p $(prefix)/yaim/functions/local
- @mkdir -p $(prefix)/yaim/node-info.d
- @mkdir -p $(prefix)/yaim/defaults
- @install -m 0644 config/functions/config* $(prefix)/yaim/functions
- @install -m 0644 config/node-info.d/glite* $(prefix)/yaim/node-info.d
- @install -m 0644 config/defaults/glite* $(prefix)/yaim/defaults
-
-clean::
- rm -f *~ test/*~ etc/*~ doc/*~ src/*~
- rm -rf rpmbuild
-
-rpm:
- @mkdir -p RPMS
- @mkdir -p rpmbuild/RPMS/noarch
- @mkdir -p rpmbuild/SRPMS/
- @mkdir -p rpmbuild/SPECS/
- @mkdir -p rpmbuild/SOURCES/
- @mkdir -p rpmbuild/BUILD/
- echo "|$(tag)|"
-ifneq ("$(tag)","ame:")
- @sed -i 's/^Version:.*/Version: $(version)/' $(package).spec
- @sed -i 's/^Release:.*/Release: $(release)/' $(package).spec
-endif
- @tar --gzip --exclude='*CVS*' -cf rpmbuild/SOURCES/${package}.src.tgz *
- rpmbuild -ba ${package}.spec
-
-
-
-
+++ /dev/null
-### Default values to some glite-LB variables
-GLITE_USER=glite
-GLITE_WMS_LCGMON_FILE="/var/glite/logging/status.log"
+++ /dev/null
-### Default values to some glite-LB variables
-GLITE_USER=glite
-GLITE_WMS_LCGMON_FILE="/var/glite/logging/status.log"
+++ /dev/null
-function config_gip_lb_check () {
-
- requires $1 SITE_NAME
- retcode=$?
- return ${retcode}
-
-}
-
-function config_gip_lb () {
-
- SERVICE_HOST=`hostname -f`
-
- SERVICE_TYPE=org.glite.lb.Server
- SERVICE_PORT=9003
- SERVICE_VERSION=1.9.1
- SERVICE_ENDPOINT="https://${SERVICE_HOST}:${SERVICE_PORT}/lb"
-
- conffile=$INSTALL_ROOT/glite/var/tmp/gip/service-${SERVICE_TYPE}.conf
- cat << EOF > $conffile
-dn: GlueServiceUniqueID=${SERVICE_ENDPOINT}
-GlueServiceName: ${SITE_NAME}-${SERVICE_TYPE}
-GlueServiceType: ${SERVICE_TYPE}
-GlueServiceVersion: ${SERVICE_VERSION}
-GlueServiceEndpoint: ${SERVICE_ENDPOINT}
-GlueServiceURI: unset
-GlueServiceAccessPointURL: ${SERVICE_ENDPOINT}
-GlueServiceStatus: OK
-GlueServiceStatusInfo: No Problems
-GlueServiceWSDL: unset
-GlueServiceSemantics: unset
-GlueServiceStartTime: 1970-01-01T00:00:00Z
-GlueForeignKey: GlueSiteUniqueID=${SITE_NAME}
-EOF
-
- for VO in $VOS; do
- echo "GlueServiceAccessControlRule: $VO" >> $conffile
- echo "GlueServiceOwner: $VO" >> $conffile
- done
-
- $INSTALL_ROOT/glite/sbin/glite-info-static-create -c $conffile -t \
- $INSTALL_ROOT/glite/etc/GlueService.template > \
- $INSTALL_ROOT/glite/etc/gip/ldif/service-${SERVICE_TYPE}.ldif
-
-}
+++ /dev/null
-function config_gip_lb_30_check () {
-
- requires $1 SITE_NAME
- retcode=$?
- return ${retcode}
-
-}
-
-function config_gip_lb_30 () {
-
- SERVICE_HOST=`hostname -f`
-
- SERVICE_TYPE=org.glite.lb.Server
- SERVICE_PORT=9003
- SERVICE_VERSION=1.6.2
- SERVICE_ENDPOINT="https://${SERVICE_HOST}:${SERVICE_PORT}/lb"
-
- conffile=$INSTALL_ROOT/glite/var/tmp/gip/service-${SERVICE_TYPE}.conf
- cat << EOF > $conffile
-dn: GlueServiceUniqueID=${SERVICE_ENDPOINT}
-GlueServiceName: ${SITE_NAME}-${SERVICE_TYPE}
-GlueServiceType: ${SERVICE_TYPE}
-GlueServiceVersion: ${SERVICE_VERSION}
-GlueServiceEndpoint: ${SERVICE_ENDPOINT}
-GlueServiceURI: unset
-GlueServiceAccessPointURL: ${SERVICE_ENDPOINT}
-GlueServiceStatus: OK
-GlueServiceStatusInfo: No Problems
-GlueServiceWSDL: unset
-GlueServiceSemantics: unset
-GlueServiceStartTime: 1970-01-01T00:00:00Z
-GlueForeignKey: GlueSiteUniqueID=${SITE_NAME}
-EOF
-
- for VO in $VOS; do
- echo "GlueServiceAccessControlRule: $VO" >> $conffile
- echo "GlueServiceOwner: $VO" >> $conffile
- done
-
- $INSTALL_ROOT/lcg/sbin/lcg-info-static-create -c $conffile -t \
- $INSTALL_ROOT/lcg/etc/GlueService.template > \
- $INSTALL_ROOT/glite/etc/gip/ldif/service-${SERVICE_TYPE}.ldif
-
-}
+++ /dev/null
-function config_glite_lb_check(){
- requires MYSQL_PASSWORD
-}
-
-function config_glite_lb_setenv(){
-
- yaimgridenv_set GLITE_LOCATION ${INSTALL_ROOT:-opt}/glite
- yaimgridenv_set GLITE_LOCATION_VAR ${GLITE_LOCATION_VAR:-/var/glite}
- yaimgridenv_set GLITE_USER ${GLITE_USER:-glite}
- yaimgridenv_set GLITE_WMS_QUERY_TIMEOUT 300
- yaimgridenv_set GLITE_HOST_CERT ${GLITE_USER_HOME:-/home/glite}/.certs/hostcert.pem
- yaimgridenv_set GLITE_HOST_KEY ${GLITE_USER_HOME:-/home/glite}/.certs/hostkey.pem
- yaimgridenv_set X509_CERT_DIR /etc/grid-security/certificates
- yaimgridenv_set X509_VOMS_DIR /etc/grid-security/vomsdir
-
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/glite/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/globus/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/c-ares/lib
-}
-
-function config_glite_lb() {
-
- #############################################
- # Logging and Bookkeeping configuration #
- #############################################
-
- HOSTNAME=`hostname -f`
-
- chmod og+rx /var/lib/mysql/
- chown mysql:mysql /var/run/mysqld/
-
- # add option --max_allowed_packet=17M
- if [ ! -f /etc/my.cnf ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- else
- grep "^[mysqld]" /etc/my.cnf > /dev/null
- if [ ! $? = 0 ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- fi
- fi
-
- /sbin/chkconfig mysqld on
- ps ax | grep -v grep |grep mysqld_safe > /dev/null 2>&1
- if [ ! $? = 0 ] ; then
- /etc/init.d/mysqld start
- sleep 1
- fi
-
- ls /tmp/mysql.sock > /dev/null 2>&1
- if [ ! $? = 0 ]; then
- ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
- fi
-
- # set mysql password
- set_mysql_passwd || return 1 # the function uses $MYSQL_PASSWORD
-
- # Check if database exist
- mysqlshow --password="$MYSQL_PASSWORD" | grep "lbserver20" > /dev/null 2>&1
-
- if [ ! $? = 0 ]; then
- mysql -u root --password="$MYSQL_PASSWORD" -e "CREATE DATABASE lbserver20"
- mysql --password="$MYSQL_PASSWORD" lbserver20 < ${INSTALL_ROOT}/glite/etc/glite-lb-dbsetup.sql
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on lbserver20.* to lbserver IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on lbserver20.* to lbserver@'$HOSTNAME' IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on lbserver20.* to lbserver@localhost IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE short_fields MAX_ROWS=1000000000;" lbserver20
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE long_fields MAX_ROWS=55000000;" lbserver20
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE states MAX_ROWS=9500000;" lbserver20
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE events MAX_ROWS=175000000;" lbserver20
- else
- yaimlog "Database lbserver20 already exists"
- fi
-
- # do we need bkindex?
-
- GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
- mkdir -p $GLITE_LOCATION_VAR # Needed to store PID of LB server
-
- chown $GLITE_USER:$GLITE_USER $GLITE_LOCATION_VAR
- chmod 0755 $GLITE_LOCATION_VAR
-
- mkdir -p $GLITE_USER_HOME/.certs
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs
- chmod 0755 $GLITE_USER_HOME/.certs
- cp -f /etc/grid-security/hostcert.pem /etc/grid-security/hostkey.pem $GLITE_USER_HOME/.certs/
- if [ ! $? = 0 ] ; then
- echo "Please copy host certificate and key into /etc/grid-security and"
- echo " $GLITE_USER_HOME/.certs/, change the owner of the ones in"
- echo " $GLITE_USER_HOME/.certs/ to $GLITE_USER"
- fi
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs/hostcert.pem $GLITE_USER_HOME/.certs/hostkey.pem
- chmod 0644 $GLITE_USER_HOME/.certs/hostcert.pem
- chmod 0400 $GLITE_USER_HOME/.certs/hostkey.pem
-
- # Create cron for purging
- mkdir -p /var/log/glite
- logfile=/var/log/glite/glite-lb-purger.log
- cat << EOF > /etc/cron.d/glite-lb-purge.cron
-HOME=/
-MAILTO=$SITE_EMAIL
-
-1 1 * * * $GLITE_USER . /opt/glite/etc/profile.d/grid-env.sh ; export GLITE_LB_EXPORT_BKSERVER=$HOSTNAME; export GLITE_LB_EXPORT_ENABLED=false; export GLITE_LB_EXPORT_PURGE_ARGS="--cleared 2d --aborted 15d --cancelled 15d --other 60d"; /opt/glite/sbin/glite-lb-export.sh >> $logfile 2>&1
-EOF
-
- touch $logfile
- chown $GLITE_USER:$GLITE_USER $logfile
-
- cat > /etc/logrotate.d/lb-purger <<EOF
-$logfile {
- weekly
- compress
- rotate 4
- missingok
-}
-EOF
-
-
- # Start services
- if [ ! -f ${GLITE_LOCATION}/etc/gLiteservices ] ; then
- touch ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- grep glite-lb-bkserverd ${GLITE_LOCATION}/etc/gLiteservices > /dev/null
- if [ ! $? = 0 ] ; then
- echo "${GLITE_LOCATION}/etc/init.d/glite-lb-bkserverd" >> ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- touch ${GLITE_LOCATION}/etc/LB-super-users
-
- . /opt/glite/etc/profile.d/grid-env.sh
- ${GLITE_LOCATION}/etc/init.d/glite-lb-bkserverd stop
- #Temporary workaround to kill glite-lb-notif-interlogd
- ps ax | grep -v grep | grep glite-lb-notif-interlogd > /dev/null
- if [ $? = 0 ]; then
- killall -9 /opt/glite/bin/glite-lb-notif-interlogd
- fi
- ${GLITE_LOCATION}/etc/init.d/glite-lb-bkserverd start
-
- if [ ! $? = 0 ] ; then
- yaimlog ABORT "Service glite-lb-bkserverd failed to start!"
- return 1
- fi
-
- return 0
-
-}
+++ /dev/null
-function config_glite_lb_30_check(){
- requires MYSQL_PASSWORD
-}
-
-function config_glite_lb_30_setenv(){
-
- yaimgridenv_set GLITE_LOCATION ${INSTALL_ROOT:-opt}/glite
- yaimgridenv_set GLITE_LOCATION_VAR /var/glite
- yaimgridenv_set GLITE_USER ${GLITE_USER:-glite}
- yaimgridenv_set GLITE_WMS_QUERY_TIMEOUT 300
- yaimgridenv_set GLITE_HOST_CERT ${GLITE_USER_HOME:-/home/glite}/.certs/hostcert.pem
- yaimgridenv_set GLITE_HOST_KEY ${GLITE_USER_HOME:-/home/glite}/.certs/hostkey.pem
- yaimgridenv_set X509_CERT_DIR /etc/grid-security/certificates
- yaimgridenv_set X509_VOMS_DIR /etc/grid-security/vomsdir
-
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/glite/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/globus/lib
- yaimgridpath_append LD_LIBRARY_PATH ${INSTALL_ROOT:-opt}/c-ares/lib
-}
-
-function config_glite_lb_30() {
-
- #############################################
- # Logging and Bookkeeping configuration #
- #############################################
-
- HOSTNAME=`hostname -f`
-
- chmod og+rx /var/lib/mysql/
-
- # add option --max_allowed_packet=17M
- if [ ! -f /etc/my.cnf ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- else
- grep "^[mysqld]" /etc/my.cnf > /dev/null
- if [ ! $? = 0 ]; then
- echo "[mysqld]" >> /etc/my.cnf
- echo "max_allowed_packet=17M" >> /etc/my.cnf
- fi
- fi
-
- /sbin/chkconfig mysql on
- ps ax | grep -v grep |grep mysqld_safe > /dev/null 2>&1
- if [ ! $? = 0 ] ; then
- /etc/init.d/mysql start
- sleep 1
- fi
-
- ls /tmp/mysql.sock > /dev/null 2>&1
- if [ ! $? = 0 ]; then
- ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
- fi
-
- # set mysql password
- set_mysql_passwd || return 1 # the function uses $MYSQL_PASSWORD
-
- # Check if database exist
- mysqlshow --password="$MYSQL_PASSWORD" | grep "lbserver20" > /dev/null 2>&1
-
- if [ ! $? = 0 ]; then
- mysql -u root --password="$MYSQL_PASSWORD" -e "CREATE DATABASE lbserver20"
- mysql --password="$MYSQL_PASSWORD" lbserver20 < ${INSTALL_ROOT}/glite/etc/glite-lb-dbsetup.sql
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on lbserver20.* to lbserver IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on lbserver20.* to lbserver@'$HOSTNAME' IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "GRANT ALL PRIVILEGES on lbserver20.* to lbserver@localhost IDENTIFIED BY '' WITH GRANT OPTION;"
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE short_fields MAX_ROWS=1000000000;" lbserver20
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE long_fields MAX_ROWS=55000000;" lbserver20
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE states MAX_ROWS=9500000;" lbserver20
- mysql -u root --password="$MYSQL_PASSWORD" -e "ALTER TABLE events MAX_ROWS=175000000;" lbserver20
- else
- yaimlog "Database lbserver20 already exists"
- fi
-
- # do we need bkindex?
-
- GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
- mkdir -p $GLITE_LOCATION_VAR # Needed to store PID of LB server
-
- chown $GLITE_USER:$GLITE_USER $GLITE_LOCATION_VAR
- chmod 0755 $GLITE_LOCATION_VAR
-
- mkdir -p $GLITE_USER_HOME/.certs
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs
- chmod 0755 $GLITE_USER_HOME/.certs
- cp -f /etc/grid-security/hostcert.pem /etc/grid-security/hostkey.pem $GLITE_USER_HOME/.certs/
- if [ ! $? = 0 ] ; then
- echo "Please copy host certificate and key into /etc/grid-security and"
- echo " $GLITE_USER_HOME/.certs/, change the owner of the ones in"
- echo " $GLITE_USER_HOME/.certs/ to $GLITE_USER"
- fi
- chown $GLITE_USER:$GLITE_USER $GLITE_USER_HOME/.certs/hostcert.pem $GLITE_USER_HOME/.certs/hostkey.pem
- chmod 0644 $GLITE_USER_HOME/.certs/hostcert.pem
- chmod 0400 $GLITE_USER_HOME/.certs/hostkey.pem
-
- # Create cron for purging
- mkdir -p /var/log/glite
- logfile=/var/log/glite/glite-lb-purger.log
- cat << EOF > /etc/cron.d/glite-lb-purge.cron
-HOME=/
-MAILTO=$SITE_EMAIL
-
-1 1 * * * $GLITE_USER . /opt/glite/etc/profile.d/grid-env.sh ; export GLITE_LB_EXPORT_BKSERVER=$HOSTNAME; export GLITE_LB_EXPORT_ENABLED=false; export GLITE_LB_EXPORT_PURGE_ARGS="--cleared 2d --aborted 15d --cancelled 15d --other 60d"; /opt/glite/sbin/glite-lb-export.sh >> $logfile 2>&1
-EOF
-
- touch $logfile
- chown $GLITE_USER:$GLITE_USER $logfile
-
- cat > /etc/logrotate.d/lb-purger <<EOF
-$logfile {
- weekly
- compress
- rotate 4
- missingok
-}
-EOF
-
-
- # Start services
- if [ ! -f ${GLITE_LOCATION}/etc/gLiteservices ] ; then
- touch ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- grep glite-lb-bkserverd ${GLITE_LOCATION}/etc/gLiteservices > /dev/null
- if [ ! $? = 0 ] ; then
- echo "${GLITE_LOCATION}/etc/init.d/glite-lb-bkserverd" >> ${GLITE_LOCATION}/etc/gLiteservices
- fi
-
- touch ${GLITE_LOCATION}/etc/LB-super-users
-
- . /opt/glite/etc/profile.d/grid-env.sh
- ${GLITE_LOCATION}/etc/init.d/glite-lb-bkserverd restart
-
- if [ ! $? = 0 ] ; then
- yaimlog ABORT "Service glite-lb-bkserverd failed to start!"
- return 1
- fi
-
- return 0
-
-}
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : config_info_service_lb
-#
-# DESCRIPTION : This function configures the dynamic service publisher
-# for site LB server node.
-#
-# AUTHORS : Maria.Alandes.Pradillo@cern.ch
-# salvet@ics.muni.cz
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-lb
-#
-##############################################################################
-
-config_info_service_lb_check () {
- requires $1 SITE_NAME INSTALL_ROOT
-}
-
-config_info_service_lb_setenv () {
- yaimlog DEBUG "This function currently doesn't set any environment variables."
-}
-
-config_info_service_lb () {
-
-INFO_SERVICE_CONFIG=${INFO_SERVICE_CONFIG:-${INSTALL_ROOT}/glite/etc}
-INFO_SERVICE_SCRIPT=${INFO_SERVICE_SCRIPT:-${INSTALL_ROOT}/glite/libexec}
-INFO_PROVIDER_PATH=${INFO_PROVIDER_PATH:-${INSTALL_ROOT}/glite/etc/gip/provider}
-
-SERVICE=LBSERVER
-SERVICE_LC=lbserver
-
-SERVICE_HOST=`hostname -f`
-
-if [ ! -f ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf.template ]; then
- yaimlog ERROR "The template file for glite-info-service-${SERVICE_LC}.conf.template was not found in ${INFO_SERVICE_CONFIG}."
- exit 1
-fi
-
-if [ ! -f ${INFO_SERVICE_SCRIPT}/glite-info-service ]; then
- yaimlog ERROR "The script file for glite-info-service was not found in ${INFO_SERVICE_SCRIPT}."
- exit 1
-fi
-
-yaimlog DEBUG "Delete a previous version of the glite-info-service-${SERVICE_LC}.conf if it exists"
-rm -rf ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf
-
-yaimlog DEBUG "Create the glite-info-service-${SERVICE_LC}.conf file out of the template file"
-cp ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf.template ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf
-
-# Note: the configuration file may need to be altered if non standard values have been used.
-
-yaimlog DEBUG "Delete a previous version of the glite-info-provider-service-${SERVICE_LC}-wrapper if it exists"
-rm -rf ${INFO_PROVIDER_PATH}/glite-info-provider-service-${SERVICE_LC}-wrapper
-
-yaimlog DEBUG "Create the ${INFO_PROVIDER_PATH} in case it doesn't exist"
-mkdir -p ${INFO_PROVIDER_PATH}
-
-yaimlog DEBUG "Create the glite-info-provider-service-${SERVICE_LC}-wrapper file"
-cat << EOF > ${INFO_PROVIDER_PATH}/glite-info-provider-service-${SERVICE_LC}-wrapper
-#!/bin/sh
-export PATH=$PATH:${INFO_SERVICE_SCRIPT}
-export ${SERVICE}_HOST=${SERVICE_HOST}
-${INFO_SERVICE_SCRIPT}/glite-info-service ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf $SITE_NAME
-EOF
-
-chmod +x ${INFO_PROVIDER_PATH}/glite-info-provider-service-${SERVICE_LC}-wrapper
-
-
-return 0
-
-}
-
-
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : config_jobmon
-#
-# DESCRIPTION : This function configures the globus clients.
-#
-# AUTHORS : Di.Qing@cern.ch
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-lb
-#
-##############################################################################
-
-function config_jobmon_check(){
-
- requires $1 GLITE_WMS_LCGMON_FILE GLITE_USER
- retcode=$?
- return ${retcode}
-
-}
-
-function config_jobmon_setenv(){
-
- yaimgridenv_set GLITE_LB_BKSERVERD_ADDOPTS "--rgmaexport"
- yaimgridenv_set GLITE_WMS_LCGMON_FILE "${GLITE_WMS_LCGMON_FILE}"
-
-}
-
-
-function config_jobmon(){
-
- mkdir -p `dirname ${GLITE_WMS_LCGMON_FILE}`
- chown $GLITE_USER:root `dirname ${GLITE_WMS_LCGMON_FILE}`
-
- if [ ! -d /opt/lcg/etc ]; then
- mkdir -p /opt/lcg/etc
- fi
-
- cat > /opt/lcg/etc/lcg-mon-job-status.conf <<EOF
-RGMA_HOME = /opt/glite
-LOG_FILE = $GLITE_WMS_LCGMON_FILE
-PARSER = jobstatus
-TABLE = JobStatusRaw
-
-# Possible values: CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET
-log_level = ERROR
-
-# Possible values: 0, 1
-debug = 0
-EOF
-
- cat > /etc/logrotate.d/glite-lb-bkserver-rgma << EOF
-# Logrotation for bkserver R-GMA status file.
-$GLITE_WMS_LCGMON_FILE {
-daily
-rotate 9
-missingok
-}
-EOF
-
- if [ -f /opt/lcg/etc/init.d/lcg-mon-logfile-daemon ]; then
- ln -sf /opt/lcg/etc/init.d/lcg-mon-logfile-daemon /etc/rc.d/init.d/lcg-mon-job-status
- /sbin/chkconfig lcg-mon-job-status on
- /etc/rc.d/init.d/lcg-mon-job-status restart
- fi
-
- return 0;
-}
-
+++ /dev/null
-LB_FUNCTIONS="
-config_add_pool_env
-config_crl
-config_host_certs
-config_edgusers
-config_rgma_client
-config_gip_only
-config_gip_lb
-config_globus_clients
-config_jobmon
-config_glite_lb
-config_glite_locallogger
-config_bdii_only
-config_glite_initd"
+++ /dev/null
-LB_FUNCTIONS="
-config_add_pool_env
-config_crl
-config_host_certs
-config_edgusers
-config_java_30
-config_rgma_client
-config_gip_only
-config_gip_lb_30
-config_globus_clients
-config_jobmon
-config_glite_lb_30
-config_glite_locallogger
-config_bdii
-config_glite_initd"
+++ /dev/null
-%define topdir %(pwd)/rpmbuild
-%define _topdir %{topdir}
-Summary: glite-yaim-lb
-Name: glite-yaim-lb
-Version: 4.0.1
-Vendor: EGEE
-Release: 3
-License: EGEE
-Group: EGEE
-Source: %{name}.src.tgz
-BuildArch: noarch
-Requires: glite-yaim-core
-Prefix: /opt/glite
-BuildRoot: %{_tmppath}/%{name}-%{version}-build
-Packager: EGEE
-
-%description
-This package contains the yaim functions to configuration of the LB node.
-
-%prep
-
-%setup -c
-
-%build
-make install prefix=%{buildroot}%{prefix}
-
-%files
-%defattr(0644,root,root)
-%{prefix}/yaim/functions/config_*
-%{prefix}/yaim/node-info.d/glite-*
-%{prefix}/yaim/defaults/glite-*
-%doc LICENSE
-
-%clean
-rm -rf %{buildroot}
-
-
-
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-prefix=/opt/glite
-package=glite-yaim-myproxy
-name=$Name$
-tag:=$(shell echo $(name) | sed 's/^[^:]*: //' )
-version:=$(shell echo "$(tag)" | sed 's/^.*R_//' | sed 's/_/\./g')
-release:=$(shell echo "$(version)" | sed 's/.*\.//')
-version:=$(shell echo "$(version)" | sed 's/\(.*\)\.[0-9]*/\1/')
-
-.PHONY: configure install clean rpm
-
-all: configure
-
-install:
- @echo installing ...
- @mkdir -p $(prefix)/yaim/functions
- @mkdir -p $(prefix)/yaim/node-info.d
- @mkdir -p $(prefix)/yaim/examples
- @mkdir -p $(prefix)/yaim/examples/siteinfo
- @mkdir -p $(prefix)/yaim/examples/siteinfo/services
- @mkdir -p ${RPM_BUILD_ROOT}/usr/share/man/man1
-
-
- @install -m 0644 config/functions/config* $(prefix)/yaim/functions
- @install -m 0644 config/node-info.d/glite* $(prefix)/yaim/node-info.d
- @install -m 0644 config/services/glite* $(prefix)/yaim/examples/siteinfo/services/.
- @install -m 0644 config/man/yaim-myproxy.1 ${RPM_BUILD_ROOT}/usr/share/man/man1/
-
-
-clean::
- rm -f *~ test/*~ etc/*~ doc/*~ src/*~
- rm -rf rpmbuild
-
-rpm:
- @mkdir -p rpmbuild/RPMS/noarch
- @mkdir -p rpmbuild/SRPMS/
- @mkdir -p rpmbuild/SPECS/
- @mkdir -p rpmbuild/SOURCES/
- @mkdir -p rpmbuild/BUILD/
-
-ifneq ("$(tag)","ame:")
- @sed -i 's/^Version:.*/Version: $(version)/' $(package).spec
- @sed -i 's/^Release:.*/Release: $(release)/' $(package).spec
-endif
- @tar --gzip --exclude='*CVS*' -cf rpmbuild/SOURCES/${package}.src.tgz *
- @rpmbuild -ba ${package}.spec
-
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : config_gip_px
-#
-# DESCRIPTION : This function configures the generic information providor (GIP)
-# for MyProxy (PX) node.
-#
-# AUTHORS : Shu-Ting.Liao@cern.ch
-#
-# NOTES : The config_gip_<node_type> function creates the ldif file.
-# This is currently done by the function config_info_service_<node_type>.
-# This function is still included in the function list for cleaning tasks.
-#
-#
-# YAIM MODULE: glite-yaim-myproxy
-#
-##############################################################################
-config_gip_px_check () {
- yaimlog DEBUG "This function currently doesn't set any environment variables."
-}
-
-config_gip_px_setenv () {
- yaimlog DEBUG "This function currently doesn't set any environment variables."
-}
-
-config_gip_px () {
-
-CONF_DIR="$INSTALL_ROOT/glite/var/tmp/gip"
-LDIF_DIR="${INSTALL_ROOT}/glite/etc/gip/ldif"
-
-rm -rf ${CONF_DIR}/glite-info-static-px.conf
-rm -rf ${LDIF_DIR}/static-file-PX.ldif
-
-return 0
-
-}
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : config_info_service_px
-#
-# DESCRIPTION : This function configures the dynamic service publisher
-# for MyProxy (PX) node.
-#
-# AUTHORS : Maria.Alandes.Pradillo@cern.ch
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-myproxy
-#
-##############################################################################
-
-config_info_service_px_check () {
- requires $1 SITE_NAME INSTALL_ROOT
-}
-
-config_info_service_px_setenv () {
- yaimlog DEBUG "This function currently doesn't set any environment variables."
-}
-
-config_info_service_px () {
-
-INFO_SERVICE_CONFIG=${INFO_SERVICE_CONFIG:-${INSTALL_ROOT}/glite/etc}
-INFO_SERVICE_SCRIPT=${INFO_SERVICE_SCRIPT:-${INSTALL_ROOT}/glite/libexec}
-INFO_PROVIDER_PATH=${INFO_PROVIDER_PATH:-${INSTALL_ROOT}/glite/etc/gip/provider}
-
-SERVICE=MYPROXY
-SERVICE_HOST=${PX_HOST}
-
-SERVICE_LC=`echo ${SERVICE} | tr '[:upper:]' '[:lower:]'`
-
-if [ ! -f ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf.template ]; then
- yaimlog ERROR "The template file for glite-info-service-${SERVICE_LC}.conf.template was not found in ${INFO_SERVICE_CONFIG}."
- exit 1
-fi
-
-if [ ! -f ${INFO_SERVICE_SCRIPT}/glite-info-service ]; then
- yaimlog ERROR "The script file for glite-info-service was not found in ${INFO_SERVICE_SCRIPT}."
- exit 1
-fi
-
-yaimlog DEBUG "Delete a previous version of the glite-info-service-${SERVICE_LC}.conf if it exists"
-rm -rf ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf
-
-yaimlog DEBUG "Create the glite-info-service-${SERVICE_LC}.conf file out of the template file"
-cp ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf.template ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf
-
-# Note: the configuration file may need to be altered if non standard values have been used.
-
-yaimlog DEBUG "Delete a previous version of the glite-info-provider-service-${SERVICE_LC}-wrapper if it exists"
-rm -rf ${INFO_PROVIDER_PATH}/glite-info-provider-service-${SERVICE_LC}-wrapper
-
-yaimlog DEBUG "Create the ${INFO_PROVIDER_PATH} in case it doesn't exist"
-mkdir -p ${INFO_PROVIDER_PATH}
-
-yaimlog DEBUG "Create the glite-info-provider-service-${SERVICE_LC}-wrapper file"
-cat << EOF > ${INFO_PROVIDER_PATH}/glite-info-provider-service-${SERVICE_LC}-wrapper
-#!/bin/sh
-export PATH=$PATH:${INFO_SERVICE_SCRIPT}
-export ${SERVICE}_HOST=${SERVICE_HOST}
-${INFO_SERVICE_SCRIPT}/glite-info-service ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf $SITE_NAME
-EOF
-
-chmod +x ${INFO_PROVIDER_PATH}/glite-info-provider-service-${SERVICE_LC}-wrapper
-
-
-return 0
-
-}
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : config_proxy_server
-#
-# DESCRIPTION : This function configures the 3.0 proxy server.
-#
-# AUTHORS : Robert.Harakaly@cern.ch
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-myproxy
-#
-##############################################################################
-
-config_proxy_server_check () {
-
-requires $1 GRID_TRUSTED_BROKERS
-return $?
-
-}
-
-config_proxy_server_setenv () {
-
-return 0
-
-}
-
-config_proxy_server () {
-
-INSTALL_ROOT=${INSTALL_ROOT:-/opt}
-
-
-if [ -f ${INSTALL_ROOT}/edg/etc/edg-myproxy.conf ]; then
- rm -f ${INSTALL_ROOT}/edg/etc/edg-myproxy.conf
-fi
-
-split_quoted_variable $GRID_TRUSTED_BROKERS | while read x; do
- echo "$x" >> ${INSTALL_ROOT}/edg/etc/edg-myproxy.conf
-done
-
-/sbin/chkconfig --add myproxy
-
-yaimlog DEBUG "Stopping MyProxy server"
-/etc/init.d/myproxy stop < /dev/null
-yaimlog DEBUG "Waiting 3 second for a complete stop"
-sleep 3
-yaimlog DEBUG "Starting MyProxy server"
-/etc/init.d/myproxy start < /dev/null
-
-return 0
-}
+++ /dev/null
-.TH "YAIM - Yet Another Installation Manager" 1
-.SH NAME
-yaim \- YAIM (YAIM Aint an Installation Manager) is, as the name suggests, a way of configuring Grid Services.
-The aim of YAIM is to provide a simple installation and configuration method that can be used to set up a simple Grid Site
-but can be easily adapted and extended to meet the need of larger sites. The yaim-myproxy module is configuring the MyProxy server.
-
-.SH DESCRIPTION
-The yaim-myproxy module allows you to configure the MyProxy server.
-
-.SH CONFIGURATION VARIABLES
-This is the list of variables needed to set up in order to configure the MyProxy server.
-.TP
-For more details, please check:
-.TP
-.B https://twiki.cern.ch/twiki/bin/view/LCG/PX_configuration_variables
-.TP
-.B Mandatory Variables:
-Site admins must ensure these variables are properly defined according to the features of the site
-.TP
-site-info.def variables: These variables are defined in /opt/glite/yaim/examples/site-info.def.
-.TP
-INSTALL_ROOT : Installation root - change if using the re-locatable distribution.
-.TP
-SITE_NAME : The GIIS of the site where the MyProxy server belongs to.
-.TP
-GLOBUS_TCP_PORT_RANGE: Port range for Globus IO. It should be specified as "num1,num2". YAIM automatically handles the syntax of this variable depending on the version of VDT. If it's VDT 1.6 it leaves "num1,num2". If it's a version < VDT 1.6 it changes to "num1 num2".
-.TP
-.TP
-node specific variables: These variables are defined in /opt/glite/yaim/examples/services/glite-px.
-.TP
-GRID_TRUSTED_BROKERS : List of the DNs of the Resource Brokers host certificates which are trusted by the Proxy node. (ex: /O=Grid/O=CERN/OU=cern.ch/CN=host/testbed013.cern.ch).
-.TP
-
-.SH EXAMPLES
-How to configure the Myproxy node.
-.TP
-.B ./yaim -c -s /root/site-info.def -n glite-PX
-.TP
-To debug the configuration process:
-.TP
-.B ./yaim -c -s /root/site-info.def -n glite-PX -d 6
-
-.SH DOCUMENTATION
-You can find useful information on these web pages:
-.TP
-Entry point for YAIM documentation:
-.TP
-.B https://twiki.cern.ch/twiki/bin/view/EGEE/YAIM
-.TP
-The Generic Installation and Configuration guides as well as the YAIM guides:
-.TP
-.B https://twiki.cern.ch/twiki/bin/view/LCG/LcgDocs
-.TP
-Useful links:
-.TP
-.B http://lcg.web.cern.ch/LCG/Sites/the-LCG-directory.html
-
-.SH AUTHORS
-YAIM is a collaborative project where different modules are developed and maintened by different
-groups. Here are some of the present contributors:
-.TP
-.B Maria Allandes Pradillo, Gergely Debreczeni, Laurence Field, \
-Di Qing, Andreas Unterkircher, Oliver Keeble, Steve Traylen, Owen Synge, Gavin Mccance , Maarten Litmaath, \
-and we are happy to receive patches from everybody !
-
-.SH CONTACT
-To contact YAIM people use the
-.B yaim-contact@cern.ch
-email address.
-
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : glite-px
-#
-# DESCRIPTION : This function contains the function list that configures the 3.1 proxy server.
-#
-# AUTHORS : Shu-Ting.Liao@cern.ch
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-myproxy
-#
-##############################################################################
-
-PX_FUNCTIONS="
-config_crl
-config_host_certs
-config_edgusers
-config_gip_only
-config_gip_px
-config_gip_service_release
-config_globus_clients
-config_proxy_server
-config_bdii_only
-config_info_service_px
-"
-
-
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : glite-px
-#
-# DESCRIPTION : This function contains the function list that configures the 3.0 proxy server.
-#
-# AUTHORS : Robert.Harakaly@cern.ch
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-myproxy
-#
-##############################################################################
-
-BASE1_FUNCTIONS="
-config_ldconf
-config_sysconfig_edg
-config_sysconfig_globus
-config_sysconfig_lcg
-config_crl
-config_rfio"
-
-PX_FUNCTIONS="${BASE1_FUNCTIONS}
-config_host_certs
-config_edgusers
-config_java
-config_rgma_client
-config_gip
-config_globus
-config_proxy_server"
-
+++ /dev/null
-##############################################################################
-# Copyright (c) Members of the EGEE Collaboration. 2004.
-# See http://www.eu-egee.org/partners/ for details on the copyright
-# holders.
-#
-# 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.
-##############################################################################
-#
-# NAME : glite-px
-#
-# DESCRIPTION : This configuration file contains the list of variables needed
-# to configure Myproxy together with site-info.def.
-#
-# AUTHORS : yaim-contact@cern.ch
-#
-# NOTES :
-#
-# YAIM MODULE: glite-yaim-myproxy
-#
-##############################################################################
-
-# GRID_TRUSTED_BROKERS: DNs of services (RBs) allowed to renew/retrives
-# credentials from/at the myproxy server. Put single quotes around each trusted DN !!!
-
-GRID_TRUSTED_BROKERS="
-'broker one'
-'broker two'
-"
-
-
+++ /dev/null
-%define topdir %(pwd)/rpmbuild
-%define _topdir %{topdir}
-Summary: glite-yaim-myproxy module configures myproxy server.
-Name: glite-yaim-myproxy
-Version: x
-Vendor: EGEE
-Release: x
-License: EGEE
-Group: EGEE
-Source: %{name}.src.tgz
-BuildArch: noarch
-Prefix: /opt/glite
-Requires: glite-yaim-core
-BuildRoot: %{_tmppath}/%{name}-%{version}-build
-Packager: EGEE
-
-%description
-This package contains the yaim functions necessary to configure myproxy server.
-
-%prep
-
-%setup -c
-
-%build
-make install prefix=%{buildroot}%{prefix}
-
-%files
-%defattr(-,root,root)
-%{prefix}/yaim/functions/config_*
-%config(noreplace) %{prefix}/yaim/node-info.d/glite-*
-%{prefix}/yaim/examples/siteinfo/services/glite-*
-/usr/share/man/man1/yaim-myproxy.1
-%doc LICENSE
-
-
-%clean
-rm -rf %{buildroot}
-
-
-
+++ /dev/null
-.project
\ No newline at end of file
+++ /dev/null
-* Fri Feb 8 2008 Andrew McNab <Andrew.McNab@cern.ch>
-- ==== GridSite version 1.7.0 ====
-* Thu Nov 15 2007 Andrew McNab <Andrew.McNab@cern.ch>
-- Add libgridsite_nossl.[so|a] with no dependencies
- on OpenSSL (for gLite L&B.)
-* Thu Nov 15 2007 Andrew McNab <Andrew.McNab@cern.ch>
-- ==== GridSite version 1.5.7 ====
-* Fri Nov 9 2007 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Many changes, including switch to AURI internal
- format for credentials
-* Fri Nov 9 2007 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.5.5 ====
-* Wed Jun 13 2007 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Include ctx->param->flags fix in mod_gridsite for
- OpenSSL 0.9.8 from Bruno Harbulot.
-- Restrict export of VOMS attributes to ones present
- in the last proxy of the chain to contain attributes
-* Fri May 10 2007 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.5.1 ====
-* Fri Feb 16 2007 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.5.0 ====
-* Fri Feb 16 2007 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.4.0 ====
-* Thu Feb 15 2007 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Final preparations for 1.4.x
-* Fri Sep 22 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Transfer htproxyinfo utility functions into
- grst_x509.c (GRSTx509ChainLoadCheck etc)
-* Wed Aug 6 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.3.4 ====
-* Mon Jul 17 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add Shibboleth handling from Joseph Dada's branch to
- mod_gridsite in main GridSite tree.
-* Tue Jun 27 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Merge delegation services back into core.
-- Add OCSP options
-* Thu Jun 22 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- Add patch from Jan Pospisil <honik@kma.zcu.cz> 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 <Andrew.McNab@man.ac.uk>
-- SiteCast support in SlashGrid
-* Mon Jun 5 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.3.1 ====
-* Sun May 26 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Include SlashGrid code, and in gridsite.spec etc
-- Add sample fuse.spec to docs for use with SlashGrid
-* Fri May 26 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.3.0 ====
-* Mon Apr 24 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- Patch from Alberto di Meglio <alberto.di.meglio@cern.ch>
- to allow use of relocated httpd include files.
-* Mon Apr 3 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Use dist for building tar balls
-* Mon Apr 3 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.19 ====
-* Fri Mar 31 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Final tidy up for gLite 3.1
-* Fri Mar 31 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.18 ====
-* Wed Mar 29 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- New proxy destroy and time functions.
-* Tue Mar 28 2006 Shiv Kaushal <shiv@hep.man.ac.uk>
-- 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 <shiv@hep.man.ac.uk>
-- Change delegation header to Proxy-Delegation-Service
- instead of Grst-
-* Wed Mar 22 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add GRSTx509MakeDelegationID() to grst_x509.c
-- Include code for new style delegation proxy storage
-* Fri Mar 17 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Associate ldconfig %post in spec with -shared RPM
-* Thu Mar 16 2006 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <shiv@hep.man.ac.uk>
-- Modify GridSiteDelegationURI directive to insert HTTP
- headers instead of modifying HTML
-* Mon Feb 6 2006 Shiv Kaushal <shiv@hep.man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.16 ====
-* Wed Nov 16 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add -fPIC option to Makefile for IA64, as suggested
- by Andreas Unterkircher.
-* Wed Oct 12 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.15 ====
-* Wed Oct 12 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Fix for older OpenSSL to grst_x509.c from
- Zoltan.Farkas <Zoltan.Farkas@cern.ch>
-* Wed Oct 12 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.14 ====
-* Tue Oct 11 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Modify VOMS AC parsing to handle multiple ACs inside
- the same X.509 AC extension.
-* Mon Oct 10 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.13 ====
-* Mon Oct 10 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add target_gname patch to gsexec from
- Gerben Venekamp <venekamp@nikhef.nl>
-* Thu Oct 6 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- Fix to gsexec GRST_CRED_0/SSL_CLIENT_S_DN bug found
- by Ian Stokes-Rees <i.stokes-rees1@PHYSICS.OX.AC.UK>
-* Fri Sep 30 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add SiteCast ping (NOP) support to htcp
-* Thu Sep 29 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add SiteCast support to mod_gridsite (file location
- discovery via UDP multicast of HTCP messages.)
-* Wed Sep 21 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.12 ====
-* Tue Sep 13 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Fix bug #10031 submitted by Fabrizio Pacini
- <fabrizio.pacini@cern.ch> (invalid free in
- GRSTgaclAclLoadFile if ACL format not valid.)
-* Mon Sep 12 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Accept GRIDHTTP_ONETIME when passed in HTTP query
- (still overridden by a GRIDHTTP_ONETIME in a cookie.)
-* Sat Sep 10 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Fix problem with attempted upgrades to GridHTTP when
- already on the HTTP virtual server.
-* Fri Sep 9 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.11 ====
-* Fri Jun 10 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Tidy up gsexec vs GridSiteDiskMode
-* Fri Jun 10 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.10 ====
-* Wed Jun 8 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- 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 <shiv@hep.man.ac.uk>
-- Add XACML support to GACL code in libgridsite.
-* Tue May 24 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.9 ====
-* Mon Apr 25 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Avoid build problems when using pre-0.9.7 OpenSSL
- (ie with Globus compatibility.)
-* Mon Apr 25 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.8 ====
-* Mon Feb 28 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Fix to GRSTgaclUndenyPerm in gridsite.h (bug #7135)
- from Marco Sottilaro <marco.sottilaro@datamat.it>
-* Mon Feb 28 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.7 ====
-* Thu Feb 24 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add more sanity checking (signatures, dates, issuer,)
- holder) to VOMS attribute parser.
-* Mon Feb 21 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add bugfix for Bug #6357 from Fabrizio Pacini
- <fabrizio.pacini@cern.ch> to fix delegation proxy
- cache names in OpenSSL 0.9.7.
-* Sun Feb 20 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Add basic VOMS support (signature checking not yet
- in) for X.509 Attribute Certificates.
-* Tue Feb 8 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.6 ====
-* Tue Feb 8 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.5 ====
-* Tue Dec 14 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Patch from Daniel Kouril <kouril@ics.muni.cz> to allow
- switching Globus vs system OpenSSL libraries/headers.
-* Tue Dec 14 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.4 ====
-* Mon Nov 15 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Back out of (most of) redone VOMS support for committing
- to JRA1 CVS.
-* Thu Oct 19 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.3 ====
-* Thu Oct 19 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
-- Fix Bug #5203 from Martijn Steenbakkers <msteenba>
- 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
- <aleks@fys.uio.no>)
-- Fix Bug #4225 from <aleks@fys.uio.no> 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 <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.2 ====
-* Tue Oct 19 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
-- 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 <Andrew.McNab@man.ac.uk>
-- Include per-file patch to GRSTgaclFileFindAclname:
- .gacl:FILENAME controls FILENAME if it exists.
-* Tue Jul 27 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
-- ==== GridSite version 1.1.1 ====
-* Tue Jul 27 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- Include HTTP Downgrade support in htcp
-* Sat Jul 24 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- Include HTTP Downgrade support in mod_gridsite.
-* Thu Jul 22 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- Begin development version 1.1.x
-* Thu Jul 22 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 1.1.0 ====
-* Mon Jul 19 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- Changes in line with EGEE SCM - most importantly
- the top level directory becomes org.gridsite.core
-* Mon Jul 19 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 1.0.3 ====
-* Mon Jun 28 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- ==== GridSite version 1.0.2 ====
-* Sun Jun 27 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- Fix for Bug #2860 (so can now read DN Lists over
- HTTPS when have no user certificate if relevant
- .gacl gives <read> permission but not <list>)
-- Include gridsite-gacl.h mods from Daniel Kouril
- <kouril@ics.muni.cz> to fix faulty definitions
- of GACLnewEntry() and GACLnewAcl() and to make
- a legacy non-static GACLparseEntry() wrapper.
-* Thu Jun 17 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- Incorporate EGEE CVS layout changes in production
- branch.
-* Wed Jun 9 2004 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 1.0.1 ====
-* Sun Dec 14 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- 1.0.0 is first full production release
- (development now in 1.1.x branch)
-* Sun Dec 14 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 1.0.0 ====
-* Sat Dec 13 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.11 ====
-* Thu Dec 11 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Simplify checking of cert/proxy chain in
- mod_ssl-gridsite: rely on mod_ssl/OpenSSL more.
-* Wed Dec 2 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.10 ====
-* Tue Dec 1 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- GACL ignores leading/trailing spaces in values.
-* Sat Nov 29 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.8 ====
-* Thu Nov 27 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Shiv's updated GACL editor, with redirects.
-* Wed Nov 26 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.7 ====
-* Thu Nov 20 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Major updates to htcp (htrm/htls/htll)
-- GACL now recurses subdirectories when examining
- the DN List directories path.
-* Sat Nov 15 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.6 ====
-* Fri Nov 14 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Function call fixes in grst-admin.cgi
-* Thu Nov 13 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Add htcp (curl-url-get reborn)
-* Thu Nov 13 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.5 ====
-* Thu Nov 13 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- One RPM instead of three, with version from VERSION
-- Textarea for HTML/Text editing now 80 columns
-* Mon Nov 10 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Add delegation level and GridSiteGSIProxyLimit
- support.
-- Add GridSiteAdminList handling to mod_gridsite
- and real-gridsite-admin.cgi
-* Sun Nov 9 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- 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 <mcnab@hep.man.ac.uk>
-- Include GACL editor in real-gridsite-admin.cgi
- from Shiv Kaushal <shiv@hep.man.ac.uk>
-* Sun Oct 26 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Reorganise into a single build tree, including
- Apache 2.0 .h files to remove circular dependency.
-* Sun Oct 26 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.4 ====
-* Sun Oct 19 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- Include many pieces of GridSite code from 0.3.x (CGI)
- fileGridSite and mod_gridsite 0.9.0
-* Sun Oct 19 2003 Andrew McNab <mcnab@hep.man.ac.uk>
-- ==== GridSite version 0.9.3 ====
+++ /dev/null
-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.
+++ /dev/null
-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.
+++ /dev/null
-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 )
+++ /dev/null
-MAJOR_VERSION=1
-MINOR_VERSION=1.7
-PATCH_VERSION=1.7.0
-DEFVERSION=010700
-VERSION=$(PATCH_VERSION)
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the Gridsite Core Subsystem
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.12 2005/05/23 13:54:53 dimeglio
- Added load of build.number file
-
- Revision 1.11 2005/02/16 14:14:39 dimeglio
- Added patch to use globus compilation flags also in the RPMS
-
- Revision 1.10 2004/12/17 09:11:43 dimeglio
- Added local tag targets (because of special naming rules here)
-
- Revision 1.9 2004/12/17 09:02:49 dimeglio
- Removed redefinition of global.prefix
-
- Revision 1.8 2004/12/17 00:32:50 dimeglio
- Fixed global.prefix
-
- Revision 1.7 2004/12/03 14:49:59 dimeglio
- Added OPENSSL_FLAGS and _LIBS options
-
- Revision 1.6 2004/11/13 10:55:44 glbuild
- Added artifacts RPMS directory
-
- Revision 1.5 2004/10/29 22:55:07 dimeglio
- Use envset target
-
- Revision 1.4 2004/10/28 23:00:14 dimeglio
- Removed post-subsystem entry
-
- Revision 1.3 2004/10/27 11:19:17 dimeglio
- Fixed i386 instead of 1386
-
- Revision 1.2 2004/10/27 11:18:38 dimeglio
- Use os.platform instead of hard-coded rhel30
-
- Revision 1.1 2004/10/26 17:54:24 dimeglio
- First version of this file
-
--->
-
-<project name="gridsite-core" default="dist">
-
- <description>
- Ant build file to build the Gridsite Core Component
- </description>
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- Import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="./project/properties.xml" />
-
- <!-- Import global build properties and global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependencies properties files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${subsystem.dependencies.file}"/>
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import global task definitions
- ========================================= -->
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Import global compiler definitions
- ========================================= -->
- <import file="${global.compilerdefs.file}" />
-
- <!-- =========================================
- Import targets
- ========================================= -->
- <import file="${global.targets-common.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ===============================================
- Public common targets
- =============================================== -->
-
- <target name="localinit" depends="envcheck">
- <mkdir dir="${stage.dir}" />
- <mkdir dir="${dist.dir}" />
- </target>
-
- <target name="init" depends="localinit">
- <echo>${global.prefix}</echo>
- </target>
-
- <target name="checkstyle" depends="init">
- </target>
-
- <target name="compile" depends="checkstyle">
- <if>
- <isset property="libonly"/>
- <then>
- <property name="buildtarget" value="build-lib"/>
- </then>
- <else>
- <property name="buildtarget" value="build"/>
- </else>
- </if>
- <if>
- <isset property="build.make.arguments"/>
- <then>
- <!-- Call make default compile target -->
- <make target="${buildtarget}" dir="${module.src.dir}" failonerror="${failonerror}" args="${build.make.arguments}"/>
- </then>
- <else>
- <!-- Call make default compile target -->
- <make target="${buildtarget}" dir="${module.src.dir}" failonerror="${failonerror}"/>
- </else>
- </if>
- </target>
-
- <target name="compiletest" depends="compile">
- </target>
-
- <target name="unittest" depends="compiletest">
- </target>
-
- <target name="unitcoverage" depends="unittest">
- </target>
-
- <target name="doc" depends="unitcoverage">
- </target>
-
- <target name="stage" depends="doc">
- <if>
- <isset property="libonly"/>
- <then>
- <property name="installtarget" value="install-lib"/>
- </then>
- <else>
- <property name="installtarget" value="install"/>
- </else>
- </if>
- <if>
- <isset property="build.make.arguments"/>
- <then>
- <!-- Call make default compile target -->
- <make target="${installtarget}" dir="${module.src.dir}" failonerror="${failonerror}" args="${build.make.arguments}"/>
- </then>
- <else>
- <!-- Call make default compile target -->
- <make target="${installtarget}" dir="${module.src.dir}" failonerror="${failonerror}"/>
- </else>
- </if>
- </target>
-
- <target name="dist" depends="stage">
- <make target="rpm" dir="${module.src.dir}" failonerror="${failonerror}" args="${build.make.arguments}"/>
- <exec dir="${module.dir}/RPMTMP/BUILDROOT/usr" executable="tar">
- <arg line="-czf ${module.dir}/gridsite-${module.version}_bin.tar.gz ." />
- </exec>
- <copy file="gridsite-${module.version}_bin.tar.gz" todir="${dist.dir}"/>
- <copy file="gridsite-${module.version}.src.tar.gz" tofile="${dist.dir}/gridsite-${module.version}_src.tar.gz"/>
- <copy todir="${dist.dir}/${os.platform}/i386/RPMS">
- <fileset dir="${module.dir}/RPMTMP/RPMS/i386">
- <include name="*.rpm"/>
- </fileset>
- </copy>
- <delete dir="${module.dir}/RPMS"/>
- <mkdir dir="${module.dir}/RPMS"/>
- <copy todir="${module.dir}/RPMS">
- <fileset dir="${module.dir}/RPMTMP/RPMS/i386">
- <include name="*.rpm"/>
- </fileset>
- </copy>
- <delete>
- <fileset dir="${module.dir}">
- <include name="*.tar.gz"/>
- </fileset>
- </delete>
- <delete dir="RPMTMP"/>
- </target>
-
- <target name="install" depends="localinit">
- <make target="install" dir="${module.src.dir}" failonerror="${failonerror}"/>
- </target>
-
- <target name="all" depends="dist">
- </target>
-
- <target name="clean" depends="envcheck">
- <property name="offline.repository" value="true" />
- <make target="clean" dir="${module.src.dir}" failonerror="false"/>
- <delete dir="${module.dir}/src/doxygen"/>
- <delete>
- <fileset dir="${module.dir}/src">
- <include name="*.o"/>
- <include name="*.so"/>
- <include name="*.so.*"/>
- <include name="*.a"/>
- <include name="rm -rf urlencode"/>
- </fileset>
- </delete>
- <delete dir="${module.dir}/RPMS"/>
- </target>
-
- <target name="cleanAll" depends="clean"/>
-
- <!-- ===============================================
- Private targets
- =============================================== -->
-
- <!-- ========================================================
- tag: Tag module
- ======================================================== -->
- <target name="tag" description="Apply tag.">
-
- <property name="tag.type" value="B"/>
- <!-- Set module CVS Label -->
- <exec executable="tr" inputstring="${module.version}" outputproperty="cvs.module.version">
- <arg line=". _"/>
- </exec>
- <property name="cvs.label" value="gridsite-core_${tag.type}_${cvs.module.version}_${module.build}" />
- <echo>New tag is ${cvs.label}</echo>
-
- <!-- Apply tag -->
- <property name="failonerror" value="true"/>
- <property name="tag.switch" value="-FR"/>
- <exec dir="${workspace.abs.dir}" executable="cvs" failonerror="${failonerror}">
- <arg line="tag ${tag.switch} ${cvs.label} ${module.name}" />
- </exec>
-
- </target>
-
- <target name="component_release_tag">
-
- <!-- Set module CVS Label -->
- <exec executable="tr" inputstring="${module.version}" outputproperty="cvs.module.version">
- <arg line=". _"/>
- </exec>
- <property name="cvs.label" value="gridsite-core_R_${cvs.module.version}" />
- <echo>New tag is ${cvs.label}</echo>
-
- <!-- Apply tag -->
- <exec dir="${workspace.abs.dir}" executable="cvs" failonerror="true">
- <arg line="tag -R ${cvs.label} ${module.name}" />
- </exec>
-
- </target>
-
- <!-- ===============================================
- Modules proxy targets
- =============================================== -->
-
- <!-- component targets definitions tag = do not remove = -->
-
- <!-- Main proxy -->
- <target name="buildmodules" depends="envset"/>
-
-</project>
-
+++ /dev/null
-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/
+++ /dev/null
-#!/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
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<wsdl:definitions
- targetNamespace="http://www.gridsite.org/namespaces/delegation-1"
- xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
- xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
- xmlns:tns="http://www.gridsite.org/namespaces/delegation-1"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:types>
- <xsd:schema targetNamespace="http://www.gridsite.org/namespaces/delegation-1">
- <xsd:complexType name="DelegationExceptionType">
- <xsd:sequence>
- <xsd:element name="message" type="xsd:string" nillable="true">
- <xsd:annotation>
- <xsd:documentation>
- The cause of the delegation exception on the server side.
- </xsd:documentation>
- </xsd:annotation>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- <xsd:element name="DelegationException" type="tns:DelegationExceptionType"/>
- <xsd:complexType name="NewProxyReq">
- <xsd:annotation>
- <xsd:documentation>
- New proxy certificate request, containing the certificate
- request and a generated delegation ID.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="proxyRequest" nillable="true" type="xsd:string">
- <xsd:annotation>
- <xsd:documentation>
- The new RFC 3280 style proxy certificate request
- in PEM format with Base64 encoding.
- </xsd:documentation>
- </xsd:annotation>
- </xsd:element>
- <xsd:element name="delegationID" nillable="true" type="xsd:string">
- <xsd:annotation>
- <xsd:documentation>
- The ID associated with the new delegation session.
- </xsd:documentation>
- </xsd:annotation>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:schema>
- </wsdl:types>
-
- <wsdl:message name="getProxyReqRequest">
- <wsdl:part name="delegationID" type="xsd:string">
- <wsdl:documentation>
- The ID of the new delegation session, specified by the client.
- The ID can be empty.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="getProxyReqResponse">
- <wsdl:part name="getProxyReqReturn" type="xsd:string">
- <wsdl:documentation>
- The new RFC 3280 style proxy certificate request
- in PEM format with Base64 encoding.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
-
- <wsdl:message name="putProxyRequest">
- <wsdl:part name="delegationID" type="xsd:string">
- <wsdl:documentation>
- The ID of an already existing delegation session,
- initiated by getProxyReq() or getNewProxyReq().
- </wsdl:documentation>
- </wsdl:part>
- <wsdl:part name="proxy" type="xsd:string">
- <wsdl:documentation>
- RFC 3280 style proxy certificate, signed by the
- client, in PEM format with Base64 encoding.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="putProxyResponse"/>
-
- <wsdl:message name="renewProxyReqRequest">
- <wsdl:part name="delegationID" type="xsd:string">
- <wsdl:documentation>
- The ID of an already existing delegation session,
- where the client wants to renew the delegated
- credential.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="renewProxyReqResponse">
- <wsdl:part name="renewProxyReqReturn" type="xsd:string">
- <wsdl:documentation>
- The new RFC 3280 style proxy certificate request,
- which is to replace the existing one,
- in PEM format with Base64 encoding.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
-
- <wsdl:message name="getNewProxyReqRequest"/>
- <wsdl:message name="getNewProxyReqResponse">
- <wsdl:part name="getNewProxyReqReturn" type="tns:NewProxyReq">
- <wsdl:documentation>
- 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.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
-
- <wsdl:message name="getTerminationTimeRequest">
- <wsdl:part name="delegationID" type="xsd:string">
- <wsdl:documentation>
- The ID of an already existing delegation session to be queried.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="getTerminationTimeResponse">
- <wsdl:part name="getTerminationTimeReturn" type="xsd:dateTime">
- <wsdl:documentation>
- The date and time when the delegated credentials will expire.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
-
- <wsdl:message name="destroyRequest">
- <wsdl:part name="delegationID" type="xsd:string">
- <wsdl:documentation>
- The ID of an already existing delegation session to be destroyed.
- </wsdl:documentation>
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="destroyResponse"/>
-
- <wsdl:message name="DelegationException">
- <wsdl:part name="fault" element="tns:DelegationException"/>
- </wsdl:message>
-
- <wsdl:portType name="Delegation">
- <wsdl:documentation>
- Delegation interface.
- </wsdl:documentation>
-
- <wsdl:operation name="getProxyReq" parameterOrder="delegationID">
- <wsdl:documentation>
- <para>
- 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.
- </para>
- <orderedlist>
- <listitem><para>
- Check if a delegation ID was provided. If not, generate a delegation
- id by hashing the client DN and client VOMS attributes.
- </para></listitem>
- <listitem><para>
- Check if the delegation ID already exists in the
- <emphasis>storage-area</emphasis>. 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.
- </para></listitem>
- <listitem><para>
- Create a new private/public key-pair (see also <emphasis>Key
- Generation Semantics</emphasis>).
- </para></listitem>
- <listitem><para>
- Generate a new proxy certificate request.
- </para></listitem>
- <listitem><para>
- Store private key and cert request in
- <emphasis>storage-cache-area</emphasis>, along with the
- requesting DN and VOMS attributes.
- </para></listitem>
- </orderedlist>
- </wsdl:documentation>
- <wsdl:input message="tns:getProxyReqRequest" name="getProxyReqRequest"/>
- <wsdl:output message="tns:getProxyReqResponse" name="getProxyReqResponse"/>
- <wsdl:fault message="tns:DelegationException" name="DelegationException">
- <wsdl:documentation>
- The client's DN and VOMS attributes do not match the stored ones,
- i.e. the client is not authorized.
- </wsdl:documentation>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="getNewProxyReq">
- <wsdl:documentation>
- <para>
- 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.
- </para>
- <orderedlist>
- <listitem><para>
- Generate a delegation
- ID by hashing the client DN and client VOMS attributes.
- </para></listitem>
- <listitem><para>
- Check if the delegation ID already exists in the
- <emphasis>storage-area</emphasis>. 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.
- </para></listitem>
- <listitem><para>
- Create a new private/public key-pair (see also <emphasis>Key
- Generation Semantics</emphasis>).
- </para></listitem>
- <listitem><para>
- Generate a new certificate request.
- </para></listitem>
- <listitem><para>
- Store private key and cert request in
- <emphasis>storage-cache-area</emphasis>, along with the
- requesting DN and VOMS attributes.
- </para></listitem>
- </orderedlist>
- </wsdl:documentation>
- <wsdl:input message="tns:getNewProxyReqRequest" name="getNewProxyReqRequest"/>
- <wsdl:output message="tns:getNewProxyReqResponse" name="getNewProxyReqResponse"/>
- <wsdl:fault message="tns:DelegationException" name="DelegationException">
- <wsdl:documentation>
- There were already credentials associated to the delegation ID.
- </wsdl:documentation>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="putProxy" parameterOrder="delegationID proxy">
- <wsdl:documentation>
- <para>
- Finishes the delegation procedure by sending the signed
- proxy certificate to the server.
- </para>
- <orderedlist>
- <listitem><para>
- Check if a delegation ID was provided. If not, generate a
- delegation id by hashing the client DN and client VOMS
- attributes.
- </para></listitem>
- <listitem><para>
- Check if the delegation ID already exists in the
- <emphasis>storage-area</emphasis>. If it does, check
- existing info (DN and VOMS attributes) against client info.
- Throw exception if it does not match.
- </para></listitem>
- <listitem><para>
- Check, if client information matches proxy information.
- </para></listitem>
- <listitem><para>
- Check given proxy against private key of delegation ID in
- <emphasis>storage-cache-area</emphasis>. If they do not
- match, throw exception.
- </para></listitem>
- <listitem><para>
- Store proxy in <emphasis>storage-area</emphasis>
- and clean up the <emphasis>storage-cache-area</emphasis>.
- </para></listitem>
- </orderedlist>
- </wsdl:documentation>
- <wsdl:input message="tns:putProxyRequest" name="putProxyRequest"/>
- <wsdl:output message="tns:putProxyResponse" name="putProxyResponse"/>
- <wsdl:fault message="tns:DelegationException" name="DelegationException">
- <wsdl:documentation>
- <para>
- There were no cached credentials associated to the delegation ID
- (neither <link linkend="Delegation.getNewProxyReq">
- getNewProxyReq()</link> nor
- <link linkend="Delegation.renewProxyReq">
- renewProxyReq()</link> was called previously),
- or the client's DN and VOMS attributes do not match the stored ones,
- i.e. the client is not authorized.
- </para>
- </wsdl:documentation>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="renewProxyReq" parameterOrder="delegationID">
- <wsdl:documentation>
- <para>
- 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.
- </para>
- <orderedlist>
- <listitem><para>
- Check if a delegation ID was provided. If not, generate a delegation
- id by hashing the client DN and client VOMS attributes.
- </para></listitem>
- <listitem><para>
- Check if the delegation ID already exists in the
- <emphasis>storage-area</emphasis>. If it does
- not, then throw an exception.
- </para></listitem>
- <listitem><para>
- Check if the existing info (DN and VOMS attributes) against client info.
- Throw exception if they do not match.
- </para></listitem>
- <listitem><para>
- Create a new private/public key-pair (see also <emphasis>Key
- Generation Semantics</emphasis>).
- </para></listitem>
- <listitem><para>
- Generate a new certificate request.
- </para></listitem>
- <listitem><para>
- Store private key and cert request in
- <emphasis>storage-cache-area</emphasis>, along with the
- requesting DN and VOMS attributes.
- </para></listitem>
- </orderedlist>
- </wsdl:documentation>
- <wsdl:input message="tns:renewProxyReqRequest" name="renewProxyReqRequest"/>
- <wsdl:output message="tns:renewProxyReqResponse" name="renewProxyReqResponse"/>
- <wsdl:fault message="tns:DelegationException" name="DelegationException">
- <wsdl:documentation>
- 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.
- </wsdl:documentation>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="getTerminationTime" parameterOrder="delegationID">
- <wsdl:documentation>
- 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.
- </wsdl:documentation>
- <wsdl:input message="tns:getTerminationTimeRequest" name="getTerminationTimeRequest"/>
- <wsdl:output message="tns:getTerminationTimeResponse" name="getTerminationTimeResponse"/>
- <wsdl:fault message="tns:DelegationException" name="DelegationException">
- <wsdl:documentation>
- 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.
- </wsdl:documentation>
- </wsdl:fault>
- </wsdl:operation>
-
-
- <wsdl:operation name="destroy" parameterOrder="delegationID">
- <wsdl:documentation>
- 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.
- </wsdl:documentation>
- <wsdl:input message="tns:destroyRequest" name="destroyRequest"/>
- <wsdl:output message="tns:destroyResponse" name="destroyResponse"/>
- <wsdl:fault message="tns:DelegationException" name="DelegationException">
- <wsdl:documentation>
- 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.
- </wsdl:documentation>
- </wsdl:fault>
- </wsdl:operation>
-
- </wsdl:portType>
-
- <wsdl:binding name="DelegationSoapBinding" type="tns:Delegation">
- <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
-
- <wsdl:operation name="getProxyReq">
- <wsdlsoap:operation soapAction=""/>
- <wsdl:input name="getProxyReqRequest">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:input>
- <wsdl:output name="getProxyReqResponse">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:output>
- <wsdl:fault name="DelegationException">
- <wsdlsoap:fault name="DelegationException" use="literal"/>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="getNewProxyReq">
- <wsdlsoap:operation soapAction=""/>
- <wsdl:input name="getNewProxyReqRequest">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:input>
- <wsdl:output name="getNewProxyReqResponse">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:output>
- <wsdl:fault name="DelegationException">
- <wsdlsoap:fault name="DelegationException" use="literal"/>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="renewProxyReq">
- <wsdlsoap:operation soapAction=""/>
- <wsdl:input name="renewProxyReqRequest">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:input>
- <wsdl:output name="renewProxyReqResponse">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:output>
- <wsdl:fault name="DelegationException">
- <wsdlsoap:fault name="DelegationException" use="literal"/>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="putProxy">
- <wsdlsoap:operation soapAction=""/>
- <wsdl:input name="putProxyRequest">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:input>
- <wsdl:output name="putProxyResponse">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:output>
- <wsdl:fault name="DelegationException">
- <wsdlsoap:fault name="DelegationException" use="literal"/>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="getTerminationTime">
- <wsdlsoap:operation soapAction=""/>
- <wsdl:input name="getTerminationTimeRequest">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:input>
- <wsdl:output name="getTerminationTimeResponse">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:output>
- <wsdl:fault name="DelegationException">
- <wsdlsoap:fault name="DelegationException" use="literal"/>
- </wsdl:fault>
- </wsdl:operation>
-
- <wsdl:operation name="destroy">
- <wsdlsoap:operation soapAction=""/>
- <wsdl:input name="destroyRequest">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:input>
- <wsdl:output name="destroyResponse">
- <wsdlsoap:body namespace="http://www.gridsite.org/namespaces/delegation-1" use="literal"/>
- </wsdl:output>
- <wsdl:fault name="DelegationException">
- <wsdlsoap:fault name="DelegationException" use="literal"/>
- </wsdl:fault>
- </wsdl:operation>
-
- </wsdl:binding>
-
- <wsdl:service name="DelegationService">
- <wsdl:port binding="tns:DelegationSoapBinding" name="gridsite-delegation">
- <wsdlsoap:address location="https://localhost:8443/glite-security-delegation"/>
- </wsdl:port>
- </wsdl:service>
-
-</wsdl:definitions>
+++ /dev/null
-.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 <Andrew.McNab@man.ac.uk>
-
-findproxyfile is part of GridSite: http://www.gridsite.org/
+++ /dev/null
-#
-# 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 <Andrew.McNab@manchester.ac.uk>
-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 <Andrew.McNab@manchester.ac.uk> 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 <lemenkov@newmail.ru> 2.5.3-1%{?dist}
-- Update to 2.5.3
-
-* Thu Mar 30 2006 Peter Lemenkov <lemenkov@newmail.ru> 2.5.2-4%{?dist}
-- rebuild
-
-* Mon Feb 13 2006 Peter Lemenkov <lemenkov@newmail.ru> - 2.5.2-3
-- Proper udev rule
-
-* Mon Feb 13 2006 Peter Lemenkov <lemenkov@newmail.ru> - 2.5.2-2
-- Added missing requires
-
-* Tue Feb 07 2006 Peter Lemenkov <lemenkov@newmail.ru> - 2.5.2-1
-- Update to 2.5.2
-- Dropped fuse-mount.fuse.patch
-
-* Wed Nov 23 2005 Thorsten Leemhuis <fedora[AT]leemhuis[DOT]info> - 2.4.2-1
-- Use dist
-
-* Wed Nov 23 2005 Thorsten Leemhuis <fedora[AT]leemhuis[DOT]info> - 2.4.2-1
-- Update to 2.4.2 (solves CVE-2005-3531)
-- Update README.fedora
-
-* Sat Nov 12 2005 Thorsten Leemhuis <fedora[AT]leemhuis[DOT]info> - 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 <fedora[AT]leemhuis[DOT]info> - 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 <fedora[AT]leemhuis[DOT]info> - 2.4.1-1
-- Initial RPM release.
+++ /dev/null
-.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 <Andrew.McNab@manchester.ac.uk>
-
-gridsite-delegation.cgi is part of GridSite: http://www.gridsite.org/
-
-.SH "SEE ALSO"
-.BR htproxyput(1)
+++ /dev/null
-.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 <Andrew.McNab@manchester.ac.uk> 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)
+++ /dev/null
-#
-# You can use this spec file and the gSOAP source tar file from sourceforge
-# to build a binary development RPM of gSOAP, suitable for building the
-# gridsite-ws components. Installing the resulting RPM puts the gSOAP files
-# directory in /usr, where the gridsite-ws Makefile expects them by default.
-#
-# See http://www.gridsite.org/wiki/GSOAP for more about GridSite and gSOAP
-#
-Name: gsoap-devel
-Version: %(echo ${MYVERSION:-2.7.6b})
-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: gSOAP development compilers/libraries/headers
-License: Modified BSD
-Group: Development/Libraries
-Source: gsoap_%{version}.tar.gz
-Prefix: %(echo ${MYPREFIX:-/usr})
-URL: http://www.cs.fsu.edu/~engelen/soap.html
-Packager: Andrew McNab <Andrew.McNab@manchester.ac.uk>
-
-%description
-Enough of gSOAP to build clients and servers based on gSOAP, using its headers
-and static libraries.
-By default, everything is installed in /usr/lib|bin|include/
-
-%prep
-
-%setup -n gsoap-2.7
-
-%build
-
-./configure --prefix=$RPM_BUILD_ROOT/%{prefix}
-make
-
-%install
-make install
-
-%files
-%attr(-, root, root) %{prefix}/bin/soapcpp2
-%attr(-, root, root) %{prefix}/bin/wsdl2h
-%attr(-, root, root) %{prefix}/include/stdsoap2.h
-%attr(-, root, root) %{prefix}/lib/libgsoap++.a
-%attr(-, root, root) %{prefix}/lib/libgsoap.a
-%attr(-, root, root) %{prefix}/lib/libgsoapck++.a
-%attr(-, root, root) %{prefix}/lib/libgsoapck.a
-%attr(-, root, root) %{prefix}/lib/libgsoapssl++.a
-%attr(-, root, root) %{prefix}/lib/libgsoapssl.a
-%attr(-, root, root) %{prefix}/lib/pkgconfig/gsoap++.pc
-%attr(-, root, root) %{prefix}/lib/pkgconfig/gsoap.pc
-%attr(-, root, root) %{prefix}/lib/pkgconfig/gsoapck++.pc
-%attr(-, root, root) %{prefix}/lib/pkgconfig/gsoapck.pc
-%attr(-, root, root) %{prefix}/lib/pkgconfig/gsoapssl++.pc
-%attr(-, root, root) %{prefix}/lib/pkgconfig/gsoapssl.pc
+++ /dev/null
-.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 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 <seconds>"
-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 <X.509 cert path> and --key <X.509 key path>"
-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 <X.509 CA root certs directory or file>"
-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 <SiteCast 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 <Andrew.McNab@manchester.ac.uk>
-
-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)
+++ /dev/null
-.so man1/htcp.1
+++ /dev/null
-.so man1/htcp.1
+++ /dev/null
-.so man1/htcp.1
+++ /dev/null
-.so man1/htcp.1
+++ /dev/null
-.so man1/htcp.1
+++ /dev/null
-.so man1/htcp.1
+++ /dev/null
-.so man1/htproxyput.1
+++ /dev/null
-.so man1/htproxyput.1
+++ /dev/null
-.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
-
-.B htproxyinfo
-[options]
-
-.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.
-
-.B htproxyinfo
-examines a local copy of a GSI proxy, and outputs a summary of its X.509 and
-VOMS contents.
-
-.SH OPTIONS
-.IP "-v/--verbose"
-Turn on debugging information.
-
-.IP "--delegation-id <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 "--info"
-Examine a local proxy file, and output a summary of the X.509 certificates
-and VOMS attributes it contains. Calling the program as htproxyinfo has the
-same effect.
-
-.IP "--cert <X.509 cert path> and --key <X.509 key path>"
-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 <X.509 CA root certs directory or file>"
-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 <Andrew.McNab@manchester.ac.uk>
-
-htproxyput is part of GridSite: http://www.gridsite.org/
-.SH "SEE ALSO"
-.BR htcp(1),
-.BR gridsite-delegation(8)
+++ /dev/null
-.so man1/htproxyput.1
+++ /dev/null
-.so man1/htproxyput.1
+++ /dev/null
-.so man1/htproxyput.1
+++ /dev/null
-.so man1/htcp.1
+++ /dev/null
-##############################################################################
-## GridSite httpd-fileserver.conf - Andrew McNab <Andrew.McNab@man.ac.uk>
-##
-## 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.
-##
-## We assume that you have mod_gridsite.so in /usr/lib/httpd/modules
-## and that 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/html owned by
-## apache.apache, including the file .gacl containing:
-##
-## <gacl>
-## <entry>
-## <any-user/>
-## <allow><read/><list/></allow>
-## </entry>
-## </gacl>
-##
-## To enable writing, add DN List, Person or VOMS entries to the GACL
-## (see the GridSite GACL document for the syntax.) For example:
-##
-## <gacl>
-## <entry>
-## <any-user/>
-## <allow><read/><list/></allow>
-## </entry>
-## <entry>
-## <person>
-## <dn>/C=UK/O=eScience/OU=Manchester/L=HEP/CN=Andrew McNab</dn>
-## </person>
-## <allow><write/></allow>
-## </entry>
-## </gacl>
-##
-## and add the following directive to the HTTPS <Directory> 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 300
-
-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/html"
-
-<Directory />
- AllowOverride None
-</Directory>
-
-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
-<VirtualHost *:80 *:777>
-
-<Directory "/var/www/html">
- GridSiteIndexes on
- GridSiteAuth on
- GridSiteDNlists /etc/grid-security/dn-lists/
-</Directory>
-
-</VirtualHost>
-
-######################################################################
-# Secured and possibly authenticated HTTPS on ports 443 and 488
-######################################################################
-Listen 443
-Listen 488
-SSLSessionCacheTimeout 300
-SSLSessionCache shm:/var/cache/mod_ssl/shm_cache
-
-<VirtualHost *:443 *:488>
-
-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
-
-<Directory "/var/www/html">
- GridSiteIndexes on
- GridSiteAuth on
- GridSiteDNlists /etc/grid-security/dn-lists/
- GridSiteGSIProxyLimit 9
- GridSiteMethods GET PUT DELETE MOVE
-</Directory>
-
-</VirtualHost>
+++ /dev/null
-
-##############################################################################
-## GridSite httpd-storage.conf - Andrew McNab <Andrew.McNab@man.ac.uk>
-##
-## For GridSite documentation, see http://www.gridsite.org/
-##
-## Example configuration file for GridSite as an HTTP(S) storage server,
-## listening on ports 80/777 (HTTP) and 443/488 (HTTPS), and
-## multicast UDP 224.0.1.111:488 for SiteCast file location.
-##
-## (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.
-##
-## We assume that you have mod_gridsite.so in /usr/lib/httpd/modules
-## and that 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/html owned by
-## apache.apache, including the file .gacl containing:
-##
-## <gacl>
-## <entry>
-## <any-user/>
-## <allow><read/><list/></allow>
-## </entry>
-## </gacl>
-##
-## To enable writing, add DN List, Person or VOMS entries to the GACL
-## (see the GridSite GACL document for the syntax.) For example:
-##
-## <gacl>
-## <entry>
-## <any-user/>
-## <allow><read/><list/></allow>
-## </entry>
-## <entry>
-## <person>
-## <dn>/C=UK/O=eScience/OU=Manchester/L=HEP/CN=Andrew McNab</dn>
-## </person>
-## <allow><write/></allow>
-## </entry>
-## </gacl>
-##
-## and add the following directive to the HTTPS <Directory> 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 300
-
-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
-
-# used for gridsite-storage tests
-LoadModule alias_module /usr/lib/httpd/modules/mod_alias.so
-LoadModule cgi_module /usr/lib/httpd/modules/mod_cgi.so
-LoadModule env_module /usr/lib/httpd/modules/mod_env.so
-
-LoadModule php4_module modules/libphp4.so
-AddType application/x-httpd-php .php
-
-TypesConfig /etc/mime.types
-
-# User and group who will own files created by Apache
-User apache
-Group apache
-
-DocumentRoot "/var/www/html"
-DirectoryIndex index.html
-
-<Directory />
- AllowOverride None
-</Directory>
-
-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
-
-# Enable SiteCast location of files via multicast
-GridSiteCastGroup 224.0.1.111:488
-
-######################################################################
-# Plain unauthenticated HTTP on ports 80 and 777
-######################################################################
-
-Listen 80
-Listen 777
-NameVirtualHost 127.0.0.1:80
-
-<VirtualHost *:80 *:777>
-
-GridSiteGridHTTP on
-GridSiteCastAlias http://sitecast.domain:777/ /var/www/html/
-
-<Directory "/var/www/html">
- GridSiteIndexes on
- GridSiteAuth on
- GridSiteDNlists /etc/grid-security/dn-lists/
- GridSiteHtmlFormat on
-</Directory>
-
-</VirtualHost>
-
-######################################################################
-# Secured and possibly authenticated HTTPS on ports 443 and 488
-######################################################################
-Listen 443
-Listen 488
-SSLSessionCacheTimeout 300
-SSLSessionCache shm:/var/cache/mod_ssl/shm_cache
-
-<VirtualHost 127.0.0.1:443 127.0.0.1:488>
-
-ServerName pc63.hep.man.ac.uk
-
-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
-
-GridSiteGridHTTP on
-GridSiteCastAlias https://sitecast.domain:488/ /var/www/html/
-
-<Directory "/var/www/html">
- SetEnv GRST_FOOTER_BLOB '</div></div></div></div><div id="footer"><div id="footer3"><div class="innertube">Copyright GridPP 2008</div></div><div id="footer2"><div class="innertube">'
- GridSiteIndexes on
- GridSiteAuth on
- GridSiteDNlists /etc/grid-security/dn-lists/
- GridSiteDNlistsURI /dn-lists/
- GridSiteGSIProxyLimit 9
- GridSiteMethods GET PUT DELETE MOVE
- GridSiteHtmlFormat on
- GridSiteAutoPasscode on
- GridSiteRequirePasscode on
-# GridSiteLoginURI https://login.pc63.hep.man.ac.uk
-</Directory>
-
-<Location "/dn-lists/">
- GridSiteACLPath /var/www/html/.gacl
-</Location>
-
-
-</VirtualHost>
-<VirtualHost 127.0.0.2:443 127.0.0.2:488>
-
-ServerName login.pc63.hep.man.ac.uk
-
-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
-
-#GridSiteAutoPasscode off
-#GridSiteRequirePasscode off
-
-AliasMatch ^/ /var/www/php-bin/gridsite-login.php
-
-<Directory "/var/www/html">
- GridSiteIndexes on
- GridSiteAuth on
- GridSiteDNlists /etc/grid-security/dn-lists/
- GridSiteDNlistsURI /dn-lists/
- GridSiteGSIProxyLimit 9
- GridSiteMethods GET PUT DELETE MOVE
- GridSiteHtmlFormat on
-</Directory>
-
-</VirtualHost>
+++ /dev/null
-##############################################################################
-## GridSite httpd-webserver.conf - Andrew McNab <Andrew.McNab@man.ac.uk>
-##
-## 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.
-##
-## We assume you have installed GridSite from the RPMs into locations
-## under /usr. This includes mod_gridsite.so in /usr/lib/httpd/modules
-## and the CGI binaries in /usr/sbin. We also assume that 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 THESE ASSUMPTIONS ARE INCORRECT, YOU NEED TO EDIT THE CORRESPONDING
-## DIRECTORY NAMES IN THIS FILE.
-##
-## If you want to use DN Lists in ACLs, they should be placed/downloaded
-## in /etc/grid-security/dn-lists/ or /var/www/html/dn-lists/
-## (Lists in /etc/grid-security/dn-lists/ override lists elsewhere.)
-##
-## To start serving files, make a directory /var/www/html owned by
-## apache.apache, including the file .gacl containing:
-##
-## <gacl>
-## <entry>
-## <any-user/>
-## <allow><read/><list/></allow>
-## </entry>
-## </gacl>
-##
-## To enable writing, add DN List, Person or VOMS entries to the GACL
-## (see the GridSite GACL document for the syntax.) For example:
-##
-## <gacl>
-## <entry>
-## <any-user/>
-## <allow><read/><list/></allow>
-## </entry>
-## <entry>
-## <person>
-## <dn>/C=UK/O=eScience/OU=Manchester/L=HEP/CN=Andrew McNab</dn>
-## </person>
-## <allow><write/></allow>
-## </entry>
-## </gacl>
-##
-## and add the following directive to the HTTPS <Directory> 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/html"
-
-<Directory />
- AllowOverride None
-</Directory>
-
-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
-<VirtualHost *:80 *: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
-
-<Directory "/var/www/html">
- ## 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 <body> and </body> 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
-</Directory>
-
-</VirtualHost>
-
-######################################################################
-# Secured and possibly authenticated HTTPS on ports 443 and 488
-######################################################################
-Listen 443
-Listen 488
-SSLSessionCacheTimeout 300
-SSLSessionCache shm:/var/cache/mod_ssl/shm_cache
-
-<VirtualHost *:443 *:488>
-
-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
-
-<Directory "/var/www/html">
- ## 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 <body> and </body> 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/html/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
-</Directory>
-
-</VirtualHost>
+++ /dev/null
-<title>GridSite 1.7.x Documentation</title>
-<body>
-<h1 align=center>GridSite 1.7.x Documentation</h1>
-
-<p>
-<a href="http://www.gridsite.org/">GridSite</a>
-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.
-
-<p>
-The <a href="http://www.gridsite.org/wiki/">GridSite Wiki</a> includes
-guides and cookbook examples about using GridSite, along with up to date
-information about the APIs.
-
-<h2>Reference</h2>
-
-<p>
-The following reference documents and man pages are put in
-/usr/share/doc/gridsite-VERSION when GridSite is installed.
-
-<p>
-<dl>
-
-<dt><b><a href="htcp.1.html">htcp(1)</a></b>
-<dd>A command line tool for copying files to or from HTTP(S) servers.
-<p>
-
-<dt><b><a href="mod_gridsite.8.html">mod_gridsite(8)</a></b>
-<dd>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.
-<p>
-
-<dt><b><a href="gsexec.8.html">gsexec(8)</a></b>
-<dd>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.
-<p>
-
-<dt><b><a href="httpd-fileserver.conf">httpd-fileserver.conf</a></b> and
- <b><a href="httpd-webserver.conf">httpd-webserver.conf</a></b>
-<dd>Example configuration files for simple HTTP(S) fileservers and
- webservers, with explanatory comments.
-<p>
-
-<dt><b><a href="urlencode.1.html">urlencode(1)</a></b>
-<dd>A command for URL-encoding strings.
-<p>
-
-<dt><b><a href="findproxyfile.1.html">findproxyfile(1)</a></b>
-<dd>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.
-<p>
-
-<!--
-<dt><b><a href="delegation-1.wsdl">delegation-1.wsdl</a></b>
-<dd>A WSDL description of a delegation Web Service including the Delegation
- portType.
-<p>
--->
-
-<dt><b><a href="fuse.spec">fuse.spec</a></b>
-<dd>An RPM SPEC file which can be used to build the
- <a href="http://www.gridsite.org/wiki/FUSE">FUSE</a> kernel module,
- library and commands on Linux 2.4.x and 2.6.x systems, for use with
- <a href="http://www.gridsite.org/slashgrid/">SlashGrid</a>.
-<p>
-
-<dt><b><a href="doxygen/gridsite_8h.html">gridsite.h API reference</a></b>
-<dd>A detailed description of the C API provided by libgridsite, generated
- from the sources by doxygen.
-<p>
-
-</dl>
-
-</body>
+++ /dev/null
-.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 <Directory ...> 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 used for as standard headers and footers
-for HTML pages. If the file name begins with "/" then this is used
-as the absolute path to that file to be used. Otherwise,
-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
-<body[ ...]> tags; footer files in place of </body>. (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 "GridSiteAutoPasscode on|off"
-Whether to automatically issue passcodes in response to HTTPS
-requests made using a full X.509 certificate (not a GSI proxy.)
-(Default: GridSiteAutoPasscode on)
-
-.IP "GridSiteRequirePasscode on|off"
-Whether to require passcode cookies when processing HTTPS
-requests made using a full X.509 certificate (not a GSI proxy.)
-(Default: GridSiteRequirePasscode off)
-
-.IP "GridSiteZoneSlashes number"
-How many slashes to include in passcode paths. The path is the
-prefix of REQUEST_URI that includes that number of slashes.
-Path matching is checked by mod_gridsite in addition to any
-selection of cookies by path made by the browser.
-(Default: GridSiteZoneSlashes 1)
-
-.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 <dn-list> 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)
-<p>
-
-.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. This directive must apply to the gridsite-admin.cgi
-executable, rather than just to the files it manages. This is most
-easily achieved by placing GridSiteEditable in the main section of
-the virtual host, outside any Directory or Location containers.
-(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 "GridSiteLoginURI uri"
-If set, gives the URI prefix to use for login/logout links in
-page footers. The text "Login/Logout" will be a link to the
-prefix followed by the value of REQUEST_URI for the page in
-question. (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 "GridSiteACLPath path"
-Specify the absolute or relative (to ServerRoot) path of the ACL file
-governing this section of the server's URL space. This can be applied to
-virtual URL spaces provided by other modules, such as DAV or SVN, using
-the Apache <Location> container. If the path contains %0, it is replaced
-by this virtual server's hostname. If it contains %1, %2, ... it is replaced
-with the 1st, 2nd, ... component of the request's URI, separated by slashes
-and counting from immediately after the initial slash.
-
-.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_PASSCODE_COOKIE
-Value of GRIDHTTP_PASSCODE cookie that should be returned when using
-a double-submit cookie procedure to guard against Cross Site Request
-Forgery (CSRF) attacks. This is only set if a valid passcode file
-was found in the server's sessions directory.
-
-.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 <Andrew.McNab@manchester.ac.uk>
-
-mod_gridsite is part of GridSite: http://www.gridsite.org/
-.SH "SEE ALSO"
-.BR htcp(1),
-.BR httpd(8),
-.BR gsexec(8)
+++ /dev/null
-.TH SLASHGRID 28 "September 2006" "slashgrid" "GridSite Manual"
-.SH NAME
-.B slashgrid
-\- Local and remote virtual filesystems using grid credentials
-
-.SH "SYNOPSIS"
-
-.BR slashgrid
-[--debug] [--domain DOMAIN --groups GROUPS] [--local-root PATH --local-user USER] [--gridmapdir PATH] [--foreground]
-
-.SH "SUMMARY"
-
-SlashGrid provides remote virtual filesystems under /grid ("slash grid")
-using HTTP/HTTPS as a transport protocol, and a local filesystem under
-/grid/local which can give access to the DocumentRoot area of a webserver
-on the same machine. In both local and remote cases, X.509, GSI Proxy
-and VOMS credentials can be used as the basis of authorization decisions.
-
-.SH "REMOTE HTTP(S) SERVERS"
-
-SlashGrid maps URLs of the form https://d.n.s:port/path/file into virtual paths
-of the form /grid/https/d.n.s:port/path/file (with /grid/http/ for
-HTTP URLs.)
-
-SlashGrid attempts to obtain a user credential in the form of a GSI Proxy
-file, either indicated by the variable X509_USER_PROXY in the environment
-of the user's process, or a file of the form /tmp/x509up_uUID, where UID is
-their Unix user ID. If none is found, an authenticated HTTPS request is made.
-
-SlashGrid searches /etc/grid-security/certificates by default for CA root
-files when verifying the host certificate of remote servers. This can be
-overriden by users setting the variable X509_CERT_DIR in their environment.
-
-.SH "SITECAST DOMAINS"
-
-If the slashgrid daemon is started with the option --domain, then URLs
-with DNS component matching the given domain will be located using SiteCast
-requests. SlashGrid will attempt to use UDP multicast queries to find a
-transfer URL of a copy of the file requested. The option --groups must also
-be used to specify a comma-separted list of one or more UDP multicast groups,
-which will be searched in order.
-
-The SiteCast area of the virtual filesystem is read-only (to prevent
-corruption of replicas.)
-
-.TP
---domain DOMAIN
-SiteCast domain to use.
-
-.TP
---groups GROUPS
-SiteCast multicast groups to query.
-
-.SH "LOCAL FILESYSTEM"
-
-This filesystem is intended for use with GridSite/Apache webservers, which
-control access via .gacl policy files in each directory hierarchy. SlashGrid
-can interpret these files internally, and this allows other services, such
-as GridFTP running in chroot mode, to share access to a common file store.
-
-.TP
---local-root PATH
-Top level directory in the underlying filesystem, which will be mapped to
-/grid/local/
-
-.TP
---local-user USER
-Local user who will own the files created in the underlying filesystem.
-
-.TP
---gridmapdir PATH
-Private gridmapdir used for mapping of pool users back to X.509 DNs. For
-example, after configuring GridFTP to use this gridmapdir.
-
-.SH "OTHER OPTIONS"
-
-.TP
---debug
-Turn on debugging.
-
-.TP
---blocksize BLOCKSIZE
-Change the default HTTP(S) block size in bytes. For streaming data,
-a much larger value than the default of 4096 may be appropriate. This may
-also be set for
-.B each user process
-if users set the environment variable SLASHGRID_BLOCKSIZE.
-
-.SH "MORE INFORMATION"
-
-http://www.gridsite.org/wiki/SlashGrid
-
-.SH AUTHORS
-
-Andrew McNab <Andrew.McNab@manchester.ac.uk>
-
-SlashGrid is part of GridSite: http://www.gridsite.org/
-
-.SH "SEE ALSO"
-.BR htcp(1),
-.BR mod_gridsite(8)
+++ /dev/null
-.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 <Andrew.McNab@manchester.ac.uk>
-
-urlencode is part of GridSite: http://www.gridsite.org/
+++ /dev/null
-/*
- 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 */
+++ /dev/null
-/*
- Copyright (c) 2002-8, 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 GRST_VERSION
-#define GRST_VERSION 010500
-#endif
-
-#ifndef GRST_NO_OPENSSL
-
-#ifndef HEADER_SSL_H
-#include <openssl/ssl.h>
-#endif
-
-#ifndef HEADER_CRYPTO_H
-#include <openssl/crypto.h>
-#endif
-
-#endif
-
-#ifndef _TIME_H
-#include <time.h>
-#endif
-
-#ifndef _STDIO_H
-#include <stdio.h>
-#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__)
-// void (*GRSTerrorLogFunc)(char *, int, int, char *, ...);
-
-#define GRSTerrorLog(GRSTerrorLevel, ...) if (GRSTerrorLogFunc != NULL) (GRSTerrorLogFunc)(__FILE__, __LINE__, GRSTerrorLevel, __VA_ARGS__)
-
-extern 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
-
-#define GRST_MAX_TIME_T INT32_MAX
-
-typedef struct { char *auri;
- int delegation;
- int nist_loa;
- time_t notbefore;
- time_t notafter;
- void *next; } GRSTgaclCred;
-
-/* used by pre-AURI GRSTgaclCred structs */
-__attribute__ ((deprecated))
-typedef struct { char *name;
- char *value;
- void *next; } GRSTgaclNamevalue;
-
-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 *issuer; /* Cert CA DN, EEC of PC, or VOMS DN */
- char *dn; /* Cert DN, or VOMS AC holder DN */
- char *value; /* VOMS FQAN or NULL */
- time_t notbefore;
- time_t notafter;
- int delegation; /* relative to END of any chain */
- 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;
-
-#ifndef GRST_NO_OPENSSL
-int GRSTx509CertLoad(GRSTx509Cert *, X509 *);
-int GRSTx509ChainLoadCheck(GRSTx509Chain **, STACK_OF(X509) *, X509 *, char *, char *);
-#endif
-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);
-
-__attribute__ ((deprecated))
-GRSTgaclCred *GRSTgaclCredNew(char *);
-
-GRSTgaclCred *GRSTgaclCredCreate(char *, char *);
-
-__attribute__ ((deprecated))
-int GRSTgaclCredAddValue(GRSTgaclCred *, char *, char *);
-
-#define GRSTgaclCredGetAuri(cred) ((cred)->auri)
-
-#define GRSTgaclCredSetNotBefore(cred, time) ((cred)->notbefore = (time))
-#define GRSTgaclCredGetNotBefore(cred) ((cred)->notbefore)
-
-#define GRSTgaclCredSetNotAfter(cred, time) ((cred)->notafter = (time))
-#define GRSTgaclCredGetNotAfter(cred) ((cred)->notafter)
-
-#define GRSTgaclCredSetDelegation(cred, level) ((cred)->delegation = (level))
-#define GRSTgaclCredGetDelegation(cred) ((cred)->delegation)
-
-#define GRSTgaclCredSetNistLoa(cred, level) ((cred)->nist_loa = (level))
-#define GRSTgaclCredGetNistLoa(cred) ((cred)->nist_loa)
-
-/* #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 *);
-
-int GRSTgaclCredCmpAuri(GRSTgaclCred *, GRSTgaclCred *);
-
-/* #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 *);
-
-__attribute__ ((deprecated))
-int GRSTgaclUserSetDNlists(GRSTgaclUser *, char *);
-
-int GRSTgaclUserLoadDNlists(GRSTgaclUser *, char *);
-
-/* #define GACLuserFindCredType(x,y) GRSTgaclUserFindCredtype((x),(y)) */
-GRSTgaclCred *GRSTgaclUserFindCredtype(GRSTgaclUser *, char *);
-
-__attribute__ ((deprecated))
-int GRSTgaclDNlistHasUser(char *, GRSTgaclUser *);
-
-int GRSTgaclUserHasAURI(GRSTgaclUser *, char *);
-
-/* #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 *);
-
-#ifndef GRST_NO_OPENSSL
-int GRSTx509KnownCriticalExts(X509 *);
-
-int GRSTx509IsCA(X509 *);
-int GRSTx509CheckChain(int *, X509_STORE_CTX *);
-int GRSTx509VerifyCallback(int, X509_STORE_CTX *);
-
-__attribute__ ((deprecated))
-int GRSTx509GetVomsCreds(int *, int, size_t, char *, X509 *, STACK_OF(X509) *, char *);
-
-__attribute__ ((deprecated))
-GRSTgaclCred *GRSTx509CompactToCred(char *);
-
-__attribute__ ((deprecated))
-int GRSTx509CompactCreds(int *, int, size_t, char *, STACK_OF(X509) *, char *, X509 *);
-#endif
-
-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 *);
-
-char *GRSTx509MakeDelegationID(void);
-
-#ifndef GRST_NO_OPENSSL
-int GRSTx509StringToChain(STACK_OF(X509) **, char *);
-char *GRSTx509MakeProxyFileName(char *, STACK_OF(X509) *);
-#endif
-
-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 *);
-int GRSThttpPrintHeader(GRSThttpBody *, char *);
-int GRSThttpPrintFooter(GRSThttpBody *, char *);
-char *GRSThttpGetCGI(char *);
-
-time_t GRSTasn1TimeToTimeT(char *, size_t);
-int GRSTasn1SearchTaglist(struct GRSTasn1TagList taglist[], int, char *);
-#ifndef GRST_NO_OPENSSL
-int GRSTasn1ParseDump(BIO *, unsigned char *, long,
- struct GRSTasn1TagList taglist[], int, int *);
-#endif
-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);
+++ /dev/null
-#Wed Feb 23 03:19:54 CET 2005
-module.build=141
+++ /dev/null
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="configure options">
- <property name="build.make.arguments"
- value='prefix=${stage.abs.dir} STDSOAP2=${with.gsoap.prefix}/src/stdsoap2.c GSOAPDIR=${with.gsoap.prefix} OPENSSL_GLOBUS_FLAGS=-I${with.globus.prefix}/include/${with.globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${with.globus.prefix}/lib/ FLAVOR_GLOBUS_EXT=_${with.globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${with.httpd.prefix:-/usr}/include/httpd"' />
- </project>
-
+++ /dev/null
-###################################################################
-# System dependencies
-###################################################################
-
-org.glite.version = HEAD
-org.glite.core.version = HEAD
-
-# Component dependencies tag = do not remove this line =
-
+++ /dev/null
-<?xml version="1.0"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- GLite Middleware WMS Configuration Specification File
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2004/10/27 10:35:37 dimeglio
- Added missing closing target
-
- Revision 1.2 2004/10/27 10:28:29 dimeglio
- Modified to use gridsite-core
-
- Revision 1.1 2004/10/26 17:54:24 dimeglio
- First version of this file
-
- Revision 1.7 2004/10/18 23:01:18 dimeglio
- Added oscheck to various targets
-
- Revision 1.6 2004/10/12 14:21:21 eronchie
- Removed ssl_utils dependency
-
- Revision 1.5 2004/08/20 09:51:39 eronchie
- Updated buildmodules orders
-
- Revision 1.4 2004/08/04 07:30:29 eronchie
- Added cppunit
-
- Revision 1.3 2004/07/23 14:50:08 eronchie
- Added exception
-
- Revision 1.2 2004/07/23 08:27:03 eronchie
- Updated
-
-
--->
-
-<project name="Gridsite Core CSF" default="all">
-
- <!-- overwrite default workspace directory -->
- <property name="workspace.dir" value="../.." />
-
- <!-- ===============================================
- Load properties
- =============================================== -->
-
- <!-- load baseline and user properties -->
- <import file="${workspace.dir}/org.glite/project/baseline.properties.xml" />
-
- <!-- define build properties file location since we are already in project dir -->
- <property name="subsystem.build.properties.file" value="./build.properties" />
-
- <!-- Load subsytem-specific property files -->
- <import file="./properties.xml"/>
-
- <!-- load global properties -->
- <import file="${global.properties.file}" />
-
- <!-- ===============================================
- Load dependencies
- =============================================== -->
-
- <!-- Load user dependencies file -->
- <property file="${user.dependencies.file}" />
-
- <!-- Load subsystem dependencies file -->
- <property file="./dependencies.properties" />
-
- <!-- Load global dependencies file -->
- <property file="${global.dependencies.file}" />
-
- <!-- ===============================================
- Load targets
- =============================================== -->
- <import file="${global.targets-envchecks.file}" />
- <import file="${global.targets-external-dependencies.file}" />
-
- <!-- ===============================================
- Evaluate CVS tags
- =============================================== -->
-
- <target name="evaluate.cvs.tags" description="Figure out if we need tagged CVS checkout">
- <condition property="glite.head">
- <and>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
- <condition property="glite.tag">
- <and>
- <not>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- </not>
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
- <condition property="gridsite-core.head">
- <and>
- <equals arg1="${org.gridsite-core.version}" arg2="HEAD" />
- <istrue value="${update}" />
- </and>
- </condition>
- <condition property="gridsite-core.tag">
- <and>
- <not>
- <equals arg1="${org.gridsite-core.version}" arg2="HEAD" />
- </not>
- <istrue value="${update}" />
- </and>
- </condition>
-
- </target>
-
- <!-- condition property tag = do not remove = -->
-
- <presetdef name="cvs-co">
- <cvs command="checkout" dest="${workspace.dir}" />
- </presetdef>
-
- <!-- =====================================================
- Self-update if required
- ===================================================== -->
-
- <!-- Update main GLite module -->
- <target name="org.glite" depends="get.glite.head, get.glite.tag"/>
- <target name="get.glite.head" if="glite.head">
- <cvs-co package="org.glite" />
- </target>
- <target name="get.glite.tag" if="glite.tag">
- <cvs-co package="org.glite"
- tag="${org.glite.version}" />
- </target>
-
- <!-- Update the current module -->
- <target name="org.gridsite.core" depends="get.gridsite-core.head, get.gridsite-core.tag"/>
- <target name="get.gridsite-core.head" if="gridsite-core.head">
- <cvs-co package="org.gridsite.core" />
- <fail>The org.glite and org.gridsite.core modules have been updated, please rerun the configuration file</fail>
- </target>
- <target name="get.gridsite-core.tag" if="gridsite-core.tag">
- <cvs-co package="org.gridsite.core"
- tag="${org.gridsite.core.version}" />
- <fail>The org.glite and org.gridsite.core modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <!-- *****************************************************-->
- <!-- Development tools -->
- <!-- *****************************************************-->
-
- <!-- All development tools -->
- <target name="devtools" depends="oscheck,
- junitcheck,
- junit,
- chkstyle,
- jalopy,
- ant-contrib,
- cpptasks,
- egee-ant-ext"/>
-
- <!-- =====================================================
- External libraries
- ===================================================== -->
-
- <!-- All external libraries -->
- <target name="external" depends="oscheck,
- log4j"/>
-
- <!-- =====================================================
- GLite WMS modules
- ===================================================== -->
-
- <!-- component targets tag = do not remove = -->
-
- <!-- All project modules -->
- <target name="project" depends=""/>
-
-
- <!-- ====================================================
- Checkout all
- ==================================================== -->
-
- <!-- All libraries -->
- <target name="all" depends="oscheck,evaluate.cvs.tags,defaultenvchecks,org.glite,org.gridsite.core,devtools,external,project" />
-
- <!-- ====================================================
- Print dependecies to console
- ==================================================== -->
-
- <target name="dependencies">
- <concat>
- <fileset dir="." includes="dependencies.properties" />
- </concat>
- </target>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Gridsite Core modules
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Gridsite Core common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property name="subsystem.build.properties.file" value="./project/build.properties" />
- <property file="${subsystem.build.properties.file}" />
-
- <!-- ======================================================
- Define subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${gridsite-core.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${gridsite-core.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define general subsystem properties
- ====================================================== -->
-
- <!-- Include common subsystem properties -->
- <import file="${subsystem.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common Ant task definition file for the Gridsite Core modules
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Gridsite Core common tasks and types definitions">
-
-<!-- ======================================================
- Subsystem task definitions
- ====================================================== -->
-
-</project>
\ No newline at end of file
+++ /dev/null
-module.version=1.6.0
-module.age=1
+++ /dev/null
-# 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 <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> 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 =
+++ /dev/null
-#
-# Andrew McNab and Shiv Kaushal, University of Manchester.
-# Copyright (c) 2002-7. 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 libdir
-export libdir=lib
-endif
-
-ifndef MYCFLAGS
-export MYCFLAGS=-I. -I../interface $(HTTPD_FLAGS) -I/usr/include/httpd -I/usr/include/apr-0 -I/usr/include/apr-1 -I/opt/glite/include -fPIC
-endif
-
-ifndef MYLDFLAGS
-export MYLDFLAGS=-L.
-endif
-
-
-
-#
-# Build
-#
-
-build: apidoc build-lib \
- htcp gridsite-copy.cgi gridsite-storage.cgi mod_gridsite.so \
- urlencode findproxyfile gsexec real-gridsite-admin.cgi
-
-build-lib: libgridsite_globus.so.$(VERSION) libgridsite_globus.a \
- libgridsite.so.$(VERSION) libgridsite.a \
- libgridsite_nossl.so.$(VERSION) libgridsite_nossl.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 grst_htcp_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_htcp_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
-
-# then build versions without OpenSSL
-
-libgridsite_nossl.so.$(VERSION): grst_err_nossl.o \
- grst_gacl_nossl.o grst_http_nossl.o \
- grst_xacml_nossl.o grst_htcp_nossl.o
- gcc -shared -Wl,-soname,libgridsite_nossl.so.$(MINOR_VERSION) \
- -o libgridsite_nossl.so.$(PATCH_VERSION) \
- grst_err_nossl.o grst_gacl_nossl.o grst_xacml_nossl.o \
- grst_http_nossl.o grst_htcp_nossl.o
- ln -sf libgridsite_nossl.so.$(VERSION) libgridsite_nossl.so
-
-libgridsite_nossl.a: grst_err_nossl.o grst_gacl_nossl.o grst_http_nossl.o
- ar src libgridsite_nossl.a \
- grst_err_nossl.o grst_gacl_nossl.o grst_http_nossl.o grst_htcp_nossl.o
-
-grst_err_nossl.o: grst_err.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) -DGRST_NO_OPENSSL \
- -I/usr/kerberos/include \
- -c grst_err.c \
- -o grst_err_nossl.o
-
-grst_gacl_nossl.o: grst_gacl.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) -DGRST_NO_OPENSSL \
- -I/usr/kerberos/include `xml2-config --cflags` -c grst_gacl.c \
- -o grst_gacl_nossl.o
-
-grst_xacml_nossl.o: grst_xacml.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) -DGRST_NO_OPENSSL \
- -I/usr/kerberos/include `xml2-config --cflags` -c grst_xacml.c \
- -o grst_xacml_nossl.o
-
-grst_http_nossl.o: grst_http.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) -DGRST_NO_OPENSSL \
- -I/usr/kerberos/include -c grst_http.c \
- -o grst_http_nossl.o
-
-grst_htcp_nossl.o: grst_htcp.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) -DGRST_NO_OPENSSL \
- -I/usr/kerberos/include -c grst_htcp.c \
- -o grst_htcp_nossl.o
-
-# now the binary exectuables
-
-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
-
-htcp-static: htcp.c libgridsite.a
- gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \
- -o htcp-static htcp.c -L. \
- -I/usr/kerberos/include \
- `curl-config --cflags` `curl-config --libs` \
- -lgridsite -static
-
-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` \
- $(MYFCGILIBS) -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
-
-mod_gridsite_example.so: mod_gridsite_example.c
- gcc -g -shared -Wl,-soname=gridsite_example_module \
- -I/usr/include/httpd -I/usr/include/apr-0 \
- -DVERSION=\"$(VERSION)\" -o mod_gridsite_example.so \
- mod_gridsite_example.c
-
-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 -lpthread
-
-# 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../interface -L. \
- -I/usr/kerberos/include -lgridsite \
- -lssl -lcrypto -lxml2 -lz -lm
-
-xacmlexample: xacmlexample.c libgridsite.a
- gcc -g -o xacmlexample xacmlexample.c -I../interface -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
-
-gridsite-storage.cgi: gridsite-storage.c libgridsite.so.$(VERSION)
- gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o gridsite-storage.cgi \
- gridsite-storage.c \
- -I/usr/kerberos/include -I.\
- -I$(GRIDSITEDIR)/include \
- -DVERSION=\"$(VERSION)\" -L. \
- -L$(GRIDSITEDIR)/lib \
- -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm
-
-clean:
-
-#
-# Install
-#
-
-install: apidoc install-lib
- mkdir -p $(prefix)/include \
- $(prefix)/$(libdir) \
- $(prefix)/bin \
- $(prefix)/sbin \
- $(prefix)/share/man/man1 \
- $(prefix)/share/man/man8 \
- $(prefix)/lib/httpd/modules \
- $(prefix)/share/doc/gridsite-$(MINOR_VERSION)
- echo '#define' GRST_VERSION $(DEFVERSION) > $(prefix)/include/gridsite.h
- cat ../interface/gridsite.h >>$(prefix)/include/gridsite.h
- 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 gridsite-storage.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 \
- mod_gridsite_example.c \
- $(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)/$(libdir)
- cp -f libgridsite.a $(prefix)/$(libdir)
- cp -f libgridsite.so.$(PATCH_VERSION) $(prefix)/$(libdir)
- ln -sf libgridsite.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite.so
- ln -sf libgridsite.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite.so.$(MAJOR_VERSION)
- ln -sf libgridsite.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite.so.$(MINOR_VERSION)
- cp -f libgridsite_globus.a $(prefix)/$(libdir)
- cp -f libgridsite_globus.so.$(PATCH_VERSION) $(prefix)/$(libdir)
- ln -sf libgridsite_globus.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite_globus.so
- ln -sf libgridsite_globus.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite_globus.so.$(MAJOR_VERSION)
- ln -sf libgridsite_globus.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite_globus.so.$(MINOR_VERSION)
- cp -f libgridsite_nossl.a $(prefix)/$(libdir)
- cp -f libgridsite_nossl.so.$(PATCH_VERSION) $(prefix)/$(libdir)
- ln -sf libgridsite_nossl.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite_nossl.so
- ln -sf libgridsite_nossl.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite_nossl.so.$(MAJOR_VERSION)
- ln -sf libgridsite_nossl.so.$(PATCH_VERSION) \
- $(prefix)/$(libdir)/libgridsite_nossl.so.$(MINOR_VERSION)
-
-install-slashgrid: slashgrid
- cp -f slashgrid $(prefix)/sbin
- cp -f slashgrid.init $(RPM_BUILD_ROOT)/etc/rc.d/init.d/slashgrid
- cp -f ../doc/slashgrid.8.html $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \
- cp -f ../doc/slashgrid.8 $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \
- cp -f ../doc/slashgrid.8 $(prefix)/share/man/man8
- gzip -f $(prefix)/share/man/man8/slashgrid.8
- mkdir -p $(RPM_BUILD_ROOT)/var/spool/slashgrid
-
-install-ws: gridsite-delegation.cgi htproxyput
- mkdir -p $(prefix)/include \
- $(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 htproxyinfo.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
- ln -sf htproxyput $(prefix)/bin/htproxyinfo
- 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 gridsite-storage.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)
-
-
+++ /dev/null
-//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 { } *);
+++ /dev/null
-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 }
+++ /dev/null
-<p><a href=http://www.gridsite.org/>GridSite</a> Version 1.1.x
+++ /dev/null
-/*
- 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 <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <getopt.h>
-
-#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;
-}
+++ /dev/null
-/*
- Copyright (c) 2002-7, 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 <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <gridsite.h>
-
-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 = GRSTgaclCredCreate("dn:", "/O=Grid/CN=Mr%20Grid%20Person");
-
- /* create an entry to put it in */
-
- entry = GRSTgaclEntryNew();
-
- /* add the credential to it */
-
- GRSTgaclEntryAddCred(entry, cred);
-
- /* add another credential */
-
- cred = GRSTgaclCredCreate("https://example-dn-list", NULL); /* DN List */
- GRSTgaclEntryAddCred(entry, cred);
-
- fp = fopen("https%3A%2F%2Fexample-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("\n**** perm should be %d in the following tests! ****\n\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 */
-
- /* old style cred creation: use GRSTgaclCredCreate as above now */
- usercred = GRSTgaclCredNew("person");
- GRSTgaclCredAddValue(usercred, "dn", "/O=Grid/CN=Mr Grid Person");
- /* end of old style cred creation */
-
- 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, perm = %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, perm = %d\n", perm2);
-
- if (perm1 != perm0) return 1;
- if (perm2 != perm0) return 2;
-
- return 0;
-}
+++ /dev/null
-/*
- 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
-//
-///////////////////////////////////////////////////////////////////
-#ifdef GRST_USE_FASTCGI
-#include <fcgi_stdio.h>
-#endif
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-#include <stdlib.h>
-#include <curl/curl.h>
-#include <sys/types.h>
-#include <sys/times.h>
-
-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 gridsite_copy()
-{
- 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("<html><head><title>HTTP COPY</title></head>\n");
- printf("<body><h1>HTTP FILE COPY</h1>\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 += 20;
- 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("</body></html>\n");
- return 0;
-}
-
-int main( void )
-{
-#ifdef GRST_USE_FASTCGI
- while(FCGI_Accept() >= 0)
-#endif
- {
- gridsite_copy();
- }
-}
+++ /dev/null
-/*
- Copyright (c) 2002-7, 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 <pwd.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <string.h>
-#include <malloc.h>
-#include <dirent.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/select.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <curl/curl.h>
-
-#include "gridsite.h"
-
-#define HTCP_SITECAST_GROUPS 32
-
-struct grst_sitecast_group { unsigned char quad1; unsigned char quad2;
- unsigned char quad3; unsigned char quad4;
- int port; int timewait; int ttl; }
- sitecast_groups[HTCP_SITECAST_GROUPS];
-int last_group;
-
-void handle_sitecast_get(void)
-{
- int request_length, response_length, i, ret, s;
- struct sockaddr_in srv, from;
- socklen_t fromlen;
-#define MAXBUF 8192
- char *https, *server_port, *request_uri, *url, *sitecast_port,
- *sitecast_domain, *request, response[MAXBUF], *p, *groups;
- GRSThtcpMessage msg;
- struct timeval start_timeval, wait_timeval;
- fd_set readsckts;
-
- sitecast_domain = getenv("SITECAST_DOMAIN");
- if (sitecast_domain == NULL)
- {
- puts("Status: 500 Internal Server Error\n"
- "Content-Type: text/plain\n\n"
- "No SITECAST_DOMAIN defined");
- return;
- }
-
- sitecast_port = getenv("SITECAST_PORT");
- if (sitecast_port == NULL)
- {
- puts("Status: 500 Internal Server Error\n"
- "Content-Type: text/plain\n\n"
- "No SITECAST_PORT defined");
- return;
- }
-
- request_uri = getenv("REQUEST_URI");
- https = getenv("HTTPS");
-
- if (request_uri == NULL)
- {
- puts("Status: 500 Internal Server Error\n"
- "Content-Type: text/plain\n\n"
- "REQUEST_URI not found");
- return;
- }
-
- if (https == NULL) asprintf(&url, "http://%s:%s%s",
- sitecast_domain, sitecast_port, request_uri);
- else asprintf(&url, "https://%s:%s%s",
- sitecast_domain, sitecast_port, request_uri);
-
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- {
- puts("Status: 500 Internal Server Error\n"
- "Content-Type: text/plain\n\n"
- "Failed to open UDP socket");
- return;
- }
-
- /* loop through multicast groups since we need to take each
- ones timewait into account */
-
- gettimeofday(&start_timeval, NULL);
-
- for (i=0; i <= last_group; ++i)
- {
-/*
- if (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 query for this group */
-
- GRSThtcpTSTrequestMake(&request, &request_length,
- (int) (start_timeval.tv_usec),
- "GET", 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 = 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 (verbose > 0)
- fprintf(stderr, "Sitecast %s -> %.*s\n",
- *source_ptr,
- GRSThtcpCountstrLen(msg.resp_hdrs) - 12,
- &(msg.resp_hdrs->text[10]));
-*/
- free(url);
-
- printf("Status: 302 Moved\nLocation: %.*s\n\n",
- GRSThtcpCountstrLen(msg.resp_hdrs) - 12,
- &(msg.resp_hdrs->text[10]));
-
- return;
- }
- }
- }
- }
-
- free(url);
- puts("Status: 404 Not Found\nContent-Type: text/plain\n\nNot found");
-}
-
-
-int main()
-{
- int ret;
- char *method, *groups, *p;
-
- groups = getenv("SITECAST_GROUPS");
- if (groups == NULL)
- {
- puts("Status: 500 Internal Server Error\n"
- "Content-Type: text/plain\n\n"
- "No SITECAST_GROUPS defined");
- return 0;
- }
-
- p = groups;
-
- for (last_group=-1; last_group+1 < HTCP_SITECAST_GROUPS;)
- {
- sitecast_groups[last_group+1].port = GRST_HTCP_PORT;
- sitecast_groups[last_group+1].timewait = 1;
- sitecast_groups[last_group+1].ttl = 1;
-
- ret = sscanf(p, "%d.%d.%d.%d:%d:%d:%d",
- &(sitecast_groups[last_group+1].quad1),
- &(sitecast_groups[last_group+1].quad2),
- &(sitecast_groups[last_group+1].quad3),
- &(sitecast_groups[last_group+1].quad4),
- &(sitecast_groups[last_group+1].port),
- &(sitecast_groups[last_group+1].ttl),
- &(sitecast_groups[last_group+1].timewait));
-
- if (ret == 0) break; /* end of list ? */
-
- if (ret < 5)
- {
- puts("Status: 500 Internal Server Error\n"
- "Content-Type: text/plain\n\n"
- "Failed to parse SITECAST_GROUPS");
- return 0;
- }
-
- ++last_group;
-
- if ((p = index(p, ',')) == NULL) break;
- ++p;
- }
-
- if (last_group == -1)
- {
- puts("Status: 500 Internal Server Error\n"
- "Content-Type: text/plain\n\n"
- "No groups found in SITECAST_GROUPS");
- return;
- }
-
- method = getenv("REQUEST_METHOD");
-
- if ((method != NULL) && (strcmp(method, "GET") == 0))
- {
- handle_sitecast_get();
- return 0;
- }
-
- puts("Status: 400 Bad Request\n");
- return 0;
-}
+++ /dev/null
-/*
- 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 <stdio.h>
-
-#include <time.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <gridsite.h>
-
-#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;
-
- for (i=0; ; ++i)
- {
- asprintf(&p, "GRST_CRED_AURI_%d", i);
- s = getenv(p);
- free(p);
-
- if (s == NULL) break;
-
- if (strncmp(s, "dn:", 3) == 0)
- {
- dn = strdup(&s[2]);
- return dn;
- }
- }
-
- 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;
-}
+++ /dev/null
-/*
- 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);
-
+++ /dev/null
-/*
- 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 <stdio.h>
-#include <time.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <fcntl.h>
-
-// when porting: remember that sendfile() is very OS-specific!
-#include <sys/sendfile.h>
-
-#include <gridsite.h>
-
-#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[1086], *filename = NULL,
- tmpfilename[1025], *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,"<title>Forbidden filename %s</title>\n", filename);
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Forbidden filename %s</h1>\n",
- filename);
-
- GRSThttpPrintf(&bp,
- "<p align=center>New file names cannot include slashes "
- "or use the reserved ACL name, %s\n", GRST_ACL_FILE);
-
- GRSThttpPrintf(&bp,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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, "<title>Failed to upload</title>\n");
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Failed to upload</h1>\n");
-
- GRSThttpPrintf(&bp, "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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 ((file[0] == '\0') ||
- ((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, "<title>Error deleting %s%s</title>\n", dir_uri, file);
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Error deleting %s%s</h1>\n",
- dir_uri, file);
-
- GRSThttpPrintf(&bp, "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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, "<title>Delete %s</title>\n", file);
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Delete %s</h1>\n", file);
-
- GRSThttpPrintf(&bp,"<form action=\"%s%s\" method=post>\n",dir_uri,admin_file);
- GRSThttpPrintf(&bp,"<h2 align=center>Do you really want to delete %s?", file);
- GRSThttpPrintf(&bp,"<p align=center><input type=submit value=\"Yes, delete %s\"></h2>\n", file);
- GRSThttpPrintf(&bp,"<input type=hidden name=file value=\"%s\">\n", file);
- GRSThttpPrintf(&bp,"<input type=hidden name=cmd value=deleteaction>\n");
- GRSThttpPrintf(&bp,"</form>\n");
-
- GRSThttpPrintf(&bp,"<p align=center>Or "
- "<a href=\"%s%s?cmd=managedir\">return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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, "<title>Rename %s</title>\n", file);
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Rename %s%s</h1>\n", dir_uri, file);
-
- GRSThttpPrintf(&bp,"<form action=\"%s%s\" method=post>\n",dir_uri,admin_file);
- GRSThttpPrintf(&bp,"<h2 align=center>What do you want to rename %s to?</h2>", file);
- GRSThttpPrintf(&bp,"<input type=hidden name=file value=\"%s\">\n", file);
- GRSThttpPrintf(&bp,"<p align=center>New name: <input type=text name=newfile value=\"%s\">\n", file);
- GRSThttpPrintf(&bp,"<input type=submit value=\"Rename\">\n");
- GRSThttpPrintf(&bp,"<input type=hidden name=cmd value=renameaction>\n");
- GRSThttpPrintf(&bp,"</form>\n");
-
- GRSThttpPrintf(&bp,"<p align=center>Or "
- "<a href=\"%s%s?cmd=managedir&diruri=%s\">return to "
- "directory listing</a>\n", dir_uri, admin_file, dir_uri);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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 ((file[0] == '\0') ||
- !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,"<title>Error writing %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Error writing %s%s</h1>\n",
- dir_uri, file);
-
- GRSThttpPrintf(&bp,
- "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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,"<title>Error creating %s%s</title>\n", dir_uri,
- GRST_ACL_FILE);
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Error creating %s%s</h1>\n",
- dir_uri, GRST_ACL_FILE);
-
- GRSThttpPrintf(&bp, "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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 (file[0] == '\0') 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 ((index(newfile, '/') != NULL) ||
- (index(newfile, '<') != NULL) ||
- (index(newfile, '>') != NULL) ||
- (index(newfile, '&') != NULL) ||
- (index(newfile, '"') != NULL)) newfile[0] = '\0';
-
- if ((newfile[0] == '\0') ||
- (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,"<title>Error renaming %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Error renaming %s%s</h1>\n",
- dir_uri, file);
-
- GRSThttpPrintf(&bp, "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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,"<title>Error create %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Error creating directory %s%s</h1>\n",
- dir_uri, file);
-
- GRSThttpPrintf(&bp,
- "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "parent directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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,"<title>Error writing %s</title>\n", file);
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Error writing %s to %s</h1>\n",
- file, dir_uri);
-
- GRSThttpPrintf(&bp, "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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,"<title>Error writing %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1 align=center>Error writing %s%s</h1>\n",
- dir_uri, file);
-
- GRSThttpPrintf(&bp, "<p align=center>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,"<p align=center>"
- "<a href=\"%s%s?cmd=managedir\">Return to "
- "directory listing</a>\n", dir_uri, admin_file);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
- GRSThttpPrintFooter(&bp, dir_path);
-
- 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 c;
- char *dir_path_file;
- FILE *fp;
- struct stat statbuf;
-
- if (!GRSTgaclPermHasRead(perm)) GRSThttpError("403 Forbidden");
-
- if (file[0] == '\0') 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) ||
- !S_ISREG(statbuf.st_mode)) GRSThttpError("403 Forbidden");
-
- fp = fopen(dir_path_file, "r");
- if (fp == NULL) GRSThttpError("500 Internal server error");
-
- printf("Status: 200 OK\nContent-Type: text/html\nContent-Length: %d\n\n",
- statbuf.st_size);
-
- while ((c = fgetc(fp)) != EOF) putchar(c);
-
- fflush(stdout);
- fclose(fp);
-}
-
-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 (file[0] == '\0') GRSThttpError("403 Forbidden");
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
- GRSThttpPrintf(&bp, "<title>History of %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeader(&bp, dir_path);
- GRSThttpPrintf(&bp,
- "<h1 align=center>History of <a href=\"%s%s\">%s%s</a></h1>\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, "<p align=center>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,
- "<p align=center><table border=1 cellpadding=5>\n"
- "<tr><td>Date</td><td>Size after</td>"
- "<td colspan=2>Changed by</td></tr>\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,
- "<tr><td>%s</td><td align=right>%d</td><td>%s</td>\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, "<td><a href=\"");
- if (strcmp (file, GRST_ACL_FILE)==0)
- GRSThttpPrintf(&bp, "%s%s?cmd=acl_history&dir_uri=%s&file=%s\">View</a></td></tr>\n",
- dir_uri, admin_file, dir_uri, namelist[i]->d_name);
- else GRSThttpPrintf(&bp, "%s%s\">View</a></td></tr>\n",
- dir_uri, namelist[i]->d_name);
- }
- else GRSThttpPrintf(&bp, "<td> </td></tr>");
-
- free(vfile);
- }
- }
- }
-
- if (num > 0) GRSThttpPrintf(&bp, "</table>\n");
- else GRSThttpPrintf(&bp, "<p align=center>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);
-
- GRSThttpPrintFooter(&bp, dir_path);
- 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 (file[0] == '\0') GRSThttpError("403 Forbidden");
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
- GRSThttpPrintf(&bp, "<title>Contents of %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeader(&bp, dir_path);
- GRSThttpPrintf(&bp,
- "<h1 align=center>Contents of ZIP file <a href=\"%s%s\">%s%s</a></h1>\n",
- dir_uri, file, dir_uri, file);
-
- unzip = getenv("GRST_UNZIP");
- if (unzip == NULL) unzip = getenv("REDIRECT_GRST_UNZIP");
-
- if (unzip != NULL)
- {
- GRSThttpPrintf(&bp, "<center><table><tr><td><pre>\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, "</pre></td></tr></table></center>\n");
-
- if (GRSTgaclPermHasWrite(perm))
- GRSThttpPrintf(&bp,
- "<p><center><form action=\"%s%s\" method=post>"
- "<input type=submit value=\"Unzip this file\"> in %s"
- "<input type=hidden name=cmd value=unzipfile>"
- "<input type=hidden name=file value=\"%s\"></form>"
- "<p>(All files are placed in the same directory and files "
- "beginning with "." are ignored.)</center>\n",
- dir_uri, admin_file, dir_uri, file);
- }
- else GRSThttpPrintf(&bp, "<p align=center>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);
-
- GRSThttpPrintFooter(&bp, dir_path);
- 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 (file[0] == '\0') GRSThttpError("403 Forbidden");
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
- GRSThttpPrintf(&bp, "<title>Unzipping %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeader(&bp, dir_path);
- GRSThttpPrintf(&bp,
- "<h1 align=center>Unzipping <a href=\"%s%s\">%s%s</a></h1>\n",
- dir_uri, file, dir_uri, file);
-
- unzip = getenv("GRST_UNZIP");
- if (unzip == NULL) unzip = getenv("REDIRECT_GRST_UNZIP");
-
- if (unzip != NULL)
- {
- GRSThttpPrintf(&bp, "<center><table><tr><td><pre>\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, "</pre></td></tr></table></center>\n");
-
- if (GRSTgaclPermHasList(perm))
- GRSThttpPrintf(&bp, "<p align=center>"
- "<b><a href=\"%s%s?cmd=managedir\">Back to "
- "directory</a></b>", dir_uri, admin_file);
- }
- else GRSThttpPrintf(&bp, "<p align=center>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);
-
- GRSThttpPrintFooter(&bp, dir_path);
- 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 (file[0] == '\0') 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, "<title>Edit file %s</title>\n", file);
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1>Edit file %s</h1>\n", file);
-
- GRSThttpPrintf(&bp,"<form action=\"%s%s\" method=post>\n",dir_uri,admin_file);
- GRSThttpPrintf(&bp,"<p><input type=submit value=\"Save changes\">\n");
- GRSThttpPrintf(&bp,"<p>File name: <input type=text name=file value=\"%s\">\n", file);
- GRSThttpPrintf(&bp,"<input type=hidden name=cmd value=editaction>\n");
- GRSThttpPrintf(&bp,"<p><textarea name=pagetext cols=80 rows=22>");
-
- if (fp != NULL)
- {
- rawpagesize = statbuf.st_size + 1000;
- rawpage = malloc(rawpagesize);
-
- i = 0;
-
- while ((c = fgetc(fp)) != EOF)
- {
- if (c == '<') { strcpy(&rawpage[i], "<");
- i += 4; }
- else if (c == '>') { strcpy(&rawpage[i], ">");
- i += 4; }
- else if (c == '&') { strcpy(&rawpage[i], "&");
- i += 5; }
- else if (c == '"') { strcpy(&rawpage[i], """);
- i += 6; }
- else { rawpage[i] = c;
- i += 1; }
-
- if (i >= rawpagesize - 7)
- {
- rawpagesize += 1000;
- rawpage = realloc(rawpage, rawpagesize);
- }
- }
-
- rawpage[i] = '\0';
-
- GRSThttpPrintf(&bp, "%s", rawpage);
- }
-
- GRSThttpPrintf(&bp, "</textarea>\n");
- GRSThttpPrintf(&bp, "<p><input type=submit value=\"Save changes\">\n");
- GRSThttpPrintf(&bp, "</form>\n");
-
- if (fp != NULL) fclose(fp);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
-
- GRSThttpPrintFooter(&bp, dir_path);
- 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 ((file[0] == '\0') ||
- !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, "<title>Edit DN List %s</title>\n", file);
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1>Edit DN List</h1>\n");
-
- GRSThttpPrintf(&bp,"<form action=\"%s%s\" method=post>\n",dir_uri,admin_file);
- GRSThttpPrintf(&bp,"<p><input type=submit value=\"Update\">\n");
- GRSThttpPrintf(&bp,"<p>List URL: <input type=text name=file value=\"%s\" "
- "size=%d>\n", file, strlen(file));
- GRSThttpPrintf(&bp,"<input type=hidden name=cmd value=editdnlistaction>\n");
-
- if (fp != NULL)
- {
- GRSThttpPrintf(&bp, "<p><table>\n<tr><th>Keep?</th>"
- "<th>Name</th></tr>\n");
-
- while (fgets(oneline, sizeof(oneline), fp) != NULL)
- {
- ++numdn;
-
- p = rindex(oneline, '\n');
- if (p != NULL) *p = '\0';
-
- GRSThttpPrintf(&bp, "<tr><td align=center><input type=checkbox "
- "name=\"dn%d\" value=\"%s\" checked></td>"
- "<td>%s</td></tr>\n", numdn, oneline, oneline);
- }
-
- GRSThttpPrintf(&bp,"</table>\n");
- }
-
- GRSThttpPrintf(&bp,"<input type=hidden name=numdn value=\"%d\">\n", numdn);
-
- GRSThttpPrintf(&bp, "<p>Add new DN: <input type=text name=add "
- "size=60 maxlength=512>\n");
-
- GRSThttpPrintf(&bp,"<p><input type=submit value=\"Update\">\n");
- GRSThttpPrintf(&bp, "</form>\n");
-
- if (fp != NULL) fclose(fp);
-
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
-
- GRSThttpPrintFooter(&bp, dir_path);
- GRSThttpWriteOut(&bp);
-}
-
-void managedir(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *dir_uri, char *admin_file)
-{
- int n, numfiles;
- char *d_namepath, modified[99], *absaclpath, *editable, *p, *unzip,
- *d_name;
- 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");
-
- printf("Status: 200 OK\nContent-Type: text/html\n");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Manage directory %s</title>\n", dir_uri);
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1>Manage directory %s</h1>\n<table>\n", dir_uri);
-
- if (dir_uri[1] != '\0')
- GRSThttpPrintf(&bp,
- "<tr><td colspan=3>[<a href=\"../%s?cmd=managedir\">Parent "
- "directory</a>]</td></tr>\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),
- "<td align=right>%R</td><td align=right>%e %b %y</td>",
- &mtime_tm);
-
- GRSThttpPrintf(&bp,
- "<tr><td><a href=\"%s\">%s</a></td>"
- "<td align=right>%ld</td>%s\n",
- GRST_ACL_FILE,
- GRST_ACL_FILE,
- statbuf.st_size, modified);
-
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=history&file=%s\">"
- "History</a></td>",
- dir_uri, admin_file, GRST_ACL_FILE);
-
- if (GRSTgaclPermHasAdmin(perm))
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=admin_acl\">Edit</a></td>"
- "<td><a href=\"%s%s?cmd=delete&file=%s\">Delete</a></td>",
- dir_uri, admin_file,
- dir_uri, admin_file, GRST_ACL_FILE);
- else if (GRSTgaclPermHasRead(perm))
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=show_acl\">View</a></td>"
- "<td> </td>", dir_uri, admin_file);
- else GRSThttpPrintf(&bp, "<td> </td><td> </td>\n");
-
- GRSThttpPrintf(&bp, "<td> </td></tr>\n");
- }
- else if (GRSTgaclPermHasAdmin(perm))
- GRSThttpPrintf(&bp, "<form method=post action=\"%s%s\">\n"
- "<tr><td colspan=8><input type=submit value=\"Create .gacl\"></td>\n"
- "<input type=hidden name=cmd value=\"create_acl\"></tr></form>\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),
- "<td align=right>%R</td><td align=right>%e %b %y</td>",
- &mtime_tm);
-
- if (S_ISDIR(statbuf.st_mode))
- {
- GRSThttpPrintf(&bp,
- "<tr><td><a href=\"%s%s/%s?cmd=managedir\">"
- "%s/</a></td>"
- "<td align=right>%ld</td>%s\n<td colspan=2> </td>",
- dir_uri, namelist[n]->d_name, admin_file,
- namelist[n]->d_name,
- statbuf.st_size, modified);
-
- if (numfiles == 0)
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=delete&file=%s\">"
- "Delete</a></td>\n",
- dir_uri, admin_file, namelist[n]->d_name);
- else GRSThttpPrintf(&bp, "<td> </td>\n");
-
- GRSThttpPrintf(&bp, "<td> </td></tr>\n");
- }
- else /* regular file */
- {
- d_name = namelist[n]->d_name;
-
- GRSThttpPrintf(&bp,
- "<tr><td><a href=\"%s%s\">%s</a></td>"
- "<td align=right>%ld</td>%s",
- dir_uri, d_name,
- d_name,
- statbuf.st_size, modified);
-
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=history&file=%s\">"
- "History</a></td>",
- dir_uri, admin_file, GRSThttpUrlEncode(d_name));
-
- p = rindex(namelist[n]->d_name, '.');
-
- if ((unzip != NULL) &&
- (p != NULL) &&
- (strcasecmp(&p[1], "zip") == 0) &&
- GRSTgaclPermHasRead(perm))
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=ziplist&file=%s\">"
- "List</a></td>\n",
- dir_uri, admin_file, GRSThttpUrlEncode(d_name));
- else if ((p != NULL) &&
- (strstr(editable, &p[1]) != NULL) &&
- GRSTgaclPermHasWrite(perm))
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=edit&file=%s\">"
- "Edit</a></td>\n",
- dir_uri, admin_file, GRSThttpUrlEncode(d_name));
- else GRSThttpPrintf(&bp, "<td> </td>");
-
- if (GRSTgaclPermHasWrite(perm))
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=delete&file=%s\">"
- "Delete</a></td>\n", dir_uri, admin_file, GRSThttpUrlEncode(d_name));
- else
- GRSThttpPrintf(&bp, "<td> </td>\n");
-
- if (GRSTgaclPermHasWrite(perm))
- GRSThttpPrintf(&bp,
- "<td><a href=\"%s%s?cmd=rename&file=%s\">"
- "Rename</a></td></tr>\n", dir_uri, admin_file, GRSThttpUrlEncode(d_name));
- else
- GRSThttpPrintf(&bp, "<td> </td></tr>");
- }
- }
-
- free(namelist[n]);
- }
-
- free(namelist);
- }
-
- if (GRSTgaclPermHasWrite(perm))
- {
- GRSThttpPrintf(&bp, "<form method=post action=\"%s%s\">\n"
- "<tr><td colspan=8><hr width=\"75%\"></td></tr>\n"
- "<tr><td>New name:</td>"
- "<td colspan=3><input type=text name=file size=25>\n"
- "<td colspan=2 align=center><input type=submit name=button value=\"New file\"></td>\n"
- "<td colspan=2 align=center><input type=submit name=button value=\"New directory\"></td>\n"
- "<input type=hidden name=cmd value=edit></td></tr></form>\n",
- dir_uri, admin_file);
-
- GRSThttpPrintf(&bp,
- "<form method=post action=\"%s%s\" enctype=\"multipart/form-data\">\n"
- "<tr><td colspan=8><hr width=\"75%\"></td></tr>\n"
- "<tr><td rowspan=2>Upload file:</td>"
- "<td colspan=2>New name:</td>"
- "<td colspan=6><input type=text name=file size=25> "
- "<input type=submit value=Upload></td></tr>\n"
- "<tr><td colspan=2>Local name:</td>"
- "<td colspan=6><input type=file name=uploadfile size=25></td></tr>\n"
- "</form>\n", dir_uri, admin_file);
- }
-
- GRSThttpPrintf(&bp, "</table>\n");
-
- adminfooter(&bp, dn, help_uri, dir_uri, NULL);
-
- GRSThttpPrintFooter(&bp, dir_path);
- GRSThttpWriteOut(&bp);
-}
-
-int userisgroupadmin(GRSTgaclUser *user, char *adminrole, char *uri)
-{
- char *uri_workspace, *p;
-
- if (uri[strlen(uri) - 1] == '/')
- asprintf(&uri_workspace, "%sRole=%s", uri, adminrole);
- else asprintf(&uri_workspace, "%s/Role=%s", uri, adminrole);
-
- while (1)
- {
- if (GRSTgaclUserHasAURI(user, uri_workspace))
- {
- free(uri_workspace);
- return 1;
- }
-
- p = rindex(uri_workspace, '/');
- if (p == NULL)
- {
- free(uri_workspace);
- return 0;
- }
-
- *p = '\0';
- strcat(uri_workspace, "/Role=");
- strcat(uri_workspace, adminrole);
- }
-}
-
-void managednlists(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm,
- char *help_uri, char *dir_path,
- char *dir_uri, char *admin_file)
-{
- int n, enclen, numfiles, encprefixlen, has_any_admin = 0;
- char *d_namepath, modified[99], *p, *adminrole, *dnlists_path,
- *dnlistsuri, *d_name, *server_name, *fulluri, *encfulluri,
- *encprefix, *dnlistsprefix, *unencuri;
- GRSThttpBody bp;
- struct tm mtime_tm;
- struct stat statbuf;
- struct dirent **namelist, *subdirfile_ent;
- DIR *subDIR;
-
- /* need to have got GACL list permission from somewhere,
- but we dont use GACL permissions apart from this */
-
- if (!GRSTgaclPermHasList(perm)) GRSThttpError("403 Forbidden");
-
- p = getenv("REDIRECT_GRST_DN_LISTS");
-
- if (p == NULL) p = getenv("GRST_DN_LISTS");
-
- if (p == NULL) p = GRST_DN_LISTS;
-
- dnlists_path = strdup(p);
-
- p = index(dnlists_path, ':');
- if (p != NULL) *p = '\0';
-
- dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI");
- if (dnlistsuri == NULL) dnlistsuri = getenv("GRST_DN_LISTS_URI");
-
- adminrole = getenv("REDIRECT_GRST_DN_LISTS_ADMIN_ROLE");
- if (adminrole == NULL) adminrole = getenv("GRST_DN_LISTS_ADMIN_ROLE");
-
- server_name = getenv("SERVER_NAME");
- asprintf(&dnlistsprefix, "https://%s%s", server_name, dnlistsuri);
- encprefix = GRSThttpUrlEncode(dnlistsprefix);
- encprefixlen = strlen(encprefix);
-
-// asprintf(&fulluri, "https://%s%s", server_name, dir_uri);
-// encfulluri = GRSThttpUrlEncode(fulluri);
-// enclen = strlen(encfulluri);
-
- printf("Status: 200 OK\nContent-Type: text/html\n");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Manage DN lists</title>\n");
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- GRSThttpPrintf(&bp, "<h1>Manage DN lists</h1>\n<table>\n");
-
- n = scandir(dnlists_path, &namelist, 0, alphasort);
- while (n--)
- {
- if (namelist[n]->d_name[0] == '.') continue;
-
- if (strncmp(namelist[n]->d_name, encprefix, encprefixlen) != 0) continue;
-
- unencuri = GRSThttpUrlDecode(namelist[n]->d_name);
-
- if (userisgroupadmin(user, adminrole, unencuri))
- {
- has_any_admin = 1;
-
- localtime_r(&(statbuf.st_mtime), &mtime_tm);
- strftime(modified, sizeof(modified),
- "<td align=right>%R</td><td align=right>%e %b %y</td>",
- &mtime_tm);
-
- GRSThttpPrintf(&bp, "<tr><td><a href=\"%s\">%s</a></td>"
- "<td align=right>%ld</td>%s"
- "<td> </td>",
- unencuri, unencuri,
- statbuf.st_size, modified);
-
- GRSThttpPrintf(&bp,
- "<form action=\"./%s\" method=post>"
- "<td><input type=submit value=Edit></td>"
- "<input type=hidden name=cmd value=editdnlist>"
- "<input type=hidden name=file value=\"%s\">"
- "</form>\n",
- admin_file, unencuri);
-
- GRSThttpPrintf(&bp,
- "<form action=\"./%s\" method=post>"
- "<td><input type=submit value=Delete></td>"
- "<input type=hidden name=cmd value=delete>"
- "<input type=hidden name=file value=\"%s\">"
- "</form>\n",
- admin_file, unencuri);
-
- GRSThttpPrintf(&bp, "<td> </td></tr>");
- }
-
- free(unencuri);
- free(namelist[n]);
- }
-
- free(namelist);
-
- if (has_any_admin)
- {
- GRSThttpPrintf(&bp, "<form method=post action=\"./%s\">\n"
- "<tr><td colspan=4>New DN list name: "
- "<input type=text name=file value=\"%s\" size=%d>\n"
- "<input type=hidden name=cmd value=editdnlist></td>"
- "<td colspan=2 align=center><input type=submit value=Create></td>\n"
- "</tr></form>\n",
- admin_file, dnlistsprefix, strlen(dnlistsprefix)+8);
- }
-
- GRSThttpPrintf(&bp, "</table>\n");
-
-// change everywhere else too!
- GRSThttpPrintFooter(&bp, dir_path);
- GRSThttpWriteOut(&bp);
-}
-
+++ /dev/null
-/*
- Copyright (c) 2003-7, Shiv Kaushal and 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/ *
-*------------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <gridsite.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-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, 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;
- 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 !!!<br>\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<br>\n");
- adminfooter(&bp, dn, help_uri, dir_uri, NULL);
- GRSThttpPrintFooter(&bp, dir_path);
- GRSThttpWriteOut(&bp);
- return;
- }
-
- if (admin) GRSThttpPrintf (&bp,"<a href=\"%s%s?cmd=new_entry_form&diruri=%s×tamp=%d\">New Entry</a><br>\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,"<br>Entry %d:\n", entry_no);
- if (admin){
- GRSThttpPrintf (&bp,"<a href=\"%s%s?cmd=edit_entry_form&entry_no=%d&diruri=%s×tamp=%d\">Edit Entry</a> ", dir_uri, admin_file, entry_no, dir_uri, timestamp );
- GRSThttpPrintf (&bp,"<a href=\"%s%s?cmd=del_entry_sure&entry_no=%d&diruri=%s×tamp=%d\">Delete Entry</a> ",dir_uri, admin_file, entry_no, dir_uri, timestamp );
- GRSThttpPrintf (&bp,"<p>\n");
- }
-
- GRSTgaclCredTableStart(&bp);
-
- // Start with the first credential in the entry and work through
- cred=entry->firstcred;
- cred_no=1;
- while (cred!=NULL){
- GRSTgaclCredTableAdd(user, entry, cred, 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,"<a href=\"%s%s?cmd=admin_acl&diruri=%s×tamp=%d\">Admin Mode</a>", dir_uri, admin_file, dir_uri, timestamp );
- if (history_mode==1 && GRSTgaclUserHasAURI(user, getenv("REDIRECT_GRST_ADMIN_LIST"))){
- StartForm(&bp, dir_uri, dir_path, admin_file, timestamp, "revert_acl");
-//GRSThttpPrintf (&bp,"<a href=\"%s%s?cmd=revert_acl&diruri=%s×tamp=%d&file=%s\">Revert to this Version</a>", dir_uri, admin_file, dir_uri, timestamp, file );
- GRSThttpPrintf (&bp, "<input type=\"hidden\" name=\"file\" value=\"%s\">\n", file);
- // Revert Button
- GRSThttpPrintf (&bp, "<p align=center><input type=\"submit\" value=\"Revert to this ACL\" name=\"B1\"></p>\n</form>\n");
- }
-
- adminfooter(&bp, dn, help_uri, dir_uri, NULL);
- GRSThttpPrintFooter(&bp, dir_path); 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;
-
- 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, "<font size=\"4\"><b>NEW ENTRY IN ACL FOR %s </b></font></p>\n", dir_uri);
-
- GRSTgaclCredTableStart(&bp);
- GRSTgaclCredTableAdd(user, entry,cred, 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 *cred_auri_1, *p;
- GRSThttpBody bp;
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- // Get new credential info and perform checks
- cred_auri_1=GRSThttpGetCGI("cred_auri_1");
-
- /* check AURI for scheme:path form */
-
- for (p=cred_auri_1; *p != '\0'; ++p) if (!isalnum(*p) && (*p != '-') && (*p != '_')) break;
-
- if ((p == cred_auri_1) || (*p != ':'))
- {
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "ERROR: CANNOT SAVE CHANGES\n\n<p>Attribute URIs must take the form scheme:path"
- "<p>For example dn:/DC=com/DC=example/CN=name or "
- "fqan:/voname/groupname or https://host.name/listname or dns:host.name.pattern or ip:ip.number.pattern\n<p>\n");
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp);
- return;
- }
-
- // Create the credential
- cred=GRSTgaclCredCreate(cred_auri_1, NULL);
-
- // 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<br>\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;
- 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, "<b><font size=\"4\">EDITING ENTRY %d IN ACL FOR %s </font></b></p>\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, "<input type=\"hidden\" name=\"entry_no\" value=\"%d\">\n", entry_no);
-
- GRSTgaclCredTableStart(&bp);
-
- while (cred!=NULL){
- // Start with the first namevalue in the credential
- GRSTgaclCredTableAdd(user, entry, cred, 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);
- GRSThttpPrintf (&bp, "<input type=\"hidden\" name=\"last_cred_no\" value=\"%d\">\n", cred_no-1);
- 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, last_cred_no;
- GRSTgaclAcl *acl;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
- char variable[30], *cred_auri_i, *p;
- 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);
- last_cred_no = atol(GRSThttpGetCGI("entry_no"));
-
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- // Reset the first credential and add in each one as they are found
- entry->firstcred = NULL;
- cred_no = 1;
-
- for (cred_no = 1; cred_no <= last_cred_no; ++cred_no)
- {
- sprintf(variable, "cred_auri_%d", cred_no);
- cred_auri_i = GRSThttpGetCGI(variable);
-
- if (cred_auri_i[0] != '\0')
- {
- /* check AURI for scheme:path form */
-
- for (p=cred_auri_i; *p != '\0'; ++p) if (!isalnum(*p) && (*p != '-') && (*p != '_')) break;
-
- if ((p == cred_auri_i) || (*p != ':'))
- {
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "ERROR: CANNOT SAVE CHANGES\n\n<p>Attribute URIs must take the form scheme:path"
- "<p>For example dn:/DC=com/DC=example/CN=name or "
- "fqan:/voname/groupname or https://host.name/listname or dns:host.name.pattern or ip:ip.number.pattern\n<p>\n");
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp);
- return;
- }
-
- if (entry->firstcred == NULL)
- {
- entry->firstcred = GRSTgaclCredCreate(cred_auri_i, NULL);
- cred = entry->firstcred;
- }
- else
- {
- cred->next = GRSTgaclCredCreate(cred_auri_i, NULL);
- cred = cred->next;
- }
- }
- }
-
- if (entry->firstcred == NULL)
- {
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "ERROR: CANNOT SAVE CHANGES\n\n<p>Each entry must include at least one valid credential (Attribute URI)\n<p>\n");
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp);
- return;
- }
-
-
- // 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;
-
- 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 <any-user> cred exists
- cred=entry->firstcred;
- while (cred!=NULL) {
- if (strcmp (cred->auri, "gacl:any-user")==0) {
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "ERROR: AND-ing \"any-user\" credential with other credential does not make sense <br>\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, " <font size=\"4\"><b>NEW CREDENTIAL IN ENTRY %d OF ACL FOR %s</b></font></p>\n", entry_no, dir_uri);
- StartForm(&bp, dir_uri, dir_path, admin_file, timestamp, "add_cred");
-
- GRSThttpPrintf (&bp, " <input type=\"hidden\" name=\"entry_no\" value=\"%d\">\n", entry_no);
-
- GRSTgaclCredTableStart(&bp);
- GRSTgaclCredTableAdd(user, entry, cred, 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 *cred_auri_1, *p;
-
- 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
- cred_auri_1=GRSThttpGetCGI("cred_auri_1");
-
- /* check AURI for scheme:path form */
-
- for (p=cred_auri_1; *p != '\0'; ++p) if (!isalnum(*p) && (*p != '-') && (*p != '_')) break;
-
- if ((p == cred_auri_1) || (*p != ':'))
- {
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "ERROR: CANNOT SAVE CHANGES\n\n<p>Attribute URIs must take the form scheme:path"
- "<p>For example dn:/DC=com/DC=example/CN=name or "
- "fqan:/voname/groupname or https://host.name/listname or dns:host.name.pattern or ip:ip.number.pattern\n<p>\n");
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp);
- return;
- }
-
- cred=GRSTgaclCredCreate(cred_auri_1, NULL);
- 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<br><a href=\"%s%s?diruri=%s&cmd=admin_acl×tamp=%d\">Click Here</a> to return to the editor", dir_uri,admin_file,dir_uri, time(NULL));
- adminfooter(bp, dn, help_uri, dir_uri, NULL);
- GRSThttpPrintFooter(bp, dir_path);
- 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;
- 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, "<h1 align=center>Do you really want to delete the following entry?</h1><br><br>\n");
- GRSThttpPrintf (&bp,"<br>Entry %d:<br>\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
- GRSTgaclCredTableAdd(user, entry, cred, 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, "<input type=\"hidden\" name=\"entry_no\" value=\"%d\">\n", entry_no);
- GRSThttpPrintf (&bp, " <p align=center><input type=\"submit\" value=\"Yes\" name=\"B1\"></p>\n</form>\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;
- 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, "<h1 align=center>Do you really want to delete the following credential from entry %d?</h1><br><br>", entry_no);
-
- // Print the credential out
- GRSTgaclCredTableStart(&bp);
- GRSTgaclCredTableAdd(user, entry, cred, 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,"<br>\n");
-
- // Yes Button
- StartForm(&bp, dir_uri, dir_path, admin_file, atol(GRSThttpGetCGI("timestamp")), "del_cred");
- GRSThttpPrintf (&bp, "<input type=\"hidden\" name=\"entry_no\" value=\"%d\">\n", entry_no);
- GRSThttpPrintf (&bp, "<input type=\"hidden\" name=\"cred_no\" value=\"%d\">\n", cred_no);
- GRSThttpPrintf (&bp, " <p align=center><input type=\"submit\" value=\"Yes\" name=\"B1\"></p>\n</form>\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, "<title>Access Control List for %s</title>\n", dir_uri);
- GRSThttpPrintHeader(bp, dir_path);
- 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, "<form method=\"POST\" action=\"%s%s?diruri=%s\">\n", dir_uri, admin_file, dir_uri);
- GRSThttpPrintf (bp, " <input type=\"hidden\" name=\"cmd\" value=\"%s\">\n", target_function);
- GRSThttpPrintf (bp, " <input type=\"hidden\" name=\"timestamp\" value=\"%d\">\n", timestamp);
- return;
-}
-
-void EndForm(GRSThttpBody *bp){
- GRSThttpPrintf (bp, " <br><input type=\"submit\" value=\"Submit\" name=\"B1\"><input type=\"reset\" value=\"Reset\" name=\"B2\"></p>\n");
- GRSThttpPrintf (bp, "</form>\n");
- return;
-}
-
-void GRSTgaclCredTableStart(GRSThttpBody *bp){
- //Starts an HTML table of credentials by setting the column widths and inputting the headings
- GRSThttpPrintf (bp,"<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\" style=\"border-collapse: collapse\" bordercolor=\"#111111\" width=\"100%\" id=\"CredentialTable\">");
- GRSThttpPrintf (bp,"<tr><td align=center width=\"15%\"><b>Credential No.</td><td align=left width=\"85%\"><b>Attribute URI</b></td></tr>");
- return;
-}
-
-void GRSTgaclCredTableAdd(GRSTgaclUser *user, GRSTgaclEntry *entry, GRSTgaclCred *cred, 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=GRSTgaclUserHasAURI(user, getenv("REDIRECT_GRST_ADMIN_LIST"));
-
- 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)
- {
- //create dummy credential for the user to edit
- cred=GRSTgaclCredCreate("", "");
- //Drop down list of types
- GRSThttpPrintf(bp,"<tr><td align=center >New</td>");
- cred_no = 1;
- }
- else
- { //Print out type and descriptor for existing cred
-
- GRSThttpPrintf(bp,"<tr><td align=center >%d", cred_no);
- if (admin) GRSThttpPrintf (bp,"<a href=\"%s%s?diruri=%s&cmd=del_cred_sure&entry_no=%d&cred_no=%d×tamp=%d\">(Delete)</a>", dir_uri,admin_file,dir_uri, entry_no, cred_no, timestamp);
- GRSThttpPrintf(bp, "</td>");
- }
-
- if (strcmp(cred->auri, "gacl:any-user")==0) GRSThttpPrintf (bp, "<td>%s", cred->auri);
- else
- {
- if (edit_values)
- { // Place AURI in an editable box if appropriate
- GRSThttpPrintf (bp, "<td align=left><input type=\"text\" name=\"cred_auri_%d\"\n", cred_no);
- GRSThttpPrintf (bp, "size=\"50\" value=\"");
- StringHTMLEncode(cred->auri, bp);
- GRSThttpPrintf (bp, "\">");
- }
- else if ((strncmp(cred->auri, "http://", 7) == 0) ||
- (strncmp(cred->auri, "https://", 8) == 0))
- {
- GRSThttpPrintf(bp, "<td align=left ><a href=\"");
- StringHTMLEncode(cred->auri, bp);
- GRSThttpPrintf(bp, " \">");
- StringHTMLEncode(cred->auri, bp);
- GRSThttpPrintf(bp, "</a>");
- }
- else
- {
- GRSThttpPrintf(bp, "<td align=left> ");
- StringHTMLEncode(cred->auri, 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, "<font color=red><b> <--</b></font>");
- GRSThttpPrintf(bp, "</td></tr>");
-}
-
-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,"</table><br>\n"); return;}
-
- GRSThttpPrintf (bp,"<tr><td align=center>");
-
- if (admin) GRSThttpPrintf (bp,"<a href=\"%s%s?diruri=%s&cmd=add_cred_form&entry_no=%d×tamp=%d\">Add Credential</a>", dir_uri,admin_file,dir_uri, entry_no, timestamp);
-
- GRSThttpPrintf (bp, "</td>\n<td align=left>");
-
- 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, "<b>Allowed:</b> ");
- 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<input type=\"checkbox\" name=\"allow_%s\" value=\"ON\" checked> \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<input type=\"checkbox\" name=\"allow_%s\" value=\"ON\" unchecked> \n", grst_perm_syms[i],grst_perm_syms[i]);
- }
-
- if (edit_perms) GRSThttpPrintf (bp, "<p>");
- GRSThttpPrintf (bp, "<b>Denied: </b>");
- 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<input type=\"checkbox\" name=\"deny_%s\" value=\"ON\" checked> \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<input type=\"checkbox\" name=\"deny_%s\" value=\"ON\" unchecked> \n", grst_perm_syms[i],grst_perm_syms[i]);
- }
-
- GRSThttpPrintf (bp, "</td></tr>");
- GRSThttpPrintf (bp,"</table><br>\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<p><p> The ACL has been modified since it was last viewed\n<p>");
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, bp);
- return;
- }
-
- // check users permissions in the new ACL
-
- if (!GRSTgaclUserHasAURI(user, getenv("REDIRECT_GRST_ADMIN_LIST")))
- {
- 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<p><p> 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<p><p> You still have Admin permissions<p>\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;
-}
+++ /dev/null
-/*
- 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 <stdio.h>
-#include <time.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <fcntl.h>
-
-// when porting: remember that sendfile() is very OS-specific!
-#include <sys/sendfile.h>
-
-#include <gridsite.h>
-
-#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("<head><title>%s</title></head>\n", status);
- printf("<body><h1 >%s</h1 ></body>\n", status);
-
- exit(0);
-}
-
-void adminfooter(GRSThttpBody *bp, char *dn, char *help_uri, char *dir_uri,
- char *admin_file)
-{
- GRSThttpPrintf(bp, "<p><small>\n");
-
- if (dn != NULL) GRSThttpPrintf(bp, "<hr>You are %s<br>\n", dn);
- else GRSThttpPrintf(bp, "<hr>\n");
-
- if (admin_file != NULL)
- GRSThttpPrintf(bp, "<a href=\"%s%s?cmd=managedir\">"
- "Manage directory</a> .\n",
- dir_uri, admin_file);
- else GRSThttpPrintf(bp, "<a href=\"%s\">"
- "Back to directory</a> .\n", dir_uri);
-
- if (help_uri != NULL)
- GRSThttpPrintf(bp, "<a href=\"%s\">Website Help</a> .\n", help_uri);
-
- if ((getenv("GRST_NO_LINK") == NULL) &&
- (getenv("REDIRECT_GRST_NO_LINK") == NULL))
- GRSThttpPrintf(bp, "Built with "
- "<a href=\"http://www.gridsite.org/\">GridSite</a> %s\n",
- VERSION);
-
- GRSThttpPrintf(bp, "</small>\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);
-
- GRSThttpPrintHeader(&bp, dir_path);
-
- 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);
-
- GRSThttpPrintFooter(&bp, dir_path);
-
- GRSThttpWriteOut(&bp);
-}
-
-int main()
-{
- int i, gsiproxylimit_i = 1, delegation = 0;
- char *cmd, *dir_uri, *file, *dir_path, *admin_file, *dn = NULL,
- *help_uri, *p, *content_type, *request_uri, *button,
- *grst_auri_i, *grst_valid_i, *gsiproxylimit, 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();
-
- gsiproxylimit = getenv("REDIRECT_GRST_GSIPROXY_LIMIT");
- if (gsiproxylimit != NULL) sscanf(gsiproxylimit, "%d", &gsiproxylimit_i);
-
- grst_auri_i = getenv("GRST_CRED_AURI_0");
- grst_valid_i = getenv("GRST_CRED_VALID_0");
-
- if ((grst_auri_i != NULL) && (strncmp(grst_auri_i, "dn:", 3) == 0))
- {
- dn = &grst_auri_i[3];
-
- sscanf(grst_valid_i,
- "notbefore=%*ld notafter=%*ld delegation=%d nist-loa=%*d",
- &delegation);
-
- if (delegation <= gsiproxylimit_i)
- {
- cred = GRSTgaclCredCreate(grst_auri_i, NULL);
- user = GRSTgaclUserNew(cred);
-
- /* User has a cert so check for VOMS attributes etc */
- for (i=1; ; i++)
- {
- sprintf (buf, "GRST_CRED_%d", i);
-
- grst_auri_i = getenv(buf);
- if (grst_auri_i == NULL) break;
-
- cred = GRSTgaclCredCreate(grst_auri_i, NULL);
- GRSTgaclUserAddCred(user, cred);
- }
-
- /* no more VOMS attributes etc found */
- }
- }
- else if ((dn = getenv("SSL_CLIENT_S_DN")) != NULL)
- {
- cred = GRSTgaclCredCreate("dn:", GRSThttpUrlMildencode(dn));
- user = GRSTgaclUserNew(cred);
- }
-
- if (GRSTgaclUserHasAURI(user, getenv("REDIRECT_GRST_ADMIN_LIST")))
- perm = GRST_PERM_ALL;
- else
- {
- p = getenv("REMOTE_HOST");
- if (p != NULL)
- {
- cred = GRSTgaclCredCreate("dns:", 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");
- button = GRSThttpGetCGI("button");
-
- file = GRSThttpGetCGI("file");
-
- if ((index(file, '/') != NULL) ||
- (index(file, '<') != NULL) ||
- (index(file, '>') != NULL) ||
- (index(file, '&') != NULL) ||
- (index(file, '"') != NULL)) file[0] = '\0';
-
- /* 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, "managednlists") == 0)
- managednlists(user, dn, perm, help_uri, dir_path, 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");
-}
+++ /dev/null
-
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <string.h>
-
-#ifndef GRST_NO_OPENSSL
-#include <openssl/x509_vfy.h>
-#include <openssl/err.h>
-#include <openssl/pem.h>
-
-#include <openssl/buffer.h>
-#include <openssl/objects.h>
-#include <openssl/asn1.h>
-#endif
-
-#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; i<bs->length; 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; i<bs->length; 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;
-}
+++ /dev/null
-/*
- 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;
+++ /dev/null
-/*
- 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 <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <unistd.h>
-#include <string.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <ctype.h>
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-#include <fnmatch.h>
-
-#include <libxml/xmlmemory.h>
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-
-#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 *GRSTgaclCredCreate(char *auri_prefix, char *auri_suffix)
-/*
- GRSTgaclCredCreate - allocate a new GRSTgaclCred structure, and return
- it's pointer or NULL on (malloc) error.
-*/
-{
- int i;
- char *auri;
- GRSTgaclCred *newcred;
-
- if ((auri_prefix != NULL) && (auri_suffix == NULL))
- auri = strdup(auri_prefix);
- else if ((auri_prefix == NULL) && (auri_suffix != NULL))
- auri = strdup(auri_suffix);
- else if ((auri_prefix != NULL) && (auri_suffix != NULL))
- asprintf(&auri, "%s%s", auri_prefix, auri_suffix);
- else return NULL;
-
- for (i=0; (auri[i] != '\0') && isspace(auri[i]); ++i) ; /* leading space */
-
- for (i=strlen(auri) - 1; (i >= 0) && isspace(auri[i]); --i)
- auri[i]='\0'; /* trailing space */
-
- newcred = malloc(sizeof(GRSTgaclCred));
- if (newcred == NULL)
- {
- free(auri);
- return NULL;
- }
-
- newcred->auri = auri;
- newcred->delegation = 0;
- newcred->nist_loa = 0;
- newcred->notbefore = 0;
- newcred->notafter = 0;
- newcred->next = NULL;
-
- return newcred;
-}
-
-GRSTgaclCred *GRSTgaclCredNew(char *type)
-/*
- GRSTgaclCredNew - allocate a new GRSTgaclCred structure, and return
- it's pointer or NULL on (malloc) error.
-*/
-{
- if (type == NULL) return NULL;
-
- if ((strcmp(type, "person" ) == 0) ||
- (strcmp(type, "voms" ) == 0) ||
- (strcmp(type, "dn-list") == 0) ||
- (strcmp(type, "dns" ) == 0) ||
- (strcmp(type, "level" ) == 0)) return GRSTgaclCredCreate("", NULL);
-
- if (strcmp(type, "any-user") == 0)
- return GRSTgaclCredCreate("gacl:", "any-user");
-
- if (strcmp(type, "auth-user") == 0)
- return GRSTgaclCredCreate("gacl:", "auth-user");
-
- return NULL;
-}
-
-int GRSTgaclCredAddValue(GRSTgaclCred *cred, char *name, char *rawvalue)
-/*
- GRSTgaclCredAddValue - add a name/value pair to a GRSTgaclCred
-*/
-{
- int i;
- char *value, *encoded_value;
-
- if ((cred == NULL) || (cred->auri == NULL)) return 0;
- free(cred->auri);
- cred->auri = NULL;
-
- /* 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';
-
- encoded_value = GRSThttpUrlMildencode(value);
-
- if (strcmp(name, "dn") == 0)
- {
- asprintf(&(cred->auri), "dn:%s", encoded_value);
- free(value);
- free(encoded_value);
- return 1;
- }
- else if (strcmp(name, "fqan") == 0)
- {
- asprintf(&(cred->auri), "fqan:%s", encoded_value);
- free(value);
- free(encoded_value);
- return 1;
- }
- else if (strcmp(name, "url") == 0)
- {
- asprintf(&(cred->auri), "%s", encoded_value);
- free(value);
- free(encoded_value);
- return 1;
- }
- else if (strcmp(name, "hostname") == 0)
- {
- asprintf(&(cred->auri), "dns:%s", encoded_value);
- free(value);
- free(encoded_value);
- return 1;
- }
- else if (strcmp(name, "nist-loa") == 0)
- {
- asprintf(&(cred->auri), "nist-loa:%s", encoded_value);
- free(value);
- free(encoded_value);
- return 1;
- }
-
- free(value);
- free(encoded_value);
- return 0;
-}
-
-int GRSTgaclCredFree(GRSTgaclCred *cred)
-/*
- GRSTgaclCredFree - free memory structures of a GRSTgaclCred,
- returning 1 always!
-*/
-{
- if (cred == NULL) return 1;
-
- if (cred->auri != NULL) free(cred->auri);
- 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 the AURI value it contains
-*/
-{
- char *q;
-
- if ((cred->auri != NULL) && (cred->auri[0] != '\0'))
- {
- fprintf(fp, "<cred>\n<auri>");
-
- for (q=cred->auri; *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, "</auri>\n");
-
- if (cred->nist_loa > 0)
- fprintf(fp, "<nist-loa>%d</nist-loa>\n", cred->nist_loa);
-
- if (cred->delegation > 0)
- fprintf(fp, "<delegation>%d</delegation>\n", cred->delegation);
-
- fprintf(fp, "</cred>\n");
-
- return 1;
- }
-
- return 0;
-}
-
-int GRSTgaclCredCmpAuri(GRSTgaclCred *cred1, GRSTgaclCred *cred2)
-/*
- GRSTgaclCredCmp - compare two credentials for exact match in AURI values
- (this means a string match, not just any-user=DN etc)
-*/
-{
- if ((cred1 == NULL) && (cred2 == NULL)) return 0;
-
- if (cred1 == NULL) return -1;
-
- if (cred2 == NULL) return 1;
-
- if ((cred1->auri == NULL) && (cred2->auri == NULL)) return 0;
-
- if (cred1->auri == NULL) return -1;
-
- if (cred2->auri == NULL) return 1;
-
- return strcmp(cred1->auri, cred2->auri);
-}
-
-/* *
- * 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("<entry>\n", fp);
-
- for (cred = entry->firstcred; cred != NULL; cred = cred->next)
- GRSTgaclCredPrint(cred, fp);
-
- if (entry->allowed)
- {
- fputs("<allow>", fp);
-
- for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i)
- if ((entry->allowed) & i) GRSTgaclPermPrint(i, fp);
-
- fputs("</allow>\n", fp);
- }
-
-
- if (entry->denied)
- {
- fputs("<deny>", fp);
-
- for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i)
- if (entry->denied & i) GRSTgaclPermPrint(i, fp);
-
- fputs("</deny>\n", fp);
- }
-
- fputs("</entry>\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("<gacl version=\"0.9.0\">\n", fp);
-
- for (entry = acl->firstentry; entry != NULL; entry = entry->next)
- GRSTgaclEntryPrint(entry, fp);
-
- fputs("</gacl>\n", fp);
-
- return 1;
-}
-
-int GRSTgaclAclSave(GRSTgaclAcl *acl, char *filename)
-{
- int ret;
- FILE *fp;
-
- fp = fopen(filename, "w");
- if (fp == NULL) return 0;
-
- fputs("<?xml version=\"1.0\"?>\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 = NULL;
-
- /* generic AURI creds first */
-
- if (strcmp((char *) cur->name, "cred") == 0)
- {
- for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next)
- {
- if (!xmlIsBlankNode(cur2) &&
- (strcmp((char *) cur2->name, "auri") == 0))
- {
- if (cred != NULL) /* multiple AURI */
- {
- GRSTgaclCredFree(cred);
- cred = NULL;
- return NULL;
- }
-
- cred = GRSTgaclCredCreate((char *) xmlNodeGetContent(cur2),NULL);
- }
- }
-
- if (cred == NULL) return NULL;
-
- for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next)
- {
- if (xmlIsBlankNode(cur2)) continue;
-
- if (strcmp((char *) cur2->name, "nist-loa") == 0)
- {
- cred->nist_loa = atoi((char *) xmlNodeGetContent(cur2));
- }
- else if (strcmp((char *) cur2->name, "delegation") == 0)
- {
- cred->delegation = atoi((char *) xmlNodeGetContent(cur2));
- }
- }
-
- return cred;
- }
-
- /* backwards compatibility */
-
- cred = GRSTgaclCredNew((char *) cur->name);
-
- 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 */
-{
- int nist_loa = 999;
- GRSTgaclCred *crediter;
-
- if ((cred == NULL) || (cred->auri == NULL)) return 0;
-
- if (strcmp(cred->auri, "gacl:any-user") == 0) return 1;
-
- if ((user == NULL) || (user->firstcred == NULL)) return 0;
-
- if (strncmp(cred->auri, "dns:", 4) == 0)
- {
- for (crediter=user->firstcred;
- crediter != NULL;
- crediter = crediter->next)
- if ((crediter->auri != NULL) &&
- (strncmp(crediter->auri, "dns:", 4) == 0))
- return (fnmatch(cred->auri, crediter->auri, FNM_CASEFOLD) == 0);
-
- return 0;
- }
-
- if (strcmp(cred->auri, "gacl:auth-user") == 0)
- {
- for (crediter=user->firstcred;
- crediter != NULL;
- crediter = crediter->next)
- if ((crediter->auri != NULL) &&
- (strncmp(crediter->auri, "dn:", 3) == 0)) return 1;
-
- return 0;
- }
-
- if (sscanf(cred->auri, "nist-loa:%d", &nist_loa) == 1)
- {
- for (crediter=user->firstcred;
- crediter != NULL;
- crediter = crediter->next)
- if ((crediter->auri != NULL) &&
- (strncmp(crediter->auri, "dn:", 3) == 0) &&
- (crediter->nist_loa >= nist_loa)) return 1;
-
- return 0;
- }
-
-/*
-// can remove this once we preload DN Lists etc as AURIs?
- if ((strncmp(cred->auri, "http:", 5) == 0) ||
- (strncmp(cred->auri, "https:", 6) == 0))
- {
- return GRSTgaclDNlistHasUser(cred->auri, user);
- }
-*/
- /* generic AURI = AURI test */
-
- for (crediter=user->firstcred; crediter != NULL; crediter = crediter->next)
- if ((crediter->auri != NULL) &&
- (strcmp(crediter->auri, cred->auri) == 0)) return 1;
-
- 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(type, "person") == 0) &&
- (strncmp(cred->auri, "dn:", 3) == 0)) return cred;
-
- if ((strcmp(type, "voms") == 0) &&
- (strncmp(cred->auri, "fqan:", 5) == 0)) return cred;
-
- if ((strcmp(type, "dns") == 0) &&
- (strncmp(cred->auri, "dns:", 4) == 0)) return cred;
-
- if ((strcmp(type, "dn-list") == 0) &&
- ((strncmp(cred->auri, "http:", 5) == 0) ||
- (strncmp(cred->auri, "https:", 6) == 0))) return cred;
-
- cred = cred->next;
- }
-
- return NULL;
-}
-
-int GRSTgaclUserSetDNlists(GRSTgaclUser *user, char *dnlists)
-{
- if (user->dnlists != NULL) free(user->dnlists);
-
- if (dnlists == NULL) user->dnlists = NULL;
- else user->dnlists = strdup(dnlists);
-
- return GRSTgaclUserLoadDNlists(user, dnlists);
-}
-
-static void recurse4dnlists(GRSTgaclUser *user, char *dir,
- int recurse_level, GRSTgaclCred *dn_cred)
-/* try to find file[] in dir[]. try subdirs if not found.
- return full path to first found version or NULL on failure */
-{
- int fd, linestart, i;
- char *fullfilename, *mapped, *q, *s;
- size_t dn_len;
- struct stat statbuf;
- DIR *dirDIR;
- struct dirent *file_ent;
- GRSTgaclCred *cred;
-
- if (recurse_level >= GRST_RECURS_LIMIT) return;
-
- dn_len = strlen(dn_cred->auri) - 3;
-
- /* search this directory */
-
- dirDIR = opendir(dir);
-
- if (dirDIR == NULL) return;
-
- while ((file_ent = readdir(dirDIR)) != NULL)
- {
- if (file_ent->d_name[0] == '.') continue;
-
- asprintf(&fullfilename, "%s/%s", dir, file_ent->d_name);
-
- GRSTerrorLog(GRST_LOG_DEBUG, "recurse4dnlists opens %s", fullfilename);
-
- if ((fd = open(fullfilename, O_RDONLY)) < 0)
- ;
- else if (fstat(fd, &statbuf) != 0)
- ;
- else if (S_ISDIR(statbuf.st_mode))
- recurse4dnlists(user, fullfilename, recurse_level + 1, dn_cred);
- else if ((S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode)) &&
- ((mapped = mmap(NULL, statbuf.st_size,
- PROT_READ, MAP_PRIVATE, fd, 0)) != MAP_FAILED))
- {
- linestart = 0;
-
- while (linestart + dn_len <= statbuf.st_size)
- {
- GRSTerrorLog(GRST_LOG_DEBUG, "recurse4dnlists at %ld in %s",
- linestart, fullfilename);
-
- for (i=0;
- (linestart + i < statbuf.st_size) && (i < dn_len);
- ++i)
- if (mapped[linestart + i] != dn_cred->auri[3+i]) break;
-
- GRSTerrorLog(GRST_LOG_DEBUG, "recurse4dnlists at %d %d %d %d",
- linestart, i, dn_len, statbuf.st_size);
-
- if ((i == dn_len) &&
- ((linestart+i == statbuf.st_size) ||
- (mapped[linestart+i] == '\n') ||
- (mapped[linestart+i] == '\r'))) /* matched */
- {
- s = GRSThttpUrlDecode(file_ent->d_name);
- cred = GRSTgaclCredCreate(s, NULL);
- GRSTerrorLog(GRST_LOG_DEBUG,
- "recurse4dnlists adds %s", s);
- free(s);
-
- GRSTgaclCredSetNotBefore(cred, dn_cred->notbefore);
- GRSTgaclCredSetNotAfter(cred, dn_cred->notafter);
- GRSTgaclCredSetDelegation(cred, dn_cred->delegation);
- GRSTgaclCredSetNistLoa(cred, dn_cred->nist_loa);
-
- GRSTgaclUserAddCred(user, cred);
- break;
- }
-
- linestart += i;
-
- while ((linestart < statbuf.st_size) &&
- (mapped[linestart] != '\n') &&
- (mapped[linestart] != '\r')) ++linestart;
-
- while ((linestart < statbuf.st_size) &&
- ((mapped[linestart] == '\n') ||
- (mapped[linestart] == '\r'))) ++linestart;
- }
-
- munmap(mapped, statbuf.st_size);
- }
-
- if (fd < 0) close(fd);
- free(fullfilename);
- }
-
- closedir(dirDIR);
-}
-
-int GRSTgaclUserLoadDNlists(GRSTgaclUser *user, char *dnlists)
-/*
- Examine DN Lists for attributes belonging to this user and
- add them to *user as additional credentials.
-*/
-{
- char *dn_lists_dirs, *dn_list_ptr, *filename, *dirname, *dn = NULL;
- GRSTgaclCred *dn_cred;
-
- /* check for DN Lists */
-
- if (dnlists == NULL) dnlists = getenv("GRST_DN_LISTS");
-
- if (dnlists == NULL) dnlists = GRST_DN_LISTS;
-
- if (*dnlists == '\0') return 1; /* Didn't ask for anything: that's ok */
-
- /* find this user's (first) DN */
-
- if (user == NULL) return 1; /* No user! */
-
- for (dn_cred = user->firstcred; dn_cred != NULL; dn_cred = dn_cred->next)
- {
- if (strncmp(dn_cred->auri, "dn:", 3) == 0) break;
- }
-
- if (dn_cred == NULL) return 1; /* User has no DN! */
-
- /* look through DN List files */
-
- dn_lists_dirs = strdup(dnlists); /* 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)
- {
- recurse4dnlists(user, dirname, 0, dn_cred);
- }
-
- free(dn_lists_dirs);
- return 1;
-}
-
-/* *
- * Functions to test for access perm of an individual *
- * */
-
-#if 0
-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;
-}
-#endif
-
-int GRSTgaclDNlistHasUser(char *listurl, GRSTgaclUser *user)
-{
- return GRSTgaclUserHasAURI(user, listurl);
-}
-
-int GRSTgaclUserHasAURI(GRSTgaclUser *user, char *auri)
-{
- GRSTgaclCred *cred;
-
- if ((auri == NULL) || (user == NULL)) return 0;
-
- for (cred = user->firstcred; cred != NULL; cred = cred->next)
- {
- if (strcmp(auri, cred->auri) == 0) return 1;
- }
-
- 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 <any-user/> */
-
- /* 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->auri, "gacl: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 (strncmp(cred->auri, "dn:", 3) != 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);
-}
+++ /dev/null
-/*
- 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 <stdio.h>
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#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;
-}
+++ /dev/null
-/*
- 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 <stdio.h>
-
-#include <time.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#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;
-}
-
-int GRSThttpPrintHeader(GRSThttpBody *bp, char *file)
-{
- char *headname;
-
- headname = getenv("REDIRECT_GRST_HEAD_FILE");
- if (headname == NULL) headname = getenv("GRST_HEAD_FILE");
- if (headname == NULL) headname = GRST_HEADFILE;
-
- if (headname[0] == '/') /* absolute location */
- {
- return GRSThttpCopy(bp, headname);
- }
-
- return GRSThttpPrintHeaderFooter(bp, file, headname);
-}
-
-int GRSThttpPrintFooter(GRSThttpBody *bp, char *file)
-{
- char *footname;
-
- footname = getenv("REDIRECT_GRST_FOOT_FILE");
- if (footname == NULL) footname = getenv("GRST_FOOT_FILE");
- if (footname == NULL) footname = GRST_FOOTFILE;
-
- if (footname[0] == '/') /* absolute location */
- {
- return GRSThttpCopy(bp, footname);
- }
-
- return GRSThttpPrintHeaderFooter(bp, file, footname);
-}
-
-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;
-}
-*/
+++ /dev/null
-/*
- Copyright (c) 2002-7, 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 <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <time.h>
-#include <stdarg.h>
-#include <dirent.h>
-#include <string.h>
-#include <pwd.h>
-#include <errno.h>
-#include <getopt.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifndef GRST_NO_OPENSSL
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-#include <openssl/err.h>
-#include <openssl/pem.h>
-
-#include <openssl/rsa.h>
-#include <openssl/pem.h>
-#include <openssl/err.h>
-#include <openssl/evp.h>
-#include <openssl/bio.h>
-#include <openssl/des.h>
-#include <openssl/rand.h>
-#endif
-
-#include "gridsite.h"
-
-#define GRST_KEYSIZE 512
-#define GRST_PROXYCACHE "/../proxycache/"
-#define GRST_MAX_CHAIN_LEN 9
-#define GRST_BACKDATE_SECONDS 300
-
-/// 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;
-
- if ((a == NULL) || (b == NULL)) return 1; /* NULL never matches */
-
- 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
-int GRSTx509KnownCriticalExts(X509 *cert)
-///
-/// 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 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
-int GRSTx509IsCA(X509 *cert)
-///
-/// Return GRST_RET_OK if true; GRST_RET_FAILED if not.
-{
- 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, *next_grst_cert;
-
- if (chain == NULL) return GRST_RET_OK;
-
- next_grst_cert = chain->firstcert;
-
- while (next_grst_cert != NULL)
- {
- grst_cert = next_grst_cert;
-
- if (grst_cert->issuer != NULL) free(grst_cert->issuer);
- if (grst_cert->dn != NULL) free(grst_cert->dn);
- if (grst_cert->value != NULL) free(grst_cert->value);
- if (grst_cert->ocsp != NULL) free(grst_cert->ocsp);
-
- next_grst_cert = grst_cert->next;
- free(grst_cert);
- }
-
- free(chain);
-
- return GRST_RET_OK;
-}
-
-/// Check a specific signature against a specific (VOMS) cert
-static int GRSTx509VerifySig(time_t *time1_time, time_t *time2_time,
- unsigned char *txt, int txt_len,
- unsigned char *sig, int sig_len,
- X509 *cert)
-///
-/// Returns GRST_RET_OK if signature is ok, other values if not.
-{
- int ret;
- EVP_PKEY *prvkey;
- EVP_MD_CTX ctx;
- time_t voms_service_time1, voms_service_time2;
-
- prvkey = X509_extract_key(cert);
- if (prvkey == NULL) return GRST_RET_FAILED;
-
- 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, txt, txt_len);
-
- ret = EVP_VerifyFinal(&ctx, sig, sig_len, prvkey);
-
-#if OPENSSL_VERSION_NUMBER >= 0x0090701fL
- EVP_MD_CTX_cleanup(&ctx);
-#endif
- EVP_PKEY_free(prvkey);
-
- if (ret != 1) return GRST_RET_FAILED;
-
- 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;
-
- return GRST_RET_OK ; /* verified */
-}
-
-/// Check the signature of the VOMS attributes
-static int GRSTx509VerifyVomsSig(time_t *time1_time, time_t *time2_time,
- unsigned char *asn1string,
- struct GRSTasn1TagList taglist[],
- int lasttag,
- char *vomsdir, int acnumber)
-///
-/// Returns GRST_RET_OK if signature is ok, other values if not.
-{
-#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, *certpath2, acvomsdn[200], dn_coords[200],
- info_coords[200], sig_coords[200];
- unsigned char *q;
- DIR *vomsDIR, *vomsDIR2;
- struct dirent *vomsdirent, *vomsdirent2;
- X509 *cert;
- EVP_PKEY *prvkey;
- FILE *fp;
- EVP_MD_CTX ctx;
- struct stat statbuf;
- 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)
- {
- if (vomsdirent->d_name[0] == '.') continue;
-
- asprintf(&certpath, "%s/%s", vomsdir, vomsdirent->d_name);
- stat(certpath, &statbuf);
-
- if (S_ISDIR(statbuf.st_mode))
- {
- vomsDIR2 = opendir(certpath);
- GRSTerrorLog(GRST_LOG_DEBUG,
- "Descend VOMS subdirectory %s", certpath);
- free(certpath);
-
- if (vomsDIR2 == NULL) continue;
-
-
- while ((vomsdirent2 = readdir(vomsDIR2)) != NULL)
- {
- if (vomsdirent2->d_name[0] == '.') continue;
-
- asprintf(&certpath2, "%s/%s/%s",
- vomsdir, vomsdirent->d_name, vomsdirent2->d_name);
-
- fp = fopen(certpath2, "r");
- GRSTerrorLog(GRST_LOG_DEBUG,
- "Examine VOMS cert %s", certpath2);
- free(certpath2);
- if (fp == NULL) continue;
-
- cert = PEM_read_X509(fp, NULL, NULL, NULL);
- fclose(fp);
- if (cert == NULL) continue;
-
- if (GRSTx509VerifySig(time1_time, time2_time,
- &asn1string[taglist[iinfo].start],
- taglist[iinfo].length+taglist[iinfo].headerlength,
- &asn1string[taglist[isig].start+
- taglist[isig].headerlength+1],
- taglist[isig].length - 1,
- cert) == GRST_RET_OK)
- {
- GRSTerrorLog(GRST_LOG_DEBUG, " VOMS cert signature match");
- X509_free(cert);
- closedir(vomsDIR2);
- closedir(vomsDIR);
- return GRST_RET_OK ; /* verified */
- }
-
- X509_free(cert);
- }
-
- closedir(vomsDIR2);
- }
- else
- {
- fp = fopen(certpath, "r");
- GRSTerrorLog(GRST_LOG_DEBUG, "Examine VOMS cert %s", certpath);
- free(certpath);
- if (fp == NULL) continue;
-
- cert = PEM_read_X509(fp, NULL, NULL, NULL);
- fclose(fp);
- if (cert == NULL) continue;
-
- if (GRSTx509VerifySig(time1_time, time2_time,
- &asn1string[taglist[iinfo].start],
- taglist[iinfo].length+taglist[iinfo].headerlength,
- &asn1string[taglist[isig].start+
- taglist[isig].headerlength+1],
- taglist[isig].length - 1,
- cert) == GRST_RET_OK)
- {
- X509_free(cert);
- closedir(vomsDIR);
- return GRST_RET_OK ; /* verified */
- }
-
- X509_free(cert);
- }
- }
-
- closedir(vomsDIR);
- return GRST_RET_FAILED;
-}
-
-/// Get the VOMS attributes in the given extension
-static int GRSTx509ChainVomsAdd(GRSTx509Cert **grst_cert,
- time_t time1_time, time_t time2_time,
- X509_EXTENSION *ex,
- char *ucuserdn, char *vomsdir)
-///
-/// Add any VOMS credentials found into the chain. Always returns GRST_RET_OK
-/// - even for invalid credentials, which are flagged in errors field
-{
-#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_VOMS_DN "-1-1-%d-1-3-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], accadn[200], acvomsdn[200],
- dn_coords[200], fqan_coords[200], time1_coords[200],
- time2_coords[200];
- long asn1length;
- int lasttag=-1, itag, i, acnumber = 1, chain_errors = 0;
- struct GRSTasn1TagList taglist[MAXTAG+1];
- time_t actime1 = 0, actime2 = 0, 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 */
- {
- chain_errors = 0;
-
- 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;
-
- 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)
- break;
-
- if (GRSTx509NameCmp(ucuserdn, acuserdn) != 0)
- chain_errors |= GRST_CERT_BAD_CHAIN;
-
- if (GRSTx509VerifyVomsSig(&time1_time, &time2_time,
- asn1string, taglist, lasttag, vomsdir, acnumber)
- != GRST_RET_OK)
- chain_errors |= GRST_CERT_BAD_SIG;
-
- snprintf(time1_coords, sizeof(time1_coords), GRST_ASN1_COORDS_TIME1, acnumber);
- itag = GRSTasn1SearchTaglist(taglist, lasttag, time1_coords);
-
- if (itag > -1) actime1 = GRSTasn1TimeToTimeT(
- &asn1string[taglist[itag].start+
- taglist[itag].headerlength],
- taglist[itag].length);
- else actime1 = 0;
-
- snprintf(time2_coords, sizeof(time2_coords), GRST_ASN1_COORDS_TIME2, acnumber);
- itag = GRSTasn1SearchTaglist(taglist, lasttag, time2_coords);
-
- if (itag > -1) actime2 = GRSTasn1TimeToTimeT(
- &asn1string[taglist[itag].start+
- taglist[itag].headerlength],
- taglist[itag].length);
- else actime2 = 0;
-
- if (actime1 > time1_time) time1_time = actime1;
- if (actime2 < time2_time) time2_time = actime2;
-
- time(&time_now);
- if ((time1_time > time_now + 300) || (time2_time < time_now))
- chain_errors |= GRST_CERT_BAD_TIME;
-
- for (i=1; ; ++i) /* now go through FQANs */
- {
- snprintf(fqan_coords, sizeof(fqan_coords), GRST_ASN1_COORDS_FQAN, acnumber, i);
- itag = GRSTasn1SearchTaglist(taglist, lasttag, fqan_coords);
-
- if (itag > -1)
- {
- (*grst_cert)->next = malloc(sizeof(GRSTx509Cert));
- *grst_cert = (*grst_cert)->next;
- bzero(*grst_cert, sizeof(GRSTx509Cert));
-
- (*grst_cert)->notbefore = time1_time;
- (*grst_cert)->notafter = time2_time;
- asprintf(&((*grst_cert)->value), "%.*s",
- taglist[itag].length,
- &asn1string[taglist[itag].start+
- taglist[itag].headerlength]);
-
- (*grst_cert)->errors = chain_errors; /* ie may be invalid */
- (*grst_cert)->type = GRST_CERT_TYPE_VOMS;
- (*grst_cert)->issuer = strdup(acvomsdn);
- (*grst_cert)->dn = strdup(acuserdn);
- }
- else break;
- }
- }
-
- return GRST_RET_OK;
-}
-
-/// Check certificate chain for GSI proxy acceptability.
-int GRSTx509ChainLoadCheck(GRSTx509Chain **chain,
- STACK_OF(X509) *certstack, X509 *lastcert,
- char *capath, char *vomsdir)
-///
-/// 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.)
-{
- X509 *cert; /* Points to the current cert in the loop */
- X509 *cacert = NULL; /* The CA root cert */
- int depth = 0; /* Depth of cert chain */
- int chain_errors = 0; /* records previous errors */
- int first_non_ca; /* number of the EEC issued to user by CA */
- char *ucuserdn = NULL; /* DN of EEC issued to user by 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,ret; /* Iteration/temp variables */
- char *proxy_part_DN; /* Pointer to end part of current-cert-in-chain
- maybe eg "/CN=proxy" */
- char s[80];
- char *cacertpath;
- unsigned long subjecthash = 0; /* hash of the name of first cert */
- unsigned long issuerhash = 0; /* hash of issuer name of first cert */
- FILE *fp;
- X509_EXTENSION *ex;
- time_t now;
- GRSTx509Cert *grst_cert, *new_grst_cert;
-
- GRSTerrorLog(GRST_LOG_DEBUG, "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? */
-
- if ((depth == 0) && (lastcert == NULL))
- {
- *chain = NULL;
- return GRST_RET_FAILED;
- }
-
- cert = sk_X509_value(certstack, depth - 1);
- subjecthash = X509_NAME_hash(X509_get_subject_name(cert));
- issuerhash = X509_NAME_hash(X509_get_issuer_name(cert));
- asprintf(&cacertpath, "%s/%.8x.0", capath, issuerhash);
-
- GRSTerrorLog(GRST_LOG_DEBUG, "Look for CA root file %s", cacertpath);
-
- fp = fopen(cacertpath, "r");
- free(cacertpath);
-
- if (fp == NULL) chain_errors |= GRST_CERT_BAD_CHAIN;
- else
- {
- cacert = PEM_read_X509(fp, NULL, NULL, NULL);
- fclose(fp);
- if (cacert != NULL)
- GRSTerrorLog(GRST_LOG_DEBUG, " Loaded CA root cert from file");
- else
- GRSTerrorLog(GRST_LOG_DEBUG, " Failed to load CA root cert file");
- }
-
- *chain = malloc(sizeof(GRSTx509Chain));
- bzero(*chain, sizeof(GRSTx509Chain));
-
- /* Check the client chain */
- for (i = depth - ((subjecthash == issuerhash) ? 1 : 0);
- i >= ((lastcert == NULL) ? 0 : -1);
- --i)
- /* loop through client-presented chain starting at CA end */
- {
- GRSTerrorLog(GRST_LOG_DEBUG, "Process cert at depth %d in chain", i);
-
- prevIsCA=IsCA;
-
- new_grst_cert = malloc(sizeof(GRSTx509Cert));
- bzero(new_grst_cert, sizeof(GRSTx509Cert));
- new_grst_cert->errors = chain_errors;
-
- if ((*chain)->firstcert == NULL)
- {
- GRSTerrorLog(GRST_LOG_DEBUG, "Initialise chain");
- (*chain)->firstcert = new_grst_cert;
- }
- else grst_cert->next = new_grst_cert;
-
- grst_cert = new_grst_cert;
-
- /* Choose X509 certificate and point to it with 'cert' */
- if (i < 0) cert = lastcert;
- else if (i == depth)
- cert = cacert; /* the self-signed CA from the store*/
- else if ((i == depth - 1) && (subjecthash == issuerhash))
- cert = cacert; /* ie claims to be a copy of a self-signed CA */
- else cert = sk_X509_value(certstack, i);
-
- if (cert != NULL)
- {
- if ((i == depth - 1) && (subjecthash != issuerhash))
- {
- /* if first cert does not claim to be a self-signed copy
- of a CA root cert in the store, we check the signature */
-
- if (cacert == NULL)
- {
- chain_errors |= GRST_CERT_BAD_CHAIN;
- ret = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
- }
- else
- {
- ret = X509_check_issued(cacert, cert);
-
- GRSTerrorLog(GRST_LOG_DEBUG,
- "Cert sig check %d returns %d", i, ret);
-
- if (ret != X509_V_OK)
- new_grst_cert->errors |= GRST_CERT_BAD_SIG;
- }
- }
- else if ((i == depth - 2) && (subjecthash == issuerhash))
- {
- /* first cert claimed to be a self-signed copy of a CA root
- cert in the store, we check the signature of the second
- cert, using OUR copy of the CA cert DIRECT from the store */
-
- if (cacert == NULL)
- {
- chain_errors |= GRST_CERT_BAD_CHAIN;
- ret = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
- }
- else
- {
- ret = X509_check_issued(cacert, cert);
-
- GRSTerrorLog(GRST_LOG_DEBUG,
- "Cert sig check %d returns %d", i, ret);
-
- if (ret != X509_V_OK)
- new_grst_cert->errors |= GRST_CERT_BAD_SIG;
- }
- }
- else if (i < depth - 1)
- {
- /* otherwise a normal part of the chain: note that if the
- first cert claims to be a self-signed copy of a CA root
- cert in the store, we never use it for sig checking */
-
- ret = X509_check_issued(sk_X509_value(certstack, i + 1), cert);
-
- GRSTerrorLog(GRST_LOG_DEBUG,
- "Cert sig check %d returns %d", i, ret);
-
- if ((ret != X509_V_OK) &&
- (ret != X509_V_ERR_KEYUSAGE_NO_CERTSIGN))
- new_grst_cert->errors |= GRST_CERT_BAD_SIG;
-
- /* NO_CERTSIGN can still be ok due to Proxy Certificates */
- }
-
- new_grst_cert->serial = (int) ASN1_INTEGER_get(
- X509_get_serialNumber(cert));
- new_grst_cert->notbefore = GRSTasn1TimeToTimeT(
- ASN1_STRING_data(X509_get_notBefore(cert)), 0);
- new_grst_cert->notafter = GRSTasn1TimeToTimeT(
- ASN1_STRING_data(X509_get_notAfter(cert)), 0);
-
- /* we check times and record if invalid */
-
- if (now < new_grst_cert->notbefore)
- new_grst_cert->errors |= GRST_CERT_BAD_TIME;
-
- if (now > new_grst_cert->notafter)
- new_grst_cert->errors |= GRST_CERT_BAD_TIME;
-
- new_grst_cert->dn = X509_NAME_oneline(X509_get_subject_name(cert),NULL,0);
- new_grst_cert->issuer = X509_NAME_oneline(X509_get_issuer_name(cert),NULL,0);
- len = strlen(new_grst_cert->dn);
- len2 = strlen(new_grst_cert->issuer);
-
- /* always treat a first cert from the CA files as a
- CA: this is really for lousy CAs that dont create
- proper v3 root certificates */
-
- if (i == depth) IsCA == TRUE;
- else IsCA = (GRSTx509IsCA(cert) == GRST_RET_OK);
-
- /* If any forebear certificate is not allowed to sign we must
- assume all decendents are proxies and cannot sign either */
- if (prevIsCA)
- {
- if (IsCA)
- {
- new_grst_cert->type = GRST_CERT_TYPE_CA;
- }
- else
- {
- new_grst_cert->type = GRST_CERT_TYPE_EEC;
- first_non_ca = i;
- ucuserdn = new_grst_cert->dn;
- new_grst_cert->delegation
- = (lastcert == NULL) ? i : i + 1;
- }
- }
- else
- {
- new_grst_cert->type = GRST_CERT_TYPE_PROXY;
-
- IsCA = FALSE;
- /* Force proxy check next iteration. Important because I can
- sign any CA I create! */
-
- new_grst_cert->delegation = (lastcert == NULL) ? i : i + 1;
- }
-
- 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(new_grst_cert->dn, new_grst_cert->issuer, 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 = &(new_grst_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 ... */
-
- for (j=0; j < X509_get_ext_count(cert); ++j)
- {
- ex = X509_get_ext(cert, j);
- OBJ_obj2txt(s,sizeof(s),X509_EXTENSION_get_object(ex),1);
-
- if (strcmp(s, GRST_VOMS_OID) == 0) /* a VOMS extension */
- {
- GRSTx509ChainVomsAdd(&grst_cert,
- new_grst_cert->notbefore,
- new_grst_cert->notafter,
- ex,
- ucuserdn,
- vomsdir);
- grst_cert->delegation = (lastcert == NULL) ? i : i+1;
- }
- }
-
- }
- }
-
-
- } /* end of for loop */
-
- if (cacert != NULL) X509_free(cacert);
-
- return GRST_RET_OK;
-}
-
-/// Check certificate chain for GSI proxy acceptability.
-int GRSTx509CheckChain(int *first_non_ca, X509_STORE_CTX *ctx)
-///
-/// 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.)
-{
- 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;
-}
-
-/// Get the VOMS attributes in the given extension
-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)
-///
-/// 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.
-{
-#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
-int GRSTx509GetVomsCreds(int *lastcred, int maxcreds, size_t credlen,
- char *creds, X509 *usercert, STACK_OF(X509) *certstack,
- char *vomsdir)
-///
-/// Puts any VOMS credentials found into the Compact Creds string array
-/// starting at *creds. Always returns GRST_RET_OK.
-{
- 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
-GRSTgaclCred *GRSTx509CompactToCred(char *grst_cred)
-///
-/// Returns pointer to created GRSTgaclCred or NULL or failure.
-{
- int delegation;
- char *p, *encoded;
- 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, ' ')))
- {
- encoded = GRSThttpUrlMildencode(&p[1]);
- cred = GRSTgaclCredCreate("dn:", encoded);
- free(encoded);
- GRSTgaclCredSetDelegation(cred, delegation);
- }
-
- 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 / */
-
- encoded = GRSThttpUrlMildencode(&p[1]);
- cred = GRSTgaclCredCreate("fqan:", encoded);
- free(encoded);
- GRSTgaclCredSetDelegation(cred, delegation);
- }
-
- return cred;
- }
-
- return NULL; /* dont recognise this credential type */
-}
-
-/// Get the credentials in an X509 cert/GSI proxy, including any VOMS
-int GRSTx509CompactCreds(int *lastcred, int maxcreds, size_t credlen,
- char *creds, STACK_OF(X509) *certstack, char *vomsdir,
- X509 *peercert)
-///
-/// 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 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
-char *GRSTx509FindProxyFileName(void)
-///
-/// Return a string with the proxy file name or NULL if not present.
-/// This function does not check if the proxy has expired.
-{
- 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
-int GRSTx509MakeProxyCert(char **proxychain, FILE *debugfp,
- char *reqtxt, char *cert, char *key, int minutes)
-///
-/// 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.
-{
- char *ptr, *certchain;
- int i, ncerts;
- long serial = 1234, 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;
- 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");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- if (X509_REQ_verify(req, pkey) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error verifying signature on certificate\n");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- /* read in the signing certificate */
- if (!(fp = fopen(cert, "r")))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error opening signing certificate file\n");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- for (ncerts = 1; ncerts < GRST_MAX_CHAIN_LEN; ++ncerts)
- if ((certs[ncerts] = PEM_read_X509(fp, NULL, NULL, NULL)) == NULL) break;
-
- if (ncerts == 1) /* zeroth cert with be new proxy cert */
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error reading signing certificate file\n");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- if (!(CApkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error reading signing private key in file\n");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- /* create new certificate */
- if (!(certs[0] = X509_new()))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error creating X509 object\n");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- if (X509_set_issuer_name(certs[0], name) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting issuer name of certificate\n");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- X509_NAME_free(newsubject);
- X509_NAME_ENTRY_free(ent);
-
- /* 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");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- /* set duration for the certificate */
- if (!(X509_gmtime_adj(X509_get_notBefore(certs[0]), -GRST_BACKDATE_SECONDS)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting beginning time of the certificate\n");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- return GRST_RET_FAILED;
- }
-
- if (!(X509_sign(certs[0], CApkey, digest)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error signing certificate\n");
-
- X509_REQ_free(req);
- 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");
-
- X509_REQ_free(req);
- 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);
- X509_free(certs[i]);
- }
-
- EVP_PKEY_free(pkey);
- EVP_PKEY_free(CApkey);
- X509_REQ_free(req);
-
- *proxychain = certchain;
- return GRST_RET_OK;
-}
-
-/// Find a proxy file in the proxy cache
-char *GRSTx509CachedProxyFind(char *proxydir, char *delegation_id,
- char *user_dn)
-///
-/// Returns the full path and file name of proxy file associated
-/// with given delegation ID and 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
-char *GRSTx509CachedProxyKeyFind(char *proxydir, char *delegation_id,
- char *user_dn)
-///
-/// Returns the full path and file name of the private key file associated
-/// with given delegation ID and 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
-int GRSTx509CreateProxyRequest(char **reqtxt, char **keytxt, char *ocspurl)
-///
-/// Returns GRST_RET_OK on success, non-zero otherwise. Request string
-/// and private key are PEM encoded strings
-{
- 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
-int GRSTx509MakeProxyRequest(char **reqtxt, char *proxydir,
- char *delegation_id, char *user_dn)
-///
-/// 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 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
-int GRSTx509ProxyDestroy(char *proxydir, char *delegation_id, char *user_dn)
-///
-/// 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 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
-int GRSTx509ProxyGetTimes(char *proxydir, char *delegation_id, char *user_dn,
- time_t *start, time_t *finish)
-///
-/// Returns GRST_RET_OK on success, non-zero otherwise.
-/// (Including GRST_RET_NO_SUCH_FILE if the cert chain was not found.)
-{
- 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
-int GRSTx509StringToChain(STACK_OF(X509) **certstack, char *certstring)
-///
-/// 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.
-{
- 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, ...
-char *GRSTx509MakeDelegationID(void)
-///
-/// Returns a malloc'd string with Delegation ID made by SHA1-hashing the
-/// values of the compact credentials exported by mod_gridsite
-{
- 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
-char *GRSTx509MakeProxyFileName(char *delegation_id,
- STACK_OF(X509) *certstack)
-///
-/// 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.
-{
- 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
-int GRSTx509CacheProxy(char *proxydir, char *delegation_id,
- char *user_dn, char *proxychain)
-///
-/// 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 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;
-}
+++ /dev/null
-/*
- 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 <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string.h>
-#include <dirent.h>
-#include <ctype.h>
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-#include <fnmatch.h>
-
-#include <libxml/xmlmemory.h>
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-
-#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 <Subject> or <AnySubjects/>, 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->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
- <Rule> tag refers to the same <Target> by checking the <RuleId> 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 <Rule> tag found
- // if (xmlStrcmp(cur->name, (const xmlChar *) "Rule") != 0) return NULL;
- // cur and rule_root point to the <Rule> tag
-
- cur = cur->xmlChildrenNode->xmlChildrenNode;
- // cur should now be pointing at <Subjects> 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 <Subjects> tag make cur2 point to <Subject> 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-><Action>
- 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-><Action>
- 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 <Subjects> 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 <Target> tag and set cur to first <Rule> 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;
-
- if (cred->auri != NULL)
- {
- fputs("\t\t\t\t<Subject>\n", fp);
- fputs("\t\t\t\t\t<SubjectMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\">\n", fp);
- fputs("\t\t\t\t\t\t<AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">", fp);
- for (q=cred->auri; *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("</AttributeValue>\n", fp);
-
- fputs("\t\t\t\t\t\t<SubjectAttributeDesignator\n", fp);
- fputs("\t\t\t\t\t\t\tAttributeId=", fp);
- fprintf(fp, "\"cred\"\n");
- fputs("\t\t\t\t\t\t\tDataType=", fp);
- fprintf(fp, "\"auri\"/>\n");
- fputs("\t\t\t\t\t</SubjectMatch>\n", fp);
- fputs("\t\t\t\t</Subject>\n", fp);
- }
- else fputs("\t\t\t\t<AnySubject/>\n", fp);
-
- return 1;
-}
-
-
-int GRSTxacmlEntryPrint(GRSTgaclEntry *entry, FILE *fp, int rule_number)
-{
- GRSTgaclCred *cred;
- GRSTgaclPerm i;
-
- if (entry->allowed){
-
- fprintf(fp, "\t<Rule RuleId=\"Entry%dA\" Effect=\"Permit\">\n", rule_number);
- fputs("\t\t<Target>\n", fp);
- fputs("\t\t\t<Subjects>\n", fp);
-
- for (cred = entry->firstcred; cred != NULL; cred = cred->next)
- GRSTxacmlCredPrint(cred, fp);
-
- fputs("\t\t\t</Subjects>\n", fp);
- fputs("\t\t\t<Actions>\n", fp);
-
- for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i)
- if ((entry->allowed) & i) GRSTxacmlPermPrint(i, fp);
-
- fputs("\t\t\t</Actions>\n", fp);
- fputs("\t\t</Target>\n", fp);
- fputs("\t</Rule>\n", fp);
- }
-
- if (entry->denied){
-
- fprintf(fp, "\t<Rule RuleId=\"Entry%dD\" Effect=\"Deny\">\n", rule_number);
- fputs("\t\t<Target>\n", fp);
- fputs("\t\t\t<Subjects>\n", fp);
-
- for (cred = entry->firstcred; cred != NULL; cred = cred->next)
- GRSTxacmlCredPrint(cred, fp);
-
- fputs("\t\t\t</Subjects>\n", fp);
- fputs("\t\t\t<Actions>\n", fp);
-
- for (i=GRST_PERM_READ; i <= GRST_PERM_ADMIN; ++i)
- if (entry->denied & i) GRSTxacmlPermPrint(i, fp);
-
- fputs("\t\t\t</Actions>\n", fp);
- fputs("\t\t</Target>\n", fp);
- fputs("\t</Rule>\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<Action>\n", fp);
- fputs("\t\t\t\t\t<ActionMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\">\n", fp);
- fputs("\t\t\t\t\t\t<AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">", fp);
- fprintf(fp, "%s", grst_perm_syms[i]);
- fputs("</AttributeValue>\n", fp);
- fputs("\t\t\t\t\t\t<ActionAttributeDesignator\n", fp);
- fputs("\t\t\t\t\t\t\tAttributeId=\"urn:oasis:names:tc:xacml:1.0:action:action-id\"\n", fp);
- fputs("\t\t\t\t\t\t\tDataType=\"http://www.w3.org/2001/XMLSchema#string\"/>\n", fp);
- fputs("\t\t\t\t\t</ActionMatch>\n", fp);
- fputs("\t\t\t\t</Action>\n",fp);
-
- return 1;
- }
-
- return 0;
-}
-
-int GRSTxacmlAclPrint(GRSTgaclAcl *acl, FILE *fp, char* dir_uri)
-{
- GRSTgaclEntry *entry;
- int rule_number=1;
-
- fputs("<Policy", fp);
- fputs("\txmlns=\"urn:oasis:names:tc:xacml:1.0:policy\"\n", fp);
- fputs("\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n", fp);
- fputs("\txsi:schemaLocation=\"urn:oasis:names:tc:xacml:1.0:policy cs-xacml-schema-policy-01.xsd\"\n", fp);
- fputs("\tPolicyId=\"GridSitePolicy\"\n", fp);
- fputs("\tRuleCombiningAlgId=\"urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides\">\n\n", fp);
-
- fputs("\t<Target>\n\t\t<Resources>\n\t\t\t<Resource>\n", fp);
- fputs("\t\t\t\t<ResourceMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\">\n", fp);
- fputs("\t\t\t\t\t<AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">", fp);
- fprintf(fp, "%s", dir_uri);
- fputs("</AttributeValue>\n", fp);
- fputs("\t\t\t\t\t<ResourceAttributeDesignator\n", fp);
- fputs("\t\t\t\t\t\tAttributeId=\"urn:oasis:names:tc:xacml:1.0:resource:resource-id\"\n", fp);
- fputs("\t\t\t\t\t\tDataType=\"http://www.w3.org/2001/XMLSchema#string\"/>\n", fp);
-
- fputs("\t\t\t\t</ResourceMatch>\n\t\t\t</Resource>\n\t\t</Resources>\n\t\t<Subjects>\n\t\t\t<AnySubject/>\n\t\t</Subjects>", fp);
- fputs("\n\t\t<Actions>\n\t\t\t<AnyAction/>\n\t\t</Actions>\n\t</Target>\n\n", fp);
-
- for (entry = acl->firstentry; entry != NULL; entry = entry->next){
-
- GRSTxacmlEntryPrint(entry, fp, rule_number);
- rule_number++;
- }
-
- fputs("</Policy>\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,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-
- ret = GRSTxacmlAclPrint(acl, fp, dir_uri);
-
- fclose(fp);
-
- return ret;
-}
-
-
-
-
+++ /dev/null
-/* 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 <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <string.h>
-#include <time.h>
-#if APR_HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-
-#ifdef HAVE_GRP_H
-#include <grp.h>
-#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 <utime.h>
-#include <errno.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <pwd.h>
-#include <sys/types.h>
-
-/******************************************************************************
-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"
- "<html><head><title>500 Internal Server Error</title></head>\n"
- "<body><h1>Internal Server Error</h1></body></html>");
-}
-
-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"
- "<html><head><title>403 Forbidden</title></head>\n"
- "<body><h1>Forbidden</h1></body></html>");
-}
-
-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);
-}
+++ /dev/null
-/* 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 */
+++ /dev/null
-/*
- Copyright (c) 2002-7, 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 <pwd.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <string.h>
-#include <malloc.h>
-#include <dirent.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/select.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <curl/curl.h>
-
-#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, loclen, srclen;
- CURL *easyhandle;
- const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
- char *s, *source_url;
- 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)
- {
- source_url = sources[isrc];
-
- if (common_data->verbose > 0)
- fprintf(stderr, "Listing %s\n", source_url);
-
- if (sources[1] != NULL) printf("\n%s:\n", source_url);
-
- curl_easy_setopt(easyhandle, CURLOPT_URL, source_url);
-
- if (source_url[strlen(source_url)-1] == '/')
- {
- isdir = 1;
- curl_easy_setopt(easyhandle,CURLOPT_WRITEFUNCTION,rawindex_callback);
- curl_easy_setopt(easyhandle,CURLOPT_WRITEDATA,(void *) &rawindex);
- curl_easy_setopt(easyhandle,CURLOPT_HTTPGET,1);
- 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 == 301) &&
- (header_data.location != NULL) &&
- ((loclen = strlen(header_data.location))
- == ((srclen = strlen(source_url)) + 1)) &&
- (strncmp(header_data.location, source_url, srclen) == 0) &&
- (header_data.location[loclen-1] == '/'))
- {
- if (common_data->verbose > 0)
- fprintf(stderr, "... redirect to %s\n", header_data.location);
-
- source_url = strdup(header_data.location);
- isdir = 1;
- curl_easy_setopt(easyhandle,CURLOPT_WRITEFUNCTION,rawindex_callback);
- curl_easy_setopt(easyhandle,CURLOPT_WRITEDATA,(void *) &rawindex);
- curl_easy_setopt(easyhandle,CURLOPT_HTTPGET,1);
- curl_easy_setopt(easyhandle,CURLOPT_NOBODY,0);
- curl_easy_setopt(easyhandle,CURLOPT_URL, source_url);
- rawindex.text = NULL;
- rawindex.used = 0;
- rawindex.allocated = 0;
-
- header_data.gridhttppasscode = NULL;
- header_data.length_set = 0;
- header_data.modified_set = 0;
- header_data.retcode = 0;
- header_data.location = NULL;
-
- 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, source_url);
- 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", source_url, 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(source_url);
- }
- }
-
- 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;
-}
+++ /dev/null
-/*
- 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 <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-#include <openssl/pem.h>
-
-#include <getopt.h>
-
-#include <gridsite.h>
-
-#include <stdsoap2.h>
-
-#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],
- *vomsdir = "/etc/grid-security/vomsdir",
- *executable, *keytxt, *proxychain, *ptr, *p;
- 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)
-#ifdef HT_LEAK_TEST
- {
- int ii;
- FILE *ffpp;
- char lineline[80];
- for (ii=0; ii < 1000; ++ii)
-#endif
- {
- if (GRSTx509CreateProxyRequest(&reqtxt, &keytxt, NULL) != GRST_RET_OK)
- {
- fprintf(stderr, "Failed to create internal proxy cert request\n");
- return 1;
- }
-
-#ifdef HT_LEAK_TEST
- ffpp = fopen("/proc/self/statm", "r");
- fgets(lineline, sizeof(lineline), ffpp);
- fprintf(stderr, "%d a %s", ii, lineline);
- fclose(ffpp);
-#endif
- if (GRSTx509MakeProxyCert(&proxychain, NULL, reqtxt, cert, key, minutes)
- != GRST_RET_OK)
- {
- fprintf(stderr, "Failed to sign internal proxy cert request\n");
- return 2;
- }
-
-#ifdef HT_LEAK_TEST
- ffpp = fopen("/proc/self/statm", "r");
- fgets(lineline, sizeof(lineline), ffpp);
- fprintf(stderr, "%d b %s", ii, lineline);
- fclose(ffpp);
-#endif
-
- /* convert back to cert stack so can output in the right order */
- if (GRSTx509StringToChain(&x509_certstack, proxychain) != GRST_RET_OK)
- {
- fprintf(stderr, "Failed to convert internal proxy chain\n");
- return 3;
- }
-
-#ifdef HT_LEAK_TEST
- ffpp = fopen("/proc/self/statm", "r");
- fgets(lineline, sizeof(lineline), ffpp);
- fprintf(stderr, "%d c %s", ii, lineline);
- fclose(ffpp);
-#endif
-
- /* just the proxy certificate we have created */
- 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);
- }
-
-#ifdef HT_LEAK_TEST
- ffpp = fopen("/proc/self/statm", "r");
- fgets(lineline, sizeof(lineline), ffpp);
- fprintf(stderr, "%d d %s", ii, lineline);
- fclose(ffpp);
-#endif
- /* then the private key */
- fputs(keytxt, stdout);
-
- /* and only now the rest of the certificates */
- 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);
- }
- }
-
-
-#ifdef HT_LEAK_TEST
- ffpp = fopen("/proc/self/statm", "r");
- fgets(lineline, sizeof(lineline), ffpp);
- fprintf(stderr, "%d e %s", ii, lineline);
- fclose(ffpp);
-#endif
- free(proxychain);
- free(keytxt);
- free(reqtxt);
- sk_X509_free(x509_certstack);
-
-#ifdef HT_LEAK_TEST
- ffpp = fopen("/proc/self/statm", "r");
- fgets(lineline, sizeof(lineline), ffpp);
- fprintf(stderr, "%d f %s", ii, lineline);
- fclose(ffpp);
- }
-#endif
- 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;
- }
-
- free(ptr);
-
- if (verbose) fprintf(stderr, "Parsing certificate chain\n");
-
- ret = GRSTx509ChainLoadCheck(&grst_chain, x509_certstack, NULL,
- capath, vomsdir);
-
- 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;
-
- for (i=0; grst_cert != NULL; grst_cert = grst_cert->next, ++i)
- {
- if (grst_cert->type == GRST_CERT_TYPE_CA) p = "(CA) ";
- else if (grst_cert->type == GRST_CERT_TYPE_EEC) p = "(EEC) ";
- else if (grst_cert->type == GRST_CERT_TYPE_PROXY) p = "(PC) ";
- else if (grst_cert->type == GRST_CERT_TYPE_VOMS) p = "(AC) ";
- else p = "";
-
- printf("%d %s%s\n", i, p,
- (grst_cert->type == GRST_CERT_TYPE_VOMS)
- ? grst_cert->value : grst_cert->dn);
-
- printf(" Status : %d ( %s%s%s%s%s%s)\n", grst_cert->errors,
- (grst_cert->errors == 0) ? "OK " : "",
- (grst_cert->errors & GRST_CERT_BAD_FORMAT) ? "BAD_FORMAT ":"",
- (grst_cert->errors & GRST_CERT_BAD_CHAIN) ? "BAD_CHAIN ":"",
- (grst_cert->errors & GRST_CERT_BAD_SIG) ? "BAD_SIG ":"",
- (grst_cert->errors & GRST_CERT_BAD_TIME) ? "BAD_TIME ":"",
- (grst_cert->errors & GRST_CERT_BAD_OCSP) ? "BAD_OCSP ":"");
-
- printf(" Start : %s", ctime(&(grst_cert->notbefore)));
- printf(" Finish : %s", ctime(&(grst_cert->notafter)));
- printf(" Delegation : %d\n", grst_cert->delegation);
-
- if (grst_cert->type == GRST_CERT_TYPE_VOMS)
- {
- printf(" User DN : %s\n", grst_cert->dn);
- printf(" VOMS DN : %s\n\n", grst_cert->issuer);
- }
- else
- {
- printf(" Serial : %d\n", grst_cert->serial);
- printf(" Issuer : %s\n\n", grst_cert->issuer);
- }
- }
-
- GRSTx509ChainFree(grst_chain);
- }
- /* weirdness */
-}
-
+++ /dev/null
-#!/bin/sh
-
-# test to see if fuse-devel (or fuse.h and libfuse) is installed
-#
-cat <<EOF >fuse-test.c
-#include <fuse.h>
-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 <<EOF >gsoap-test.c
-#include <stdsoap2.h>
-#ifdef SOAP_BEGIN
-main() { return; }
-#endif
-EOF
-make GSOAPDIR=$GSOAPDIR STDSOAP2=$STDSOAP2 gridsite-delegation.cgi
-if [ $? = 0 ] ; then have_gsoap=1 ; fi
-
-cat <<EOF >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: %(if [ "$RELEASE_VERSION" ] ; then echo $RELEASE_VERSION ; else sed 's/^\([A-Z]\)[^ ]* \([A-Z]\)[^0-9]*\([0-9][^ ]*\).*/1\1\2\3/g' /etc/redhat-release | sed 's/[^A-Z,a-z,0-9]//g' ; fi)
-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-devel,httpd-devel,openssl-devel
-Packager: Andrew McNab <Andrew.McNab@manchester.ac.uk>
-
-%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
-Provides: gridsite
-
-%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 <<EOF >>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 <<EOF >>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 <<EOF >>gridsite.spec
-
-%install
-cd src
-make install prefix=\$RPM_BUILD_ROOT/%{prefix} libdir=%{_lib} \
-GSOAPDIR=\$GSOAPDIR OPENSSL_FLAGS=\$OPENSSL_FLAGS \
-OPENSSL_LIBS=\$OPENSSL_LIBS FLAVOR_EXT=\$FLAVOR_EXT
-EOF
-
-if [ $have_fuse ] ; then
-
-cat <<EOF >>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 <<EOF >>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 <<EOF >>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}/%{_lib}/libgridsite_nossl.so.%{version}
-%attr(-, root, root) %{prefix}/%{_lib}/libgridsite_nossl.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
-%attr(-, root, root) %{prefix}/lib/libgridsite_nossl.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
-%attr(-, root, root) %{prefix}/sbin/gridsite-storage.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 <<EOF >>gridsite.spec
-%package slashgrid
-Group: Applications/Internet
-Summary: slashgrid daemon
-Requires: curl >= 7.12.1,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
-%attr(-, root, root) %{prefix}/share/man/man8/slashgrid.8.gz
-EOF
-
-fi
-
-if [ $have_gsoap ] ; then
-
-cat <<EOF >>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}/bin/htproxyinfo
-%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/man/man1/htproxyinfo.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
-%attr(-, root, root) %{prefix}/share/doc/gridsite-${MINOR_VERSION:-1.x}/htproxyinfo.1
-EOF
-
-fi
-
+++ /dev/null
-/*
- Copyright (c) 2003-8, 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 <apr_strings.h>
-#include <apr_tables.h>
-#include <apr_network_io.h>
-
-#include <ap_config.h>
-#include <httpd.h>
-#include <http_config.h>
-#include <http_core.h>
-#include <http_log.h>
-#include <http_protocol.h>
-#include <http_request.h>
-#include <unixd.h>
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <netdb.h>
-#include <malloc.h>
-#include <stdlib.h>
-#include <string.h>
-#include <dirent.h>
-#include <ctype.h>
-#include <time.h>
-
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-#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 autopasscode;
- int requirepasscode;
- int zoneslashes;
- int envs;
- int format;
- int indexes;
- char *indexheader;
- int gridsitelink;
- char *adminfile;
- char *adminuri;
- char *helpuri;
- char *loginuri;
- char *dnlists;
- char *dnlistsuri;
- char *adminlist;
- int gsiproxylimit;
- char *unzip;
- char *methods;
- char *editable;
- char *headfile;
- char *footfile;
- int gridhttp;
- char *aclformat;
- char *aclpath;
- 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 *html_escape(apr_pool_t *pool, char *s)
-{
- int htmlspecials, i;
- char *escaped, *p;
-
- for (htmlspecials=0,p=s; *p != '\0'; ++p)
- if ((*p == '<') || (*p == '>') || (*p == '&') || (*p == '"'))
- ++htmlspecials;
-
- escaped = apr_palloc(pool, strlen(s) + htmlspecials * 6 + 1);
-
- for (i=0,p=s; *p != '\0'; ++p)
- {
- if (*p == '<')
- {
- strcpy(&escaped[i], "<");
- i += 4;
- }
- else if (*p == '>')
- {
- strcpy(&escaped[i], ">");
- i += 4;
- }
- else if (*p == '&')
- {
- strcpy(&escaped[i], "&");
- i += 5;
- }
- else if (*p == '"')
- {
- strcpy(&escaped[i], """);
- i += 6;
- }
- else
- {
- escaped[i] = *p;
- ++i;
- }
- }
-
- escaped[i] = '\0';
-
- return escaped;
-}
-
-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_auri_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, "<p>\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,"<hr><small>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,
- ". <a href=\"%s?cmd=history&file=%s\">"
- "View page history</a>\n",
- conf->adminfile, file);
- out = apr_pstrcat(r->pool, out, temp, NULL);
- }
-
- out = apr_pstrcat(r->pool, out, "</small>", NULL);
- }
-
- out = apr_pstrcat(r->pool, out, "<hr><small>", NULL);
-
- if (r->notes != NULL)
- {
- grst_cred_auri_0 = (char *)
- apr_table_get(r->notes, "GRST_CRED_AURI_0");
- }
-
- if ((grst_cred_auri_0 != NULL) &&
- (strncmp(grst_cred_auri_0, "dn:", 3) == 0))
- {
- dn = GRSThttpUrlDecode(&grst_cred_auri_0[3]);
- if (dn[0] == '\0')
- {
- free(dn);
- dn = NULL;
- }
- }
-
- if (dn != NULL)
- {
- temp = apr_psprintf(r->pool,
- "You are %s<br>\n", html_escape(r->pool,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,
- "<a href=\"%s?cmd=edit&file=%s\">"
- "Edit page</a> .\n", conf->adminfile, file);
- out = apr_pstrcat(r->pool, out, temp, NULL);
- }
-
- if (GRSTgaclPermHasList(perm) || GRSTgaclPermHasWrite(perm))
- {
- temp = apr_psprintf(r->pool,
- "<a href=\"%s%s?cmd=managedir\">Manage directory</a> .\n",
- dir_uri, conf->adminfile);
-
- out = apr_pstrcat(r->pool, out, temp, NULL);
- }
- }
-
- free(dn);
- }
-
- if ((https != NULL) && (strcasecmp(https, "on") == 0))
- temp = apr_psprintf(r->pool,
- "<a href=\"http://%s%s\">Switch to HTTP</a> \n",
- r->server->server_hostname, r->unparsed_uri);
- else temp = apr_psprintf(r->pool,
- "<a href=\"https://%s%s\">Switch to HTTPS</a> \n",
- r->server->server_hostname, r->unparsed_uri);
-
- out = apr_pstrcat(r->pool, out, temp, NULL);
-
- if ((conf->loginuri != NULL) && (conf->loginuri[0] != '\0'))
- {
- temp = apr_psprintf(r->pool,
- ". <a href=\"%s%s\">Login/Logout</a>\n",
- conf->loginuri, r->unparsed_uri);
- out = apr_pstrcat(r->pool, out, temp, NULL);
- }
-
- if ((conf->helpuri != NULL) && (conf->helpuri[0] != '\0'))
- {
- temp = apr_psprintf(r->pool,
- ". <a href=\"%s\">Website Help</a>\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, ". <a href=\"%s?cmd=print&file=%s\">"
- "Print View</a>\n", conf->adminfile, file);
- out = apr_pstrcat(r->pool, out, temp, NULL);
- }
-
- if (conf->gridsitelink)
- {
- temp = apr_psprintf(r->pool,
- ". Built with <a href=\"http://www.gridsite.org/\">"
- "GridSite</a> %s\n", VERSION);
- out = apr_pstrcat(r->pool, out, temp, NULL);
- }
-
- out = apr_pstrcat(r->pool, out, "\n</small>\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 **** */
-
- fd = -1;
-
- if (conf->headfile[0] == '/') /* try absolute */
- {
- fd = open(conf->headfile, O_RDONLY);
- }
- else /* try relative */
- {
- /* first make a buffer big enough to hold path names we want to try */
- 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, "<body");
- if (p == NULL) p = strstr(buf, "<BODY");
- if (p == NULL) p = strstr(buf, "<Body");
-
- if (p == NULL)
- {
- head_formatted = apr_pstrdup(r->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 </body> tag from body **** */
-
- p = strstr(body_formatted, "</body");
- if (p == NULL) p = strstr(body_formatted, "</BODY");
- if (p == NULL) p = strstr(body_formatted, "</Body");
-
- if (p != NULL) *p = '\0';
-
- /* **** set up dynamic part of footer to go at end of body **** */
-
- admin_formatted = make_admin_footer(r, conf, FALSE);
-
- /* **** try to find a footer file in this or parent directories **** */
-
- fd = -1;
-
- if (conf->footfile[0] == '/') /* try absolute */
- {
- fd = open(conf->footfile, O_RDONLY);
- }
- else /* try relative */
- {
- /* first make a buffer big enough to hold path names we want to try */
- 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 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[999], *d_namepath, *indexheaderpath, *indexheadertext,
- *encoded, *escaped;
- 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,
- "<head><title>Directory listing %s</title></head>\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, "<body bgcolor=white>");
- }
- 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 bgcolor=white>");
-
- body_formatted = apr_psprintf(r->pool,
- "<h1>Directory listing %s</h1>\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, "<p><table>\n", NULL);
-
- if (r->unparsed_uri[1] != '\0')
- body_formatted = apr_pstrcat(r->pool, body_formatted,
- "<tr><td colspan=3>[<a href=\"../\">Parent directory</a>]</td></tr>\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),
- "<td align=right>%R</td><td align=right>%e %b %y</td>",
- &mtime_tm);
-
- encoded = GRSThttpUrlMildencode(namelist[n]->d_name);
- escaped = html_escape(r->pool, namelist[n]->d_name);
-
- if (S_ISDIR(statbuf.st_mode))
- temp = apr_psprintf(r->pool,
- "<tr><td><a href=\"%s/\" content-length=\"%ld\" "
- "last-modified=\"%ld\">"
- "%s/</a></td>"
- "<td align=right>%ld</td>%s</tr>\n",
- encoded, statbuf.st_size, statbuf.st_mtime,
- escaped,
- statbuf.st_size, modified);
- else temp = apr_psprintf(r->pool,
- "<tr><td><a href=\"%s\" content-length=\"%ld\" "
- "last-modified=\"%ld\">"
- "%s</a></td>"
- "<td align=right>%ld</td>%s</tr>\n",
- encoded, statbuf.st_size, statbuf.st_mtime,
- escaped,
- statbuf.st_size, modified);
-
- free(encoded);
- /* escaped done with pool so no free() */
-
- body_formatted = apr_pstrcat(r->pool,body_formatted,temp,NULL);
- }
-
- free(namelist[n]);
- }
-
- free(namelist);
-
- body_formatted = apr_pstrcat(r->pool, body_formatted, "</table>\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, "</body>");
- }
- 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, "</body>");
- }
-
- /* **** 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;
-}
-
-char *make_passcode_file(request_rec *r, mod_gridsite_dir_cfg *conf,
- char *path, apr_time_t expires_time)
-{
- int i;
- char *filetemplate, *notename_i, *grst_cred_i, *cookievalue=NULL;
- apr_uint64_t gridauthcookie;
- apr_table_t *env;
- apr_file_t *fp;
-
- /* create random for use in GRIDHTTP_PASSCODE cookies and file name */
-
- if (apr_generate_random_bytes((char *) &gridauthcookie,
- sizeof(gridauthcookie))
- != APR_SUCCESS) return NULL;
-
- 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 NULL;
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Created passcode file %s", filetemplate);
-
- if (expires_time > 0) apr_file_printf(fp, "expires=%lu\n",
- (time_t) apr_time_sec(expires_time));
-
- apr_file_printf(fp, "domain=%s\npath=%s\n", r->hostname, path);
-
- for (i=0; ; ++i)
- {
- notename_i = apr_psprintf(r->pool, "GRST_CRED_AURI_%d", i);
- if (grst_cred_i = (char *)
- apr_table_get(r->connection->notes, notename_i))
- {
- apr_file_printf(fp, "%s=%s\n", notename_i, grst_cred_i);
- }
- else break; /* GRST_CRED_AURI_i are numbered consecutively */
-
- notename_i = apr_psprintf(r->pool, "GRST_CRED_VALID_%d", i);
- if (grst_cred_i = (char *)
- apr_table_get(r->connection->notes, notename_i))
- {
- apr_file_printf(fp, "%s=%s\n", notename_i, grst_cred_i);
- }
- else break; /* GRST_CRED_VALID_i are numbered consecutively */
- }
-
- if (apr_file_close(fp) != APR_SUCCESS)
- {
- apr_file_remove(filetemplate, r->pool); /* try to clean up */
- return NULL;
- }
-
- cookievalue = rindex(filetemplate, '-');
- if (cookievalue != NULL)
- {
- ++cookievalue;
- return cookievalue;
- }
- else return NULL;
-}
-
-int http_gridhttp(request_rec *r, mod_gridsite_dir_cfg *conf)
-{
- char *httpurl, *cookievalue, expires_str[APR_RFC822_DATE_LEN];
- apr_time_t expires_time;
-
- /* passcode cookies are valid for only 5 mins! */
- expires_time = apr_time_now() + apr_time_from_sec(300);
-
- /* try to generate passcode and make passcode file */
- cookievalue = make_passcode_file(r, conf, r->uri, expires_time);
-
- if (cookievalue == NULL) return HTTP_INTERNAL_SERVER_ERROR;
-
- /* send redirection header back to client */
-
- 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,
- request_rec *r, 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,
- *mildencoded;
- 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(r->pool, "%s/%s", dirname, onedirent->d_name);
-
- if (stat(d_namepath, &statbuf) != 0) continue;
-
- if (S_ISDIR(statbuf.st_mode))
- {
- if (recurse_level < GRST_RECURS_LIMIT)
- recurse4dirlist(d_namepath, dirs_time, fulluri,
- fullurilen, encfulluri, enclen,
- r, 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),
- "<td align=right>%R</td><td align=right>%e %b %y</td>",
- &mtime_tm);
-
- mildencoded = GRSThttpUrlMildencode(&unencname[fullurilen]);
-
- oneline = apr_psprintf(r->pool,
- "<tr><td><a href=\"%s\" "
- "content-length=\"%ld\" "
- "last-modified=\"%ld\">"
- "%s</a></td>"
- "<td align=right>%ld</td>%s</tr>\n",
- mildencoded, statbuf.st_size,
- statbuf.st_mtime,
- html_escape(r->pool, unencname),
- statbuf.st_size, modified);
-
- free(mildencoded);
-
- *body = apr_pstrcat(r->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",
- r->hostname, 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,
- "<head><title>Directory listing %s</title></head>\n", r->uri);
-
- if (conf->format)
- {
- /* **** try to find a header file in this or parent directories **** */
-
- fd = -1;
-
- if (conf->headfile[0] == '/') /* try absolute */
- {
- fd = open(conf->headfile, O_RDONLY);
- }
- else /* try relative */
- {
- /* first make a buffer big enough to hold path names we want to try */
- 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, "<body bgcolor=white>");
- }
- 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 bgcolor=white>");
-
- body = apr_psprintf(r->pool,
- "<h1>Directory listing %s</h1>\n<table>", r->uri);
-
- if ((r->uri)[1] != '\0')
- body = apr_pstrcat(r->pool, body,
- "<tr><td>[<a href=\"../\">Parent directory</a>]</td></tr>\n",
- NULL);
-
- while ((dirname = strsep(&dn_list_ptr, ":")) != NULL)
- recurse4dirlist(dirname, &dirs_time, fulluri, fullurilen,
- encfulluri, enclen, r, &body, 0);
-
- p = (char *) apr_table_get(r->subprocess_env, "HTTPS");
- if ((p != NULL) && (strcmp(p, "on") == 0))
- {
- oneline = apr_psprintf(r->pool,
- "<form action=\"%s%s\" method=post>\n"
- "<input type=hidden name=cmd value=managednlists>"
- "<tr><td colspan=4 align=center><small><input type=submit "
- "value=\"Manage DN lists\"></small></td></tr></form>\n",
- r->uri, conf->adminfile);
-
- body = apr_pstrcat(r->pool, body, oneline, NULL);
- }
-
- body = apr_pstrcat(r->pool, body, "</table>\n", NULL);
-
- free(encfulluri); /* libgridsite doesnt use pools */
-
- if (conf->format)
- {
- /* **** try to find a footer file in this or parent directories **** */
-
- fd = -1;
-
- if (conf->headfile[0] == '/') /* try absolute */
- {
- fd = open(conf->headfile, O_RDONLY);
- }
- else /* try relative */
- {
- /* first make a buffer big enough to hold path names we want to try */
- 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, "</body>");
- }
- 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, "</body>");
-
- /* **** 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;
- }
-
- if (r->uri[strlen(r->uri) - 1] == '/')
- {
- apr_table_setn(r->headers_out, apr_pstrdup(r->pool, "Location"),
- apr_pstrdup(r->pool, conf->dnlistsuri));
-
- r->status = HTTP_MOVED_TEMPORARILY;
- return OK;
- }
-
- fulluri = apr_psprintf(r->pool, "https://%s%s",
- r->hostname, 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->autopasscode = 1; /* GridSiteAutoPasscode on/off */
- conf->requirepasscode = 0; /* GridSiteRequirePasscode on/off */
- conf->zoneslashes = 1; /* GridSiteZoneSlashes number */
- 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->loginuri = NULL; /* GridSiteLoginURI 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->aclpath = NULL; /* GridSiteACLPath acl-path */
- 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->autopasscode = UNSET; /* GridSiteAutoPasscode on/off */
- conf->requirepasscode = UNSET; /* GridSiteRequirePasscode on/off */
- conf->zoneslashes = UNSET; /* GridSiteZoneSlashes number */
- 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->loginuri = NULL; /* GridSiteLoginURI 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->aclpath = NULL; /* GridSiteACLPath acl-path */
- 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->autopasscode != UNSET) conf->autopasscode = direct->autopasscode;
- else conf->autopasscode = server->autopasscode;
-
- if (direct->requirepasscode != UNSET) conf->requirepasscode = direct->requirepasscode;
- else conf->requirepasscode = server->requirepasscode;
-
- if (direct->zoneslashes != UNSET) conf->zoneslashes = direct->zoneslashes;
- else conf->zoneslashes = server->zoneslashes;
-
- 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->loginuri != NULL) conf->loginuri = direct->loginuri;
- else conf->loginuri = server->loginuri;
-
- 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->aclpath != NULL) conf->aclpath = direct->aclpath;
- else conf->aclpath = server->aclpath;
-
- 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, "GridSiteZoneSlashes") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->zoneslashes = atoi(parm);
-
- if (((mod_gridsite_dir_cfg *) cfg)->zoneslashes < 1)
- return "GridSiteZoneSlashes must be greater than 0";
- }
- 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, "GridSiteLoginURI") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->loginuri =
- 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, "GridSiteACLPath") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->aclpath = 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, buf[APRMAXHOSTLEN + 1] = "localhost";
-
- 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)
- {
- if ((parm1[strlen(parm1)-1] != '/') || (parm2[strlen(parm2)-1] != '/'))
- return "GridSiteCastAlias URL and path must end with /";
-
- 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);
-
- if (a->server->server_hostname == NULL)
- {
- apr_gethostname(buf, APRMAXHOSTLEN + 1, a->pool);
- sitecastaliases[i].local_hostname = apr_pstrdup(a->pool, buf);
- }
- else 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, "GridSiteAutoPasscode") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->autopasscode = flag;
- }
- else if (strcasecmp(a->cmd->name, "GridSiteRequirePasscode") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->requirepasscode = 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("GridSiteAutoPasscode", mod_gridsite_flag_cmds,
- NULL, OR_FILEINFO, "on or off"),
- AP_INIT_FLAG("GridSiteRequirePasscode", 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("GridSiteLoginURI", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "URI prefix of login/logout page"),
- 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("GridSiteZoneSlashes", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "number of slashes in passcode cookie paths"),
-
- 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("GridSiteACLPath", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "explicit location of access control file"),
-
- 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");
-#if 0
- apr_table_unset(r->headers_in, "User-Distinguished-Name-2");
-#endif
- apr_table_unset(r->headers_in, "Nist-LoA");
- apr_table_unset(r->headers_in, "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+1], *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_AURI_%d=", &i) == 1)
- {
- if ((p = index(line, '\n')) != NULL) *p = '\0';
- p = index(line, '=');
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_AURI_%d", i),
- apr_pstrdup(conn->pool, &p[1]));
- }
- else if (sscanf(line, "GRST_CRED_VALID_%d=", &i) == 1)
- {
- if ((p = index(line, '\n')) != NULL) *p = '\0';
- p = index(line, '=');
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_VALID_%d", i),
- apr_pstrdup(conn->pool, &p[1]));
- }
- else if (sscanf(line, "GRST_OCSP_URL_%d=", &i) == 1)
- {
- if ((p = index(line, '\n')) != NULL) *p = '\0';
- 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 AURIs and validity info from chain into connection notes,
- and write out in an SSL session creds file.
-*/
-
-void GRST_save_ssl_creds(conn_rec *conn, GRSTx509Chain *grst_chain)
-{
- int i, lastcred, lowest_voms_delegation = 65535;
- char envname[14], *tempfile = NULL, *encoded,
- *sessionfile, session_id[(SSL_MAX_SSL_SESSION_ID_LENGTH+1)*2];
- apr_file_t *fp = NULL;
- SSL *ssl;
- SSLConnRec *sslconn;
- GRSTx509Cert *grst_cert = NULL;
-
- /* check if already done */
-
- if ((grst_chain != 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 - even if creds not save-able*/
-
- 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);
- }
-
- i=0;
-
- for (grst_cert = grst_chain->firstcert;
- grst_cert != NULL; grst_cert = grst_cert->next)
- {
- if (grst_cert->type == GRST_CERT_TYPE_VOMS)
- {
- /* want to record the delegation level
- of the last proxy with VOMS attributes */
-
- lowest_voms_delegation = grst_cert->delegation;
- }
- else if ((grst_cert->type == GRST_CERT_TYPE_EEC) ||
- (grst_cert->type == GRST_CERT_TYPE_PROXY))
- {
- encoded = GRSThttpUrlMildencode(grst_cert->dn);
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_AURI_%d", i),
- apr_pstrcat(conn->pool, "dn:", encoded, NULL));
-
- if (fp != NULL) apr_file_printf(fp, "GRST_CRED_AURI_%d=dn:%s\n",
- i, encoded);
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_VALID_%d", i),
- apr_psprintf(conn->pool,
- "notbefore=%ld notafter=%ld delegation=%d nist-loa=%d",
- grst_cert->notbefore,
- grst_cert->notafter,
- grst_cert->delegation, 0));
-
- if (fp != NULL) apr_file_printf(fp,
- "GRST_CRED_VALID_%d=notbefore=%ld notafter=%ld delegation=%d nist-loa=%d\n",
- i, grst_cert->notbefore,
- grst_cert->notafter,
- grst_cert->delegation, 0);
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server,
- "store GRST_CRED_AURI_%d=dn:%s", i, encoded);
-
- free(encoded);
-
- ++i;
- }
- }
-
- for (grst_cert = grst_chain->firstcert;
- grst_cert != NULL; grst_cert = grst_cert->next)
- {
- if ((grst_cert->type == GRST_CERT_TYPE_VOMS) &&
- (grst_cert->delegation == lowest_voms_delegation))
- {
- /* only export attributes from the last proxy to contain them */
-
- encoded = GRSThttpUrlMildencode(grst_cert->value);
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_AURI_%d", i),
- apr_pstrcat(conn->pool, "fqan:", encoded, NULL));
-
- if (fp != NULL) apr_file_printf(fp, "GRST_CRED_AURI_%d=fqan:%s\n",
- i, encoded);
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_VALID_%d", i),
- apr_psprintf(conn->pool,
- "notbefore=%ld notafter=%ld delegation=%d nist-loa=%d",
- grst_cert->notbefore,
- grst_cert->notafter,
- grst_cert->delegation, 0));
-
- if (fp != NULL) apr_file_printf(fp,
- "GRST_CRED_VALID_%d=notbefore=%ld notafter=%ld delegation=%d nist-loa=%d\n",
- i, grst_cert->notbefore,
- grst_cert->notafter,
- grst_cert->delegation, 0);
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server,
- "store GRST_CRED_AURI_%d=fqan:%s", i, encoded);
-
- free(encoded);
-
- ++i;
- }
- }
-
- /* this needs to be merged into grst_x509? */
-#if 0
- 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));
- }
- }
- }
- }
-#endif
- /* 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 char *get_aclpath_component(request_rec *r, int n)
-/*
- Get the nth component of REQUEST_URI, or component 0
- which is the server name.
-
-*/
-{
- int ii, i, nn;
-
- if (n == 0) return r->server->server_hostname;
-
- if (r->uri == NULL) return NULL; /* some kind of internal error? */
-
- i = 1; /* start of first component */
- nn = 1;
-
- for (ii=1; r->uri[ii] != '\0'; ++ii) /* look for this component */
- {
- if (r->uri[ii] == '/') /* end of a component */
- {
- if (nn == n) break;
-
- ++nn;
- i = ii + 1;
- }
- else if ((r->uri[ii] == '.') && (r->uri[ii+1] == '.'))
- {
- return NULL; /* can this happen? dont allow anyway */
- }
- }
-
- if (nn != n) return NULL; /* no component for this number */
-
- return apr_psprintf(r->pool, "%.*s", ii - i, &(r->uri[i]));
-}
-
-static char *make_aclpath(request_rec *r, char *format)
-{
- int i, n;
- char *formatted, *p;
-
- formatted = apr_pstrdup(r->pool, format);
-
- while (1)
- {
- for (i=0; (formatted[i] != '\0') && (formatted[i] != '%'); ++i) ;
-
- if (formatted[i] == '\0') break;
-
- if ((formatted[i] == '%') && (formatted[i+1] == '%'))
- {
- ++i;
- continue;
- }
-
- if (sscanf(&formatted[i+1], "%d", &n) != 1)
- {
- return NULL; /* not %% or %0,%1,... */
- }
-
- formatted[i] = '\0';
-
- for (i++; isdigit(formatted[i]); ++i) ;
-
- if ((p = get_aclpath_component(r, n)) == NULL) return NULL;
-
- formatted = apr_pstrcat(r->pool, formatted, p, &formatted[i],NULL);
- i += strlen(p);
- }
-
- return ap_server_root_relative(r->pool, formatted);
-}
-
-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, j, n, file_is_acl = 0, cc_delegation,
- destination_is_acl = 0, ishttps = 0, nist_loa, delegation,
- from_cookie = 0;
- char *dn, *p, *q, envname1[30], envname2[30],
- *grst_cred_auri_0 = NULL, *dir_path,
- *remotehost, s[99], *grst_cred_auri_i, *cookies, *file, *https,
- *cookiefile, oneline[1025], *key_i, *decoded,
- *destination = NULL, *destination_uri = NULL, *querytmp,
- *destination_prefix = NULL, *destination_translated = NULL,
- *aclpath = NULL, *grst_cred_valid_0 = NULL, *grst_cred_valid_i,
- *gridauthpasscode = NULL;
- 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;
-
- p = (char *) apr_table_get(env, "HTTPS");
- if ((p != NULL) && (strcmp(p, "on") == 0)) ishttps = 1;
-
- delegation = ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit + 1;
-
- /* reload per-connection (SSL) cred variables? (TO CONNECTION) */
-
- sslconn = (SSLConnRec *) ap_get_module_config(r->connection->conn_config,
- &ssl_module);
- if ((user == NULL) &&
- (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");
- }
-
- /* look for GRIDHTTP_PASSCODE in QUERY_STRING ie after ? */
-
- 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';
- }
- }
-
- /* then look for GRIDHTTP_PASSCODE cookie */
-
- if ((gridauthpasscode == NULL) &&
- ((q = (char *) apr_table_get(r->headers_in, "Cookie")) != NULL))
- {
- cookies = apr_pstrcat(r->pool, " ", q, NULL);
- gridauthpasscode = strstr(cookies, " GRIDHTTP_PASSCODE=");
-
- if (gridauthpasscode != NULL)
- {
- gridauthpasscode = &gridauthpasscode[19];
-
- for (p = gridauthpasscode;
- (*p != '\0') && (*p != ';'); ++p)
- if (!isalnum(*p)) *p = '\0';
-
- if (gridauthpasscode[0] != '\0') from_cookie = 1;
- }
- }
-
- /* try to load user structure from passcode file */
-
- if ((user == NULL) &&
- (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);
-
- i = -1;
- cred = NULL;
-
- 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()))
- {
- if (user != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0,
- r->server, "Bad expires");
- GRSTgaclUserFree(user);
- user = NULL;
- }
- break;
- }
- else if ((strncmp(oneline, "domain=", 7) == 0) &&
- (strcmp(&oneline[7], r->hostname) != 0))
- {
- if (user != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0,
- r->server, "Bad domain/host");
- GRSTgaclUserFree(user);
- user = NULL;
- }
- break;
- }
- else if (strncmp(oneline, "path=", 5) == 0)
- {
- /* count number of slashes in Request URI */
-
- for (n=0,p=r->uri; *p != '\0'; ++p)
- if (*p == '/') ++n;
-
- /* if too few slashes or path mismatch, then stop */
-
- if ((n < ((mod_gridsite_dir_cfg *) cfg)->zoneslashes) ||
- (strncmp(&oneline[5], r->uri, strlen(&oneline[5])) != 0))
- {
- if (user != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0,
- r->server, "Bad path");
- GRSTgaclUserFree(user);
- user = NULL;
- }
-
- break;
- }
- }
- else if ((sscanf(oneline,"GRST_CRED_AURI_%d=",&j) == 1)
- && (j == i+1)
- && ((p = index(oneline, '=')) != NULL))
- {
- cred = GRSTgaclCredCreate(&p[1], NULL);
-
- if (cred != NULL) ++i;
-
- if (user == NULL) user = GRSTgaclUserNew(cred);
- else GRSTgaclUserAddCred(user, cred);
- }
- else if ((sscanf(oneline,"GRST_CRED_VALID_%d=",&j) == 1)
- && (j == i)
- && ((p = index(oneline, '=')) != NULL)
- && (sscanf(&p[1],
- "notbefore=%ld notafter=%ld delegation=%d nist-loa=%d",
- ¬before, ¬after, &delegation,
- &nist_loa) == 4))
- {
- if ((i == 0) &&
- (delegation > ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit))
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0,
- r->server, "Bad delegation");
- if (user != NULL) GRSTgaclUserFree(user);
- user = NULL;
- break;
- }
-
- GRSTgaclCredSetNotBefore( cred, notbefore);
- GRSTgaclCredSetNotAfter( cred, notafter);
- GRSTgaclCredSetDelegation(cred, delegation);
-
- if (delegation == 0) GRSTgaclCredSetNistLoa(cred, 3);
- else GRSTgaclCredSetNistLoa(cred, 2);
- }
- }
-
- apr_file_close(fp);
-
- /* delete passcode file if used over HTTP not HTTPS */
- if (!ishttps) remove(cookiefile);
-
- /* if successful and we got passcode from a cookie, then
- we put cookie value into environment variables, so
- can be used for double-submit cookie CSRF protection */
-
- if ((user != NULL) &&
- from_cookie &&
- ((mod_gridsite_dir_cfg *) cfg)->envs)
- apr_table_setn(env, "GRST_PASSCODE_COOKIE",
- gridauthpasscode);
- }
- }
-
- /*
- if not succeeded from passcode file, try from connection notes
- if a GSI Proxy or have GridSiteAutoPasscode on (the default)
- or have GridSiteRequirePasscode off (the default).
- If GridSiteAutoPasscode off and GridSiteRequirePasscode on
- then interactive websites must use a login script to make passcode
- and file instead.
- */
-
- if ((user == NULL) &&
- (r->connection->notes != NULL) &&
- ((grst_cred_auri_0 = (char *)
- apr_table_get(r->connection->notes, "GRST_CRED_AURI_0")) != NULL) &&
- (strncmp(grst_cred_auri_0, "dn:", 3) == 0) &&
- ((grst_cred_valid_0 = (char *)
- apr_table_get(r->connection->notes, "GRST_CRED_VALID_0")) != NULL) &&
- (sscanf(grst_cred_valid_0,
- "notbefore=%ld notafter=%ld delegation=%d nist-loa=%d",
- ¬before, ¬after, &delegation, &nist_loa) == 4) &&
- (delegation <= ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit) &&
- ((delegation > 0) ||
- ((mod_gridsite_dir_cfg *) cfg)->autopasscode ||
- !(((mod_gridsite_dir_cfg *) cfg)->requirepasscode)))
- {
- cred_0 = GRSTgaclCredCreate(grst_cred_auri_0, NULL);
- if (cred_0 != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Using identity %s from SSL/TLS", grst_cred_auri_0);
-
- GRSTgaclCredSetNotBefore( cred_0, notbefore);
- GRSTgaclCredSetNotAfter( cred_0, notafter);
- GRSTgaclCredSetDelegation(cred_0, delegation);
-
- if (delegation == 0) GRSTgaclCredSetNistLoa(cred_0, 3);
- else GRSTgaclCredSetNistLoa(cred_0, 2);
-
- user = GRSTgaclUserNew(cred_0);
-
- /* check for VOMS etc in GRST_CRED_AURI_i too */
-
- for (i=1; ; ++i)
- {
- snprintf(envname1, sizeof(envname1), "GRST_CRED_AURI_%d", i);
- snprintf(envname2, sizeof(envname2), "GRST_CRED_VALID_%d", i);
-
- if ((grst_cred_auri_i = (char *)
- apr_table_get(r->connection->notes,envname1)) &&
- (grst_cred_valid_i = (char *)
- apr_table_get(r->connection->notes,envname2)))
- {
- cred = GRSTgaclCredCreate(grst_cred_auri_i, NULL);
- if (cred != NULL)
- {
- notbefore = 0;
- notafter = 0;
- delegation = 0;
- nist_loa = 0;
-
- sscanf(grst_cred_valid_i,
- "notbefore=%ld notafter=%ld delegation=%d nist-loa=%d",
- ¬before, ¬after, &delegation, &nist_loa);
-
- GRSTgaclCredSetNotBefore( cred, notbefore);
- GRSTgaclCredSetNotAfter( cred, notafter);
- GRSTgaclCredSetDelegation(cred, delegation);
- GRSTgaclCredSetDelegation(cred, nist_loa);
-
- GRSTgaclUserAddCred(user, cred);
- }
- }
- else break; /* GRST_CRED_AURI_i are numbered consecutively */
- }
- }
-
- /* if user from SSL ok and not a GSI Proxy and have
- GridSiteAutoPasscode on we create passcode and file
- automatically, and return cookie to client.
- (if GridSiteAutoPasscode off then the site must use
- a login script to make passcode and file instead.) */
-
- if (((mod_gridsite_dir_cfg *) cfg)->autopasscode &&
- (user != NULL) &&
- (GRSTgaclCredGetDelegation(cred_0) == 0))
- {
- n = 0; /* number of slashes seen */
-
- for (i=0; r->uri[i] != '\0'; ++i)
- {
- if (n >= ((mod_gridsite_dir_cfg *) cfg)->zoneslashes) break;
-
- if (r->uri[i] == '/') ++n;
- }
-
- if ((n >= ((mod_gridsite_dir_cfg *) cfg)->zoneslashes)
- && (i > 0))
- {
- p = apr_pstrdup(r->pool, r->uri);
- p[i] = '\0';
-
- /* try to generate passcode and make passcode file */
- gridauthpasscode = make_passcode_file(r, cfg, p, 0);
-
- if (gridauthpasscode != NULL)
- {
- apr_table_add(r->headers_out,
- apr_pstrdup(r->pool, "Set-Cookie"),
- apr_psprintf(r->pool,
- "GRIDHTTP_PASSCODE=%s; "
- "domain=%s; "
- "path=%s; "
- "secure", gridauthpasscode, r->hostname, p));
- }
- }
- }
- }
-
- /*
- GridSite passcode files don't include groups, IP or DNS so we add
- them last so they're not written to passcode files by GridSite.
-
- (site-supplied login scripts might create passcode files with
- optional or additional AURIs. for example, valid roles selected by
- the user on the login page.)
-
- */
-
- /* first add groups from DN lists - ie non-optional attributes */
-
- if ((user != NULL) && ((mod_gridsite_dir_cfg *) cfg)->dnlists)
- GRSTgaclUserLoadDNlists(user, ((mod_gridsite_dir_cfg *) cfg)->dnlists);
-
- /* then 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 = GRSTgaclCredCreate("dns:", remotehost);
- GRSTgaclCredSetNotAfter(cred, GRST_MAX_TIME_T);
-
- if (user == NULL) user = GRSTgaclUserNew(cred);
- else GRSTgaclUserAddCred(user, cred);
- }
-
- /* finally add IP credential */
-
- remotehost = (char *) ap_get_remote_host(r->connection,
- r->per_dir_config, REMOTE_DOUBLE_REV, NULL);
- if ((remotehost != NULL) && (*remotehost != '\0'))
- {
- cred = GRSTgaclCredCreate("ip:", r->connection->remote_ip);
- GRSTgaclCredSetNotAfter(cred, GRST_MAX_TIME_T);
-
- if (user == NULL) user = GRSTgaclUserNew(cred);
- else GRSTgaclUserAddCred(user, cred);
- }
-
- /* write contents of user to per-request environment variables */
-
- if (((mod_gridsite_dir_cfg *) cfg)->envs && (user != NULL))
- {
- cred = user->firstcred;
-
- /* old-style Compact Credentials have the same delegation level
- for all credentials. eg Using EEC delegation=0; using 1st GSI
- Proxy then delegation=1 for X509USER _and_ GSIPROXY credentials.
- So we remember the delegation level of any X509USER here */
- if (cred != NULL) cc_delegation = cred->delegation;
-
- for (i=0; (cred != NULL) && (cred->auri != NULL); ++i)
- {
- if (strncmp(cred->auri, "dn:", 3) == 0)
- {
- decoded = GRSThttpUrlDecode(&(cred->auri[3]));
- apr_table_setn(env,
- apr_psprintf(r->pool, "GRST_CRED_%d", i),
- apr_psprintf(r->pool,
- "%s %ld %ld %d %s",
- (i==0) ? "X509USER" : "GSIPROXY",
- cred->notbefore,
- cred->notafter,
- cc_delegation,
- decoded));
- free(decoded);
- }
- else if (strncmp(cred->auri, "fqan:", 5) == 0)
- {
- decoded = GRSThttpUrlDecode(&(cred->auri[5]));
- apr_table_setn(env,
- apr_psprintf(r->pool, "GRST_CRED_%d", i),
- apr_psprintf(r->pool,
- "VOMS %ld %ld 0 %s",
- notbefore, notafter,
- decoded));
- free(decoded);
- }
-
- apr_table_setn(env,
- apr_psprintf(r->pool, "GRST_CRED_AURI_%d", i),
- apr_pstrdup(r->pool, cred->auri));
-
- apr_table_setn(env,
- apr_psprintf(r->pool, "GRST_CRED_VALID_%d", i),
- apr_psprintf(r->pool,
- "notbefore=%ld notafter=%ld delegation=%d nist-loa=%d",
- cred->notbefore,
- cred->notafter,
- cred->delegation,
- cred->nist_loa));
-
- cred = cred->next;
- }
- }
-
- /* check for Destination: header and evaluate if present */
-
- if ((destination = (char *) apr_table_get(r->headers_in,
- "Destination")) != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Destination header found, value=%s", destination);
-
- 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;
- }
- }
- }
-
- if ((((mod_gridsite_dir_cfg *) cfg)->adminlist != NULL) && (user != NULL))
- {
- cred = user->firstcred;
-
- while ((cred != NULL) && (cred->auri != NULL))
- {
- if (strcmp(((mod_gridsite_dir_cfg *) cfg)->adminlist,
- cred->auri) == 0)
- {
- perm = GRST_PERM_ALL;
- if (destination_translated != NULL)
- destination_perm = GRST_PERM_ALL;
- break;
- }
-
- cred = cred->next;
- }
- }
-
- if (perm != GRST_PERM_ALL) /* cannot improve on perfection... */
- {
- if (((mod_gridsite_dir_cfg *) cfg)->aclpath != NULL)
- {
- aclpath = make_aclpath(r,((mod_gridsite_dir_cfg *) cfg)->aclpath);
-
- if (aclpath != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Examine ACL file %s (from ACL path %s)",
- aclpath, ((mod_gridsite_dir_cfg *) cfg)->aclpath);
-
- acl = GRSTgaclAclLoadFile(aclpath);
- }
- else ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Failed to make ACL file from ACL path %s, URI %s)",
- ((mod_gridsite_dir_cfg *) cfg)->aclpath, r->uri);
- }
- else if ((((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)))
- {
- 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));
- }
- }
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "After GACL/Onetime evaluation, GRST_PERM=%d", perm);
-
- /* add permission and first AURI to request notes */
-
- apr_table_setn(r->notes, "GRST_PERM", apr_psprintf(r->pool, "%d", perm));
-
- cred = user->firstcred;
- if ((cred != NULL) && (strncmp(cred->auri, "dn:", 3) == 0))
- {
- apr_table_setn(r->notes, "GRST_CRED_AURI_0",
- apr_psprintf(r->pool, "%s", cred->auri));
- }
-
-
- if (((mod_gridsite_dir_cfg *) cfg)->envs)
- {
- /* copy any credentials from (SSL) connection to environment */
-
- for (i=0; ; ++i)
- {
- snprintf(envname1, sizeof(envname1), "GRST_CRED_AURI_%d", i);
- snprintf(envname2, sizeof(envname2), "GRST_CRED_VALID_%d", i);
-
- if ((grst_cred_auri_i = (char *)
- apr_table_get(r->connection->notes,envname1)) &&
- (grst_cred_valid_i = (char *)
- apr_table_get(r->connection->notes,envname2)))
- {
- apr_table_setn(env,
- apr_psprintf(r->pool, "GRST_CONN_AURI_%d", i),
- apr_pstrdup(r->pool, grst_cred_auri_i));
-
- apr_table_setn(env,
- apr_psprintf(r->pool, "GRST_CONN_VALID_%d", i),
- apr_pstrdup(r->pool, grst_cred_valid_i));
- }
- else break;
- }
-
- 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)->loginuri != NULL)
- apr_table_setn(env, "GRST_LOGIN_URI",
- ((mod_gridsite_dir_cfg *) cfg)->loginuri);
-
- 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)->aclpath != NULL)
- apr_table_setn(env, "GRST_ACL_PATH",
- ((mod_gridsite_dir_cfg *) cfg)->aclpath);
-
- 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) ||
-
- /* for WebDAV/Subversion */
-
- (((r->method_number == M_PROPFIND) ||
- (r->method_number == M_REPORT)) &&
- !GRSTgaclPermHasRead(perm)) ||
-
- (((r->method_number == M_CHECKOUT) ||
- (r->method_number == M_MERGE) ||
- (r->method_number == M_MKACTIVITY) ||
- (r->method_number == M_MKCOL) ||
- (r->method_number == M_LOCK) ||
- (r->method_number == M_UNLOCK)) &&
- !GRSTgaclPermHasWrite(perm))
-
- ) 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 OPENSSL_VERSION_NUMBER < 0x00908000
- if (!(ctx->flags & X509_V_FLAG_CB_ISSUER_CHECK)) return 0;
-#else
- if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK)) return 0;
-#endif
-
- 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;
-#if AP_MODULE_MAGIC_AT_LEAST(20051115,0)
- request_rec *r = (request_rec *)SSL_get_app_data2(ssl);
- SSLSrvConfigRec *sc = mySrvConfig(s);
- SSLDirConfigRec *dc = r ? myDirConfig(r) : NULL;
- modssl_ctx_t *mctx = myCtxConfig(sslconn, sc);
- int verify;
-#endif
- STACK_OF(X509) *certstack;
- GRSTx509Chain *grst_chain;
-
-#if AP_MODULE_MAGIC_AT_LEAST(20051115,0)
- /*
- * Log verification information
- */
- if (s->loglevel >= APLOG_DEBUG)
- {
- X509 *cert = X509_STORE_CTX_get_current_cert(ctx);
- char *sname = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0);
- char *iname = X509_NAME_oneline(X509_get_issuer_name(cert), NULL, 0);
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
- "Certificate Verification: "
- "depth: %d, subject: %s, issuer: %s",
- errdepth,
- sname ? sname : "-unknown-",
- iname ? iname : "-unknown-");
-
- if (sname) modssl_free(sname);
-
- if (iname) modssl_free(iname);
- }
-
- /*
- * Check for optionally acceptable non-verifiable issuer situation
- */
- if (dc && (dc->nVerifyClient != SSL_CVERIFY_UNSET))
- {
- verify = dc->nVerifyClient;
- }
- else
- {
- verify = mctx->auth.verify_mode;
- }
-
- if (verify == SSL_CVERIFY_NONE)
- {
- /*
- * SSLProxyVerify is either not configured or set to "none".
- * (this callback doesn't happen in the server context if SSLVerify
- * is not configured or set to "none")
- */
- return TRUE;
- }
-
- if (ssl_verify_error_is_optional(errnum) &&
- (verify == SSL_CVERIFY_OPTIONAL_NO_CA))
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
- "Certificate Verification: Verifiable Issuer is "
- "configured as optional, therefore we're accepting "
- "the certificate");
-
- sslconn->verify_info = "GENEROUS";
- ok = TRUE;
- }
-
- /*
- * Additionally perform CRL-based revocation checks
- */
- if (ok)
- {
- if (!(ok = ssl_callback_SSLVerify_CRL(ok, ctx, conn)))
- {
- errnum = X509_STORE_CTX_get_error(ctx);
- }
- }
-
- /*
- * If we already know it's not ok, log the real reason
- */
- if (!ok) {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
- "Certificate Verification: Error (%d): %s",
- errnum, X509_verify_cert_error_string(errnum));
-
- if (sslconn->client_cert) {
- X509_free(sslconn->client_cert);
- sslconn->client_cert = NULL;
- }
- sslconn->client_dn = NULL;
- sslconn->verify_error = X509_verify_cert_error_string(errnum);
- }
-
- /*
- * Finally check the depth of the certificate verification
- */
- if (dc && (dc->nVerifyDepth != UNSET))
- {
- depth = dc->nVerifyDepth;
- }
- else
- {
- depth = mctx->auth.verify_depth;
- }
-
- if (errdepth > depth)
- {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
- "Certificate Verification: Certificate Chain too long "
- "(chain has %d certificates, but maximum allowed are "
- "only %d)",
- errdepth, depth);
-
- errnum = X509_V_ERR_CERT_CHAIN_TOO_LONG;
- sslconn->verify_error = X509_verify_cert_error_string(errnum);
-
- ok = FALSE;
- }
-
-#endif
-
- /*
- * 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 GRSTx509ChainLoadCheck
- */
- 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);
- }
- }
-
-#if AP_MODULE_MAGIC_AT_LEAST(20051115,0)
- returned_ok = ok;
-#else
- returned_ok = ssl_callback_SSLVerify(ok, ctx);
-#endif
-
- /* 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.
- */
- {
- certstack = (STACK_OF(X509) *) X509_STORE_CTX_get_chain(ctx);
-
- errnum = GRSTx509ChainLoadCheck(&grst_chain, certstack, NULL,
- "/etc/grid-security/certificates",
- "/etc/grid-security/vomsdir");
-
- 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 GRSTx509ChainLoadCheck()");
-
- /* Put result of GRSTx509ChainLoadCheck into connection notes */
- GRST_save_ssl_creds(conn, grst_chain);
- }
-
- GRSTx509ChainFree(grst_chain);
- }
-
- 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)
- {
- 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 */
- }
-
- 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);
- }
- else ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast does not find %*s (would be at %s)",
- GRSThtcpCountstrLen(htcp_mesg->uri),
- htcp_mesg->uri->text, filename);
-
-
- 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 server_rec *mod_gridsite_log_func_server;
-static void mod_gridsite_log_func(char *file, int line, int level,
- char *fmt, ...)
-{
- char *mesg;
- va_list ap;
-
- va_start(ap, fmt);
- vasprintf(&mesg, fmt, ap);
- va_end(ap);
-
- ap_log_error(file, line, level,
- 0, mod_gridsite_log_func_server, "%s", mesg);
-
- free(mesg);
-}
-
-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();
- mod_gridsite_log_func_server = pServer;
- GRSTerrorLogFunc = mod_gridsite_log_func;
-
- /* 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)
- {
- if (strcmp(r->uri, conf->dnlistsuri) == 0)
- return mod_gridsite_dnlistsuri_dir_handler(r, conf);
-
- if (strncmp(r->uri, conf->dnlistsuri, strlen(conf->dnlistsuri)) == 0)
- return mod_gridsite_dnlistsuri_handler(r, conf);
-
- if ((strncmp(r->uri, conf->dnlistsuri, strlen(r->uri)) == 0)
- && (strlen(r->uri) == strlen(conf->dnlistsuri) - 1))
- {
- apr_table_setn(r->headers_out, apr_pstrdup(r->pool, "Location"),
- apr_pstrcat(r->pool, r->uri, "/", NULL));
-
- r->status = HTTP_MOVED_TEMPORARILY;
- return OK;
- }
- }
-
- 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 */
-};
+++ /dev/null
-/*
- Copyright (c) 2003-7, 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/ *
- *------------------------------------------------------------------*/
-
-
-/*
-
- This example demonstrates how you can make your own Apache modules
- to consume credentials put into environment variables by mod_gridsite.
-
- With the Apache development libraries and includes installed on your
- system, you can build the module with something like:
-
- gcc -g -shared -Wl,-soname=gridsite_example_module \
- -I/usr/include/httpd -I/usr/include/apr-0 \
- -DVERSION=\"$(VERSION)\" -o mod_gridsite_example.so \
- mod_gridsite_example.c
-
- and load it into Apache DIRECTLY AFTER the mod_gridsite LoadModule with:
-
- LoadModule gridsite_module_example mod_gridsite_example.so
-
- This example will work with GridSite 1.6 onwards (AURIs) and older
- versions (Compact Credentials). If you define GRIDSITE_1_6, the
- compatibility support for pre-1.6 won't be compiled in.
-
- The module adds the command GridSiteExample which you can use in
- the main section of Apache's httpd.conf file, outside any virtual
- server sections. It takes one parameter (surround it in " quotes if
- it contains spaces) which is an Attribute URI to be rejected.
-
- These AURIs look like: dn:/C=UK/...
- fqan:/dteam/Role=NULL
- https://voms.xyz/listofDNs
-
- If the parameter matches the AURI, then we refuse the request.
-
- To reject clients with DN /C=UK/... use GridSiteExample "dn:/C=UK/..."
-
- The special values A_Bad_Example and never_nobody_nothing demonstrate
- how to reject bad parameters at start time, and during request handling.
-
- Please read through the rest of the comments in this file to see how it
- all goes together.
-
-*/
-
-#include <stdio.h>
-#include <apr_strings.h>
-#include <apr_tables.h>
-#include <httpd.h>
-#include <http_config.h>
-#include <http_log.h>
-
-module AP_MODULE_DECLARE_DATA gridsite_module;
-
-char *example_parameter = NULL; /* Applies to all virtual servers */
-
-int get_auri_i(char **auri, int i, request_rec *r)
-/*
- Look for credentials from mod_gridsite passed as environment variables.
-*/
-{
- char *s, *p;
-
- /* Try AURI variables first. If you're using GridSite 1.6 onwards
- then you only need this part, but you do need to keep the return
- 0 for failure right at the end. */
-
- *auri = (char *) apr_table_get(r->subprocess_env,
- apr_psprintf(r->pool, "GRST_CRED_AURI_%d", i));
-
- if (*auri != NULL) return 1;
-
-#ifndef GRIDSITE_1_6
- /* Try old-style Compact Credential variables. If you're using
- GridSite 1.6 onwards then you don't need this part, but you
- do need to keep the return 0 right at the end. */
-
- s = (char *) apr_table_get(r->subprocess_env,
- apr_psprintf(r->pool, "GRST_CRED_%d", i));
-
- if ((s != NULL) &&
- (strncmp(s, "X509USER ", 9) == 0) &&
- ((p = index(s, '/')) != NULL))
- {
- *auri = apr_psprintf(r->pool, "dn:%s", p);
- return 1;
- }
-
- if ((s != NULL) &&
- (strncmp(s, "GSIPROXY ", 9) == 0) &&
- ((p = index(s, '/')) != NULL))
- {
- *auri = apr_psprintf(r->pool, "dn:%s", p);
- return 1;
- }
-
- if ((s != NULL) &&
- (strncmp(s, "VOMS ", 5) == 0) &&
- ((p = index(s, '/')) != NULL))
- {
- *auri = apr_psprintf(r->pool, "fqan:%s", p);
- return 1;
- }
-#endif
-
- /* No credentials found: tell the caller with a 0. Keep this line
- even if you discard the old-style Compact Credentials handling. */
- return 0;
-}
-
-static int mod_gridsite_example_fixups(request_rec *r)
-/*
- We do access control here so results of mod_gridsite and mod_ssl
- are available.
-*/
-{
- char *auri;
- int i;
-
- /* We return DECLINED (ie nothing for us to do) if a GridSiteExample
- command doesn't apply. This isn't the same as code 403 Forbidden. */
-
- if (example_parameter == NULL) return DECLINED;
-
- /* If example_parameter has a special value, then immediately deny
- access, causing Apache to return 403 Forbidden to the client. */
-
- if (strcmp(example_parameter, "never_nobody_nothing") == 0)
- return HTTP_FORBIDDEN;
-
- /* Otherwise we go through the credentials from GridSite looking for
- ones to deny. */
-
- for (i=0; get_auri_i(&auri, i, r); ++i)
- {
- /*
- Log what we get back. You can see these in the Apache
- ErrorLog file if you have LogLevel debug in httpd.conf
-
- These lines will look like: dn:/C=UK/...
- fqan:/dteam/Role=NULL
- https://voms.xyz/listofDNs
- */
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Examine AURI %s", auri);
-
- /* If the parameter matches the AURI, then we refuse.
- For example, to reject clients with the DN /C=UK/...
- use GridSiteExample "dn:/C=UK/..." */
-
- if (strcmp(auri, example_parameter) == 0)
- {
- return HTTP_FORBIDDEN;
- }
- }
-
- return DECLINED; /* nothing more for us to do: that's ok */
-}
-
-static const char *mod_gridsite_example_take1_cmds(cmd_parms *a, void *cfg,
- const char *parm)
-{
-/*
- For the command we're allowed, check it doesn't set A_Bad_Example
- and otherwise store it via the global pointer example_parameter
-*/
- if (strcasecmp(a->cmd->name, "GridSiteExample") == 0)
- {
- if (strcmp(parm, "A_Bad_Example") == 0)
- return "Don't set A_Bad_Example in GridSiteExample command.";
-
- example_parameter = apr_pstrdup(a->pool, parm);
- }
-
- return NULL;
-}
-
-static const command_rec mod_gridsite_example_cmds[] =
-{
-/*
- Define one command that we can use in the MAIN SERVER in httpd.conf,
- that takes a single parameter. Enclose in " quotes if it contains
- spaces.
-
- "In main server" = "outside any virtual server sections". You need
- to use Apache's per-server and per-directory module configuration
- machinery if you want to create and merge finer-grained parameters.
-*/
-
- AP_INIT_TAKE1("GridSiteExample", mod_gridsite_example_take1_cmds, NULL,
- RSRC_CONF, "Value to use in GridSite Example Module"),
- {NULL}
-};
-
-static void register_hooks(apr_pool_t *p)
-{
-/*
- From GridSite 1.6.x onwards, credential handling and access control
- are split into APR_HOOK_LAST and APR_HOOK_REALLY_LAST parts of the
- Apache fixups stage. This makes it possible for modules to consume
- credentials placed into environment variables by GridSite or Apache
- itself, and then put additional credentials into the environment
- for access control processing by GridSite with GACL etc.
-
- In both pre-1.6 and 1.6+ cases, the line similar to
-
- LoadModule gridsite_module_example mod_gridsite_example.so
-
- must be placed DIRECTLY AFTER the mod_gridsite LoadModule line.
-*/
-
-#ifdef GRIDSITE_1_6
- ap_hook_fixups(mod_gridsite_example_fixups,NULL,NULL,APR_HOOK_LAST);
-#else
- ap_hook_fixups(mod_gridsite_example_fixups,NULL,NULL,APR_HOOK_REALLY_LAST);
-#endif
-}
-
-module AP_MODULE_DECLARE_DATA gridsite_example_module =
-{
- STANDARD20_MODULE_STUFF,
- NULL, /* dir config creater */
- NULL, /* dir merger */
- NULL, /* create server config */
- NULL, /* merge server config */
- mod_gridsite_example_cmds, /* command apr_table_t */
- register_hooks /* register hooks */
-};
+++ /dev/null
-/*
- Copyright (c) 2003-8, 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 <openssl/ssl.h>
-
-#ifndef BOOL
-#define BOOL unsigned int
-#endif
-
-typedef enum {
- SSL_SHUTDOWN_TYPE_UNSET,
- SSL_SHUTDOWN_TYPE_STANDARD,
- SSL_SHUTDOWN_TYPE_UNCLEAN,
- SSL_SHUTDOWN_TYPE_ACCURATE
-} ssl_shutdown_type_e;
-
-typedef enum {
- SSL_ENABLED_UNSET = -1,
- SSL_ENABLED_FALSE = 0,
- SSL_ENABLED_TRUE = 1,
- SSL_ENABLED_OPTIONAL = 3
-} ssl_enabled_t;
-
-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;
- BOOL enabled;
- BOOL proxy_enabled;
- const char *vhost_id;
- int vhost_id_len;
- int session_cache_timeout;
-#if AP_MODULE_MAGIC_AT_LEAST(20051115,0)
- BOOL cipher_server_pref;
-#endif
- modssl_ctx_t *server;
- modssl_ctx_t *proxy;
-} SSLSrvConfigRec;
-
-extern module AP_MODULE_DECLARE_DATA ssl_module;
+++ /dev/null
-#!/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 <daniel@haxx.se>
-# 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 <a name> name for the SH section
-# - added <a href> 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 class=\"level$indentlevel\">", @p;
-}
-
-sub defaultcss {
- print $OutFH <<ENDOFCSS
-<STYLE type="text/css">
-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%;
-}
-</STYLE>
-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 <span> sections we should convert
-# to proper links
-sub linkfile {
- my @new;
- for(@out) {
- my $line=$_;
- my $l;
- while($line =~ s/<span class=\"(emphasis|bold)\">([^<]*)<\/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="<a class=\"$style\" href=\"#$l\">$name</a>";
- }
- else {
- $link="<span Class=\"$style\">$name</span>";
- }
- $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, "</pre>\n";
- $pre = 0;
- }
-
- my $name = text2name($rest);
- $anchor{$name}=1;
-
- $rest =~ s/\"//g; # cut off quotes
- $rest =~ s/</</g;
- $rest =~ s/>/>/g;
- $out = "<a name=\"$name\"></a><h2 class=\"nroffsh\">$rest</h2>";
- $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;
- $rest =~ s/>/>/g;
- push @p, "<span class=\"bold\">$rest</span> ";
- }
- elsif($keyword =~ /^I$/i) {
- $rest =~ s/\"//g; # cut off quotes
- $rest =~ s/</</g;
- $rest =~ s/>/>/g;
- push @p, "<span class=\"emphasis\">$rest</span> ";
- }
- 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 <pre> section
- showp(@p);
- @p="";
- push @out, "<pre>\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;
- $rest =~ s/>/>/g;
-
- $indentlevel-- if ($indentlevel);
- push @p, "<a name=\"$name\"></a><span class=\"nroffip\">$rest</span> ";
- # 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, "<span class=\"manpage\">$_</span> ";
- }
- }
- else {
- showp(@p);
- print $debugFH "ALERT: unknown keyword \"$keyword\"\n";
- }
- }
- else {
- # text line, decode \-stuff
- my $txt = $in;
-
- $txt =~ s/</</g;
- $txt =~ s/>/>/g;
- $txt =~ s/\\&//g; # cut off \&
- $txt =~ s/\\fI/<span class=\"emphasis\">/g;
- $txt =~ s/\\fB/<span class=\"bold\">/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 <<MOO
-<html><head>
-<title>$title</title>
-<meta name="generator" content="roffit $version">
-MOO
- ;
- defaultcss();
- print "</head><body>\n";
-}
-
-print $OutFH @conv;
-print $OutFH <<ROFFIT
-<p class="roffit">
- This HTML page was made with <a href="http://daniel.haxx.se/projects/roffit/">roffit</a>.
-ROFFIT
- ;
-
-if($standalone) {
- print "</body></html>\n";
-}
+++ /dev/null
-
-#include <stdio.h>
-#include <openssl/x509.h>
-#include <openssl/x509_vfy.h>
-#include <openssl/err.h>
-#include <openssl/pem.h>
-
-#include <openssl/buffer.h>
-#include <openssl/objects.h>
-#include <openssl/asn1.h>
-#include <openssl/evp.h>
-#include <openssl/bio.h>
-
-#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]);
-*/
- }
-}
+++ /dev/null
-/*
- Copyright (c) 2003-7, 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 <stdio.h>
-#include <string.h>
-#include <sys/mount.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <time.h>
-#include <syslog.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/stat.h>
-#include <sys/vfs.h>
-#include <unistd.h>
-#include <signal.h>
-#include <dirent.h>
-#include <malloc.h>
-#include <curl/curl.h>
-#include <pthread.h>
-#include <pwd.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <fuse.h>
-
-#include "gridsite.h"
-
-#define GRST_SLASH_PIDFILE "/var/run/slashgrid.pid"
-
-#define GRST_SLASH_TOPDIR "/var/spool/slashgrid"
-#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_CACHE_EXPIRE 300
-#define GRST_SLASH_DEFAULT_BLOCKSIZE 65536
-#define GRST_SLASH_MAX_BLOCKSIZE 104857600
-#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_INFILE
-#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;
- char *capath;
- time_t last_used;
- } handles[GRST_SLASH_MAX_HANDLES];
-
-pthread_mutex_t cache_mutex;
-
-int debugmode = 0;
-int number_of_tries = 1, sitecast_domain_len = 0;
-char *sitecast_domain = NULL, *sitecast_groups = NULL, *local_root = NULL,
- *gridmapdir = NULL;
-off_t default_blocksize = GRST_SLASH_DEFAULT_BLOCKSIZE;
-uid_t local_uid = 0;
-gid_t local_gid = 0;
-
-int cleanup_recurse(char *currentdirname)
-/*
- returns number of files/dirs LEFT in this directory after scan. ie 0=empty
-*/
-{
- int num_left_here = 0;
- char *s;
- DIR *currentDIR;
- struct stat ent_stat;
- struct dirent *ent;
- time_t now;
-
- time(&now);
-
- if ((currentDIR = opendir(currentdirname)) == NULL)
- {
- return 0; /* some error - maybe its empty anyway? */
- }
-
- while ((ent = readdir(currentDIR)) != NULL)
- {
- if ((strcmp(ent->d_name, "." ) == 0) ||
- (strcmp(ent->d_name, "..") == 0)) continue;
-
- if (asprintf(&s, "%s/%s", currentdirname, ent->d_name) == -1) continue;
-
- if (debugmode) syslog(LOG_DEBUG, "cleanup_thread() stat(%s)", s);
-
- pthread_mutex_lock(&cache_mutex);
- if (stat(s, &ent_stat) == 0) /* ignore if gone already! */
- {
- if (S_ISDIR(ent_stat.st_mode))
- {
- pthread_mutex_unlock(&cache_mutex); /* unlock during recurse */
-
- if (cleanup_recurse(s) == 0) /* directory is now empty */
- {
- pthread_mutex_lock(&cache_mutex); /* lock for stat/rmdir */
-
- if ((stat(s, &ent_stat) == 0) &&
- (S_ISDIR(ent_stat.st_mode)) &&
- (ent_stat.st_mtime < now - GRST_SLASH_CACHE_EXPIRE))
- rmdir(s);
- else ++num_left_here;
-
- pthread_mutex_unlock(&cache_mutex);
-
- if (debugmode) syslog(LOG_DEBUG, "cleanup_thread() rmdir(%s)", s);
- }
- else ++num_left_here;
- }
- else /* not a directory - treat as regular file */
- {
- if (ent_stat.st_mtime < now - GRST_SLASH_CACHE_EXPIRE)
- {
- if (debugmode) syslog(LOG_DEBUG, "cleanup_thread() unlink(%s)", s);
- unlink(s);
- }
- else ++num_left_here;
-
- pthread_mutex_unlock(&cache_mutex);
- }
- }
- else pthread_mutex_unlock(&cache_mutex);
-
- free(s);
- }
-
- closedir(currentDIR);
-
- return num_left_here;
-}
-
-void *cleanup_thread(void *unused)
-{
- while (1)
- {
- cleanup_recurse(GRST_SLASH_HEADERS);
- cleanup_recurse(GRST_SLASH_BLOCKS);
- cleanup_recurse(GRST_SLASH_TMP);
-
- sleep(GRST_SLASH_CACHE_EXPIRE / 2);
- }
-}
-
-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)
- {
- modified_tm.tm_isdst = 0;
- request_data->modified = timegm(&modified_tm);
- request_data->modified_set = 1;
- }
- else if (strptime(&s[15], "%a, %d-%b-%y %T GMT", &modified_tm) != NULL)
- {
- modified_tm.tm_isdst = 0;
- request_data->modified = timegm(&modified_tm);
- request_data->modified_set = 1;
- }
- else if (strptime(&s[15], "%a %b %d %T %Y", &modified_tm) != NULL)
- {
- modified_tm.tm_isdst = 0;
- request_data->modified = timegm(&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';
-
- if (debugmode) 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;
-}
-
-static void check_user_environ(char **capath, char **proxyfile,
- off_t *blocksize, pid_t pid)
-{
- int fd;
- size_t allocated = 1024, ret = 0, count = 0;
- char file[80], *pid_environ, *p;
- struct stat statbuf;
-
- if (proxyfile != NULL) *proxyfile = NULL;
- if (capath != NULL) *capath = NULL;
- if (blocksize != NULL) *blocksize = default_blocksize;
-
- snprintf(file, sizeof(file), "/proc/%d/environ", (int) pid);
-
- if ((fd = open(file, O_RDONLY)) == -1) return;
-
- if (debugmode)
- syslog(LOG_DEBUG, "Opened for %d environ in %s", (int) pid, file);
-
- pid_environ = malloc(allocated + 1); /* always space for terminal NUL */
-
- while ((ret = read(fd, &pid_environ[count], allocated - count)) > 0)
- {
- count += ret;
-
- if (count >= allocated)
- {
- allocated = count + 1024;
- pid_environ = realloc(pid_environ, allocated + 1);
- }
- }
-
- close(fd);
-
- if (ret < 0)
- {
- free(pid_environ);
- syslog(LOG_ERR, "File error reading %s for %d", file, (int) pid);
- return;
- }
-
- pid_environ[count] = '\0'; /* just in case */
-
- for (p = pid_environ; p < pid_environ + count; p += (strlen(p) + 1))
- {
- if (debugmode) syslog(LOG_DEBUG, "Examine %s in environ", p);
-
- if ((proxyfile != NULL) &&
- (strncmp(p, "X509_USER_PROXY=", 16) == 0))
- {
- if ((p[16] != '\0') && (stat(&p[16], &statbuf) == 0))
- {
- if (*proxyfile != NULL) free(*proxyfile);
- *proxyfile = strdup(&p[16]);
- if (debugmode) syslog(LOG_DEBUG, "Found proxyfile");
- }
- }
- else if ((capath != NULL) &&
- (strncmp(p, "X509_CERT_DIR=", 14) == 0))
- {
- if ((p[14] != '\0') && (stat(&p[14], &statbuf) == 0))
- {
- if (*capath != NULL) free(*capath);
- *capath = strdup(&p[14]);
- if (debugmode) syslog(LOG_DEBUG, "Found capath");
- }
- }
- else if ((blocksize != NULL) &&
- (strncmp(p, "SLASHGRID_BLOCKSIZE=", 20) == 0))
- {
- if (p[20] != '\0')
- {
- *blocksize = (off_t) atol(&p[20]);
-
- if (*blocksize > GRST_SLASH_MAX_BLOCKSIZE)
- *blocksize = GRST_SLASH_MAX_BLOCKSIZE;
- else if (*blocksize <= 0) *blocksize = default_blocksize;
- }
- }
- }
-
- free(pid_environ);
-}
-
-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, *capath = NULL, *range_header = NULL,
- *url;
- struct stat statbuf;
- struct curl_slist *headers_list = NULL;
-
- if (strncmp(request_data->url, "https://", 8) == 0) /* HTTPS options */
- {
- ishttps = 1;
-
- check_user_environ(&capath, &proxyfile, NULL, fuse_ctx->pid);
-
- if (proxyfile == 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 (capath == NULL) capath = strdup("/etc/grid-security/certificates");
- }
-
- 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))) &&
- (((handles[i].capath == NULL) && (capath == NULL)) ||
- ((handles[i].capath != NULL) && (capath != NULL) &&
- (strcmp(handles[i].capath, capath) == 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))) ||
- (((handles[i].capath != NULL) || (capath != NULL)) &&
- ((handles[i].capath == NULL) || (capath == NULL) ||
- (strcmp(handles[i].capath, capath) != 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].capath != NULL) free(handles[i].capath);
- handles[i].capath = capath; /* capath might be NULL itself */
-
- 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, handles[i].capath);
-
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSL_VERIFYPEER, 2);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
- }
-
- 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->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);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_INFILESIZE, -1);
- }
- 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");
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_INFILESIZE, -1);
- }
- 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");
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_INFILESIZE, -1);
- }
- 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_INFILESIZE, -1);
- }
-
- 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);
-
- 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;
- }
-
- pthread_mutex_unlock(&(handles[i].mutex));
-
- if (headers_list != NULL) curl_slist_free_all(headers_list);
- if (range_header != NULL) free(range_header);
-
- 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;
-}
-
-static 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 + 1 >= allocated) /* always room for terminal NULL */
- {
- 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;
- }
-
- if (list[used].filename != NULL)
- {
- ++used;
- list[used].filename = NULL; /* used+1>=allocated above allows this */
- }
-
- 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, *encoded_dn;
-
-// 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)
- {
- encoded_dn = GRSThttpUrlMildencode(dn);
-
- cred = GRSTgaclCredCreate("dn:", encoded_dn);
- user = GRSTgaclUserNew(cred);
- free(dn);
- free(encoded_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, fd;
- 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",
- GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
-
- free(encoded_filename);
-
- if ((fd = open(disk_filename, O_RDONLY)) == -1)
- {
- if (debugmode) syslog(LOG_DEBUG, "open(%s) in cache fails", disk_filename);
- free(disk_filename);
- return 0;
- }
-
- if (fstat(fd, &statbuf) != 0) /* no cache file to read */
- {
- close(fd);
- if (debugmode) syslog(LOG_DEBUG, "fstat(%s) in cache fails", disk_filename);
- free(disk_filename);
- return 0;
- }
-
- time(&now);
-
- if (statbuf.st_mtime < now - GRST_SLASH_CACHE_EXPIRE)
- {
- close(fd);
- if (debugmode) syslog(LOG_DEBUG, "%s in cache has expired", disk_filename);
- 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);
-
- free(disk_filename);
-
- if ((fp = fdopen(fd, "r")) != 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;
- }
-
- close(fd);
-
- return 0;
-}
-
-int write_headers_to_cache(struct fuse_context *fuse_ctx, char *filename,
- off_t length, time_t modified)
-{
- int fd, len, ret;
- 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! */
- {
- pthread_mutex_lock(&cache_mutex);
- unlink(newdir);
- mkdir(newdir, S_IRUSR | S_IWUSR | S_IXUSR);
- pthread_mutex_unlock(&cache_mutex);
- }
- /* 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);
- }
-
- pthread_mutex_lock(&cache_mutex);
- ret = rename(tempfile, new_filename);
- pthread_mutex_unlock(&cache_mutex);
-
- if (debugmode) syslog(LOG_DEBUG, "Move %s to %s in cache (%d;%ld,%ld)\n",
- tempfile, new_filename, ret, 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;
- stbuf->st_uid = fuse_ctx.uid;
- stbuf->st_gid = fuse_ctx.gid;
-
- 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_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;
- }
- else if (debugmode) syslog(LOG_DEBUG,
- "Headers for %s not found in cache at %s\n", url, path);
-
- if (debugmode) syslog(LOG_DEBUG, "Get details for %s over network\n", url);
-
- bzero(&request_data, sizeof(struct grst_request));
- request_data.writefunction = null_callback;
- request_data.writedata = NULL;
- request_data.readfunction = null_callback;
- request_data.readdata = 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 (debugmode) syslog(LOG_DEBUG, "perform_request returns error=%d (%s)\n",
- thiserror, errorbuffer);
-
- 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);
-
- pthread_mutex_lock(&cache_mutex);
- rename(tempfile, new_filename);
- pthread_mutex_unlock(&cache_mutex);
-
- if (debugmode) syslog(LOG_DEBUG, "Added %s to block cache", new_filename);
-
- free(tempfile);
- free(new_filename);
-
- return 0;
-}
-
-void drop_cache_blocks(struct fuse_context *fuse_ctx, char *filename)
-/*
- Drop ALL the blocks cached for this file by moving the whole directory
- to GRST_SLASH_TMP and letting the cleanup thread deal with them when
- it has time; and then remove the headers cached for this file.
-*/
-{
- char *encoded_filename, *dirname, *headersname;
-// DIR *blocksDIR;
-// struct dirent *blocks_ent;
-
- encoded_filename = GRSThttpUrlMildencode(filename);
-
- /* move blocks directory */
-
- asprintf(&dirname, "%s/%d%s",
- GRST_SLASH_BLOCKS, fuse_ctx->uid, encoded_filename);
-
- rename(dirname, GRST_SLASH_TMP);
- free(dirname);
-
- /* remove headers file */
-
- asprintf(&headersname, "%s/%d%s",
- GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
-
- unlink(headersname);
- free(headersname);
-
- /* finish */
-
- free(encoded_filename);
- return;
-
-#if 0
- 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 */
-#endif
-}
-
-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, fd;
- char *s, *url, *disk_filename, *encoded_filename, *localpath;
- off_t blocksize, 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;
-
- check_user_environ(NULL, NULL, &blocksize, fuse_ctx.pid);
-
- if (debugmode) syslog(LOG_DEBUG,
- "in slashgrid_read, process blocksize=%ld offset=%ld",
- (long) blocksize, (long) offset);
-
- /* start byte of first block required */
- block_start = blocksize * (offset / blocksize);
-
- /* start byte of last block required */
- block_finish = blocksize * ((offset + size - 1) / blocksize);
-
- encoded_filename = GRSThttpUrlMildencode((char *) path);
- time(&now);
-
- for (block_i = block_start; block_i <= block_finish; block_i += blocksize)
- {
- asprintf(&disk_filename, "%s/%d%s/%ld-%ld",
- GRST_SLASH_BLOCKS, fuse_ctx.uid, encoded_filename,
- (long) block_i, (long) (block_i + blocksize - 1));
-
- if (debugmode) syslog(LOG_DEBUG, "disk_filename=%s", disk_filename);
-
- fd = open(disk_filename, O_RDONLY);
-
- if ((fd == -1) ||
- (fstat(fd, &statbuf) != 0) ||
- (statbuf.st_mtime < now - GRST_SLASH_CACHE_EXPIRE))
- {
- if (fd != -1) close(fd);
-
- write_block_to_cache(&fuse_ctx, (char *) path,
- block_i, block_i + blocksize - 1);
-
- fd = open(disk_filename, O_RDONLY);
- }
-
- /* even if another thread deletes disk_filename between
- open and read, we've still got it open so can carry on */
-
- if (fd != -1)
- {
- if (block_i == block_start)
- {
- lseek(fd, offset - block_start, SEEK_SET);
- read(fd, buf,
- (offset - block_start + size < blocksize)
- ? size : blocksize - offset + block_start);
- }
- else if (block_i == block_finish)
- {
- read(fd, buf + (block_i - offset),
- offset + size - block_i);
- }
- else
- {
- read(fd, buf + (block_i - offset),
- blocksize);
- }
-
- close(fd);
- }
- else syslog(LOG_ERR, "Failed to open %s in cache", disk_filename);
- }
-
- free(disk_filename);
- free(encoded_filename);
-
- if (debugmode) syslog(LOG_DEBUG,
- "slashgrid_read finishes, process blocksize=%ld offset=%ld",
- (long) blocksize, (long) offset);
- 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)
-/*
- Since this is executed after fuse_main() forks, we can do
- various things unset/undone by FUSE.
-*/
-{
- FILE *fp;
- pthread_t cleanup_thread_t;
- struct rlimit unlimited = { RLIM_INFINITY, RLIM_INFINITY };
-
- if ((fp = fopen(GRST_SLASH_PIDFILE, "w")) != NULL)
- {
- fprintf(fp, "%d\n", (int) getpid());
- fclose(fp);
- }
-
- if (debugmode)
- {
- chdir("/var/tmp"); /* fuse changes to / in demonize: undo this */
- setrlimit(RLIMIT_CORE, &unlimited);
- }
-
- pthread_create(&cleanup_thread_t, NULL, cleanup_thread, NULL);
-
- 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,large_read",
- "-s", "-d" };
- int i, ret, fuse_argc = 4; /* by default, ignore the final 2 args */
- struct passwd *pw;
-
- 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 if ((strcmp(argv[i], "--blocksize") == 0) && (i + 1 < argc))
- {
- default_blocksize = (off_t) atol(argv[i+1]);
- if (default_blocksize <= 0)
- {
- fprintf(stderr, "if present, blocksize must be greater than zero\n");
- return 1;
- }
-
- if (default_blocksize > GRST_SLASH_MAX_BLOCKSIZE)
- {
- fprintf(stderr,
- "if present, blocksize must be no greater than %ld\n",
- GRST_SLASH_MAX_BLOCKSIZE);
- return 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 previous crash - will fail if still busy */
-
- mkdir(GRST_SLASH_TOPDIR, 0700);
- mkdir(GRST_SLASH_HEADERS, 0700);
- mkdir(GRST_SLASH_BLOCKS, 0700);
- mkdir(GRST_SLASH_TMP, 0700);
-
- 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;
- }
-
- pthread_mutex_init(&cache_mutex, NULL);
-
-// GRSTerrorLogFunc = slashgrid_logfunc;
-
- GRSTgaclInit();
-
- ret = fuse_main(fuse_argc, fuse_argv, &slashgrid_oper);
-
- syslog(LOG_ERR, "fuse_main() returns and SlashGrid exits! (%d)", ret);
- return ret;
-}
+++ /dev/null
-#!/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
+++ /dev/null
-/*
- 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 <stdio.h>
-#include <string.h>
-
-#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;
-}
+++ /dev/null
-/*
- 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 <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <gridsite.h>
-
-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;
-}
-