Sprout from master 2007-03-23 11:56:29 UTC Aleš Křenek <ljocha@ics.muni.cz> 'push version'
Cherrypick from master 2006-09-19 20:28:45 UTC Aleš Křenek <ljocha@ics.muni.cz> 'Builds after merge _RC31':
org.glite.jp.client/config/startup
org.glite.jp.client/examples/glite-jp-importer.sh
org.glite.jp.client/project/version.properties
org.glite.jp.client/src/jpimporter.c
org.glite.jp.common/Makefile
org.glite.jp.common/interface/attr.h
org.glite.jp.common/interface/context.h
org.glite.jp.common/interface/known_attr.h
org.glite.jp.common/interface/strmd5.h
org.glite.jp.common/interface/types.h
org.glite.jp.common/project/version.properties
org.glite.jp.common/src/attr.c
org.glite.jp.common/src/stdtypes.c
org.glite.jp.common/src/strmd5.c
org.glite.jp.index/Makefile
org.glite.jp.index/config/glite-jpis-config.xml
org.glite.jp.index/config/startup
org.glite.jp.index/doc/README
org.glite.jp.index/doc/glite-jp-indexd.sgml
org.glite.jp.index/examples/jpis-client.c
org.glite.jp.index/examples/jpis-test.c
org.glite.jp.index/examples/query-tests/authz.out
org.glite.jp.index/examples/query-tests/complex_query.out
org.glite.jp.index/examples/query-tests/dump1.sql
org.glite.jp.index/examples/query-tests/run-test.sh
org.glite.jp.index/examples/query-tests/simple_query.out
org.glite.jp.index/project/version.properties
org.glite.jp.index/src/conf.c
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/soap_ops.c
org.glite.jp.index/src/ws_is_typeref.c
org.glite.jp.primary/Makefile
org.glite.jp.primary/config/startup
org.glite.jp.primary/examples/jpps-test.c
org.glite.jp.primary/interface/file_plugin.h
org.glite.jp.primary/project/configure.properties.xml
org.glite.jp.primary/project/version.properties
org.glite.jp.primary/src/attrs.c
org.glite.jp.primary/src/attrs.h
org.glite.jp.primary/src/authz.c
org.glite.jp.primary/src/backend.h
org.glite.jp.primary/src/bones_server.c
org.glite.jp.primary/src/builtin_plugins.h
org.glite.jp.primary/src/feed.c
org.glite.jp.primary/src/ftp_backend.c
org.glite.jp.primary/src/new_ftp_backend.c
org.glite.jp.primary/src/soap_ops.c
org.glite.jp.primary/src/tags.c
org.glite.jp.primary/src/tags.h
org.glite.jp.primary/src/tags_plugin.c
org.glite.jp.server-common/Makefile
org.glite.lb.server-bones/Makefile
org.glite.lb.server-bones/project/version.properties
org.glite.lb.utils/project/version.properties
Cherrypick from master 2006-11-14 17:39:11 UTC Aleš Křenek <ljocha@ics.muni.cz> 'merged connpool branch':
org.glite.lb.server-bones/src/srvbones.c
Delete:
org.glite.deployment.jpis/build.xml
org.glite.deployment.jpis/config/scripts/glite-jpis-config.py
org.glite.deployment.jpis/config/templates/glite-jpis.cfg.xml
org.glite.deployment.jpis/project/build.number
org.glite.deployment.jpis/project/build.properties
org.glite.deployment.jpis/project/glite-jp.sdf.xml.template
org.glite.deployment.jpis/project/glite-jpis.sdf.xml.template
org.glite.deployment.jpis/project/lxscript-rpm.xsl
org.glite.deployment.jpis/project/lxscript-tgz.xsl
org.glite.deployment.jpis/project/properties.xml
org.glite.deployment.jpis/project/quattor-template.xsl
org.glite.deployment.jpis/project/version.properties
org.glite.deployment.jpps/build.xml
org.glite.deployment.jpps/config/scripts/glite-jpps-config.py
org.glite.deployment.jpps/config/templates/glite-jpps.cfg.xml
org.glite.deployment.jpps/project/build.number
org.glite.deployment.jpps/project/build.properties
org.glite.deployment.jpps/project/glite-jpps.sdf.xml.template
org.glite.deployment.jpps/project/lxscript-rpm.xsl
org.glite.deployment.jpps/project/lxscript-tgz.xsl
org.glite.deployment.jpps/project/properties.xml
org.glite.deployment.jpps/project/quattor-template.xsl
org.glite.deployment.jpps/project/version.properties
org.glite.deployment.lb/.cvsignore
org.glite.deployment.lb/CHANGELOG
org.glite.deployment.lb/LICENSE
org.glite.deployment.lb/build.xml
org.glite.deployment.lb/config/scripts/glite-lb-config.py
org.glite.deployment.lb/config/templates/glite-lb.cfg.xml
org.glite.deployment.lb/doc/release_notes/release_notes.doc
org.glite.deployment.lb/doc/release_notes/release_notes.html
org.glite.deployment.lb/doc/release_notes/release_notes.pdf
org.glite.deployment.lb/project/.cvsignore
org.glite.deployment.lb/project/build.number
org.glite.deployment.lb/project/build.properties
org.glite.deployment.lb/project/glite-lb.sdf.xml.template
org.glite.deployment.lb/project/lxscript-rpm.xsl
org.glite.deployment.lb/project/lxscript-tgz.xsl
org.glite.deployment.lb/project/properties.xml
org.glite.deployment.lb/project/quattor-template.xsl
org.glite.deployment.lb/project/version.properties
org.glite.jp.common/test/base64_test.cpp
org.glite.jp.common/test/type_test.cpp
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.primary/examples/dag-deps.c
org.glite.jp.primary/src/classad_plugin.c
org.glite.jp.primary/src/sandbox_plugin.c
org.glite.jp.primary/src/utils.c
org.glite.jp.primary/src/utils.h
org.glite.lb-utils.context/.cvsignore
org.glite.lb-utils.context/LICENSE
org.glite.lb-utils.context/build.xml
org.glite.lb-utils.context/project/build.number
org.glite.lb-utils.context/project/build.properties
org.glite.lb-utils.context/project/configure.properties.xml
org.glite.lb-utils.context/project/properties.xml
org.glite.lb-utils.context/project/version.properties
org.glite.lb-utils.db/.cvsignore
org.glite.lb-utils.db/LICENSE
org.glite.lb-utils.db/Makefile
org.glite.lb-utils.db/build.xml
org.glite.lb-utils.db/examples/db_test.c
org.glite.lb-utils.db/interface/db.h
org.glite.lb-utils.db/project/build.number
org.glite.lb-utils.db/project/build.properties
org.glite.lb-utils.db/project/configure.properties.xml
org.glite.lb-utils.db/project/properties.xml
org.glite.lb-utils.db/project/tar_exclude
org.glite.lb-utils.db/project/version.properties
org.glite.lb-utils.db/src/db.c
org.glite.lb-utils.jobid/.cvsignore
org.glite.lb-utils.jobid/LICENSE
org.glite.lb-utils.jobid/Makefile
org.glite.lb-utils.jobid/build.xml
org.glite.lb-utils.jobid/interface/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.common/doc/events.tex.T
org.glite.lb.common/doc/status.tex.T
org.glite.lb.logger/.cvsignore
org.glite.lb.logger/LICENSE
org.glite.lb.logger/Makefile
org.glite.lb.logger/build.xml
org.glite.lb.logger/config/glite-lb-logger.config.xml
org.glite.lb.logger/config/glite-lb-logger.default-properties
org.glite.lb.logger/config/startup
org.glite.lb.logger/project/build.number
org.glite.lb.logger/project/build.properties
org.glite.lb.logger/project/configure.properties.xml
org.glite.lb.logger/project/properties.xml
org.glite.lb.logger/project/tar_exclude
org.glite.lb.logger/project/version.properties
org.glite.lb.logger/src-nt/Connection.H
org.glite.lb.logger/src-nt/EventManager.H
org.glite.lb.logger/src-nt/Exception.H
org.glite.lb.logger/src-nt/HTTPTransport.H
org.glite.lb.logger/src-nt/HTTPTransport.cpp
org.glite.lb.logger/src-nt/Makefile
org.glite.lb.logger/src-nt/PlainConnection.H
org.glite.lb.logger/src-nt/PlainConnection.cpp
org.glite.lb.logger/src-nt/PluginManager.H
org.glite.lb.logger/src-nt/PluginManager.cpp
org.glite.lb.logger/src-nt/Singleton.H
org.glite.lb.logger/src-nt/SocketInput.H
org.glite.lb.logger/src-nt/SocketInput.cpp
org.glite.lb.logger/src-nt/ThreadPool.H
org.glite.lb.logger/src-nt/ThreadPool.cpp
org.glite.lb.logger/src-nt/Transport.H
org.glite.lb.logger/src-nt/main.cpp
org.glite.lb.logger/src-nt/test/EventManagerTest.cpp
org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp
org.glite.lb.logger/src-nt/test/SingletonTest.cpp
org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp
org.glite.lb.logger/src-nt/test/test_main.cpp
org.glite.lb.logger/src/event_queue.c
org.glite.lb.logger/src/event_store.c
org.glite.lb.logger/src/il_error.c
org.glite.lb.logger/src/il_error.h
org.glite.lb.logger/src/il_master.c
org.glite.lb.logger/src/input_queue_socket.c
org.glite.lb.logger/src/interlogd.c
org.glite.lb.logger/src/interlogd.h
org.glite.lb.logger/src/logd.c
org.glite.lb.logger/src/logd_proto.c
org.glite.lb.logger/src/logd_proto.h
org.glite.lb.logger/src/perftest_il.sh
org.glite.lb.logger/src/perftest_ll.sh
org.glite.lb.logger/src/queue_mgr.c
org.glite.lb.logger/src/queue_thread.c
org.glite.lb.logger/src/recover.c
org.glite.lb.logger/src/send_event.c
org.glite.lb.logger/src/server_msg.c
org.glite.lb.logger/test/IlTestBase.cpp
org.glite.lb.logger/test/IlTestBase.h
org.glite.lb.logger/test/event_queueTest.cpp
org.glite.lb.logger/test/event_storeTest.cpp
org.glite.lb.logger/test/il_test.cpp
org.glite.lb.logger/test/input_queue_socketTest.cpp
org.glite.lb.logger/test/ll_test.cpp
org.glite.lb.logger/test/logd_proto_test.c
org.glite.lb.logger/test/server_msgTest.cpp
org.glite.lb/.cvsignore
org.glite.lb/LICENSE
org.glite.lb/build.xml
org.glite.lb/deployment/README
org.glite.lb/deployment/deploy_all.diff
org.glite.lb/deployment/deploy_jp.diff
org.glite.lb/deployment/deploy_lb.diff
org.glite.lb/doc/README.lb4vdt
org.glite.lb/doc/copyright.tex
org.glite.lb/doc/frontmatter.tex
org.glite.lb/doc/perf_clear_proxy
org.glite.lb/doc/perf_purge
org.glite.lb/doc/perf_reg_jobs
org.glite.lb/doc/perf_results/il_sci_09062006.txt
org.glite.lb/doc/perf_results/il_sci_09062006_01.txt
org.glite.lb/doc/perf_results/il_sci_12062006.txt
org.glite.lb/doc/perf_results/ll_michal_21062006.txt
org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt
org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt
org.glite.lb/doc/perf_results/proxy_sci_09062006.txt
org.glite.lb/doc/perf_run_interlogd
org.glite.lb/doc/perf_run_proxy
org.glite.lb/doc/perf_run_server
org.glite.lb/doc/perf_run_test
org.glite.lb/doc/perftest.tex
org.glite.lb/doc/testplan.tex
org.glite.lb/lb4vdt/LB_install.sh
org.glite.lb/lb4vdt/Makefile.inc
org.glite.lb/lb4vdt/scripts/org.gridsite.core.build
org.glite.lb/project/MultiStruct.pm
org.glite.lb/project/StructField.pm
org.glite.lb/project/at3
org.glite.lb/project/build.number
org.glite.lb/project/build.properties
org.glite.lb/project/dependencies.properties
org.glite.lb/project/events.T
org.glite.lb/project/glite.lb.csf.xml
org.glite.lb/project/properties.xml
org.glite.lb/project/run-workspace
org.glite.lb/project/status.T
org.glite.lb/project/taskdefs.xml
org.glite.lb/project/types.T
org.glite.lb/project/version.properties
org.glite.security.proxyrenewal/.cvsignore
org.glite.security.proxyrenewal/LICENSE
org.glite.security.proxyrenewal/Makefile
org.glite.security.proxyrenewal/build.xml
org.glite.security.proxyrenewal/config/startup
org.glite.security.proxyrenewal/examples/renew_core.c
org.glite.security.proxyrenewal/interface/renewal.h
org.glite.security.proxyrenewal/interface/renewal_core.h
org.glite.security.proxyrenewal/project/build.number
org.glite.security.proxyrenewal/project/build.properties
org.glite.security.proxyrenewal/project/configure.properties.xml
org.glite.security.proxyrenewal/project/properties.xml
org.glite.security.proxyrenewal/project/tar_exclude
org.glite.security.proxyrenewal/project/taskdefs.xml
org.glite.security.proxyrenewal/project/version.properties
org.glite.security.proxyrenewal/src/api.c
org.glite.security.proxyrenewal/src/client.c
org.glite.security.proxyrenewal/src/commands.c
org.glite.security.proxyrenewal/src/common.c
org.glite.security.proxyrenewal/src/renew.c
org.glite.security.proxyrenewal/src/renewal_core.c
org.glite.security.proxyrenewal/src/renewal_locl.h
org.glite.security.proxyrenewal/src/renewd.c
org.glite.security.proxyrenewal/src/renewd_locl.h
org.glite.security.proxyrenewal/src/voms.c
org.glite.testsuites.ctb/LB/Makefile
org.glite.testsuites.ctb/LB/lb-l1.sh
org.glite.testsuites.ctb/LB/lb-l2.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.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-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/grst-delegation.c
org.gridsite.core/src/grst_admin.h
org.gridsite.core/src/grst_admin_file.c
org.gridsite.core/src/grst_admin_gacl.c
org.gridsite.core/src/grst_admin_main.c
org.gridsite.core/src/grst_asn1.c
org.gridsite.core/src/grst_err.c
org.gridsite.core/src/grst_gacl.c
org.gridsite.core/src/grst_htcp.c
org.gridsite.core/src/grst_http.c
org.gridsite.core/src/grst_x509.c
org.gridsite.core/src/grst_xacml.c
org.gridsite.core/src/gsexec.c
org.gridsite.core/src/gsexec.h
org.gridsite.core/src/htcp.c
org.gridsite.core/src/htproxyput.c
org.gridsite.core/src/make-gridsite-spec
org.gridsite.core/src/mod_gridsite.c
org.gridsite.core/src/mod_ssl-private.h
org.gridsite.core/src/roffit
org.gridsite.core/src/showx509exts.c
org.gridsite.core/src/slashgrid.c
org.gridsite.core/src/slashgrid.init
org.gridsite.core/src/urlencode.c
org.gridsite.core/src/xacmlexample.c
+++ /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
jpdump_maildir="--dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR "
[ -d "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] || mkdir "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP "$GLITE_LB_EXPORT_JPDUMP_MAILDIR"
[ -n "$GLITE_LB_EXPORT_JPPS" ] && jpps="--jpps $GLITE_LB_EXPORT_JPPS "
-
[ -n "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] && sandbox_maildir="--sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR "
- if [ -n "$GLITE_LB_EXPORT_JOBSDIR_KEEP" ]; then
- keep_jobs="--store ${GLITE_LB_EXPORT_JOBSDIR_KEEP} "
- [ -d $GLITE_LB_EXPORT_JOBSDIR_KEEP ] || mkdir -p $GLITE_LB_EXPORT_JOBSDIR_KEEP
- fi
-
echo -n Starting glite-jp-importer ...
-
-# 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" \
+ -i $pidfile $jpreg_maildir $jpdump_maildir $jpps $sandbox_maildir $creds" \
&& echo " done" || echo " FAILED"
}
echo "Please specify the Job Provanance Primary Storage server."
exit 1
fi
-# book keeping server
-GLITE_LB_SERVER_PORT=${GLITE_LB_SERVER_PORT:-9000}
-GLITE_LB_EXPORT_BKSERVER=${GLITE_LB_EXPORT_BKSERVER:-localhost:$GLITE_LB_SERVER_PORT}
+# bookkeeping server
+if [ -z "$GLITE_LB_EXPORT_BKSERVER" ]; then
+ echo "Please specify the Book Keeping 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."
GLITE_LB_EXPORT_JPREG_MAILDIR=/tmp/jpreg
echo "GLITE_LB_EXPORT_JPREG_MAILDIR not specified (-J arguent of the bkserver), used $GLITE_LB_EXPORT_JPREG_MAILDIR"
fi
-# pidfile
-[ -n "$GLITE_JP_IMPORTER_PIDFILE" ] && pidfile="-i $GLITE_JP_IMPORTER_PIDFILE "
CERT_ARGS="-c $X509_USER_CERT -k $X509_USER_KEY"
GLITE_LB_EXPORT_JPDUMP_MAILDIR=${GLITE_LB_EXPORT_JPDUMP_MAILDIR:-/tmp/jpdump}
-
-# XXX: head
-#GLITE_LB_EXPORT_DUMPDIR_OLD=${GLITE_LB_EXPORT_DUMPDIR_OLD:-$GLITE_LB_EXPORT_DUMPDIR.old}
-#GLITE_LB_EXPORT_EXPORTDIR=${GLITE_LB_EXPORT_EXPORTDIR:-/tmp/lbexport}
-
+GLITE_LB_EXPORT_DUMPDIR_OLD=${GLITE_LB_EXPORT_DUMPDIR_OLD:-$GLITE_LB_EXPORT_DUMPDIR.old}
+GLITE_LB_EXPORT_EXPORTDIR=${GLITE_LB_EXPORT_EXPORTDIR:-/tmp/lbexport}
GLITE_LB_EXPORT_SANDBOX_MAILDIR=${GLITE_LB_EXPORT_SANDBOX_MAILDIR:-/tmp/jpsandbox}
-
-# 3.1
-GLITE_LB_EXPORT_JOBSDIR=${GLITE_LB_EXPORT_JOBSDIR:-/tmp/lbexport}
-
PREFIX=${PREFIX:-`dirname $0`/..}
LOGDIR=$GLITE_LOCATION_VAR
-GLITE_LB_EXPORT_PURGE_ARGS=${GLITE_LB_EXPORT_PURGE_ARGS:---cleared 2d --aborted 2w --cancelled 2w --other 2m}
+GLITE_LB_EXPORT_PURGE_ARGS=${GLITE_LB_EXPORT_PURGE_ARGS:--a 1h -c 1h -n 1h -o 1d}
[ -d $GLITE_LB_EXPORT_JPDUMP_MAILDIR ] || mkdir -p $GLITE_LB_EXPORT_JPDUMP_MAILDIR
[ -d $GLITE_LB_EXPORT_DUMPDIR ] || mkdir -p $GLITE_LB_EXPORT_DUMPDIR
-
-# XXX: head
-#[ -d $GLITE_LB_EXPORT_DUMPDIR_OLD ] || mkdir -p $GLITE_LB_EXPORT_DUMPDIR_OLD
-#[ -d $GLITE_LB_EXPORT_EXPORTDIR ] || mkdir -p $GLITE_LB_EXPORT_EXPORTDIR
-
+[ -d $GLITE_LB_EXPORT_DUMPDIR_OLD ] || mkdir -p $GLITE_LB_EXPORT_DUMPDIR_OLD
+[ -d $GLITE_LB_EXPORT_EXPORTDIR ] || mkdir -p $GLITE_LB_EXPORT_EXPORTDIR
[ -d $GLITE_LB_EXPORT_SANDBOX_MAILDIR ] || mkdir -p $GLITE_LB_EXPORT_SANDBOX_MAILDIR
-
-# 3.1
-[ -n "$GLITE_LB_EXPORT_DUMPDIR_KEEP" -a ! -d $GLITE_LB_EXPORT_DUMPDIR_KEEP ] && mkdir -p $GLITE_LB_EXPORT_DUMPDIR_KEEP
-[ -d $GLITE_LB_EXPORT_JOBSDIR ] || mkdir -p $GLITE_LB_EXPORT_JOBSDIR
-if [ -n "$GLITE_LB_EXPORT_JOBSDIR_KEEP" ]; then
- keep_jobs="--store ${GLITE_LB_EXPORT_JOBSDIR_KEEP} "
- [ -d $GLITE_LB_EXPORT_JOBSDIR_KEEP ] || mkdir -p $GLITE_LB_EXPORT_JOBSDIR_KEEP
-fi
-
[ -d $LOGDIR ] || mkdir -p $LOGDIR
echo "Using cert args $CERT_ARGS"
$PREFIX/bin/glite-jp-importer --reg-mdir $GLITE_LB_EXPORT_JPREG_MAILDIR --dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR $CERT_ARGS --sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR -g --jpps $GLITE_LB_EXPORT_JPPS $pidfile$keep_jobs> $LOGDIR/jp-importer.log 2>&1 &
-
JP_PID=$!
trap "kill $JP_PID; exit 0" SIGINT
for file in $GLITE_LB_EXPORT_DUMPDIR/*; do
if [ -s $file ]; then
- $PREFIX/sbin/glite-lb-lb_dump_exporter -d $file -s $GLITE_LB_EXPORT_JOBSDIR -m $GLITE_LB_EXPORT_JPDUMP_MAILDIR
- if [ -n "$GLITE_LB_EXPORT_DUMPDIR_KEEP" ]; then
- mv $file $GLITE_LB_EXPORT_DUMPDIR_KEEP
- else
- rm $file
- fi
+ $PREFIX/sbin/glite-lb-lb_dump_exporter -d $file -s $GLITE_LB_EXPORT_EXPORTDIR -m $GLITE_LB_EXPORT_JPDUMP_MAILDIR
+ mv $file $GLITE_LB_EXPORT_DUMPDIR_OLD
else
rm $file
fi
-module.version=1.1.2
+module.version=1.1.0
module.age=0
#include <errno.h>
#include <syslog.h>
#include <fcntl.h>
-#include <libgen.h>
#include "glite/lb/lb_maildir.h"
#include "glite/security/glite_gsplugin.h"
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;
{ "sandbox-mdir",1, NULL, 's'},
{ "pidfile", 1, NULL, 'i'},
{ "poll", 1, NULL, 't'},
- { "store", 1, NULL, 'S'},
{ NULL, 0, NULL, 0}
};
"\t-s, --sandbox-mdir path to the 'LB maildir' subtree for input/output sandboxes\n"
"\t-i, --pidfile file to store master pid\n"
"\t-t, --poll maildir polling interval (in seconds)\n",
- "\t-S, --store keep uploaded jobs in this directory\n",
me);
}
case 'C': cadir = optarg; break;
case 'p': jpps = optarg; break;
case 't': poll = atoi(optarg); break;
- case 'S': store = optarg; break;
case 'r': strcpy(reg_mdir, optarg); break;
case 'd': strcpy(dump_mdir, optarg); break;
case 's': strcpy(sandbox_mdir, optarg); break;
edg_wll_MaildirInit(reg_mdir);
edg_wll_MaildirInit(dump_mdir);
edg_wll_MaildirInit(sandbox_mdir);
- if (store && *store) {
- if (mkdir(store, 0750) != 0 && errno != EEXIST) {
- fprintf(stderr, "Can't create directory %s: %s\n", store, strerror(errno));
- store = NULL;
- }
- }
if ( !debug ) {
if ( daemon(1,0) == -1 ) { perror("deamon()"); exit(1); }
static int readnew = 1;
char *msg = NULL,
*fname = NULL,
- *aux,
- *bname;
- char fspec[PATH_MAX];
+ *aux;
int ret;
int fhnd;
msg_pattern_t tab[] = {
if ( readnew ) ret = edg_wll_MaildirTransStart(dump_mdir, &msg, &fname);
- else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, (time_t)600, &msg, &fname);
+ else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, &msg, &fname);
if ( !ret ) {
- readnew = !readnew;
+ readnew = ~readnew;
if ( readnew ) ret = edg_wll_MaildirTransStart(dump_mdir, &msg, &fname);
- else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, (time_t)600, &msg, &fname);
+ else ret = edg_wll_MaildirRetryTransStart(dump_mdir, (time_t)60, &msg, &fname);
if ( !ret ) {
- readnew = !readnew;
+ readnew = ~readnew;
return 0;
}
}
dprintf(("[%s] Importing LB dump file '%s'\n", name, tab[_file].val));
if ( !debug ) syslog(LOG_INFO, "Importing LB dump file '%s'\n", msg);
ret = soap_call___jpsrv__StartUpload(soap, tab[_jpps].val?:jpps, "", &su_in, &su_out);
- if ( (ret = check_soap_fault(soap, ret)) ) break;
+ 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 (su_out.destination == NULL) {
- dprintf(("[%s] StartUpload returned NULL destination\n", name));
- if ( !debug ) syslog(LOG_ERR, "StartUpload returned NULL destination");
- break;
- }
if ( (fhnd = open(tab[_file].val, O_RDONLY)) < 0 ) {
dprintf(("[%s] Can't open dump file: %s\n", name, tab[_file].val));
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));
- 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);
edg_wll_MaildirTransEnd(dump_mdir, fname, ret? LBMD_TRANS_FAILED_RETRY: LBMD_TRANS_OK);
if ( readnew ) ret = edg_wll_MaildirTransStart(sandbox_mdir, &msg, &fname);
- else ret = edg_wll_MaildirRetryTransStart(sandbox_mdir, (time_t)60, (time_t) 600,&msg, &fname);
+ else ret = edg_wll_MaildirRetryTransStart(sandbox_mdir, (time_t)60, &msg, &fname);
if ( !ret ) {
- readnew = !readnew;
+ readnew = ~readnew;
if ( readnew ) ret = edg_wll_MaildirTransStart(sandbox_mdir, &msg, &fname);
- else ret = edg_wll_MaildirRetryTransStart(sandbox_mdir, (time_t)60, (time_t) 600,&msg, &fname);
+ else ret = edg_wll_MaildirRetryTransStart(sandbox_mdir, (time_t)60, &msg, &fname);
if ( !ret ) {
- readnew = !readnew;
+ readnew = ~readnew;
return 0;
}
}
globus_cond_init(&gCond, GLOBUS_NULL);
gDone = GLOBUS_FALSE;
- gError = GLOBUS_FALSE;
/* do the op */
if ( globus_ftp_client_put(
CFLAGS:=${DEBUG} -I. -I${top_srcdir}/interface -I${stagedir}/include \
${GLOBUSINC}
-LDFLAGS:=-L${globus_prefix}/lib
-
offset=0
version_info:=-version-info ${shell \
perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' }
SRCS:=context.c strmd5.c attr.c
OBJS:=${SRCS:.c=.lo}
-LIBS:=-lcrypto_${nothrflavour}
-LIBS_THR:=-lcrypto_${thrflavour}
-commonlib:= libglite_jp_common_${nothrflavour}.la
-commonlib_thr:= libglite_jp_common_${thrflavour}.la
+commonlib:= libglite_jp_common.la
TRIO_OBJS:=escape.o trio.o strio.o
TRIO_LIB:=libglite_jp_trio.la
TRIO_LOBJS:=${TRIO_OBJS:.o=.lo}
-TEST_LIBS:=-L${cppunit}/lib -lcppunit -ldl
-TEST_INC:=-I${cppunit}/include
-
-
default all: compile
-compile: ${commonlib} ${commonlib_thr} ${TRIO_LIB}
+compile: ${commonlib} ${TRIO_LIB}
${commonlib}: ${OBJS}
- ${LINK} -o $@ ${OBJS} ${LIBS}
-
-${commonlib_thr}: ${OBJS}
- ${LINK} -o $@ ${OBJS} ${LIBS}
+ ${LINK} -o $@ ${OBJS}
${TRIO_LIB}: ${TRIO_LOBJS}
${LINK} ${version_info} -o $@ ${TRIO_LOBJS} -lm
-check: base64_test type_test
- ./base64_test base64_test.xml
- ./type_test type_test.xml
-
-type_test base64_test: %: %.cpp compile
- ${CXX} -c ${CFLAGS} ${TEST_INC} $<
- ${LINKXX} -o $@ $@.o ${commonlib} ${TRIO_LIB} ${TEST_LIBS}
+check:
+ -echo nothing yet
doc:
-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} ${TRIO_LIB} ${PREFIX}/lib
+ ${INSTALL} -m 755 ${commonlib} ${TRIO_LIB} ${PREFIX}/lib
dist: distsrc distbin
#ifndef __GLITE_JP_ATTR
#define __GLITE_JP_ATTR
-#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 *);
time_t glite_jp_attr2time(const char *);
char * glite_jp_time2attr(time_t);
-#ifdef __cplusplus
-};
-#endif
-
#endif
#ifndef __GLITE_JP_CONTEXT
#define __GLITE_JP_CONTEXT
-#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 *);
int glite_jp_run_deferred(glite_jp_context_t);
-#ifdef __cplusplus
-};
-#endif
-
#endif
/** 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"
* 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
#ifndef _GLITE_STRMD5_H
#define _GLITE_STRMD5_H
-#ifdef __cplusplus
-extern "C" {
-#endif
-
#ident "$Header$"
/* Compute MD5 sum of the first argument.
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 */
void *dbhandle;
char **trusted_peers;
char *myURL;
- int noauth;
} *glite_jp_context_t;
typedef enum {
-module.version=1.2.1
+module.version=1.2.0
module.age=1
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++] = ':';
-
+ char *db;
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;
+ int osize = attr->size * 4/3 + 6;
+ db = malloc(osize);
+ db[0] = 'B'; db[1] = ':';
+ osize = base64_encode(attr->value,attr->size,db+2,osize-3);
+ assert(osize >= 0);
+ db[osize] = 0;
+ }
+ else {
+ db = malloc(strlen(attr->value)+3);
+ db[0] = 'S'; db[1] = ':';
+ strcpy(db+2,attr->value);
}
- 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;
+ char *db = fb_to_db_full(ctx,attr);
+ if (len < strlen(db)) db[len] = 0;
+ return db;
}
-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;
+int fb_from_db(void *ctx,const char *str,glite_jp_attrval_t *attr)
+{
+ int osize;
+ switch (str[0]) {
+ case 'B':
+ attr->value = malloc(osize = strlen(str) * 3/4 + 4);
+ attr->size = base64_decode(str,str+2,osize);
+ assert(attr->size >= 0);
+ attr->binary = 1;
+ break;
+ case 'S':
+ attr->value = strdup(str + 2);
+ attr->size = 0;
+ attr->binary = 0;
+ break;
+ default: return EINVAL;
}
- 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;
}
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "lb/trio.h"
+
+#include "types.h"
+#include "type_plugin.h"
+
+static char *namespace = "http://glite.org/wsdl/types/jp_std_attr";
+
+static int check_namespace(const glite_jp_attr_t *a)
+{
+ if (a->namespace && strcmp(a->namespace,namespace)) return -1;
+ return 0;
+}
+
+static int *cmp(
+ void *ctx,
+ const glite_jp_attrval_t *a,
+ const glite_jp_attrval_t *b,
+ int *result
+{
+ struct timeval t;
+ int r;
+
+ if (check_namespace(&a->attr) || check_namespace(&b->attr)) return -1;
+ if (glite_jp_attr_cmp(&a->attr,&b->attr)) return -1;
+
+ switch (a->attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+ r = strcmp(a->value.s,b->value.s);
+ break;
+ case GLITE_JP_ATTR_TIME:
+ t = a->value.time;
+ t.tv_sec -= b->value.time.tv_sec;
+ if ((t.tv_usec -= b->value.time.tv_usec) < 0) {
+ t.tv_usec += 1000000;
+ t.tv_sec--;
+ }
+ r = t.tv_sec ? t.tv_sec : t.tv_usec;
+ if (r) r = r > 0 ? 1 : -1;
+ break;
+ case GLITE_JP_ATTR_TAG:
+ if (a->value.tag.binary != b->value.tag.binary) return -1;
+ if (a->value.tag.binary) {
+ /* FIXME: I'm lazy. */
+ abort();
+ }
+ else r = strcmp(a->value.tag.value,b->value.tag.value);
+ default: return -1;
+ }
+ *result = r;
+ return 0;
+}
+
+static char *to_xml(void *ctx,const glite_jp_attrval_t *a)
+{
+ char *out = NULL;
+
+ if (check_namespace(a)) return NULL;
+
+ switch (a->attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+ trio_asprintf(&out,"%|Xs",a->value.s);
+ break;
+ case GLITE_JP_ATTR_TIME:
+ /* XXX */
+ trio_asprintf(&out,"%ld.06%ld",a->value.time.tv_sec,
+ a->value.time.tv_usec);
+ break;
+ case GLITE_JP_ATTR_TAG:
+ /* FIXME */ assert(!a->value.tag.binary);
+
+ trio_asprintf(&out,"<seq>%d</seq><timestamp>%ld></timestamp>%|Xs",a->value.tag.sequence,a->value.tag.timestamp,a->value.tag.value);
+ break;
+ default:
+ break;
+ }
+ return out;
+}
+
+static glite_jp_attrval_t *from_xml(void *ctx,const char *name,const char *val)
+{
+ /* FIXME: I'm lazy. */
+ abort();
+}
+
+static char *to_db(void *ctx,const glite_jp_attrval_t *a)
+{
+ /* FIXME: I'm lazy. */
+ abort();
+}
+
+static glite_jp_attrval_t *from_db(void *ctx,const char *a)
+{
+ /* FIXME: I'm lazy. */
+ abort();
+}
+
+static const char *db_type(void *ctx,const glite_jp_attr_t *a)
+{
+ if check_namespace(a) return NULL;
+ switch (a->type) {
+ case GLITE_JP_ATTR_OWNER: return "varchar(250) binary";
+ case GLITE_JP_ATTR_TIME: return "datetime";
+ case GLITE_JP_ATTR_TAG: return "mediumblob";
+ default: return NULL;
+ }
+}
+
+int init(
+ glite_jp_context_t ctx,
+ const char *param,
+ glite_jp_tplug_data *pd
+)
+{
+ pd->namespace = namespace;
+ pd->cmp = cmp;
+ pd->to_xml = to_xml;
+ pd->from_xml = from_xml;
+ pd->to_db = to_db;
+ pd->from_db = from_db;
+ pd->db_type = db_type;
+ pd->pctx = ctx;
+}
+
}
while (*enc && *enc != '=') {
- bits <<= 6;
+ bits << 6;
bits |= b64r[*enc++];
shift += 6;
}
}
+ /* XXX: will it ever happen? */
+ if (shift) {
+ if (out_size >= max_out_size) return -1;
+ bits <<= 8-shift;
+ *out = bits & 0xff;
+ out_size++;
+ }
+
return out_size;
}
+++ /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
-#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"
-
-
-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 ;
-}
-
-
-
-include Makefile.inc
-VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/project:${top_srcdir}/doc:${jpproject}:${stagedir}/interface
+VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/examples/query-tests:${top_srcdir}/tests:${top_srcdir}/test:${top_srcdir}/project:${top_srcdir}/doc:${jpproject}:${stagedir}/interface
GLOBUS_LIBS:=-L${globus_prefix}/lib \
-lglobus_common_${nothrflavour} \
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
-
+test_files:=dump1.sql simple_query.in simple_query.out complex_query.in complex_query.out authz.out
MANS1:=glite-jpis-client.1
MANS8:=glite-jp-indexd.8
MANS:=${MANS1} ${MANS8}
SRCS:= conf.c bones_server.c soap_ops.c soap_ps_calls.c \
ws_ps_typeref.c ws_is_typeref.c db_ops.c context.c common_server.c \
- ${is_prefix}ServerLib.c\
- ${ps_prefix}ClientLib.c ${ps_prefix}C.c
+ ${is_prefix}Server.c ${is_prefix}C.c\
+ ${ps_prefix}ClientLib.c
EXA_TEST_SRCS:=jpis-test.c ${is_prefix}C.c ${is_prefix}Client.c context.c db_ops.c conf.c ws_is_typeref.c
EXA_DB_SRCS:=jpis-db-internal.c db_ops.c conf.c context.c ws_is_typeref.c
EXA_CLIENT_OBJS:=${EXA_CLIENT_SRCS:.c=.o}
-COMMONLIB:=-lglite_jp_common_${nothrflavour}
+COMMONLIB:=-lglite_jp_common
SRVCOMMONLIB:=-lglite_jp_server_common
BONESLIB:=-lglite_lb_server_bones
TRIOLIB:=-lglite_jp_trio
${LINK} -o $@ $+ ${GSOAPLIB}
copy_tests: ${test} ${test_files}
-
-${test} ${test_files}:
- for i in $@; do cp ${top_srcdir}/examples/query-tests/$$i ${top_srcdir}/build; done
+ -for i in $?; do cp $$i ${top_srcdir}/build; done
JobProvenanceIS.xh: JobProvenanceIS.wsdl JobProvenanceTypes.wsdl typemap.dat
cp ${stagedir}/interface/JobProvenanceTypes.wsdl .
<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>
[ -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"
[ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
+ if test -z "$GLITE_JPIS_PS" ;then
+ echo 'Error: GLITE_JPIS_PS is not set'
+ echo FAILED
+ return 1
+ fi
if [ ! -d "`dirname $GLITE_JPIS_PIDFILE`" ]
then
echo "Directory `dirname $GLITE_JPIS_PIDFILE` does not exist!"
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 \
+ -s $GLITE_JPIS_PS $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"
}
The index server takes the following options:
./glite-jp-indexd [option]
+ -s, --ps-server primary storage server address (http://hostname:port)
-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
-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.
+Other parameters will be configurable in close future. Its
+current hard-coded values are in org.glite.jp.index/src/conf.[ch]
Starting the daemon
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_PS - location of JP-PS server (_required parameter_)
+ (for example http://umbar.ics.muni.cz:8901)
GLITE_JPIS_DEBUG - setting to '-d' forces the daemon not to daemonize
GLITE_JPIS_QT - defines query type
'hist' ... history query
<arg>--help</arg>
</group></arg>
+ <arg><group choice='plain'>
+ <arg>-s</arg>
+ <arg>--ps-server</arg>
+ </group> <replaceable>HOST:PORT</replaceable></arg>
+
<arg>-d</arg>
<arg><group choice='plain'>
<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>
-
</cmdsynopsis>
</refsynopsisdiv>
<variablelist>
<varlistentry>
+ <term><option>-s</option>|<option>--ps-server</option></term>
+ <listitem><para>
+Primary storage server address
+(http://<replaceable>HOSTNAME:PORT</replaceable>).
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-d</option>|<option>--debug</option></term>
<listitem><para>
Don't run as daemon, additional diagnostics.
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>.
- </para></listitem>
- </varlistentry>
</variablelist>
<para>
<variablelist>
<varlistentry>
- <term>GLITE_JPIS_CONFIG</term>
+ <term>GLITE_JPIS_PS</term>
<listitem><para>
-Specifying config file. Default is <filename>$GLITE_LOCATION/etc/glite-jpis-config.xml</filename>
+Location of JP-PS server (_required parameter_), for example http://umbar.ics.muni.cz:8901.
</para></listitem>
</varlistentry>
#include <time.h>
#include <unistd.h>
#include <getopt.h>
-#include <stdlib.h>
#include <stdsoap2.h>
#include <glite/security/glite_gsplugin.h>
#define soap_serialize__jpisclient__QueryJobsResponse soap_serialize__jpelem__QueryJobsResponse
#define DEFAULT_JPIS "http://localhost:8902"
-#define USE_GMT 1
/* namespaces[] not used here but needed to prevent linker to complain... */
cond = soap_malloc(soap, sizeof(*cond));
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;
+ cond->origin = NULL;
cond->__sizerecord = 2;
cond->record = soap_malloc(soap, cond->__sizerecord * sizeof(*(cond->record)));
fprintf(out, "Conditions:\n");
for (i = 0; i < in->__sizeconditions; i++) {
fprintf(out, "\t%s\n", in->conditions[i]->attr);
- if (in->conditions[i]->origin) {
- for (k = 0; k <= NUMBER_ORIG; k++)
- if (origins[k].orig == *(in->conditions[i]->origin)) break;
- fprintf(out, "\t\torigin == %s\n", origins[k].name);
- } else {
- fprintf(out, "\t\torigin IS ANY\n");
- }
for (j = 0; j < in->conditions[i]->__sizerecord; j++) {
rec = in->conditions[i]->record[j];
for (k = 0; k <= NUMBER_OP; k++)
if (operations[k].op == rec->op) break;
- fprintf(out, "\t\tvalue %s", operations[k].name);
+ fprintf(out, "\t\t%s", operations[k].name);
if (rec->value) {
fprintf(out, " ");
value_print(out, rec->value);
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++) {
fprintf(out, "\tjobid = %s, owner = %s\n", in->jobs[j]->jobid, in->jobs[j]->owner);
{
glite_jp_db_stmt_t stmt;
glite_jp_context_t ctx;
- glite_jpis_context_t isctx = NULL;
+ glite_jpis_context_t isctx;
glite_jp_is_conf *conf;
glite_jp_init_context(&ctx);
- glite_jp_get_conf(argc, argv, NULL, &conf);
- if (!conf) {
- fprintf(stderr, "Can't gather configuration\n");
- goto end;
- }
+ glite_jp_get_conf(0, NULL, NULL, &conf);
if (default_server) strcpy(server, default_server);
else snprintf(server, sizeof(server), "http://localhost:%s", conf->port ? conf->port : GLITE_JPIS_DEFAULT_PORT_STR);
printf("JP index server: %s\n", server);
Conditions:
http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- origin IS ANY
- value == Ready
+ == 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:user
OK
-<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"></jpisclient:QueryJobsResponse>
+Result 0 jobs:
+<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"></jpisclient:QueryJobsResponse>
\ No newline at end of file
Conditions:
http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- origin IS ANY
- value == Done
- value == Ready
+ == Done
+ == Ready
http://egee.cesnet.cz/en/Schema/LB/Attributes:user
- origin IS ANY
- value <> God
+ <> 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:user
OK
-<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"><jobs><jobid>https://localhost:7846/pokus1</jobid><owner>/O=CESNET/O=Masaryk University/CN=Milos Mulac</owner><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Done</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>FILE</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>FILE</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs><jobs><jobid>https://localhost:7846/pokus2</jobid><owner>OwnerName</owner><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Ready</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>SYSTEM</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>SYSTEM</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs></jpisclient:QueryJobsResponse>
+Result 2 jobs:
+ jobid = https://localhost:7846/pokus1, owner = (null)
+ http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
+ value = Done
+ origin = 0, (null)
+ time = Thu Jan 1 01:00:00 1970
+ http://egee.cesnet.cz/en/Schema/LB/Attributes:user
+ value = CertSubj
+ origin = 0, (null)
+ time = Thu Jan 1 01:00:00 1970
+ jobid = https://localhost:7846/pokus2, owner = (null)
+ http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
+ value = Ready
+ origin = 0, (null)
+ time = Thu Jan 1 01:00:00 1970
+ http://egee.cesnet.cz/en/Schema/LB/Attributes:user
+ value = CertSubj
+ origin = 0, (null)
+ time = Thu Jan 1 01:00:00 1970
+<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"><jobs><jobid>https://localhost:7846/pokus1</jobid><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Done</string></value><timestamp>1970-01-01T00:00:00Z</timestamp><origin>SYSTEM</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T00:00:00Z</timestamp><origin>SYSTEM</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs><jobs><jobid>https://localhost:7846/pokus2</jobid><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Ready</string></value><timestamp>1970-01-01T00:00:00Z</timestamp><origin>SYSTEM</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T00:00:00Z</timestamp><origin>SYSTEM</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs></jpisclient:QueryJobsResponse>
\ No newline at end of file
/*!40000 ALTER TABLE `attr_9892f81a8175c09bd00afcb152f510ad` DISABLE KEYS */;
LOCK TABLES `attr_9892f81a8175c09bd00afcb152f510ad` WRITE;
-INSERT INTO `attr_9892f81a8175c09bd00afcb152f510ad` VALUES ('593e62a063231f8c623b74406b3e12b0','CertSubj','S:7201:F::CertSubj',3),('9276789a0093ad44457655ef03ade36a','CertSubj','S:7201:S::CertSubj',2);
+INSERT INTO `attr_9892f81a8175c09bd00afcb152f510ad` VALUES ('593e62a063231f8c623b74406b3e12b0','S:CertSubj','S:CertSubj',1),('9276789a0093ad44457655ef03ade36a','S:CertSubj','S:CertSubj',2);
UNLOCK TABLES;
/*!40000 ALTER TABLE `attr_9892f81a8175c09bd00afcb152f510ad` ENABLE KEYS */;
/*!40000 ALTER TABLE `attr_a1e9e0a1b7943cc041fefb5da65868f9` DISABLE KEYS */;
LOCK TABLES `attr_a1e9e0a1b7943cc041fefb5da65868f9` WRITE;
-INSERT INTO `attr_a1e9e0a1b7943cc041fefb5da65868f9` VALUES ('593e62a063231f8c623b74406b3e12b0','Done','S:7201:F::Done',3),('9276789a0093ad44457655ef03ade36a','Ready','S:7201:S::Ready',1);
+INSERT INTO `attr_a1e9e0a1b7943cc041fefb5da65868f9` VALUES ('593e62a063231f8c623b74406b3e12b0','S:Done','S:Done',1),('9276789a0093ad44457655ef03ade36a','S:Ready','S:Ready',1);
UNLOCK TABLES;
/*!40000 ALTER TABLE `attr_a1e9e0a1b7943cc041fefb5da65868f9` ENABLE KEYS */;
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpisclient: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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient">
-
- <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>
-
-</jpisclient:QueryJobs>
+++ /dev/null
-query: using JPIS http://localhost:12002
-
-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
-<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"><jobs><jobid>https://localhost:7846/pokus1</jobid><owner>/O=CESNET/O=Masaryk University/CN=Milos Mulac</owner><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Done</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>FILE</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>FILE</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs></jpisclient:QueryJobsResponse>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<jpisclient: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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient">
-
- <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>
-
-</jpisclient:QueryJobs>
+++ /dev/null
-query: using JPIS http://localhost:12002
-
-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
-<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"><jobs><jobid>https://localhost:7846/pokus1</jobid><owner>/O=CESNET/O=Masaryk University/CN=Milos Mulac</owner><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Done</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>FILE</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>FILE</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs></jpisclient:QueryJobsResponse>
\ No newline at end of file
# 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"
+ [ -z "$GLITE_JPIS_TEST_ROOT_PASSWORD" ] || ARGS="-p ${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-config.xml"}
if [ -z "$GLITE_JPIS_TEST_DB" ]; then
GLITE_JPIS_TEST_DB="jpis/@localhost:jpis1test"
if [ "x$need_new_db" = "x1" ]; then
mysqladmin -f $ARGS drop $DB_NAME > /dev/null 2>&1
mysqladmin -f $ARGS create $DB_NAME && \
- mysql $ARGS -e "GRANT ALL on $DB_NAME.* to jpis@localhost" && \
+ mysql $ARGS -e 'GRANT ALL on $DB_NAME.* to jpis@localhost' && \
mysql -u $DB_USER $DB_NAME < $GLITE_LOCATION/etc/glite-jp-index-dbsetup.sql || exit 1
db_created="1"
fi
# run index server
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\
+ -i ${GLITE_JPIS_TEST_PIDFILE} -o ${GLITE_JPIS_TEST_LOGFILE} $1\
2>/dev/null
run_test_query() {
X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
- $GLITE_LOCATION/examples/glite-jpis-client -f xml -q $1 \
+ $GLITE_LOCATION/examples/glite-jpis-client -q $1 \
-i http://localhost:$GLITE_JPIS_TEST_PORT &>/tmp/result
- DIFF=`diff -b --ignore-matching-lines="query: using JPIS" $2 /tmp/result`
+ DIFF=`diff --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 ------------------------------------------------------------------------------
+ echo "Expected result:"
cat $2
- echo
- echo ---------------------------------------------------------------------------------------------------
- echo
echo "Obtained result (in /tmp/result):"
- echo ---------------------------------
cat /tmp/result
echo
- echo ---------------------------------------------------------------------------------------------------
drop_db;
kill_is;
exit 1
run_test_feed() {
# run the example
numok=`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 | grep -c OK`
+ GLITE_JPIS_DB=$GLITE_JPIS_TEST_DB \
+ GLITE_JPIS_PORT=$GLITE_JPIS_TEST_PORT \
+ $GLITE_LOCATION/examples/glite-jpis-test 2>/dev/null| grep "OK" | wc -l`
if [ "$numok" -eq "2" ]; then
echo OK.
else
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;
+import_db $GLITE_LOCATION/examples/dump1.sql;
+run_test_query $GLITE_LOCATION/examples/simple_query.in $GLITE_LOCATION/examples/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;
+import_db $GLITE_LOCATION/examples/dump1.sql;
+run_test_query $GLITE_LOCATION/examples/complex_query.in $GLITE_LOCATION/examples/complex_query.out;
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;
+import_db $GLITE_LOCATION/examples/dump1.sql;
+run_test_query $GLITE_LOCATION/examples/simple_query.in $GLITE_LOCATION/examples/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;
Conditions:
http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
- origin IS ANY
- value == Ready
+ == 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:user
OK
-<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"><jobs><jobid>https://localhost:7846/pokus2</jobid><owner>OwnerName</owner><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Ready</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>SYSTEM</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T02:00:01Z</timestamp><origin>SYSTEM</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs></jpisclient:QueryJobsResponse>
+Result 1 jobs:
+ jobid = https://localhost:7846/pokus2, owner = (null)
+ http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus
+ value = Ready
+ origin = 0, (null)
+ time = Thu Jan 1 01:00:00 1970
+ http://egee.cesnet.cz/en/Schema/LB/Attributes:user
+ value = CertSubj
+ origin = 0, (null)
+ time = Thu Jan 1 01:00:00 1970
+<?xml version="1.0" encoding="UTF-8"?><jpisclient:QueryJobsResponse 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" xmlns:jpisclient="http://glite.org/xsd/types/jpisclient"><jobs><jobid>https://localhost:7846/pokus2</jobid><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:finalStatus</name><value><string>Ready</string></value><timestamp>1970-01-01T00:00:00Z</timestamp><origin>SYSTEM</origin></attributes><attributes><name>http://egee.cesnet.cz/en/Schema/LB/Attributes:user</name><value><string>CertSubj</string></value><timestamp>1970-01-01T00:00:00Z</timestamp><origin>SYSTEM</origin></attributes><primaryStorage>http://localhost:8901</primaryStorage></jobs></jpisclient:QueryJobsResponse>
\ No newline at end of file
-module.version=1.2.2
+module.version=1.2.0
module.age=1
#include "db_ops.h"
#include "ws_is_typeref.h"
-
-#define SOAP_FMAC3 static
-#define WITH_NOGLOBAL
-#include "jpis_C.c"
+#include <stdsoap2.h>
+#include "soap_version.h"
+#include "jpis_H.h"
extern SOAP_NMAC struct Namespace jpis__namespaces[];
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;
globus_libc_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);
}
void *param_expires;
char *hname;
-
- char op_args[GLITE_JP_QUERYOP__LAST];
} *glite_jpis_context_t;
typedef struct _slave_data_t{
}
-static size_t db_arg1_length(glite_jpis_context_t isctx, glite_jp_query_rec_t *query) {
+static size_t db_arg2_length(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;
+ len = 0;
+ switch (query->op) {
+ case GLITE_JP_QUERYOP_WITHIN:
+ len = query->binary ? query->size2 : strlen(query->value2) + 1;
+ case GLITE_JP_QUERYOP_UNDEF:
+ case GLITE_JP_QUERYOP_EQUAL:
+ case GLITE_JP_QUERYOP_UNEQUAL:
+ case GLITE_JP_QUERYOP_LESS:
+ case GLITE_JP_QUERYOP_GREATER:
+ case GLITE_JP_QUERYOP_EXISTS:
+ case GLITE_JP_QUERYOP__LAST:
+ len = 0;
+ }
return len;
}
}
-static int glite_jpis_db_queries_serialize(glite_jpis_context_t isctx, void **blob, size_t *len, glite_jp_query_rec_t **queries) {
+static int glite_jpis_db_queries_serialize(void **blob, size_t *len, glite_jp_query_rec_t **queries) {
size_t maxlen;
glite_jp_query_rec_t *query;
int ret;
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);
+ datalen = query->binary ? query->size : strlen(query->value) + 1;
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);
+ datalen = db_arg2_length(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;
// attrs table and attrid_* tables
attrs = ctx->conf->attrs;
i = 0;
- if (attrs) while (attrs[i]) {
+ 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], INDEX_LENGTH);
if (glite_jp_db_prepare(jpctx, "INSERT INTO feeds (state, locked, source, condition) VALUES (?, ?, ?, ?)", &stmt, param, NULL) != 0) goto fail;
feeds = ctx->conf->feeds;
i = 0;
- if (feeds) while (feeds[i]) {
+ while (feeds[i]) {
state = (feeds[i]->history ? GLITE_JP_IS_STATE_HIST : 0) |
(feeds[i]->continuous ? GLITE_JP_IS_STATE_CONT : 0);
locked = 0;
GLITE_JPIS_PARAM(source, source_len, feeds[i]->PS_URL);
- assert(glite_jpis_db_queries_serialize(ctx, &conds, &conds_len, feeds[i]->query) == 0);
+ assert(glite_jpis_db_queries_serialize(&conds, &conds_len, feeds[i]->query) == 0);
assert(conds_len <= sizeof(dbconds));
dbconds_len = conds_len;
memcpy(dbconds, conds, conds_len);
#include "glite/jp/context.h"
#include "glite/jp/strmd5.h"
#include "glite/jp/attr.h"
-#include "glite/jp/known_attr.h"
#include "glite/lb/trio.h"
#include "jpis_H.h"
for (k=0; k < in->__sizeconditions; k++) {
for (j=0; j < i; j++) {
- char *attr = in->conditions[k]->attr;
- if (!strcmp(attr, GLITE_JP_ATTR_JOBID) || !strcmp(attr, indexed_attrs[j])) {
+ if (!strcmp(in->conditions[k]->attr, indexed_attrs[j])) {
ret = 0;
goto end;
}
int i, j, ret;
glite_jp_db_stmt_t stmt;
glite_jp_attrval_t attr;
- glite_jp_attr_orig_t orig;
qwhere = strdup("");
for (i=0; i < in->__sizeconditions; i++) {
- {
- /* attr name */
- if (strcmp(in->conditions[i]->attr, GLITE_JP_ATTR_JOBID) == 0) {
- /* no subset from attr_ table, used jobs table instead */
- attr_md5 = NULL;
- qa = strdup("(");
- } else {
- attr_md5 = str2md5(in->conditions[i]->attr);
-
- /* origin */
- if (in->conditions[i]->origin) {
- glite_jpis_SoapToAttrOrig(soap, in->conditions[i]->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%s jobs.jobid = attr_%|Ss.jobid AND (",
- (i ? "AND" : ""), qb, attr_md5);
-
- free(qb);
- }
-
- /* inside part of the condition: record list (ORs) */
- for (j=0; j < in->conditions[i]->__sizerecord; j++) {
- if (get_op(in->conditions[i]->record[j]->op, &qop)) goto err;
- if (attr_md5) add_attr_table(attr_md5, &attr_tables);
+ attr_md5 = str2md5(in->conditions[i]->attr);
+ trio_asprintf(&qa,"%s jobs.jobid = attr_%|Ss.jobid AND (",
+ (i ? "AND" : ""), attr_md5);
+
+ for (j=0; j < in->conditions[i]->__sizerecord; j++) {
+ if (get_op(in->conditions[i]->record[j]->op, &qop)) goto err;
+ add_attr_table(attr_md5, &attr_tables);
+ if (in->conditions[i]->record[j]->value->string) {
attr.name = in->conditions[i]->attr;
- if (in->conditions[i]->record[j]->value->string) {
- attr.value = in->conditions[i]->record[j]->value->string;
- attr.binary = 0;
- } else {
- attr.value = in->conditions[i]->record[j]->value->blob->__ptr;
- attr.size = in->conditions[i]->record[j]->value->blob->__size;
- attr.binary = 1;
- }
+ attr.value = in->conditions[i]->record[j]->value->string;
+ attr.binary = 0;
glite_jpis_SoapToAttrOrig(soap,
in->conditions[i]->origin, &(attr.origin));
- if (strcmp(in->conditions[i]->attr, GLITE_JP_ATTR_JOBID) == 0) {
- trio_asprintf(&qb,"%s%sjobs.dg_jobid %s \"%|Ss\"",
- qa, (j ? " OR " : ""), qop, attr.value);
- } else {
- trio_asprintf(&qb,"%s%sattr_%|Ss.value %s \"%|Ss\"",
- qa, (j ? " OR " : ""), attr_md5, qop,
- glite_jp_attrval_to_db_index(ctx->jpctx, &attr, 255));
- }
+ trio_asprintf(&qb,"%s%sattr_%|Ss.value %s \"%|Ss\"",
+ qa, (j ? " OR " : ""), attr_md5, qop,
+ glite_jp_attrval_to_db_index(ctx->jpctx, &attr, 255));
free(qop);
free(qa); qa = qb; qb = NULL;
}
- trio_asprintf(&qb,"%s %s)", qwhere, qa);
- free(qa); qwhere = qb; qb = NULL; qa = NULL;
- free(attr_md5);
+ else {
+ attr.name = in->conditions[i]->attr;
+ attr.value = in->conditions[i]->record[j]->value->blob->__ptr;
+ attr.binary = 1;
+ attr.size = in->conditions[i]->record[j]->value->blob->__size;
+ glite_jpis_SoapToAttrOrig(soap,
+ in->conditions[i]->origin, &(attr.origin));
+ trio_asprintf(&qb,"%s %s attr_%|Ss.value %s \"%|Ss\"",
+ qa, (j ? "OR" : ""), attr_md5, qop,
+ glite_jp_attrval_to_db_index(ctx->jpctx, &attr, 255));
+ free(qop);
+ free(qa); qa = qb; qb = NULL;
+ }
}
+ trio_asprintf(&qb,"%s %s)", qwhere, qa);
+ free(qa); qwhere = qb; qb = NULL; qa = NULL;
+ free(attr_md5);
}
qa = strdup("");
}
if (ctx->conf->no_auth) {
- trio_asprintf(&query, "SELECT DISTINCT dg_jobid,ps FROM jobs%s WHERE %s", qa, qwhere);
+ 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);
+ 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);
{
glite_jp_attrval_t jav;
struct jptype__attrValue **av = NULL;;
- enum jptype__attrOrig *origin;
+ //enum jptype__attrOrig *origin;
char *query, *fv, *jobid_md5, *attr_md5;
int i, ret;
glite_jp_db_stmt_t stmt;
- memset(&jav,0,sizeof(jav));
jobid_md5 = str2md5(jobid);
attr_md5 = str2md5(attr_name);
trio_asprintf(&query,"SELECT full_value FROM attr_%|Ss WHERE jobid = \"%s\"",
free(attr_md5);
free(jobid_md5);
- if ((ret = glite_jp_db_execstmt(ctx->jpctx, query, &stmt)) < 0)
- // unknown attribute
- // XXX: propagate the error to client
- goto err;
+ if ((ret = glite_jp_db_execstmt(ctx->jpctx, query, &stmt)) < 0) goto err;
free(query);
i = 0;
else {
av[i]->value->string = soap_strdup(soap, jav.value);
}
- av[i]->timestamp = jav.timestamp;
- glite_jpis_AttrOrigToSoap(soap, jav.origin, &origin);
- av[i]->origin = *origin; soap_dealloc(soap, origin);
- av[i]->originDetail = soap_strdup(soap, jav.origin_detail);
+// XXX: load timestamp and origin from DB
+// need to add columns to DB
+// av[i]->timestamp = jav.timestamp;
+// glite_jpis_AttrOrigToSoap(soap, jav.origin, &origin);
+// av[i]->origin = *origin; free(origin);
+// av[i]->originDetail = soap_strdup(soap, jav.origin_detail);
i++;
freeAttval_t(jav);
glite_jp_query_rec_t **out)
{
glite_jp_query_rec_t *qr;
- int i;
+ int i;
assert(in); assert(out);
-lglobus_common_${nothrflavour} \
-lglobus_gssapi_gsi_${nothrflavour}
-ifneq (${classads_prefix},/usr)
- classadslib := -L${classads_prefix}/lib -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}/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
+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
LDFLAGS:=-L${stagedir}/lib
LINK:=libtool --mode=link ${CC} ${LDFLAGS}
INSTALL:=libtool --mode=install install
daemon:=glite-jp-primarystoraged
-example:=jpps-test dag-deps
+example:=jpps-test
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
+plugins:=glite-jp-tags.la glite-jp-ftpdauth.la
HDRS_I=file_plugin.h
-HDRS_S=builtin_plugins.h backend.h feed.h utils.h
+HDRS_S=builtin_plugins.h backend.h feed.h
SRCS:= bones_server.c soap_ops.c \
- new_ftp_backend.c mysql.c file_plugin.c utils.c\
- feed.c authz.c attrs.c \
- tags.c\
+ new_ftp_backend.c mysql.c file_plugin.c \
+ feed.c authz.c attrs.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
+EXA_SRCS:=jpps-test.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}
+EXA_OBJS:=${EXA_SRCS:.c=.o}
dotless_soap_ver:=${shell echo ${gsoap_version} | tr -d . }
-COMMONLIB:=-lglite_jp_common_${nothrflavour}
+COMMONLIB:=-lglite_jp_common
BONESLIB:=-lglite_lb_server_bones
GSOAPLIB:=-L${stagedir}/lib -lglite_security_gsoap_plugin_${dotless_soap_ver}_${nothrflavour}
TRIOLIB:=-lglite_jp_trio
-LIBTARLIB:=-L${libtar_prefix}/lib -ltar
ifneq (${mysql_prefix},/usr)
ifeq ($(shell test -f ${mysql_prefix}/lib/libmysqlclient.a -o -f ${mysql_prefix}/lib/libmysqlclient.so && echo ok),ok)
${daemon}: ${OBJS}
${LINK} -o $@ -export-dynamic ${OBJS} ${BONESLIB} ${TRIOLIB} ${COMMONLIB} ${GSOAPLIB} ${GLOBUS_LIBS} ${MYSQLIB}
-jpps-test: ${TEST_OBJS}
- ${LINK} -o $@ ${TEST_OBJS} ${GSOAPLIB}
-
-dag-deps: ${DAG_OBJS}
- ${LINKXX} -o $@ ${DAG_OBJS} ${classadslib} ${GSOAPLIB}
+${example}: ${EXA_OBJS}
+ ${LINK} -o $@ ${EXA_OBJS} ${GSOAPLIB} ${GLOBUS_LIBS}
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
-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 \
# ${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-tags.la: tags_plugin.lo
+ ${SOLINK} -o $@ tags_plugin.lo
glite-jp-ftpdauth.la: ftpd_auth.lo mysql.lo
${SOLINK} -o $@ ftpd_auth.lo mysql.lo ${COMMONLIB} ${TRIOLIB} ${MYSQLIB}
-#glite-jp-classad.lo: classad_plugin.c
-# ${LTCOMPILE} -DPLUGIN_DEBUG -o $@ -c $<
-
%.lo: %.c
${LTCOMPILE} -o $@ -c $<
echo -n Starting glite-jp-primarystoraged ...
su - $GLITE_USER -c " $GLITE_LOCATION/bin/glite-jp-primarystoraged \
$GLITE_JP_DEBUG \
- -P $GLITE_LOCATION/lib/glite-jp-tags.so -P $GLITE_LOCATION/lib/glite_lb_plugin.so -P $GLITE_LOCATION/lib/glite-jp-sandbox.so \
+ -P $GLITE_LOCATION/lib/glite-jp-tags.so -P $GLITE_LOCATION/lib/glite_lb_plugin.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' \
+++ /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/security/glite_gsplugin.h"
-#include "glite/jp/known_attr.h"
-
-#include "jpps_H.h"
-#include "jpps_.nsmap"
-
-#include "jptype_map.h"
-
-#include "soap_version.h"
-#if GSOAP_VERSION <= 20602
-#define soap_call___jpsrv__RegisterJob soap_call___ns1__RegisterJob
-#define soap_call___jpsrv__StartUpload soap_call___ns1__StartUpload
-#define soap_call___jpsrv__CommitUpload soap_call___ns1__CommitUpload
-#define soap_call___jpsrv__RecordTag soap_call___ns1__RecordTag
-#define soap_call___jpsrv__FeedIndex soap_call___ns1__FeedIndex
-#define soap_call___jpsrv__FeedIndexRefresh soap_call___ns1__FeedIndexRefresh
-#define soap_call___jpsrv__GetJob soap_call___ns1__GetJob
-#endif
-
-
-static void usage(const char *me)
-{
- fprintf(stderr,"%s: [-s server-url] jobid\n",me);
-
- exit (EX_USAGE);
-}
-
-static int check_fault(struct soap *soap,int err) {
- struct SOAP_ENV__Detail *detail;
- struct jptype__genericFault *f;
- char *reason,indent[200] = " ";
-
- switch(err) {
- case SOAP_OK: puts("OK");
- break;
- case SOAP_FAULT:
- case SOAP_SVR_FAULT:
- if (soap->version == 2) {
- detail = soap->fault->SOAP_ENV__Detail;
- reason = soap->fault->SOAP_ENV__Reason;
- }
- else {
- detail = soap->fault->detail;
- reason = soap->fault->faultstring;
- }
- fputs(reason,stderr);
- putc('\n',stderr);
- assert(detail->__type == SOAP_TYPE__genericFault);
-#if GSOAP_VERSION >=20700
- f = ((struct _genericFault *) detail->fault)
-#else
- f = ((struct _genericFault *) detail->value)
-#endif
- -> jpelem__genericFault;
-
- while (f) {
- fprintf(stderr,"%s%s: %s (%s)\n",indent,
- f->source,f->text,f->description);
- f = f->reason;
- strcat(indent," ");
- }
- return -1;
-
- default: soap_print_fault(soap,stderr);
- return -1;
- }
- return 0;
-}
-
-static const char *orig2str(enum jptype__attrOrig orig)
-{
- switch (orig) {
- case jptype__attrOrig__SYSTEM: return "SYSTEM";
- case jptype__attrOrig__USER: return "USER";
- case jptype__attrOrig__FILE_: return "FILE";
- default: return "unknown";
- }
-}
-
-
-int main(int argc,char *argv[])
-{
- char *server = NULL;
- int opt,ret = 0,i;
- struct soap *soap = soap_new();
- struct _jpelem__GetJobAttributes in;
- struct _jpelem__GetJobAttributesResponse out;
- char *aname = "http://egee.cesnet.cz/en/Schema/LB/Attributes:JDL";
- struct cclassad *ad;
- struct { char *a,*s; } *deps = calloc(1,sizeof *deps);
- int ndeps = 0;
- char *dep_s,*where,*end,*tmp_a,*tmp_s,*wa,*wa_r,*ws,*ws_r;
-
- if (argc < 2) usage(argv[0]);
-
- soap_init(soap);
- soap_set_namespaces(soap, jpps__namespaces);
-
- soap_register_plugin(soap,glite_gsplugin);
-
- while ((opt = getopt(argc,argv,"s:")) >= 0) switch (opt) {
- case 's': server = optarg;
- break;
- case '?': usage(argv[0]);
- }
-
- if (server) {
- argv += 2;
- argc -= 2;
- }
- else server = "http://localhost:8901";
-
-
-
- in.jobid = argv[1];
- in.__sizeattributes = 1;
- in.attributes = &aname;
-
- puts("Retrieving JDL ...");
- if ((ret = check_fault(soap,soap_call___jpsrv__GetJobAttributes(soap,server,"",&in,&out))))
- return 1;
-
- ad = cclassad_create(out.attrValues[0]->value->string);
- if (!ad) {
- fputs("Can't parse JDL\n",stderr);
- return 1;
- }
-
- // cclassad_evaluate_to_string(ad,"dependencies",&dep_s);
- cclassad_evaluate_to_expr(ad,"dependencies",&dep_s);
-
- /* XXX: assumes syntacticly correct dependencies = { ... } */
- where = strchr(dep_s,'{'); assert(where);
- where++;
-
- while ((where = strchr(where, '{'))) { /* 2nd level */
- for (where++; isspace(*where); where++);
-
- if (*where == '{') end = strchr(where, '}')+1; /* more ancestors */
- else for (end = where; !isspace(*end) && *end != ','; end++);
- tmp_a = strndup(where,end - where);
- where = end++;
-
- while(isspace(*where)) where++;
- where++; /* comma */
- while(isspace(*where)) where++;
-
- if (*where == '{') end = strchr(where, '}')+1; /* more successors */
- else for (end = where; !isspace(*end) && *end != ','; end++);
- tmp_s = strndup(where,end - where);
- where = strchr(end+1,'}');
-
-#define DELIM "{} ,\t\n"
- for (ws = strtok_r(tmp_s,DELIM,&ws_r); ws; ws = strtok_r(NULL,DELIM,&ws_r))
- for (wa = strtok_r(tmp_a,DELIM,&wa_r); wa; wa = strtok_r(NULL,DELIM,&wa_r)) {
- deps[ndeps].a = strdup(wa);
- deps[ndeps].s = strdup(ws);
- deps = realloc(deps, (ndeps+2) * sizeof *deps);
- ndeps++;
- deps[ndeps].a = deps[ndeps].s = NULL;
- }
- free(tmp_a); free(tmp_s);
- }
-
- for (i=0; deps[i].a; i++) {
- char attr[1000],*ja,*js;
- int have_a,have_s;
-
- printf("node: %s -> %s\n",deps[i].a,deps[i].s);
- sprintf(attr,"nodes.%s.description.edg_jobid",deps[i].a);
- have_a = cclassad_evaluate_to_string(ad,attr,&ja);
-
- sprintf(attr,"nodes.%s.description.edg_jobid",deps[i].s);
- have_s = cclassad_evaluate_to_string(ad,attr,&js);
-
- printf("jobid: %s -> %s\n",ja,js);
-
- if (have_a && have_s) {
- struct _jpelem__RecordTag in;
- struct _jpelem__RecordTagResponse empty;
- struct jptype__tagValue tagval;
- struct jptype__stringOrBlob val;
-
- in.jobid = ja;
- in.tag = &tagval;
- tagval.name = GLITE_JP_ATTR_WF_SUCCESSOR;
- tagval.value = &val;
- val.string = js;
- val.blob = NULL;
-
- printf("Register successor ...\n");
- ret = check_fault(soap,soap_call___jpsrv__RecordTag(soap, server, "",&in, &empty));
- in.jobid = js;
- tagval.name = GLITE_JP_ATTR_WF_ANCESTOR;
- val.string = ja;
-
- printf("Register ancestor ...\n");
- ret = check_fault(soap,soap_call___jpsrv__RecordTag(soap, server, "",&in, &empty));
- putchar(10);
- }
- }
-
- return ret;
-}
soap_register_plugin(soap,glite_gsplugin);
- /*while ((opt = getopt(argc,argv,"s:")) >= 0) switch (opt) {
+ 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];
+ case '?': usage(argv[0]);
+ }
if (server) {
argv += 2;
}
else server = "http://localhost:8901";
-
if (!strcasecmp(argv[1],"RegisterJob")) {
struct _jpelem__RegisterJob in;
struct _jpelem__RegisterJobResponse empty;
puts("Attribute values:");
for (i=0; i<out.__sizeattrValues; i++)
- printf("\t%s\t%s\t%s\t%s",
+ printf("\t%s\t%s\t%s",
out.attrValues[i]->value->string ?
out.attrValues[i]->value->string :
"binary",
orig2str(out.attrValues[i]->origin),
- out.attrValues[i]->originDetail,
ctime(&out.attrValues[i]->timestamp));
}
\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
\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);
+ int (*attr)(void *fpctx,void *handle,const char *attr,glite_jp_attrval_t **attrval);
/** File type specific operation.
\param[in] fpctx Plugin context.
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
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>
-module.version=1.2.2
+module.version=1.2.0
module.age=1
#include <errno.h>
#include <string.h>
#include <stdlib.h>
-#include <stdio.h>
#include <fcntl.h>
#include "glite/jp/types.h"
#include "feed.h"
#include "backend.h"
#include "attrs.h"
-#include "utils.h"
#include "file_plugin.h"
#include "builtin_plugins.h"
static struct {
- char *namespace;
- glite_jpps_fplug_data_t **plugins;
- int nplugins;
+ char *class,*uri;
+ glite_jpps_fplug_data_t **plugins;
+ int nplugins;
+} *known_classes;
-} *known_namespaces;
+static int tags_index;
-static void scan_namespaces(glite_jp_context_t ctx)
+
+static void scan_classes(glite_jp_context_t ctx)
{
- int i,j,k;
- glite_jpps_fplug_data_t *pd;
+ 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];
- }
- 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);
- }
- }
+ pd = ctx->plugins[i];
+
+ for (j=0; pd->classes[j]; j++) {
+ for (k=0; known_classes && known_classes[k].class
+ && strcmp(pd->classes[j],known_classes[k].class);
+ k++);
+ if (known_classes && known_classes[k].class) {
+ known_classes[k].plugins = realloc(known_classes[k].plugins,
+ (known_classes[k].nplugins + 2) * sizeof(glite_jpps_fplug_data_t *));
+ known_classes[k].plugins[known_classes[k].nplugins++] = pd;
+ known_classes[k].plugins[known_classes[k].nplugins] = NULL;
+ }
+ else {
+ known_classes = realloc(known_classes,(k+2) * sizeof *known_classes);
+ known_classes[k].class = pd->classes[j];
+ known_classes[k].uri = pd->uris[j];
+ known_classes[k].plugins = malloc(2 * sizeof(glite_jpps_fplug_data_t *));
+ known_classes[k].plugins[0] = pd;
+ known_classes[k].plugins[1] = NULL;
+ known_classes[k].nplugins = 1;
+ memset(known_classes+k+1,0,sizeof *known_classes);
+ if (!strcmp(known_classes[k].uri,GLITE_JP_FILETYPE_TAGS)) tags_index = k;
+ }
}
- }
+ }
}
static int merge_attrvals(glite_jp_attrval_t **out,int nout,const glite_jp_attrval_t *in)
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;
}
-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){
- void *ph, *beh;
- char** names = NULL;
- int nnames = glite_jppsbe_get_names(ctx, job, class, &names);
- int n;
- glite_jp_error_t *keep_err = NULL;
-
- for (n = 0; n < nnames; n++)
- if (! glite_jppsbe_open_file(ctx,job,class, names[n], O_RDONLY, &beh)) {
- if (!plugin->ops.open(plugin->fpctx,beh,uri,&ph)) {
- 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;
- plugin->ops.close(plugin->fpctx, ph);
- if (keep_err) { ctx->error = keep_err; keep_err = NULL; }
- }
- keep_err = ctx->error; ctx->error = NULL;
- glite_jppsbe_close_file(ctx,beh);
- if (keep_err) { ctx->error = keep_err; keep_err = NULL; }
- }
-}
-
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;
+ glite_jp_attrval_t *meta = NULL,*out = NULL;
char const **other = NULL;
int i,j,nmeta,nother,err = 0,nout = 0;
+ struct { int class_idx;
+ char *name;
+ } *files = NULL;
+ int nfiles = 0;
+
nmeta = nother = 0;
glite_jp_clear_error(ctx);
/* 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, m;
- void* beh;
- 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;
+ if (!known_classes) scan_classes(ctx);
+
+/* build a list of available files for this job */
+ files = malloc(sizeof *files);
+ files->class_idx = tags_index;
+ files->name = NULL;
+ nfiles = 1;
+
+ for (i=0; known_classes[i].class; i++) {
+ char **names = NULL;
+ int nnames =
+ glite_jppsbe_get_names(ctx,job,known_classes[i].class,&names);
+ if (nnames < 0) continue; /* XXX: error ignored */
+
+ if (nnames > 0) {
+ files = realloc(files,(nfiles+nnames+1) * sizeof *files);
+ for (j=0; j<nnames; j++) {
+ files[nfiles].class_idx = i;
+ files[nfiles++].name = names[j];
+ }
}
- for (j = 0; known_namespaces[j].namespace; j++) {
- void* ph;
- char* attr_namespace = glite_jpps_get_namespace(other[i]);
- 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]);
- break;
+ free(names);
+ }
+
+/* loop over the files */
+ for (i=0; i<nfiles; i++) {
+ void *beh;
+ int ci;
+
+ /* XXX: ignore error */
+ if (!glite_jppsbe_open_file(ctx,job,
+ known_classes[ci = files[i].class_idx].class,
+ files[i].name,O_RDONLY,&beh))
+ {
+ for (j=0; j<known_classes[ci].nplugins; j++) {
+ void *ph;
+
+ glite_jpps_fplug_data_t *p =
+ known_classes[ci].plugins[j];
+ /* XXX: ignore error */
+ if (!p->ops.open(p->fpctx,beh,known_classes[ci].uri,&ph)) {
+
+ for (j=0; j<nother; j++) {
+ glite_jp_attrval_t *myattr;
+ /* XXX: ignore errors */
+ if (!p->ops.attr(p->fpctx,ph,other[j],&myattr)) {
+ int k;
+ for (k=0; myattr[k].name; k++) {
+ myattr[k].origin = GLITE_JP_ATTR_ORIG_FILE;
+ trio_asprintf(&myattr[k].origin_detail,"%s %s",
+ known_classes[ci].uri,
+ files[i].name ? files[i].name : "");
+ }
+ nout = merge_attrvals(&out,nout,myattr);
+ free(myattr);
+ }
+
+ }
+ p->ops.close(p->fpctx,ph);
+ }
}
- free(attr_namespace);
+
+ glite_jppsbe_close_file(ctx,beh);
}
}
nout = merge_attrvals(&out,nout,meta);
-
free(meta); meta = NULL;
- for (i = 0; i < nout; i++)
- printf("%s\n", out[i].value);
-
if (nout) {
*attrs_out = out;
err = 0;
free(other);
+ if (files) for (i=0; i<nfiles; i++) free(files[i].name);
+ free(files);
+
return err;
}
-
int glite_jpps_get_attrs(glite_jp_context_t,const char *,char **,int,glite_jp_attrval_t **);
-
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;
+ return strcmp(owner,ctx->peer) ? glite_jp_stack_error(ctx,&err) : 0;
break;
default:
fclose(f);
return 0;
}
-
#define __GLITE_JP_BACKEND
#include <sys/types.h>
-#include <sys/stat.h>
#include <unistd.h>
#include "feed.h"
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,
b_argc = p_argc = 1;
- while ((opt = getopt(argc,argv,"B:P:a:p:s:dl:i:c:k:n")) != EOF) switch (opt) {
+ while ((opt = getopt(argc,argv,"B:P:a:p:s:dl:i:c:k:")) != EOF) switch (opt) {
case 'B':
assert(b_argc < 20);
if (com = strchr(optarg,',')) *com = 0;
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);
-#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_FILETYPE_TAGS "urn:org.glite.jp.primary:tags"
+#define GLITE_JP_FILETYPE_LB "urn:org.glite.jp.primary:lb"
+#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
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <cclassad.h>
-#include <errno.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 "file_plugin.h"
-#include "builtin_plugins.h"
-#include "backend.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)) {
- //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 = strdup(str);
- 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
+#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 "glite/jp/types.h"
+#include "glite/jp/context.h"
+#include "glite/jp/strmd5.h"
+
+#include "tags.h"
+#include "backend.h"
+
+#define UPLOAD_SUFFIX ".upload"
+#define LOCK_SUFFIX ".lock"
+
+struct ftpbe_config {
+ char *internal_path;
+ char *external_path;
+ char *gridmap;
+ char *logname;
+};
+
+static struct ftpbe_config *config = NULL;
+
+struct fhandle_rec {
+ int fd;
+ int fd_append;
+};
+typedef struct fhandle_rec *fhandle;
+
+static struct option ftpbe_opts[] = {
+ { "ftp-internal-path", 1, NULL, 'I' },
+ { "ftp-external-path", 1, NULL, 'E' },
+ { "ftp-gridmap", 1, NULL, 'G' },
+ { NULL, 0, NULL, 0 }
+};
+
+/* obsolete */
+#if 0
+static struct {
+ glite_jp_fileclass_t type;
+ char * fname;
+ } class_to_fname_tab[] = {
+ { GLITE_JP_FILECLASS_INPUT, "input" },
+ { GLITE_JP_FILECLASS_OUTPUT, "output" },
+ { GLITE_JP_FILECLASS_LBLOG, "lblog" },
+ { GLITE_JP_FILECLASS_TAGS, "tags" },
+ { GLITE_JP_FILECLASS_UNDEF, NULL }
+ };
+
+static char *class_to_fname(glite_jp_fileclass_t type)
+{
+ int i;
+
+ for (i = 0; class_to_fname_tab[i].type != GLITE_JP_FILECLASS_UNDEF; i++)
+ if (type == class_to_fname_tab[i].type)
+ return class_to_fname_tab[i].fname;
+
+ return NULL;
+}
+
+static glite_jp_fileclass_t fname_to_class(char* fname)
+{
+ int i;
+
+ for (i = 0; class_to_fname_tab[i].type != GLITE_JP_FILECLASS_UNDEF; i++)
+ if (!strcmp(fname, class_to_fname_tab[i].fname))
+ return class_to_fname_tab[i].type;
+
+ return GLITE_JP_FILECLASS_UNDEF;
+}
+#endif
+
+static int config_check(
+ glite_jp_context_t ctx,
+ struct ftpbe_config *config)
+{
+ return config == NULL ||
+ config->internal_path == NULL ||
+ config->external_path == NULL ||
+ config->gridmap == NULL ||
+ config->logname == NULL;
+
+ /* XXX check reality */
+}
+
+static int jobid_unique_pathname(glite_jp_context_t ctx, const char *job,
+ char **unique, char **ju_path, int get_path)
+{
+ char *p;
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ p = strrchr(job, '/');
+ if (!p) {
+ err.code = EINVAL;
+ err.desc = "Malformed jobid";
+ return glite_jp_stack_error(ctx,&err);
+ }
+ /* XXX thorough checks */
+ if (!(*unique = strdup(p+1))) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+ if (get_path) {
+ if (!(*ju_path = strdup(p+1))) {
+ free(*unique);
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+ *(*ju_path + 10) = '\0';
+ }
+ return 0;
+}
+
+static int mkdirpath(const char* path, int prefixlen)
+{
+ char *wpath, *p;
+ int goout, ret;
+
+ wpath = strdup(path);
+ if (!wpath) {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ p = wpath + prefixlen;
+ goout = 0;
+ while (!goout) {
+ while (*p == '/') p++;
+ while (*p != '/' && *p != '\0') p++;
+ goout = (*p == '\0');
+ *p = '\0';
+ ret = mkdir(wpath, S_IRUSR | S_IWUSR | S_IXUSR);
+ if (ret < 0 && errno != EEXIST) break;
+ *p = '/';
+ }
+ free(wpath);
+ return goout ? 0 : ret;
+}
+
+static long regtime_trunc(long tv_sec)
+{
+ return tv_sec / (86400*7);
+}
+
+static long regtime_ceil(long tv_sec)
+{
+ return (tv_sec % (86400*7)) ? tv_sec/(86400*7)+1 : tv_sec/(86400*7) ;
+}
+
+/********************************************************************************/
+int glite_jppsbe_init(
+ glite_jp_context_t ctx,
+ int argc,
+ char *argv[]
+)
+{
+ glite_jp_error_t err;
+ int opt;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ config = (struct ftpbe_config *) calloc(1, sizeof *config);
+ if (!config) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ config->logname = getlogin();
+
+ while ((opt = getopt_long(argc, argv, "I:E:G:", ftpbe_opts, NULL)) != EOF) {
+ switch (opt) {
+ case 'I': config->internal_path = optarg; break;
+ case 'E': config->external_path = optarg; break;
+ case 'G': config->gridmap = optarg; break;
+ default: break;
+ }
+ }
+
+ if (config_check(ctx, config)) {
+ err.code = EINVAL;
+ err.desc = "Invalid FTP backend configuration";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ return 0;
+}
+
+int glite_jppsbe_init_slave(
+ glite_jp_context_t ctx
+)
+{
+ /* Nothing to do */
+}
+
+int glite_jppsbe_register_job(
+ glite_jp_context_t ctx,
+ const char *job,
+ const char *owner
+)
+{
+ glite_jp_error_t err;
+ char *int_dir = NULL;
+ char *int_fname = NULL;
+ char *data_dir = NULL;
+ char *data_fname = NULL;
+ char *ju = NULL;
+ char *ju_path = NULL;
+ char *ownerhash = NULL;
+ FILE *regfile = NULL;
+ struct timeval reg_tv;
+ long reg_tv_trunc;
+ struct stat statbuf;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ assert(job != NULL);
+ assert(owner != NULL);
+
+ gettimeofday(®_tv, NULL);
+ reg_tv_trunc = regtime_trunc(reg_tv.tv_sec);
+
+ if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot obtain jobid unique path/name";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (asprintf(&int_dir, "%s/regs/%s",
+ config->internal_path, ju_path) == -1) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (mkdirpath(int_dir, strlen(config->internal_path)) < 0 &&
+ errno != EEXIST) {
+ free(int_dir);
+ err.code = errno;
+ err.desc = "Cannot mkdir jobs's reg directory";
+ return glite_jp_stack_error(ctx,&err);
+ }
+ free(int_dir);
+
+ if (asprintf(&int_fname, "%s/regs/%s/%s.info",
+ config->internal_path, ju_path, ju) == -1) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (stat(int_fname, &statbuf) < 0) {
+ if (errno != ENOENT) {
+ err.code = errno;
+ err.desc = "Cannot stat jobs's reg info file";
+ goto error_out;
+ }
+ } else {
+ err.code = EEXIST;
+ err.desc = "Job already registered";
+ goto error_out;
+ }
+
+ regfile = fopen(int_fname, "w");
+ if (regfile == NULL) {
+ err.code = errno;
+ err.desc = "Cannot open jobs's reg info file";
+ goto error_out;
+ }
+
+ ownerhash = str2md5(owner); /* static buffer */
+
+ if (fprintf(regfile, "%d %ld.%06ld %s %s %d %s\n", 1,
+ (long)reg_tv.tv_sec, (long)reg_tv.tv_usec, job,
+ ownerhash, strlen(owner), owner) < 1 || ferror(regfile)) {
+ fclose(regfile);
+ err.code = errno;
+ err.desc = "Cannot write jobs's reg info file";
+ goto error_out;
+ }
+ if (fclose(regfile) != 0 ) {
+ err.code = errno;
+ err.desc = "Cannot close(write) jobs's reg info file";
+ goto error_out;
+ }
+
+ if (asprintf(&data_dir, "%s/data/%s/%d/%s",
+ config->internal_path, ownerhash, regtime_trunc(reg_tv.tv_sec), ju) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ if (asprintf(&data_fname, "%s/_info", data_dir) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ if (mkdirpath(data_dir, strlen(config->internal_path)) < 0 &&
+ errno != EEXIST) {
+ err.code = errno;
+ err.desc = "Cannot mkdir jobs's data directory";
+ goto error_out;
+ }
+
+ if (link(int_fname, data_fname) < 0) {
+ err.code = errno;
+ err.desc = "Cannot link job's reg and data info files";
+ goto error_out;
+ }
+
+error_out:
+ free(int_fname);
+ free(data_fname);
+ if (err.code && data_dir) rmdir(data_dir);
+ free(data_dir);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+static int add_to_gridmap(glite_jp_context_t ctx, const char *dn)
+{
+ FILE *gridmap = NULL;
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ gridmap = fopen(config->gridmap, "a");
+ if (!gridmap) {
+ err.code = errno;
+ err.desc = "Cannot open gridmap file";
+ return glite_jp_stack_error(ctx,&err);
+ }
+ if (fprintf(gridmap, "\"%s\" %s\n", dn, config->logname) < 6 ||
+ ferror(gridmap)) {
+ err.code = EIO;
+ err.desc = "Cannot write to gridmap file";
+ fclose(gridmap);
+ return glite_jp_stack_error(ctx,&err);
+ }
+ fclose(gridmap);
+ return 0;
+}
+
+static int remove_from_gridmap(glite_jp_context_t ctx, const char *dn)
+{
+ FILE *gridmap = NULL;
+ char *temp_name = NULL;
+ FILE *temp_file = NULL;
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ /* XXX */
+ return 0;
+}
+
+int glite_jppsbe_start_upload(
+ glite_jp_context_t ctx,
+ const char *job,
+ const char *class,
+ const char *name, /* TODO */
+ const char *content_type,
+ char **destination_out,
+ time_t *commit_before_inout
+)
+{
+ char *int_fname = NULL;
+ char *lock_fname = NULL;
+ FILE *lockfile = NULL;
+ FILE *regfile = NULL;
+ char *data_dir = NULL;
+ char *data_lock = NULL;
+ char *ju = NULL;
+ char *ju_path = NULL;
+ char *peername = NULL;
+ int info_version;
+ long reg_time;
+ char ownerhash[33];
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ assert(job!=NULL);
+ assert(destination_out!=NULL);
+
+ assert(class!=NULL);
+
+ if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot obtain jobid unique path/name";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ peername = glite_jp_peer_name(ctx);
+
+ if (asprintf(&int_fname, "%s/regs/%s/%s.info",
+ config->internal_path, ju_path, ju) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ regfile = fopen(int_fname, "r");
+ if (regfile == NULL) {
+ err.code = errno;
+ if (errno == ENOENT)
+ err.desc = "Job not registered";
+ else
+ err.desc = "Cannot open jobs's reg info file";
+ goto error_out;
+ }
+ if (fscanf(regfile, "%d %ld.%*ld %*s %s ", &info_version,
+ ®_time, ownerhash) < 3 || ferror(regfile)) {
+ fclose(regfile);
+ err.code = errno;
+ err.desc = "Cannot read jobs's reg info file";
+ goto error_out;
+ }
+ fclose(regfile);
+
+ /* XXX authorization */
+
+ if (asprintf(&data_dir, "%s/data/%s/%d/%s",
+ config->internal_path, ownerhash, regtime_trunc(reg_time), ju) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+ if (asprintf(&lock_fname, "%s/%s" LOCK_SUFFIX,
+ data_dir, class) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+ if (commit_before_inout != NULL)
+ *commit_before_inout = (time_t) LONG_MAX; /* XXX no timeout enforced */
+
+ lockfile = fopen(lock_fname, "w");
+ if (lockfile == NULL) {
+ err.code = errno;
+ err.desc = "Cannot open uploads's lock file";
+ goto error_out;
+ }
+
+ if (fprintf(lockfile, "%ld %d %s\n", (long)*commit_before_inout,
+ peername ? peername : 0,
+ peername ? peername : "") < 1 || ferror(regfile)) {
+ fclose(lockfile);
+ err.code = errno;
+ err.desc = "Cannot write upload's lock file";
+ goto error_out;
+ }
+ if (fclose(lockfile) != 0 ) {
+ err.code = errno;
+ err.desc = "Cannot close(write) upload's lock file";
+ goto error_out;
+ }
+
+ if (asprintf(destination_out, "%s/data/%s/%d/%s/%s" UPLOAD_SUFFIX,
+ config->external_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+ if (add_to_gridmap(ctx, peername)) {
+ err.code = EIO;
+ err.desc = "Cannot add peer DN to ftp server authorization file";
+ goto error_out;
+ }
+
+error_out:
+ free(int_fname);
+ free(data_dir);
+ if (err.code && data_lock) unlink(data_lock);
+ free(data_lock);
+ free(ju); free(ju_path);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+int glite_jppsbe_commit_upload(
+ glite_jp_context_t ctx,
+ const char *destination
+)
+{
+ size_t dest_len;
+ size_t suff_len;
+ size_t extp_len;
+ long commit_before;
+ int lockpeerlen;
+ char *lockpeername = NULL;
+ char *peername = NULL;
+ char *dest_rw = NULL;
+ char *dest_rw_suff = NULL;
+ char *dest_rw_lock = NULL;
+ FILE *lockfile = NULL;
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ assert(destination != NULL);
+
+ suff_len = strlen(UPLOAD_SUFFIX);
+ dest_len = strlen(destination);
+ extp_len = strlen(config->external_path);
+
+ if (dest_len < suff_len ||
+ strcmp(UPLOAD_SUFFIX, destination + (dest_len - suff_len)) ||
+ strncmp(destination, config->external_path, extp_len)) {
+ err.code = EINVAL;
+ err.desc = "Forged destination path";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (asprintf(&dest_rw_suff, "%s%s", config->internal_path,
+ destination + extp_len) == -1) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+ dest_rw = strdup(dest_rw_suff);
+ if (!dest_rw) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ *(dest_rw + (strlen(dest_rw_suff) - suff_len)) = '\0';
+
+ if (asprintf(&dest_rw_lock, "%s" LOCK_SUFFIX, dest_rw) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+ lockfile = fopen(dest_rw_lock, "r");
+ if (lockfile == NULL) {
+ err.code = errno;
+ err.desc = "Cannot open upload's lock file";
+ goto error_out;
+ }
+ if (fscanf(lockfile, "%ld %d ", &commit_before, &lockpeerlen) < 2 || ferror(lockfile)) {
+ fclose(lockfile);
+ err.code = errno;
+ err.desc = "Cannot read upload's lock file";
+ goto error_out;
+ }
+ if (lockpeerlen) {
+ lockpeername = (char*) calloc(1, lockpeerlen+1);
+ if (!lockpeername) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ if (fgets(lockpeername, lockpeerlen+1, lockfile) == NULL) {
+ fclose(lockfile);
+ err.code = errno;
+ err.desc = "Cannot read upload's lock file";
+ goto error_out;
+ }
+ }
+ fclose(lockfile);
+
+ peername = glite_jp_peer_name(ctx);
+ if (lockpeername && (!peername || strcmp(lockpeername, peername))) {
+ err.code = EPERM;
+ err.desc = "Upload started by client of different identity";
+ goto error_out;
+ }
+
+ if (rename(dest_rw_suff, dest_rw) < 0) {
+ err.code = errno;
+ err.desc = "Cannot move upload file to the final place";
+ goto error_out;
+ }
+
+ if (unlink(dest_rw_lock) < 0) {
+ err.code = errno;
+ err.desc = "Cannot unlink upload's lock file";
+ goto error_out;
+ }
+
+error_out:
+ free(dest_rw);
+ free(dest_rw_suff);
+ free(dest_rw_lock);
+ free(peername);
+ free(lockpeername);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+int glite_jppsbe_destination_info(
+ glite_jp_context_t ctx,
+ const char *destination,
+ char **job,
+ char **class,
+ char **name
+)
+{
+ size_t dest_len;
+ size_t suff_len;
+ size_t extp_len;
+ char *dest_rw = NULL;
+ char *dest_rw_suff = NULL;
+ char *dest_rw_info = NULL;
+ FILE *infofile = NULL;
+ char *classname = NULL;
+ char jobstr[256+1];
+ glite_jp_error_t err;
+
+ assert(destination != NULL);
+ assert(job != NULL);
+ assert(class != NULL);
+ assert(name != NULL);
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ suff_len = strlen(UPLOAD_SUFFIX);
+ dest_len = strlen(destination);
+ extp_len = strlen(config->external_path);
+
+ if (dest_len < suff_len ||
+ strcmp(UPLOAD_SUFFIX, destination + (dest_len - suff_len)) ||
+ strncmp(destination, config->external_path, extp_len)) {
+ err.code = EINVAL;
+ err.desc = "Forged destination path";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (asprintf(&dest_rw_suff, "%s%s", config->internal_path,
+ destination + extp_len) == -1) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+ dest_rw = strdup(dest_rw_suff);
+ if (!dest_rw) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ *(dest_rw + (strlen(dest_rw_suff) - suff_len)) = '\0';
+
+ classname = strrchr(dest_rw,'/');
+ if (classname == NULL) {
+ err.code = EINVAL;
+ err.desc = "Forged destination path";
+ goto error_out;
+ }
+ *classname++ ='\0';
+ *class = strdup(classname);
+
+/* XXX: do we need similar check?
+ if (!class == GLITE_JP_FILECLASS_UNDEF) {
+ err.code = EINVAL;
+ err.desc = "Forged destination path";
+ goto error_out;
+ }
+*/
+
+ /* TODO: */
+ *name = NULL;
+
+ if (asprintf(&dest_rw_info, "%s/_info", dest_rw) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+ infofile = fopen(dest_rw_info, "r");
+ if (infofile == NULL) {
+ err.code = errno;
+ err.desc = "Cannot open _info file";
+ goto error_out;
+ }
+ if (fscanf(infofile, "%*d %*ld.%*ld %256s ", jobstr) < 1 || ferror(infofile)) {
+ fclose(infofile);
+ err.code = errno;
+ err.desc = "Cannot read _info file";
+ goto error_out;
+ }
+ *job = strdup(jobstr);
+ fclose(infofile);
+
+error_out:
+ free(dest_rw);
+ free(dest_rw_suff);
+ free(dest_rw_info);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+
+int glite_jppsbe_get_job_url(
+ glite_jp_context_t ctx,
+ const char *job,
+ const char *class,
+ const char *name, /* TODO */
+ char **url_out
+)
+{
+ FILE *regfile = NULL;
+ char *int_fname = NULL;
+ char *ju = NULL;
+ char *ju_path = NULL;
+ int info_version;
+ long reg_time;
+ char ownerhash[33];
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ assert(job!=NULL);
+ assert(url_out != NULL);
+
+ assert(class!=NULL);
+
+ if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot obtain jobid unique path/name";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (asprintf(&int_fname, "%s/regs/%s/%s.info",
+ config->internal_path, ju_path, ju) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ regfile = fopen(int_fname, "r");
+ if (regfile == NULL) {
+ err.code = errno;
+ if (errno == ENOENT)
+ err.desc = "Job not registered";
+ else
+ err.desc = "Cannot open jobs's reg info file";
+ goto error_out;
+ }
+ if (fscanf(regfile, "%d %ld.%*ld %*s %s", &info_version,
+ ®_time, ownerhash) < 3 || ferror(regfile)) {
+ fclose(regfile);
+ err.code = errno;
+ err.desc = "Cannot read jobs's reg info file";
+ goto error_out;
+ }
+ fclose(regfile);
+
+ if (asprintf(url_out, "%s/data/%s/%d/%s/%s",
+ config->external_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+error_out:
+ free(int_fname);
+ free(ju); free(ju_path);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+static int get_job_fname(
+ glite_jp_context_t ctx,
+ const char *job,
+ const char *class,
+ const char *name, /* TODO */
+ char **fname_out
+)
+{
+ FILE *regfile = NULL;
+ char *int_fname = NULL;
+ char *ju = NULL;
+ char *ju_path = NULL;
+ int info_version;
+ long reg_time;
+ char ownerhash[33];
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ assert(job!=NULL);
+ assert(fname_out != NULL);
+
+ assert(class!=NULL);
+
+ if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot obtain jobid unique path/name";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (asprintf(&int_fname, "%s/regs/%s/%s.info",
+ config->internal_path, ju_path, ju) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ regfile = fopen(int_fname, "r");
+ if (regfile == NULL) {
+ err.code = errno;
+ if (errno == ENOENT)
+ err.desc = "Job not registered";
+ else
+ err.desc = "Cannot open jobs's reg info file";
+ goto error_out;
+ }
+ if (fscanf(regfile, "%d %ld.%*ld %*s %s", &info_version,
+ ®_time, ownerhash) < 3 || ferror(regfile)) {
+ fclose(regfile);
+ err.code = errno;
+ err.desc = "Cannot read jobs's reg info file";
+ goto error_out;
+ }
+ fclose(regfile);
+
+ if (asprintf(fname_out, "%s/data/%s/%d/%s/%s",
+ config->internal_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+error_out:
+ free(int_fname);
+ free(ju); free(ju_path);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+int glite_jppsbe_open_file(
+ glite_jp_context_t ctx,
+ const char *job,
+ const char *class,
+ const char *name, /* TODO */
+ int mode,
+ void **handle_out
+)
+{
+ fhandle handle = NULL;
+ char* fname = NULL;
+ glite_jp_error_t err;
+
+ assert(handle_out != NULL);
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ if (get_job_fname(ctx, job, class, name, &fname)) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot construct internal filename";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ handle = (fhandle) calloc(1,sizeof(*handle));
+ if (handle == NULL) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+
+ handle->fd = open(fname, mode, S_IRUSR | S_IWUSR);
+ if (handle->fd < 0) {
+ err.code = errno;
+ err.desc = "Cannot open requested file";
+ free(handle);
+ goto error_out;
+ }
+ handle->fd_append = open(fname, mode | O_APPEND, S_IRUSR | S_IWUSR);
+ if (handle->fd_append < 0) {
+ err.code = errno;
+ err.desc = "Cannot open requested file for append";
+ close(handle->fd);
+ free(handle);
+ goto error_out;
+ }
+ *handle_out = (void*) handle;
+
+error_out:
+ free(fname);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+int glite_jppsbe_close_file(
+ glite_jp_context_t ctx,
+ void *handle
+)
+{
+ glite_jp_error_t err;
+
+ assert(handle != NULL);
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ if (close(((fhandle)handle)->fd_append) < 0) {
+ err.code = errno;
+ err.desc = "Error closing file descriptor (fd_append)";
+ goto error_out;
+ }
+ if (close(((fhandle)handle)->fd) < 0) {
+ err.code = errno;
+ err.desc = "Error closing file descriptor";
+ goto error_out;
+ }
+
+error_out:
+ free(handle);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+int glite_jppsbe_pread(
+ glite_jp_context_t ctx,
+ void *handle,
+ void *buf,
+ size_t nbytes,
+ off_t offset,
+ ssize_t *nbytes_ret
+)
+{
+ ssize_t ret;
+ glite_jp_error_t err;
+
+ assert(handle != NULL);
+ assert(buf != NULL);
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ if ((ret = pread(((fhandle)handle)->fd, buf, nbytes, offset)) < 0) {
+ err.code = errno;
+ err.desc = "Error in pread()";
+ return glite_jp_stack_error(ctx,&err);
+ }
+ *nbytes_ret = ret;
+
+ return 0;
+}
+
+int glite_jppsbe_pwrite(
+ glite_jp_context_t ctx,
+ void *handle,
+ void *buf,
+ size_t nbytes,
+ off_t offset
+)
+{
+ glite_jp_error_t err;
+
+ assert(handle != NULL);
+ assert(buf != NULL);
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ if (pwrite(((fhandle)handle)->fd, buf, nbytes, offset) < 0) {
+ err.code = errno;
+ err.desc = "Error in pwrite()";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ return 0;
+}
+
+int glite_jppsbe_append(
+ glite_jp_context_t ctx,
+ void *handle,
+ void *buf,
+ size_t nbytes
+)
+{
+ glite_jp_error_t err;
+
+ assert(handle != NULL);
+ assert(buf != NULL);
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ if (write(((fhandle)handle)->fd_append, buf, nbytes) < 0) {
+ err.code = errno;
+ err.desc = "Error in write()";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ return 0;
+}
+
+static int get_job_info(
+ glite_jp_context_t ctx,
+ const char *job,
+ char **owner,
+ struct timeval *tv_reg
+)
+{
+ char *ju = NULL;
+ char *ju_path = NULL;
+ FILE *regfile = NULL;
+ long reg_time_sec;
+ long reg_time_usec;
+ int ownerlen = 0;
+ int info_version;
+ char *int_fname = NULL;
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot obtain jobid unique path/name";
+ return glite_jp_stack_error(ctx,&err);
+ }
+
+ if (asprintf(&int_fname, "%s/regs/%s/%s.info",
+ config->internal_path, ju_path, ju) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ regfile = fopen(int_fname, "r");
+ if (regfile == NULL) {
+ err.code = errno;
+ if (errno == ENOENT)
+ err.desc = "Job not registered";
+ else
+ err.desc = "Cannot open jobs's reg info file";
+ goto error_out;
+ }
+ if (fscanf(regfile, "%d %ld.%ld %*s %*s %d ", &info_version,
+ ®_time_sec, ®_time_usec, &ownerlen) < 4 || ferror(regfile)) {
+ fclose(regfile);
+ err.code = errno;
+ err.desc = "Cannot read jobs's reg info file";
+ goto error_out;
+ }
+ if (ownerlen) {
+ *owner = (char *) calloc(1, ownerlen+1);
+ if (!*owner) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ if (fgets(*owner, ownerlen+1, regfile) == NULL) {
+ fclose(regfile);
+ free(*owner);
+ err.code = errno;
+ err.desc = "Cannot read jobs's reg info file";
+ goto error_out;
+ }
+ }
+ fclose(regfile);
+
+ tv_reg->tv_sec = reg_time_sec;
+ tv_reg->tv_usec = reg_time_usec;
+
+error_out:
+ free(int_fname);
+ free(ju);
+ free(ju_path);
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+static int get_job_info_int(
+ glite_jp_context_t ctx,
+ const char *int_fname,
+ char **jobid,
+ char **owner,
+ struct timeval *tv_reg
+)
+{
+ FILE *regfile = NULL;
+ long reg_time_sec;
+ long reg_time_usec;
+ int ownerlen = 0;
+ int info_version;
+ char jobid_buf[256];
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ regfile = fopen(int_fname, "r");
+ if (regfile == NULL) {
+ err.code = errno;
+ err.desc = "Cannot open jobs's reg info file";
+ goto error_out;
+ }
+ if (fscanf(regfile, "%d %ld.%ld %s %*s %d ", &info_version,
+ ®_time_sec, ®_time_usec, jobid_buf, &ownerlen) < 5 || ferror(regfile)) {
+ fclose(regfile);
+ err.code = errno;
+ err.desc = "Cannot read jobs's reg info file";
+ goto error_out;
+ }
+ *jobid = strdup(jobid_buf);
+ if (ownerlen) {
+ *owner = (char *) calloc(1, ownerlen+1);
+ if (!*owner) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ if (fgets(*owner, ownerlen+1, regfile) == NULL) {
+ fclose(regfile);
+ free(*owner);
+ err.code = errno;
+ err.desc = "Cannot read jobs's reg info file";
+ goto error_out;
+ }
+ }
+ fclose(regfile);
+
+ tv_reg->tv_sec = reg_time_sec;
+ tv_reg->tv_usec = reg_time_usec;
+
+error_out:
+ if (err.code) {
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+
+int glite_jppsbe_get_job_metadata(
+ glite_jp_context_t ctx,
+ const char *job,
+ glite_jp_attrval_t attrs_inout[]
+)
+{
+ int got_info = 0;
+ struct timeval tv_reg;
+ char *owner = NULL;
+ int got_tags = 0;
+ void *tags_handle = NULL;
+ glite_jp_tagval_t* tags = NULL;
+ int i,j;
+ glite_jp_error_t err;
+
+ assert(job != NULL);
+ assert(attrs_inout != NULL);
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ for (i = 0; attrs_inout[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) {
+ switch (attrs_inout[i].attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+
+/* must be implemented via filetype plugin
+ case GLITE_JP_ATTR_TIME:
+*/
+ if (!got_info) {
+ if (get_job_info(ctx, job, &owner, &tv_reg)) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot retrieve job info";
+ goto error_out;
+ }
+ got_info = 1;
+ }
+ break;
+
+/* must be implemented via filetype plugin
+ case GLITE_JP_ATTR_TAG:
+ if (!got_tags) {
+ if (glite_jppsbe_open_file(ctx, job, GLITE_JP_FILECLASS_TAGS,
+ O_RDONLY, &tags_handle)) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot open tag file";
+ goto error_out;
+ }
+ if (glite_jpps_tag_readall(ctx, tags_handle, &tags)) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot read tags";
+ glite_jppsbe_close_file(ctx, tags_handle);
+ goto error_out;
+ }
+ glite_jppsbe_close_file(ctx, tags_handle);
+ got_tags = 1;
+ }
+ break;
+*/
+ default:
+ err.code = EINVAL;
+ err.desc = "Invalid attribute type";
+ goto error_out;
+ break;
+ }
+
+ switch (attrs_inout[i].attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+ attrs_inout[i].value.s = strdup(owner);
+ if (!attrs_inout[i].value.s) {
+ err.code = ENOMEM;
+ err.desc = "Cannot copy owner string";
+ goto error_out;
+ }
+ break;
+ case GLITE_JP_ATTR_TIME:
+ attrs_inout[i].value.time = tv_reg;
+ break;
+
+/* must be implemented via filetype plugin
+ case GLITE_JP_ATTR_TAG:
+ for (j = 0; tags[j].name != NULL; j++) {
+ if (!strcmp(tags[j].name, attrs_inout[i].attr.name)) {
+ if (glite_jpps_tagval_copy(ctx, &tags[j],
+ &attrs_inout[i].value.tag)) {
+ err.code = ENOMEM;
+ err.desc = "Cannot copy tag value";
+ goto error_out;
+ }
+ break;
+ }
+ }
+ if (!tags[j].name) attrs_inout[i].value.tag.name = NULL;
+ break;
+*/
+ default:
+ break;
+ }
+ }
+
+error_out:
+ free(owner);
+ if (tags) for (j = 0; tags[j].name != NULL; j++) {
+ free(tags[j].name);
+ free(tags[j].value);
+ }
+ free(tags);
+
+ if (err.code) {
+ while (i > 0) {
+ i--;
+ switch (attrs_inout[i].attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+ free(attrs_inout[i].value.s);
+ break;
+ case GLITE_JP_ATTR_TAG:
+ free(attrs_inout[i].value.tag.name);
+ free(attrs_inout[i].value.tag.value);
+ default:
+ break;
+ }
+ }
+ return glite_jp_stack_error(ctx,&err);
+ } else {
+ return 0;
+ }
+}
+static int compare_timeval(struct timeval a, struct timeval b)
+{
+ if (a.tv_sec < b.tv_sec) return -1;
+ if (a.tv_sec > b.tv_sec) return 1;
+ if (a.tv_usec < b.tv_usec) return -1;
+ if (a.tv_usec > b.tv_usec) return 1;
+ return 0;
+}
+
+
+/* FIXME: disabled -- clarification wrt. filetype plugin needed */
+
+#if 0
+
+static int query_phase2(
+ glite_jp_context_t ctx,
+ const char *ownerhash,
+ long regtime_tr,
+ int q_tags,
+ int md_tags,
+ const glite_jp_query_rec_t query[],
+ glite_jp_attrval_t metadata[],
+ int (*callback)(
+ glite_jp_context_t ctx,
+ const char *job,
+ const glite_jp_attrval_t metadata[]
+ )
+);
+
+static int query_phase2(
+ glite_jp_context_t ctx,
+ const char *ownerhash,
+ long regtime_tr,
+ int q_tags,
+ int md_tags,
+ const glite_jp_query_rec_t query[],
+ glite_jp_attrval_t metadata[],
+ int (*callback)(
+ glite_jp_context_t ctx,
+ const char *job,
+ const glite_jp_attrval_t metadata[]
+ )
+)
+{
+ char *time_dirname = NULL;
+ DIR *time_dirp = NULL;
+ struct dirent *jobent;
+ char *info_fname = NULL;
+ char *jobid = NULL;
+ char *owner = NULL;
+ struct timeval tv_reg;
+ void *tags_handle = NULL;
+ int matching;
+ int i, j;
+ glite_jp_tagval_t* tags = NULL;
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ if (asprintf(&time_dirname, "%s/data/%s/%d", config->internal_path,
+ ownerhash, regtime_tr) == -1) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+ time_dirp = opendir(time_dirname);
+ if (!time_dirp) {
+ free(time_dirname);
+ return 0; /* found nothing */
+ }
+ while ((jobent = readdir(time_dirp)) != NULL) {
+ if (!strcmp(jobent->d_name, ".")) continue;
+ if (!strcmp(jobent->d_name, "..")) continue;
+ if (asprintf(&info_fname, "%s/%s/_info", time_dirname,
+ jobent->d_name) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ if (get_job_info_int(ctx, info_fname, &jobid, &owner, &tv_reg)) {
+ err.code = EIO;
+ err.desc = "Cannot retrieve job info";
+ goto error_out;
+ }
+ if (q_tags || md_tags) {
+ if (glite_jppsbe_open_file(ctx, jobid, GLITE_JP_FILECLASS_TAGS,
+ O_RDONLY, &tags_handle)) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot open tag file";
+ goto error_out;
+ }
+ if (glite_jpps_tag_readall(ctx, tags_handle, &tags)) {
+ err.code = ctx->error->code;
+ err.desc = "Cannot read tags";
+ glite_jppsbe_close_file(ctx, tags_handle);
+ goto error_out;
+ }
+ glite_jppsbe_close_file(ctx, tags_handle);
+ tags_handle = NULL;
+ }
+
+ matching = 1;
+ for (i = 0; matching && query[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) {
+ switch (query[i].attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+ if (query[i].value.s == NULL ||
+ strcmp(query[i].value.s, owner)) matching = 0;
+ break;
+ case GLITE_JP_ATTR_TIME:
+ switch (query[i].op) {
+ case GLITE_JP_QUERYOP_EQUAL:
+ matching = !compare_timeval(tv_reg, query[i].value.time);
+ break;
+ case GLITE_JP_QUERYOP_UNEQUAL:
+ matching = compare_timeval(tv_reg, query[i].value.time);
+ break;
+ case GLITE_JP_QUERYOP_LESS:
+ matching = compare_timeval(tv_reg, query[i].value.time) < 0;
+ break;
+ case GLITE_JP_QUERYOP_GREATER:
+ matching = compare_timeval(tv_reg, query[i].value.time) > 0;
+ break;
+ case GLITE_JP_QUERYOP_WITHIN:
+ matching = compare_timeval(tv_reg, query[i].value.time) >= 0
+ && compare_timeval(tv_reg, query[i].value2.time) <= 0;
+ break;
+ }
+ break;
+ case GLITE_JP_ATTR_TAG:
+ if (!tags) {
+ matching = 0;
+ break;
+ }
+ for (j = 0; tags[j].name != NULL; j++) {
+ if (!strcmp(tags[j].name, query[i].attr.name)) {
+ switch (query[i].op) {
+ case GLITE_JP_QUERYOP_EQUAL:
+ matching = !strcmp(tags[j].value, query[i].value.s);
+ break;
+ case GLITE_JP_QUERYOP_UNEQUAL:
+ matching = strcmp(tags[j].value, query[i].value.s);
+ break;
+ case GLITE_JP_QUERYOP_LESS:
+ matching = strcmp(tags[j].value, query[i].value.s) < 0;
+ break;
+ case GLITE_JP_QUERYOP_GREATER:
+ matching = strcmp(tags[j].value, query[i].value.s) > 0;
+ break;
+ case GLITE_JP_QUERYOP_WITHIN:
+ matching = strcmp(tags[j].value, query[i].value.s) >= 0 \
+ && strcmp(tags[j].value, query[i].value2.s) <= 0 ;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (!matching) {
+ free(info_fname); info_fname = NULL;
+ free(jobid); jobid = NULL;
+ if (tags) for (j = 0; tags[j].name != NULL; j++) {
+ free(tags[j].name);
+ free(tags[j].value);
+ }
+ free(tags); tags = NULL;
+ continue;
+ }
+
+ for (i = 0; metadata[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) {
+ switch (metadata[i].attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+ metadata[i].value.s = owner;
+ break;
+ case GLITE_JP_ATTR_TIME:
+ metadata[i].value.time = tv_reg;
+ break;
+ case GLITE_JP_ATTR_TAG:
+ for (j = 0; tags[j].name != NULL; j++) {
+ if (!strcmp(tags[j].name, metadata[i].attr.name)) {
+ if (glite_jpps_tagval_copy(ctx, &tags[j],
+ &metadata[i].value.tag)) {
+ err.code = ENOMEM;
+ err.desc = "Cannot copy tag value";
+ goto error_out;
+ }
+ break;
+ }
+ }
+ if (!tags[j].name) {
+ metadata[i].value.tag.name = NULL;
+ metadata[i].value.tag.value = NULL;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ (*callback)(ctx, jobid, metadata);
+ free(jobid); jobid = NULL;
+ while (i > 0) {
+ i--;
+ switch (metadata[i].attr.type) {
+ case GLITE_JP_ATTR_TAG:
+ free(metadata[i].value.tag.name);
+ free(metadata[i].value.tag.value);
+ default:
+ break;
+ }
+ }
+ }
+
+error_out:
+ if (tags) for (j = 0; tags[j].name != NULL; j++) {
+ free(tags[j].name);
+ free(tags[j].value);
+ }
+ if (tags_handle) glite_jppsbe_close_file(ctx, tags_handle);
+ free(info_fname);
+ free(owner);
+ free(jobid);
+ closedir(time_dirp);
+ free(time_dirname);
+ if (err.code) {
+ while (i > 0) {
+ i--;
+ switch (metadata[i].attr.type) {
+ case GLITE_JP_ATTR_TAG:
+ free(metadata[i].value.tag.name);
+ free(metadata[i].value.tag.value);
+ default:
+ break;
+ }
+ }
+ return glite_jp_stack_error(ctx,&err);
+ } else
+ return 0;
+}
+
+int glite_jppsbe_query(
+ glite_jp_context_t ctx,
+ const glite_jp_query_rec_t query[],
+ const glite_jp_attrval_t metadata[],
+ int (*callback)(
+ glite_jp_context_t ctx,
+ const char *job,
+ const glite_jp_attrval_t metadata[]
+ )
+)
+{
+ /* XXX clone metadata */
+ int i;
+ char *q_exact_owner = NULL;
+ char *ownerhash = NULL;
+ long q_min_time = 0;
+ long q_max_time = LONG_MAX;
+ long q_min_time_tr;
+ long q_max_time_tr;
+ int q_with_tags = 0;
+ int md_info = 0;
+ int md_tags = 0;
+ char *owner_dirname = NULL;
+ DIR *owner_dirp = NULL;
+ struct dirent *ttimeent;
+ char *data_dirname = NULL;
+ DIR *data_dirp = NULL;
+ struct dirent *ownerent;
+ long ttime = 0;
+ glite_jp_attrval_t *metadata_templ = NULL;
+ glite_jp_error_t err;
+
+ glite_jp_clear_error(ctx);
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+
+ for (i = 0; query[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) {
+ if (query[i].attr.type == GLITE_JP_ATTR_OWNER && query[i].op == GLITE_JP_QUERYOP_EQUAL) {
+ q_exact_owner = query[i].value.s;
+ }
+ if (query[i].attr.type == GLITE_JP_ATTR_TIME) {
+ switch (query[i].op) {
+ case GLITE_JP_QUERYOP_EQUAL:
+ q_min_time = query[i].value.time.tv_sec;
+ q_max_time = query[i].value.time.tv_sec + 1;
+ break;
+ case GLITE_JP_QUERYOP_LESS:
+ if (q_max_time > query[i].value.time.tv_sec + 1)
+ q_max_time = query[i].value.time.tv_sec + 1;
+ break;
+ case GLITE_JP_QUERYOP_WITHIN:
+ if (q_max_time > query[i].value2.time.tv_sec + 1)
+ q_max_time = query[i].value2.time.tv_sec + 1;
+ /* fallthrough */
+ case GLITE_JP_QUERYOP_GREATER:
+ if (q_min_time < query[i].value.time.tv_sec)
+ q_min_time = query[i].value.time.tv_sec;
+ break;
+ default:
+ err.code = EINVAL;
+ err.desc = "Invalid query op";
+ return glite_jp_stack_error(ctx,&err);
+ break;
+ }
+ }
+ if (query[i].attr.type == GLITE_JP_ATTR_TAG)
+ q_with_tags = 1;
+
+ }
+
+ for (i = 0; metadata[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) {
+ switch (metadata[i].attr.type) {
+ case GLITE_JP_ATTR_OWNER:
+ case GLITE_JP_ATTR_TIME:
+ md_info = 1;
+ break;
+ case GLITE_JP_ATTR_TAG:
+ md_tags = 1;
+ break;
+ default:
+ err.code = EINVAL;
+ err.desc = "Invalid attribute type in metadata parameter";
+ return glite_jp_stack_error(ctx,&err);
+ break;
+ }
+ }
+ metadata_templ = (glite_jp_attrval_t *) calloc(i + 1, sizeof(glite_jp_attrval_t));
+ if (!metadata_templ) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+ memcpy(metadata_templ, metadata, (i + 1) * sizeof(glite_jp_attrval_t));
+
+ q_min_time_tr = regtime_trunc(q_min_time);
+ q_max_time_tr = regtime_ceil(q_max_time);
+
+ if (q_exact_owner) {
+ ownerhash = str2md5(q_exact_owner); /* static buffer */
+ if (asprintf(&owner_dirname, "%s/data/%s", config->internal_path, ownerhash) == -1) {
+ err.code = ENOMEM;
+ return glite_jp_stack_error(ctx,&err);
+ }
+ owner_dirp = opendir(owner_dirname);
+ free(owner_dirname);
+ if (!owner_dirp) {
+ free(metadata_templ);
+ return 0; /* found nothing */
+ }
+ while ((ttimeent = readdir(owner_dirp)) != NULL) {
+ if (!strcmp(ttimeent->d_name, ".")) continue;
+ if (!strcmp(ttimeent->d_name, "..")) continue;
+ ttime = atol(ttimeent->d_name);
+ if (ttime >= q_min_time_tr && ttime < q_max_time_tr) {
+ if (query_phase2(ctx, ownerhash, ttime, q_with_tags, md_tags,
+ query, metadata_templ, callback)) {
+ err.code = EIO;
+ err.desc = "query_phase2() error";
+ goto error_out;
+ }
+ }
+ }
+ } else { /* !q_exact_owner */
+ if (asprintf(&data_dirname, "%s/data", config->internal_path) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ data_dirp = opendir(data_dirname);
+ if (!data_dirp) {
+ err.code = EIO;
+ err.desc = "Cannot open data directory";
+ goto error_out;
+ }
+ while ((ownerent = readdir(data_dirp)) != NULL) {
+ if (!strcmp(ownerent->d_name, ".")) continue;
+ if (!strcmp(ownerent->d_name, "..")) continue;
+ if (asprintf(&owner_dirname, "%s/data/%s", config->internal_path,
+ ownerent->d_name) == -1) {
+ err.code = ENOMEM;
+ goto error_out;
+ }
+ owner_dirp = opendir(owner_dirname);
+ free(owner_dirname);
+ if (!owner_dirp) {
+ err.code = EIO;
+ err.desc = "Cannot open owner data directory";
+ goto error_out;
+ }
+ while ((ttimeent = readdir(owner_dirp)) != NULL) {
+ if (!strcmp(ttimeent->d_name, ".")) continue;
+ if (!strcmp(ttimeent->d_name, "..")) continue;
+ ttime = atol(ttimeent->d_name);
+ if (ttime >= q_min_time_tr && ttime < q_max_time_tr) {
+ if (query_phase2(ctx, ownerent->d_name, ttime, q_with_tags, md_tags,
+ query, metadata_templ, callback)) {
+ err.code = EIO;
+ err.desc = "query_phase2() error";
+ goto error_out;
+ }
+ }
+ }
+ closedir(owner_dirp); owner_dirp = NULL;
+ }
+ closedir(data_dirp); data_dirp = NULL;
+ }
+ return 0;
+
+error_out:
+ if (owner_dirp) closedir(owner_dirp);
+ if (data_dirp) closedir(data_dirp);
+ free(data_dirname);
+ free(metadata_templ);
+ return glite_jp_stack_error(ctx,&err);
+}
+
+#else
+
+/* placeholder instead */
+int glite_jppsbe_query(
+ glite_jp_context_t ctx,
+ const glite_jp_query_rec_t query[],
+ const glite_jp_attrval_t metadata[],
+ int (*callback)(
+ glite_jp_context_t ctx,
+ const char *job,
+ const glite_jp_attrval_t metadata[]
+ )
+)
+{
+ glite_jp_error_t err;
+ err.code = ENOSYS;
+ err.desc = "not implemented";
+ return glite_jp_stack_error(ctx,&err);
+}
+
+#endif
+
+/* XXX:
+- no primary authorization yet
+- no concurrency control yet
+- partial success in pwrite,append
+- "unique" part of jobid is assumed to be unique across bookkeeping servers
+- repository versioning not fully implemented yet
+*/
}
}
-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 (! fstat(((fhandle)handle)->fd, buf)) {
- err.code = errno;
- err.desc = "Error calling fstat";
- return -1;
- }
-
- return 0;
-}
-
int glite_jppsbe_pread(
glite_jp_context_t ctx,
void *handle,
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;attrs[i]; i++) metadata[i].name = (char *) attrs[i];
for (i=0; query[i].attr; i++) {
char *qitem;
return err.code;
}
-int glite_jppsbe_append_tag(
- void *fpctx,
- char *jobid,
- glite_jp_attrval_t *attr
-)
-{
- void *file_be;
- glite_jp_error_t err;
- glite_jp_context_t ctx = fpctx;
- 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);
- }
-
- if (tag_append(ctx,file_be,attr))
- {
- err.code = EIO;
- err.desc = "cannot append tag";
- 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;
-
- 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";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (tag_attr(ctx,h,attr,attrval)){
- err.code = EIO;
- err.desc = "cannot read tag";
- return glite_jp_stack_error(ctx,&err);
- }
-
- if (glite_jppsbe_close_file(ctx,h->bhandle))
- {
- err.code = EIO;
- err.desc = "cannot close tags file";
- return glite_jp_stack_error(ctx,&err);
- }
-
- return 0;
-}
+++ /dev/null
-#include <stdlib.h>
-#include <assert.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <stdint.h>
-
-#include <libtar.h>
-#include <fcntl.h>
-
-#include <glite/jp/types.h>
-#include <glite/jp/known_attr.h>
-
-#include "file_plugin.h"
-#include "builtin_plugins.h"
-#include "backend.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;
-}
-
/* 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);
- }
-
- }
- }
-
free(job); free(class); free(name);
return SOAP_OK;
{
CONTEXT_FROM_SOAP(soap,ctx);
void *file_be,*file_p;
- glite_jp_attrval_t attr[2], meta[2];
-
+ glite_jpps_fplug_data_t **pd = NULL;
+ glite_jp_attrval_t attr[2];
file_be = file_p = NULL;
memset(attr, 0, 2 * sizeof(glite_jp_attrval_t));
- memset(meta,0,sizeof meta);
- meta[0].name = strdup(GLITE_JP_ATTR_OWNER);
-
- if (glite_jppsbe_get_job_metadata(ctx,in->jobid,meta)) {
- goto err;
- }
-
- if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__RecordTag,in->jobid,meta[0].value)) {
- goto err;
- }
-
attr[0].name = in->tag->name;
if (in->tag->value->string) {
attr[0].value = in->tag->value->string;
attr[0].origin_detail = NULL; /* XXX */
attr[1].name = NULL;
- /*if (glite_jppsbe_open_file(ctx,in->jobid,"tags",NULL,
- O_RDWR|O_CREAT,&file_be)
- // XXX: tags need reading to check magic number
- ) {
- err2fault(ctx,soap);
- return SOAP_FAULT;
- }
+ /* XXX: we assume just one plugin and also that TAGS plugin handles
+ * just one uri/class */
- if (glite_jppsbe_close_file(ctx,file_be))
+ if (glite_jpps_fplug_lookup(ctx,GLITE_JP_FILETYPE_TAGS,&pd)
+ || glite_jppsbe_open_file(ctx,in->jobid,pd[0]->classes[0],NULL,
+ O_RDWR|O_CREAT,&file_be)
+ /* XXX: tags need reading to check magic number */
+ ) {
+ free(pd);
+ err2fault(ctx,soap);
+ return SOAP_FAULT;
+ }
+
+ /* XXX: assuming tag plugin handles just one type */
+ if (pd[0]->ops.open(pd[0]->fpctx,file_be,GLITE_JP_FILETYPE_TAGS,&file_p)
+ || pd[0]->ops.generic(pd[0]->fpctx,file_p,GLITE_JP_FPLUG_TAGS_APPEND,attr))
{
err2fault(ctx,soap);
+ if (file_p) pd[0]->ops.close(pd[0]->fpctx,file_p);
+ glite_jppsbe_close_file(ctx,file_be);
+ free(pd);
return SOAP_FAULT;
- }*/
- glite_jppsbe_append_tag(ctx,in->jobid,attr);
+ }
- /*if (tag_append(ctx,file_be,attr))
+ if (pd[0]->ops.close(pd[0]->fpctx,file_p)
+ || glite_jppsbe_close_file(ctx,file_be))
{
- err2fault(ctx,soap);
- return SOAP_FAULT;
- }*/
+ err2fault(ctx,soap);
+ free(pd);
+ return SOAP_FAULT;
+ }
/* XXX: ignore errors but don't fail silenty */
glite_jpps_match_attr(ctx,in->jobid,attr);
+ free(pd);
return SOAP_OK;
-err:
- glite_jp_attrval_free(meta,0);
- err2fault(ctx,soap);
- return SOAP_FAULT;
}
static void s2jp_qval(const struct jptype__stringOrBlob *in, char **value, int *binary, size_t *size)
glite_jp_error_t err;
void **pd;
struct jptype__jppsFile **f = NULL;
- glite_jp_attrval_t meta[2];
memset(&err,0,sizeof err);
out->__sizefiles = 0;
- memset(meta,0,sizeof meta);
- meta[0].name = strdup(GLITE_JP_ATTR_OWNER);
-
- if (glite_jppsbe_get_job_metadata(ctx,in->jobid,meta)) {
- goto err;
- }
-
- if (glite_jpps_authz(ctx,SOAP_TYPE___jpsrv__GetJobFiles,in->jobid,meta[0].value)) {
- goto err;
- }
-
for (pd = ctx->plugins; *pd; pd++) {
glite_jpps_fplug_data_t *plugin = *pd;
memcpy(out->files,f,out->__sizefiles * sizeof *f);
return SOAP_OK;
-err:
- glite_jp_attrval_free(meta,0);
- err2fault(ctx,soap);
- return SOAP_FAULT;
}
SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__GetJobAttributes(
struct _jpelem__GetJobAttributes *in,
struct _jpelem__GetJobAttributesResponse *out)
{
- glite_jp_attrval_t *attr, meta[2];
+ glite_jp_attrval_t *attr;
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)) {
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;
}
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <stdint.h>
#include <glite/jp/types.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 */
-
-/*int glite_jpps_tag_append(
+int glite_jpps_tag_append(
glite_jp_context_t ctx,
void *handle,
const glite_jp_tagval_t *tag
err.desc = "No more tags in the file";
goto error_out;
}
- // #define HEADER "JP#TAG# %05u %012lu %c %05u %012lu#"
+ /* #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";
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(
+int glite_jpps_tag_readall(
glite_jp_context_t ctx,
void *handle,
glite_jp_tagval_t **tags_out
}
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;
- size_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;
- int 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;
-}
-
-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);
+int glite_jpps_tag_append(glite_jp_context_t,void *,const char *, const char *);
--- /dev/null
+#include <stdlib.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <stdint.h>
+
+#include <glite/jp/types.h>
+
+#include "file_plugin.h"
+#include "builtin_plugins.h"
+#include "backend.h"
+
+static int tagappend(void *,void *,int,...);
+static int tagopen(void *,void *,const char *uri,void **);
+static int tagclose(void *,void *);
+static int tagattr(void *,void *,const char *,glite_jp_attrval_t **);
+
+struct tags_handle {
+ void *bhandle;
+ int n;
+ glite_jp_attrval_t *tags;
+};
+
+static int tagsread(void *,struct tags_handle *);
+
+#define TAGS_MAGIC 0x74c016f2 /* two middle digits encode version, i.e. 01 */
+
+static int tagdummy()
+{
+ puts("tagdummy()");
+ return -1;
+}
+
+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_TAGS);
+
+ data->classes = calloc(2,sizeof *data->classes);
+ data->classes[0] = strdup("tags");
+
+ data->ops.open = tagopen;
+ data->ops.close = tagclose;
+ data->ops.attr = tagattr;
+ data->ops.generic = tagappend;
+
+ printf("tags_plugin: URI: \"%s\"; magic number: 0x%08lx\n",GLITE_JP_FILETYPE_TAGS,TAGS_MAGIC);
+ return 0;
+}
+
+static int tagopen(void *fpctx,void *bhandle,const char *uri,void **handle)
+{
+ struct tags_handle *h = calloc(1,sizeof *h);
+ h->n = 0;
+ h->bhandle = bhandle;
+
+ *handle = h;
+
+ return 0;
+}
+
+static int tagclose(void *fpctx,void *handle)
+{
+ int i;
+ struct tags_handle *h = handle;
+
+ for (i=0; i<h->n; i++) glite_jp_attrval_free(h->tags+i,0);
+ free(h->tags);
+ free(h);
+
+ return 0;
+}
+
+static int tagappend(void *fpctx,void *handle,int oper,...)
+{
+ glite_jp_attrval_t *tag;
+ va_list ap;
+ char *hdr,*rec;
+ glite_jp_context_t ctx = fpctx;
+ struct tags_handle *h = handle;
+ uint32_t magic,hlen,rlen,rlen_n;
+ size_t r;
+ glite_jp_error_t err;
+
+ memset(&err,0,sizeof err);
+ err.source = __FUNCTION__;
+ glite_jp_clear_error(ctx);
+
+ va_start(ap,oper);
+ tag = va_arg(ap,glite_jp_attrval_t *);
+ va_end(ap);
+
+ printf("tagappend: %s,%s\n",tag->name,tag->value);
+
+ assert(oper == GLITE_JP_FPLUG_TAGS_APPEND);
+
+ 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 == 0) {
+ magic = htonl(TAGS_MAGIC);
+ if (glite_jppsbe_pwrite(ctx,h->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,h->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;
+}
+
+static int tagattr(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;
+ int 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
-#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/jp/types.h"
-#include "glite/jp/context.h"
-#include "glite/jp/strmd5.h"
-#include "glite/jp/known_attr.h"
-#include "glite/jp/attr.h"
-#include "glite/jp/escape.h"
-
-#include "feed.h"
-#include "tags.h"
-#include "db.h"
-
-#include "utils.h"
-#include "backend.h"
-
-/*
- * 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;
-}
-
-/*
- * read next line from stream
- *
- * \return error code
- */
-int glite_jppsbe_readline(
- glite_jp_context_t ctx,
- void *handle,
- rl_buffer_t *buffer,
- char **line
-)
-{
- size_t maxlen, len, i;
- ssize_t nbytes;
- int retval, z, end;
-
- maxlen = BUFSIZ;
- i = 0;
- len = 0;
- *line = malloc(maxlen);
- end = 0;
-
- do {
- /* read next portion */
- if (buffer->pos >= buffer->size) {
- buffer->pos = 0;
- buffer->size = 0;
- if ((retval = glite_jppsbe_pread(ctx, handle, buffer->buf, BUFSIZ, buffer->offset, &nbytes)) == 0) {
- if (nbytes < 0) {
- retval = EINVAL;
- goto fail;
- } else {
- if (nbytes) {
- buffer->size = (size_t)nbytes;
- buffer->offset += nbytes;
- } else end = 1;
- }
- } else goto fail;
- }
-
- /* we have buffer->size - buffer->pos bytes */
- i = buffer->pos;
- do {
- if (i >= buffer->size) z = '\0';
- else {
- z = buffer->buf[i];
- if (z == '\n') z = '\0';
- }
- len++;
-
- if (!check_realloc_line(line, &maxlen, len)) {
- retval = ENOMEM;
- goto fail;
- }
- (*line)[len - 1] = z;
- i++;
- } while (z && i < buffer->size);
- buffer->pos = i;
- } while (len && (*line)[len - 1] != '\0');
-
- if ((!len || !(*line)[0]) && end) {
- free(*line);
- *line = NULL;
- }
-
- return 0;
-
-fail:
- free(*line);
- *line = NULL;
- return retval;
-}
-
-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
-#ifndef __GLITE_JP_UTILS
-#define __GLITE_JP_UTILS
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "feed.h"
-
-typedef struct _rl_buffer_t {
- char *buf;
- size_t pos, size;
- off_t offset;
-} rl_buffer_t;
-
-int glite_jppsbe_readline(
- glite_jp_context_t ctx,
- void *handle,
- rl_buffer_t *buffer,
- char **line
-);
-
-char* glite_jpps_get_namespace(
- const char* attr
-);
-
-#endif
-
examples: db-test-int
db-test-int: db-test-int.o
- ${LINK} -o $@ $+ ${STATICLIB} ${MYSQLIB} -lglite_jp_common_${nothrflavour} ${TRIOLIB} ${GLOBUS_LIBS}
+ ${LINK} -o $@ $+ ${STATICLIB} ${MYSQLIB} -lglite_jp_common ${TRIOLIB} ${GLOBUS_LIBS}
check:
-echo nothing yet
+++ /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
-
-ifneq (${mysql_prefix},/usr)
- ifeq ($(shell echo ${mysql_version} | cut -d. -f1,2),4.1)
- mysqlib := -L${mysql_prefix}/lib/mysql
- else
- mysqlib := -L${mysql_prefix}/lib
- endif
-endif
-
-EXT_LIBS:=${mysqlib} -lmysqlclient -lglite_lbu_trio
-OBJS:=db.o
-TESTOBJS:=dbtest.o
-HDRS:=db.h
-LOBJS:=${OBJS:.o=.lo}
-LTESTOBJS:=${TESTOBJS:.o=.lo}
-
-libglite_lbu_db.la: ${LOBJS}
- ${LINK} -o $@ $< ${EXT_LIBS}
-
-libglite_lbu_dbtest.la: ${LTESTOBJS}
- ${LINK} -o $@ $< ${EXT_LIBS}
-
-dbtest.lo dbtest.o: db.c db.h
- ${COMPILE} -DGLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH=10 -c $< -o $@
-
-db_test: db_test.lo libglite_lbu_dbtest.la
- ${LINK} -o $@ $+ ${EXT_LIBS}
-
-default all: compile
-
-compile: libglite_lbu_db.la
-
-check:
- -echo No checks here yet.
-
-test_coverage:
- -mkdir coverage
- cd coverage && $(MAKE) -f ../Makefile top_srcdir=../../ COVERAGE_FLAGS="-fprofile-arcs -ftest-coverage" check
- cd coverage && for i in `echo ${OBJS} | tr ' ' '\012' | sort -u`; do gcov $$i ; done
-
-examples: db_test
-
-doc:
- doxygen C.dox
-
-stage: compile
- $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
-
-dist: distsrc distbin
-
-distsrc:
- mkdir -p ${top_srcdir}/${package}-${version}
- cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version}
- cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version}
- rm -rf ${top_srcdir}/${package}-${version}
-
-distbin:
- $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir}
- save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir
- rm -rf tmpbuilddir
-
-install:
- -mkdir -p ${PREFIX}/lib
- -mkdir -p ${PREFIX}/include/${globalprefix}/${lbutilsprefix}
-# ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
- ${INSTALL} -m 755 "libglite_lbu_db.la" "${PREFIX}/lib/libglite_lbu_db.la"; \
- ${INSTALL} -m 644 ${top_srcdir}/interface/${HDRS} ${PREFIX}/include/${globalprefix}/${lbutilsprefix}
-
-clean:
-
-%.o %.lo: %.c
- ${COMPILE} -c $<
-
-db.lo: db.c db.h
-db_test.lo: libglite_lbu_dbtest.la db.h db_test.c
-
-.PHONY: default all compile check examples doc stage dist distsrc distbin install clean test_coverage
+++ /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 this DB module.
- *
- * Requires existing database with appropriate access:
- *
- * mysqladmin -u root -p create test
- * mysql -u root -p -e 'GRANT ALL on test.* to testuset@localhost'
- *
- * Use CS environment variable when using different user/pwd@machine:dbname.
- */
-
-#include <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);
- 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;
-
- 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
-
-
-/**
- * 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/lb-utils/trio.h"
-#include "db.h"
-
-
-#define GLITE_LBU_MYSQL_INDEX_VERSION 40001
-#define GLITE_LBU_MYSQL_PREPARED_VERSION 40102
-#define BUF_INSERT_ROW_ALLOC_BLOCK 1000
-#ifndef GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH
-#define GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH 256
-#endif
-
-
-#define CLR_ERR(CTX) lbu_clrerr((CTX))
-#define ERR(CTX, CODE, DESC) lbu_err((CTX), (CODE), (DESC), __FUNCTION__, __LINE__)
-#define STATUS(CTX) ((CTX)->err.code)
-#define MY_ERR(CTX) myerr((CTX), __FUNCTION__, __LINE__)
-#define MY_ERRSTMT(STMT) myerrstmt((STMT), __FUNCTION__, __LINE__)
-#define MY_ISOKSTMT(STMT, RETRY) myisokstmt((STMT), __FUNCTION__, __LINE__, (RETRY))
-
-#define USE_TRANS(CTX) ((CTX->caps & GLITE_LBU_DB_CAP_TRANSACTIONS) != 0)
-
-
-
-struct glite_lbu_DBContext_s {
- MYSQL *mysql;
- const char *cs;
- int have_caps;
- int caps;
- struct {
- int code;
- char *desc;
- } err;
-};
-
-
-struct glite_lbu_Statement_s {
- glite_lbu_DBContext ctx;
-
- /* for simple commands */
- MYSQL_RES *result;
-
- /* for prepared commands */
- MYSQL_STMT *stmt;
- unsigned long nrfields;
-};
-
-
-struct glite_lbu_bufInsert_s {
- glite_lbu_DBContext ctx;
- char *table_name;
- char *columns; /* names of columns to be inserted into
- * (values separated with commas) */
- char **rows; /* each row hold string of one row to be inserted
- * (values separated with commas) */
- long rec_num, /* actual number of rows in structure */
- rec_size; /* approx. size of a real insert string */
- long size_limit, /* size and # of records limit which trigger */
- record_limit; /* real insert; zero means unlimitted */
-};
-
-
-/*
- * mapping glite DB types to mysql types
- */
-int glite_type_to_mysql[] = {
- MYSQL_TYPE_NULL,
- MYSQL_TYPE_TINY,
- MYSQL_TYPE_LONG,
- MYSQL_TYPE_TINY_BLOB,
- MYSQL_TYPE_TINY_BLOB,
- MYSQL_TYPE_BLOB,
- MYSQL_TYPE_BLOB,
- MYSQL_TYPE_MEDIUM_BLOB,
- MYSQL_TYPE_MEDIUM_BLOB,
- MYSQL_TYPE_LONG_BLOB,
- MYSQL_TYPE_LONG_BLOB,
- MYSQL_TYPE_VAR_STRING,
- MYSQL_TYPE_STRING,
- MYSQL_TYPE_DATE,
- MYSQL_TYPE_TIME,
- MYSQL_TYPE_DATETIME,
- MYSQL_TYPE_TIMESTAMP,
-};
-
-
-
-static int lbu_clrerr(glite_lbu_DBContext ctx);
-static int lbu_err(glite_lbu_DBContext ctx, int code, const char *desc, const char *func, int line);
-static int myerr(glite_lbu_DBContext ctx, const char *source, int line);
-static int myerrstmt(glite_lbu_Statement stmt, const char *source, int line);
-static int myisokstmt(glite_lbu_Statement stmt, const char *source, int line, int *retry);
-static int db_connect(glite_lbu_DBContext ctx, const char *cs, MYSQL **mysql);
-static void db_close(MYSQL *mysql);
-static int transaction_test(glite_lbu_DBContext ctx, MYSQL *m2, int *have_transactions);
-static int FetchRowSimple(glite_lbu_DBContext ctx, MYSQL_RES *result, unsigned long *lengths, char **results);
-static int FetchRowPrepared(glite_lbu_DBContext ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results);
-void set_time(MYSQL_TIME *mtime, const time_t time);
-time_t get_time(const MYSQL_TIME *mtime);
-
-
-/* ---- common ---- */
-
-
-int glite_lbu_DBError(glite_lbu_DBContext ctx, char **text, char **desc) {
- if (text) *text = strdup(strerror(ctx->err.code));
- if (desc) {
- if (ctx->err.desc) *desc = strdup(ctx->err.desc);
- else *desc = NULL;
- }
-
- return ctx->err.code;
-}
-
-
-int glite_lbu_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;
- fprintf(stderr, "[db] %s:%d %s\n", func, line, desc);
- return code;
- } else
- return ctx->err.code;
-}
-
-
-/*
- * helping function: find oud mysql error and sets on the context
- */
-static int myerr(glite_lbu_DBContext ctx, const char *source, int line) {
- return lbu_err(ctx, EIO, mysql_error(ctx->mysql), source, line);
-}
-
-
-/*
- * helping function: find oud mysql stmt error and sets on the context
- */
-static int myerrstmt(glite_lbu_Statement stmt, const char *source, int line) {
- return lbu_err(stmt->ctx, EIO, mysql_stmt_error(stmt->stmt), source, line);
-}
-
-
-/*
- * Ehelping function: error handle
- *
- * \return -1 failed
- * \return 0 retry
- * \return 1 OK
- */
-static int myisokstmt(glite_lbu_Statement stmt, const char *source, int line, int *retry) {
- switch (mysql_stmt_errno(stmt->stmt)) {
- case 0:
- return 1;
- break;
- case ER_DUP_ENTRY:
- lbu_err(stmt->ctx, EEXIST, mysql_stmt_error(stmt->stmt), source, line);
- return -1;
- break;
- case CR_SERVER_LOST:
- if (*retry > 0) {
- (*retry)--;
- return 0;
- } else
- return -1;
- break;
- default:
- myerrstmt(stmt, source, line);
- return -1;
- break;
- }
-}
-
-
-/*
- * mysql connect
- */
-static int db_connect(glite_lbu_DBContext ctx, const char *cs, MYSQL **mysql) {
- char *buf = NULL;
- char *host,*user,*pw,*db;
- char *slash,*at,*colon;
- int ret;
-
- // needed for SQL result parameters
- assert(sizeof(int) >= sizeof(my_bool));
-
- if (!cs) return ERR(ctx, EINVAL, "connect string not specified");
-
- if (!(*mysql = mysql_init(NULL))) return ERR(ctx, ENOMEM, NULL);
-
- mysql_options(*mysql, MYSQL_READ_DEFAULT_FILE, "my");
-
- host = user = pw = db = NULL;
-
- buf = strdup(cs);
- slash = strchr(buf,'/');
- at = strrchr(buf,'@');
- colon = strrchr(buf,':');
-
- if (!slash || !at || !colon) {
- free(buf);
- db_close(*mysql);
- *mysql = NULL;
- return ERR(ctx, EINVAL, "Invalid DB connect string");
- }
-
- *slash = *at = *colon = 0;
- host = at+1;
- user = buf;
- pw = slash+1;
- db = colon+1;
-
- /* ljocha: CLIENT_FOUND_ROWS added to make authorization check
- * working in update_notif().
- * Hope it does not break anything else */
- if (!mysql_real_connect(*mysql,host,user,pw,db,0,NULL,CLIENT_FOUND_ROWS)) {
- free(buf);
- ret = MY_ERR(ctx);
- glite_lbu_DBClose(ctx);
- return ret;
- }
- free(buf);
-
- ctx->cs = cs;
- return 0;
-}
-
-
-/*
- * mysql close
- */
-static void db_close(MYSQL *mysql) {
- if (mysql) mysql_close(mysql);
-}
-
-
-/*
- * test transactions capability:
- *
- * 1) with connection 1 create testing table test<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)", 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);
- 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
-@@@{
-gen qq{
-% !! Automatically generated file. Do not edit.
-% !! Change the corresponding template file $ARGV
-};
-@@@}
-
-\begin{description}
-@@@{
-for my $e (sort { $event->{order}->{$a} <=> $event->{order}->{$b} }
- $event->getTypes) {
- my $c = getTypeComment $event $e;
- gen "\\item\[$e:\] $c\n";
-}
-@@@}
-\end{description}
+++ /dev/null
-@@@{
-gen qq{
-% !! Automatically generated file. Do not edit.
-% !! Change the corresponding template file $ARGV
-};
-@@@}
-
-\begin{description}
-@@@{
-for my $stat ($status->getTypesOrdered) {
- my $c = getTypeComment $status $stat;
- gen "\\item\[$stat:\] $c\n";
- }
-@@@}
-\end{description}
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
+++ /dev/null
-# defaults
-top_srcdir=.
-builddir=build
-top_builddir=${top_srcdir}/${builddir}
-stagedir=.
-distdir=.
-globalprefix=glite
-lbprefix=lb
-package=glite-lb-client
-version=0.0.0
-PREFIX=/opt/glite
-
-glite_location=/opt/glite
-globus_prefix=/opt/globus
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-expat_prefix=/opt/expat
-
--include Makefile.inc
--include ../project/version.properties
-
-version=${module.version}
-
-CC=gcc
-
-VPATH:=${top_srcdir}/src:${top_srcdir}/test
-
-VERSION=-DVERSION=\"GLite-${version}\"
-
-SUFFIXES=.no
-
-GLOBUSINC=-I${globus_prefix}/include/${nothrflavour}
-
-GLOBUSTHRINC=-I${globus_prefix}/include/${thrflavour}
-
-ifdef LB_STANDALONE
- LB_STANDALONE_FLAGS:=-DLB_STANDALONE
-endif
-
-ifdef LB_PERF
- LOGD:=glite-lb-logd-perf glite-lb-logd-perf-nofile
- INTERLOGD:=glite-lb-interlogd-perf \
- glite-lb-interlogd-perf-empty
-# glite-lb-interlogd-perf-inline-empty
- NOTIF_INTERLOGD:=glite-lb-notif-interlogd
- LB_PERF_FLAGS:=-DLB_PERF
-else
- LOGD:=glite-lb-logd
- INTERLOGD:=glite-lb-interlogd
- NOTIF_INTERLOGD:=glite-lb-notif-interlogd
-endif
-
-DEBUG:=-g -O0
-CFLAGS:=${DEBUG} \
- -I${stagedir}/include -I${top_srcdir}/src \
- -D_GNU_SOURCE \
- ${COVERAGE_FLAGS} \
- ${VERSION} ${LB_STANDALONE_FLAGS} ${LB_PERF_FLAGS}
-
-LDFLAGS:=-L${stagedir}/lib \
- ${COVERAGE_FLAGS}
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LINKXX:=libtool --mode=link ${CXX} -rpath ${stagedir}/lib ${LDFLAGS}
-INSTALL:=libtool --mode=install install
-
-GLOBUS_LIBS:= -L${globus_prefix}/lib \
- -lglobus_common_${nothrflavour} \
- -lglobus_gssapi_gsi_${nothrflavour}
-
-GLOBUS_THRLIBS:= -L${globus_prefix}/lib \
- -lglobus_common_${thrflavour} \
- -lglobus_gssapi_gsi_${thrflavour}
-
-ifneq (${expat_prefix},/usr)
- EXPAT_LIBS:=-L${expat_prefix}/lib
-endif
-EXPAT_LIBS:=${EXPAT_LIBS} -lexpat
-
-EXT_LIBS:= ${EXPAT_LIBS}
-
-COMMON_LIB:=-lglite_lb_common
-
-GLITE_GSS_LIB:=-lglite_security_gss
-
-TEST_LIBS:=-L${cppunit_prefix}/lib -lcppunit
-TEST_INC:=-I${cppunit_prefix}/include
-
-LOGD_OBJS:= logd_proto.o logd.o
-
-LOGD_NOBJS:=${LOGD_OBJS:.o=.no}
-
-INTERLOG_OBJS:=il_error.o input_queue_socket.o \
- recover.o send_event.o \
- event_queue.o event_store.o il_master.o interlogd.o \
- queue_mgr.o server_msg.o queue_thread.o
-
-INTERLOG_NOBJS:=${INTERLOG_OBJS:.o=.no}
-INTERLOG_PERF_OBJS:=${INTERLOG_OBJS:.o=.perf.o}
-INTERLOG_EMPTY_OBJS:=${INTERLOG_OBJS:.o=.empty.o}
-#INTERLOG_INLINE_EMPTY_OBJS:=${INTERLOG_OBJS:.o=.io}
-
-INTERLOG_TEST_OBJS:= \
- il_error.o \
- server_msg.o \
- server_msgTest.o \
- queue_thread.o \
- event_store.o \
- event_storeTest.o \
- queue_mgr.o \
- il_master.o \
- input_queue_socket.o \
- input_queue_socketTest.o \
- send_event.o \
- event_queue.o \
- event_queueTest.o \
- IlTestBase.o \
- il_test.o
-
-default: all
-
-all compile: $(LOGD) $(INTERLOGD) $(NOTIF_INTERLOGD)
-
-glite-lb-logd: ${LOGD_OBJS}
- ${LINK} -o $@ ${LOGD_OBJS} ${COMMON_LIB}_${nothrflavour}
-
-glite-lb-logd-perf: ${LOGD_OBJS}
- ${LINK} -o $@ ${LOGD_OBJS} ${COMMON_LIB}_${nothrflavour}
-
-glite-lb-logd-nofile: ${LOGD_NOBJS}
- ${LINK} -o $@ ${LOGD_NOBJS} ${COMMON_LIB}_${nothrflavour}
-
-glite-lb-logd-perf-nofile: ${LOGD_NOBJS}
- ${LINK} -o $@ ${LOGD_NOBJS} ${COMMON_LIB}_${nothrflavour}
-
-glite-lb-interlogd: ${INTERLOG_OBJS}
- ${LINK} -o $@ ${INTERLOG_OBJS} ${COMMON_LIB}_${thrflavour}
-
-glite-lb-notif-interlogd: ${INTERLOG_NOBJS}
- ${LINK} -o $@ ${INTERLOG_NOBJS} ${COMMON_LIB}_${thrflavour}
-
-glite-lb-interlogd-perf: ${INTERLOG_PERF_OBJS}
- ${LINK} -o $@ ${INTERLOG_PERF_OBJS} ${COMMON_LIB}_${thrflavour}
-
-glite-lb-interlogd-perf-empty: ${INTERLOG_EMPTY_OBJS}
- ${LINK} -o $@ ${INTERLOG_EMPTY_OBJS} ${COMMON_LIB}_${thrflavour}
-
-#glite-lb-interlogd-perf-inline-empty: ${INTERLOG_INLINE_EMPTY_OBJS}
-# ${LINK} -o $@ ${INTERLOG_INLINE_EMPTY_OBJS} \
-# ${COMMON_LIB}_${thrflavour}
-
-stage: compile
- $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
-
-check:
-# do nothing until test/ is really added to CVS
-# check.ll check.il
-
-#check.ll: logd_proto_test.o ll_test.o
-# ${LINKXX} -o $@ ${COMMON_LIB}_${nothrflavour} ${EXT_LIBS} ${GLOBUS_LIBS} ${TEST_LIBS} $+
-# ./check.ll
-
-check.ll:
- -echo commented out -- fix needed
-
-check.il: ${INTERLOG_TEST_OBJS}
- ${LINKXX} -o $@ ${COMMON_LIB}_${thrflavour} ${GLITE_GSS_LIB}_${nothrflavour} ${TEST_LIBS} -lpthread $+
-
-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}/bin
- -mkdir -p ${PREFIX}/etc/init.d
- -mkdir -p ${PREFIX}/share/doc/${package}-${version}
- ${INSTALL} -m 755 ${LOGD} ${PREFIX}/bin
- ${INSTALL} -m 755 ${INTERLOGD} ${PREFIX}/bin
- if [ x${DOSTAGE} = xyes ]; then \
- ${INSTALL} -m 755 ${NOTIF_INTERLOGD} ${PREFIX}/bin; \
- fi
-ifdef LB_PERF
- ${INSTALL} -m 755 ${top_srcdir}/src/perftest_ll.sh ${PREFIX}/sbin
- ${INSTALL} -m 755 ${top_srcdir}/src/perftest_il.sh ${PREFIX}/sbin
-endif
- ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-locallogger
- ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
-
-${INTERLOG_NOBJS}: %.no: %.c
- ${CC} ${CFLAGS} ${GLOBUSTHRINC} -DIL_NOTIFICATIONS -c $< -o $@
-
-${INTERLOG_OBJS}: %.o: %.c
- ${CC} ${CFLAGS} ${GLOBUSTHRINC} -c $< -o $@
-
-${INTERLOG_EMPTY_OBJS}: %.empty.o: %.c
- ${CC} ${CFLAGS} ${GLOBUSTHRINC} -DPERF_EMPTY -c $< -o $@
-
-${INTERLOG_PERF_OBJS}: %.perf.o: %.c
- ${CC} ${CFLAGS} ${GLOBUSTHRINC} -c $< -o $@
-
-#${INTERLOG_INLINE_EMPTY_OBJS}: %.io: %.c
-# ${CC} ${CFLAGS} ${GLOBUSTHRINC} -DLB_PERF -DPERF_EMPTY -DPERF_EVENTS_INLINE -c $< -o $@
-
-${LOGD_NOBJS}: %.no: %.c
- ${CC} ${CFLAGS} ${GLOBUSINC} -DLOGD_NOFILE -c $< -o $@
-
-${LOGD_OBJS}: %.o: %.c
- ${CC} ${CFLAGS} ${GLOBUSINC} -c $< -o $@
-
-logd_proto_test.o: %.o: %.c
- ${CC} ${CFLAGS} ${GLOBUSINC} -c $< -o $@
-
-ll_test.o: %.o: %.cpp
- ${CXX} ${CFLAGS} ${TEST_INC} -c $< -o $@
-
-il_test.o IlTestBase.o server_msgTest.o event_queueTest.o input_queue_socketTest.o event_storeTest.o: %.o: %.cpp
- ${CXX} ${CFLAGS} ${GLOBUSTHRINC} ${TEST_INC} -c $< -o $@
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite LB Client module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.5 2005/05/26 15:13:49 zurek
- inserted module.build.file
-
- Revision 1.4.2.1 2005/02/12 01:39:10 glbuild
- Changed start time
-
- Revision 1.4 2004/10/18 19:16:09 zsalvet
- RPM descriptions
-
- Revision 1.3 2004/07/29 23:21:51 dimeglio
- Changed default target from compile to dist
-
- Revision 1.2 2004/07/07 09:24:57 akrenek
- thr/nonthr flavours used correctly
-
- Revision 1.3 2004/07/06 17:45:30 flammer
- Update of classpath definitions, targets & configure file.
-
- Revision 1.2 2004/06/23 00:29:33 dimeglio
- Added standard comments and handling of support files
-
--->
-
-<project name="logger" default="dist">
-
- <!-- =========================================
- Builds the GLite LB Client Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
- <!-- =========================================
- RPM settings
- ========================================= -->
-
- <property name="build.package.summary" value="L&B local logger" />
- <property name="build.package.description" value="
-Daemons installed on any EGEE machine producing Logging & Bookkeeping
-(L&B)
events. They are responsible for non-blocking accept of
-an event, persistent
storage, and reliable transfer to bookkeeping server." />
-
-</project>
+++ /dev/null
-<service name="glite-lb-logger">
- <components>
-
- <component name="locallogger">
- <config-template>
- <description>glite_lb_logd daemon</description>
- <init>
- <param name="port" mandatory="false" type="int" advanced="false">
- <description>port to listen</description>
- </param>
- <param name="file-prefix" mandatory="false" type="string" advanced="false">
- <description>path and prefix for event files</description>
- </param>
- <param name="socket" mandatory="false" type="string" advanced="false">
- <description>path to local socket</description>
- </param>
- <param name="cert" mandatory="false" type="string" advanced="false">
- <description>location of server certificate</description>
- </param>
- <param name="key" mandatory="false" type="string" advanced="false">
- <description>location of server private key</description>
- </param>
- <param name="CAdir" mandatory="false" type="string" advanced="false">
- <description>"directory containing CA certificates"</description>
- </param>
- </init>
- </config-template>
- </component>
-
- <component name="interlogger">
- <config-template>
- <description>glite_lb_interlogd daemon</description>
- <init>
- <param name="file-prefix" mandatory="false" type="string" advanced="false">
- <description>path and prefix for event files</description>
- </param>
- <param name="socket" mandatory="false" type="string" advanced="false">
- <description>path to local socket</description>
- </param>
- <param name="cert" mandatory="false" type="string" advanced="false">
- <description>location of server certificate</description>
- </param>
- <param name="key" mandatory="false" type="string" advanced="false">
- <description>location of server private key</description>
- </param>
- <param name="CAdir" mandatory="false" type="string" advanced="false">
- <description>"directory containing CA certificates"</description>
- </param>
- </init>
- </config-template>
- </component>
-
- <component name="notification-interlogger">
- <config-template>
- <description>glite_lb_notif_interlogd daemon</description>
- <init>
- <param name="file-prefix" mandatory="false" type="string" advanced="false">
- <description>path and prefix for event files</description>
- </param>
- <param name="socket" mandatory="false" type="string" advanced="false">
- <description>path to local socket</description>
- </param>
- <param name="cert" mandatory="false" type="string" advanced="false">
- <description>location of server certificate</description>
- </param>
- <param name="key" mandatory="false" type="string" advanced="false">
- <description>location of server private key</description>
- </param>
- <param name="CAdir" mandatory="false" type="string" advanced="false">
- <description>"directory containing CA certificates"</description>
- </param>
- </init>
- </config-template>
- </component>
-
- </components>
-</service>
+++ /dev/null
-locallogger.port = 9002
-locallogger.file-prefix = /var/glite/log/dglogd.log
-locallogger.socket = /tmp/interlogger.sock
-locallogger.cert = /etc/grid-security/hostcert.pem
-locallogger.key = /etc/grid-security/hostkey.pem
-locallogger.CAdir = /etc/grid-security/certificates
-interlogger.file-prefix = /var/glite/log/dglogd.log
-interlogger.socket = /tmp/interlogger.sock
-interlogger.cert = /etc/grid-security/hostcert.pem
-interlogger.key = /etc/grid-security/hostkey.pem
-interlogger.CAdir = /etc/grid-security/certificates
-notification-interlogger.file-prefix = /tmp/notif_events
-notification-interlogger.socket = /tmp/notif_interlogger.sock
-notification-interlogger.cert = /etc/grid-security/hostcert.pem
-notification-interlogger.key = /etc/grid-security/hostkey.pem
-notification-interlogger.CAdir = /etc/grid-security/certificates
-log.Priority = DEBUG
-log.fileName = /var/glite/log/glite-lb-logger.log
+++ /dev/null
-#!/bin/sh
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-$GLITE_LOCATION/var}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-
-[ -f $GLITE_LOCATION/etc/lb.conf ] && . $GLITE_LOCATION/etc/lb.conf
-[ -f $GLITE_LOCATION_VAR/etc/lb.conf ] && . $GLITE_LOCATION_VAR/etc/lb.conf
-
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-unset creds port
-
-start()
-{
- if test -z "$GLITE_USER" ;then
- echo 'Error: GLITE_USER is not set'
- echo FAILED
- return 1
- fi
-
- [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] &&
- creds="-c $GLITE_HOST_CERT -k $GLITE_HOST_KEY"
-
- if test -z "$creds"; then
- if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
- echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
- creds="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
- fi
- fi
-
- [ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
-
- [ -n "$GLITE_LB_LOGGER_PORT" ] && port="--port $GLITE_LB_LOGGER_PORT"
- [ -n "$GLITE_LB_IL_SOCK" ] && sock="--socket $GLITE_LB_IL_SOCK"
- [ -n "$GLITE_LB_IL_FPREFIX" ] && fprefix="--file-prefix $GLITE_LB_IL_FPREFIX"
-
- mkdir -p /var/glite/log
- chown $GLITE_USER /var/glite/log
- echo -n Starting glite-lb-logd ...
- (cd /tmp && ls -f /tmp |fgrep ^dglogd_sock_ |xargs rm -f)
- su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-logd \
- $creds $port $sock $fprefix" && echo " done" || echo " FAILED"
-
- echo -n Starting glite-lb-interlogd ...
- su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-interlogd \
- $creds $sock $fprefix" && echo " done" || echo " FAILED"
-}
-
-stop()
-{
- echo -n Stopping glite-lb-logd ...
- killall glite-lb-logd
- echo " done"
- echo -n Stopping glite-lb-interlogd ...
- killall glite-lb-interlogd
- echo " done"
-}
-
-status()
-{
- LC_ALL=C
- if netstat -an --inet | grep "^tcp .* 0.0.0.0:${GLITE_LB_LOGGER_PORT:-9002} .*LISTEN" >/dev/null 2>&1 ;then
- echo glite-lb-logd running
- else
- echo glite-lb-logd not running
- return 1
- fi
- if netstat -an --unix | grep "^unix .* LISTEN.* ${GLITE_LB_IL_SOCK:-/tmp/interlogger.sock}$" >/dev/null 2>&1 ;then
- echo glite-lb-interlogd running
- else
- echo glite-lb-interlogd not running
- return 1
- fi
-}
-
-case x$1 in
- xstart) start;;
- xstop) stop;;
- xrestart) stop; start;;
- xstatus) status;;
- x*) echo usage: $0 start,stop,restart,status >&2
- exit 1;;
-esac
+++ /dev/null
-#Fri Aug 18 12:30:51 CEST 2006
-module.build=0243
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration options for the GLite LB Client module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2006/03/15 18:25:31 akrenek
- cares
-
- Revision 1.2 2004/08/31 13:44:44 mvocu
- * added cppunit
-
- Revision 1.1 2004/07/07 12:08:47 akrenek
- *** empty log message ***
-
- Revision 1.2 2004/07/06 20:47:11 flammer
- Moved to configure.properties.xml
-
-
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="LB Client configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-cppunit_prefix=${with.cppunit.prefix}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the Glite LB Logger component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="LB Logger component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="logger" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-#Fri Sep 02 14:18:17 CEST 2005
-module.version=1.4.0
-module.age=1
+++ /dev/null
-#ifndef _CONNECTION_H
-#define _CONNECTION_H
-
-
-class Connection {
-public:
- class Factory {
- public:
- virtual Connection *newConnection(int fd) const = 0;
- virtual Connection *accept(int fd) const = 0;
- };
-
- class Endpoint {
- };
-
- Connection(int a_fd) : fd(a_fd)
- {}
-
- virtual ~Connection()
- {}
-
- virtual int getFD() const
- { return fd; }
-
- virtual int read(char *buf, unsigned int len) = 0;
- virtual int write(char *buf, unsigned int len) = 0;
-
-protected:
- int fd;
-};
-
-#endif
+++ /dev/null
-#ifndef _EVENT_MANAGER_H
-#define _EVENT_MANAGER_H
-
-
-class EventManager {
-public:
- // type for return code of event handler
- typedef enum {
- NOT_HANDLED, // the event was not handled at all
- HANDLED, // the event was handled succesfully
- HANDLED_FINAL // the event was handled,
- // no other handlers should be called
- } eventstatus_t;
-
-
- static EventManager* getEventManager() { return &theEventManager; };
-
- class Event {
- public:
- };
-
- template<class T>
- class EventHandler {
- public:
-
- virtual eventstatus_t handleEvent(T *&e);
-
- eventstatus_t dispatchEvent(Event *&e) {
- T *event = dynamic_cast<T*>(e);
-
- if(event)
- return(handleEvent(event));
- else
- return(NOT_HANDLED);
- }
- };
-
-
- void postEvent(Event &);
-
- template<class T>
- bool registerHandler(EventHandler<T> *);
-
- template<class T>
- bool registerHandlerFirst(EventHandler<T> *);
-
-private:
-
- // the event manager
- static EventManager theEventManager;
-
- // private default constructor for singleton instance
- EventManager()
- {};
-
-};
-
-
-#endif
+++ /dev/null
-#ifndef _EXCEPTION_H
-#define _EXCEPTION_H
-
-class Exception {
-};
-
-#endif
+++ /dev/null
-#ifndef _HTTP_TRANSPORT_H
-#define _HTTP_TRANSPORT_H
-
-#include "ThreadPool.H"
-#include "Transport.H"
-
-#include <string>
-
-class HTTPTransport:
- public Transport
-{
-public:
- class Factory: public Transport::Factory {
- public:
- virtual Transport *newTransport(Connection *conn) const {
- if(conn)
- return(new HTTPTransport(conn));
- else
- return NULL;
- }
- };
-
- static Factory theFactory;
-
- HTTPTransport(Connection *conn)
- : Transport(conn),
- state(NONE),
- request(), headers(), body(NULL), pos(NULL),
- content_length(0)
- {}
-
- virtual ~HTTPTransport();
-
-
-protected:
- // from ThreadPool::WorkDescription
- virtual void onReady();
- virtual void onTimeout();
- virtual void onError();
-
-private:
- enum { NONE,
- IN_REQUEST,
- IN_HEADERS,
- IN_BODY } state;
- std::string request;
- std::string headers;
- char *body;
- char buffer[256];
- char *pos;
- unsigned int content_length;
-
- int parseHeader(const char *s, unsigned int len);
-};
-
-
-#endif
+++ /dev/null
-#include "HTTPTransport.H"
-#include "Exception.H"
-
-#include <iostream>
-#include <string.h>
-
-
-HTTPTransport::Factory HTTPTransport::theFactory;
-
-
-HTTPTransport::~HTTPTransport()
-{
- if(body) free(body);
-}
-
-
-void
-HTTPTransport::onReady()
-{
- int len;
-
- switch(state) {
- case NONE:
- state = IN_REQUEST;
- pos = buffer;
-
- case IN_REQUEST:
- case IN_HEADERS:
- len = conn->read(pos, sizeof(buffer) - (pos - buffer));
- if(len < 0) {
- // error during request
- state = NONE;
- } else if(len == 0) {
- // other side closed connection
- state = NONE;
- } else {
- char *cr = NULL, *p = buffer, *s = buffer;
- bool crlf_seen = false;
-
- // parse buffer, look for CRLFs
- // s - start scan position
- // p - start of current token
- // cr - current CRLF position
- // crlf_seen <=> previous block ends with CRLF
- while((state != IN_BODY) &&
- (s < buffer + len) &&
- (cr = (char*)memchr(s, '\r', len - (s - buffer)))) {
- if((cr < buffer + len - 1) &&
- (cr[1] == '\n')) {
- // found CRLF
- if(state == IN_REQUEST) {
- // found end of request
- request.append(p, cr - p);
- // change state
- state = IN_HEADERS;
- // start new tokens
- p = cr + 2;
- } else {
- // headers continue. parse the current one
- *cr = 0;
- parseHeader(s, cr - s);
- *cr = '\r';
- }
- if(crlf_seen && (s == cr)) {
- // found CRLFCRLF
- state = IN_BODY;
- }
- // next scan starts after CRLF
- s = cr + 2;
- // we have seen CRLF
- crlf_seen = true;
- } else {
- if(crlf_seen && (s == cr)) {
- if(cr < buffer + len - 1) {
- // found CRLFCRx
- // continue scan behind this
- s = cr + 2;
- } else {
- // found CRLFCR at the end of buffer
- // s points behind buffer => scan ends
- s = cr + 1;
- // cr points at the CRLFCR => it will be left for next pass
- cr = cr - 2;
- }
- } else {
- // single '\r' - skip it,
- // or '\r' at the end of buffer - skip it, that ends scanning
- s = cr + 1;
- }
- crlf_seen = false;
- }
- }
- // copy the current token into appropriate variable,
- // but leave the trailing \r[\n] in buffer
- if(!cr) cr = buffer + len;
- if(state == IN_REQUEST)
- request.append(p, cr - p);
- else
- headers.append(p, cr - p);
- if(state == IN_BODY) {
- // we found body
- // content-length should be set at the moment
- if(content_length > 0) {
- body = (char*)malloc(content_length);
- if(body == NULL) {
- // chyba alokace
- }
- // move rest of buffer to body
- if(s < buffer + len) {
- memmove(body, s, buffer + len - s);
- pos = body + (buffer + len - s);
- } else {
- pos = body;
- }
- } else {
- // report error
- std::cout << "Wrong content length" << std::endl;
- throw new Exception();
- }
- } else {
- // move the trailing characters to the front
- if(cr < buffer + len)
- memmove(buffer, cr, buffer + len - cr);
- // and set pos to point at the first free place
- pos = buffer + (buffer + len - cr);
- }
- }
- break;
-
- case IN_BODY:
- len = conn->read(pos, content_length - (pos - body));
- if(len < 0) {
- // error reading
- state = NONE;
- } else if(len == 0) {
- // no more data
- state = NONE;
- } else {
- pos += len;
- if(pos - body == content_length) {
- // finished reading
- state = NONE;
- }
- }
- break;
- }
-
- if(state != NONE)
- ThreadPool::instance()->queueWorkRead(this);
- else {
- std::cout << request << std::endl << headers << std::endl;
- std::cout.write(body, content_length);
- std::cout.flush();
- }
-
-}
-
-
-void
-HTTPTransport::onTimeout()
-{
-}
-
-
-void
-HTTPTransport::onError()
-{
-}
-
-
-int
-HTTPTransport::parseHeader(const char *s, unsigned int len)
-{
- char *p;
-
- std::cout << "header: ";
- std::cout.write(s, len);
- std::cout << std::endl;
- std::cout.flush();
- if(!strncasecmp(s, "Content-Length", 14)) {
- p = (char*)memccpy((void*)s, (void*)s, ':', len);
- content_length = p ? atoi(p) : 0 ;
- }
- return(0);
-}
+++ /dev/null
-
-CXX = c++
-CC = gcc
-
-CFLAGS = -g -Wall
-
-COMPILEPP = $(CXX) $(CXXFLAGS) $(CFLAGS)
-COMPILE = $(CC) $(CFLAGS)
-LINK = libtool --mode=link g++ $(LDFLAGS)
-
-THREAD_LIB = -lpthread
-
-CPPUNIT_ROOT = /afs/ruk.cuni.cz/home/michal/egee/repository/externals/cppunit/1.10.2/slc3_ia32_gcc323
-CPPUNIT_LIB = -L$(CPPUNIT_ROOT)/lib -lcppunit -ldl
-CPPUNIT_INCLUDE = -I$(CPPUNIT_ROOT)/include
-
-TEST_OBJS= \
- test/ThreadPoolTest.o \
- test/PluginManagerTest.o \
- test/EventManagerTest.o \
- test/SingletonTest.o \
- test/test_main.o
-
-plain: SocketInput.o PlainConnection.o HTTPTransport.o ThreadPool.o main.o
- $(LINK) -o $@ $+ $(THREAD_LIB)
-
-utest: ThreadPool.o PluginManager.o EventManager.o $(TEST_OBJS)
- $(LINK) -o $@ $+ $(CPPUNIT_LIB) $(THREAD_LIB)
-
-stest: test/SingletonTest.o test/test_main.o
- $(LINK) -o $@ $+ $(CPPUNIT_LIB) $(THREAD_LIB)
-
-$(TEST_OBJS): %.o: %.cpp
- $(COMPILEPP) -I. $(CPPUNIT_INCLUDE) -o $@ -c $<
-
-%.o: %.cpp
- $(COMPILEPP) -o $@ -c $<
-
-%.o: %.c
- $(COMPILE) -o $@ -c $<
\ No newline at end of file
+++ /dev/null
-#ifndef _PLAIN_CONNECTION_H
-#define _PLAIN_CONNECTION_H
-
-#include "Connection.H"
-
-
-class PlainConnection:
- public Connection
-{
-public:
- class Factory: public Connection::Factory {
- public:
- virtual Connection *newConnection(int fd) const {
- return new PlainConnection(fd);
- }
-
- virtual Connection *accept(int fd) const;
- };
-
- static Factory theFactory;
-
- PlainConnection(int a_fd): Connection(a_fd)
- {}
-
- virtual ~PlainConnection();
-
- // from Connection
- virtual int read(char *buf, unsigned int len);
- virtual int write(char *buf, unsigned int len);
-
-};
-
-#endif
+++ /dev/null
-#include "PlainConnection.H"
-#include "ThreadPool.H"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-PlainConnection::Factory PlainConnection::theFactory;
-
-
-PlainConnection::~PlainConnection()
-{
-}
-
-
-Connection *
-PlainConnection::Factory::accept(int fd) const
-{
- int nfd;
-
- nfd = ::accept(fd, NULL, NULL);
- return newConnection(nfd);
-}
-
-
-int
-PlainConnection::read(char *buf, unsigned int len)
-{
- int ret;
-
- ret = ::recv(fd, buf, len, MSG_NOSIGNAL);
- return ret;
-}
-
-
-int
-PlainConnection::write(char *buf, unsigned int len)
-{
-}
+++ /dev/null
-#ifndef _PLUGIN_MANAGER_H
-#define _PLUGIN_MANAGER_H
-
-#include <list>
-#include <iostream>
-
-#include "Singleton.H"
-
-class PluginManager: public Singleton<PluginManager> {
- friend class Singleton<PluginManager>;
-public:
-
- // base class for plugins
- class Plugin {
- public:
- const char *name;
-
- Plugin(const char *aname) : name(aname) {
- PluginManager::instance()->registerPlugin(this, aname);
- }
-
- virtual bool initialize() = 0;
- virtual bool cleanup () = 0;
- };
-
- // add plugin with given name to the list of registered plugins
- void registerPlugin(Plugin *plugin, const char *name) {
- pluginList.push_front(plugin);
- }
-
- // remove plugin from the list
- void removePlugin();
-
- // initialize all plugins on list
- void initialize() {
- for(std::list<Plugin *>::iterator i = pluginList.begin();
- i != pluginList.end();
- i++) {
- (*i)->initialize();
- }
-
- }
-
- // cleanup all plugins on list
- void cleanup() {
- for(std::list<Plugin *>::iterator i = pluginList.begin();
- i != pluginList.end();
- i++) {
- (*i)->cleanup();
- }
-
- }
-
-
-protected:
- // default constructor
- PluginManager() : pluginList()
- {};
-
-private:
- // list of registered plugins
- std::list<Plugin *> pluginList;
-
-};
-
-
-#endif
+++ /dev/null
-#include "PluginManager.H"
-
-
+++ /dev/null
-#ifndef _SINGLETON_H
-#define _SINGLETON_H
-
-#include <pthread.h>
-
-#include "Exception.H"
-
-template <class T>
-class Singleton {
-public:
- // obtain the singleton object
- static T* instance() {
- // XXX - is this really thread safe?
- static pthread_mutex_t instance_lock = PTHREAD_MUTEX_INITIALIZER;
-
- pthread_mutex_lock(&instance_lock);
- if(theInstance == NULL) {
- theInstance = new T;
- }
- pthread_mutex_unlock(&instance_lock);
- return(theInstance);
- }
-
-protected:
- // prevent other's from messing with the instance
- Singleton() {}
- Singleton(const Singleton &) {}
- Singleton& operator=(const Singleton &) {}
- ~Singleton() {}
-
-private:
- static T *theInstance;
-};
-
-template<class T>
-T *Singleton<T>::theInstance = NULL;
-
-
-#endif
+++ /dev/null
-#ifndef _SOCKET_INPUT_H
-#define _SOCKET_INPUT_H
-
-#include "ThreadPool.H"
-#include "Connection.H"
-#include "Transport.H"
-
-#include "sys/un.h"
-
-
-class SocketInput: public ThreadPool::WorkDescription
-{
-public:
- SocketInput(const char *path,
- const Connection::Factory *a_cfactory,
- const Transport::Factory *a_tfactory);
- virtual ~SocketInput();
-
- // from WorkDescription
- virtual void onReady();
- virtual void onTimeout();
- virtual void onError();
-
-private:
- static const int SOCK_QUEUE_MAX = 5;
-
- struct sockaddr_un saddr;
- const Connection::Factory *cFactory;
- const Transport::Factory *tFactory;
-};
-
-#endif
+++ /dev/null
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <errno.h>
-
-#include "ThreadPool.H"
-#include "SocketInput.H"
-
-
-
-// create unix domain socket for input
-SocketInput::SocketInput(const char *path,
- const Connection::Factory *a_cfactory,
- const Transport::Factory *a_tfactory)
- : ThreadPool::WorkDescription(0),
- cFactory(a_cfactory),
- tFactory(a_tfactory)
-{
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, path);
- fd = socket(PF_UNIX, SOCK_STREAM, 0);
- if(connect(fd, (struct sockaddr*)&saddr, sizeof(saddr.sun_path)) < 0) {
- if(errno == ECONNREFUSED) {
- unlink(saddr.sun_path);
- }
- } else {
- // another instance running
- // throw new Exception
- }
- bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
- listen(fd, SOCK_QUEUE_MAX);
- ThreadPool::instance()->setWorkAccept(this);
-}
-
-
-// remove the socket
-SocketInput::~SocketInput()
-{
- if(fd >= 0)
- close(fd);
- unlink(saddr.sun_path);
-}
-
-
-void
-SocketInput::onReady()
-{
- Connection *conn = cFactory->accept(fd);
- Transport *trans = tFactory->newTransport(conn);
- ThreadPool::instance()->queueWorkRead(trans);
-}
-
-
-void
-SocketInput::onTimeout()
-{
- // nothing special, just sit around
-}
-
-
-void
-SocketInput::onError()
-{
- // should report an error?
-}
+++ /dev/null
-#ifndef _THREAD_POOL_H
-#define _THREAD_POOL_H
-
-#include <pthread.h>
-#include <poll.h>
-#include <time.h>
-
-#include <list>
-
-#include "Singleton.H"
-
-class ThreadPool : public Singleton<ThreadPool> {
- friend class Singleton<ThreadPool>;
-public:
- const static int default_timeout = 5;
-
- class WorkDescription {
- friend class ThreadPool;
- public:
- int fd;
-
- WorkDescription(int afd)
- : fd(afd), event(NONE) {}
-
-
- protected:
- enum Event { NONE, READY, TIMEOUT, ERROR } event;
- void doWork();
-
- virtual void onReady()
- {}
-
- virtual void onTimeout()
- {}
-
- virtual void onError()
- {}
- };
-
-public:
- void startWorkers(unsigned int n);
- void stopWorkers();
-
- void postWork(WorkDescription *work_unit);
-
- void queueWorkAccept(WorkDescription *work_unit);
- void queueWorkRead(WorkDescription *work_unit);
- void queueWorkWrite(WorkDescription *work_unit);
- void queueWorkTimeout(WorkDescription *work_unit);
- void queueWorkConnect(WorkDescription *work_unit);
-
- void setWorkAccept(WorkDescription *work_unit);
- void setWorkRead(WorkDescription *work_unit);
- void setWorkWrite(WorkDescription *work_unit);
- void setWorkTimeout(WorkDescription *work_unit);
-
- void run();
- void exit()
- { f_exit = true; pthread_cond_signal(&wait_queue_cond_ready); }
-
-protected:
- ThreadPool();
- ~ThreadPool();
-
- WorkDescription *getWork();
-
-private:
- class WaitDesc {
- public:
- WorkDescription *wd;
- short event;
- bool f_permanent;
- struct timeval timeout;
-
- WaitDesc(WorkDescription *w, short e,
- bool permanent = false, int t = default_timeout)
- : wd(w), event(e), f_permanent(permanent) {
- timeout.tv_sec = t;
- timeout.tv_usec = 0;
- }
-
- int get_fd() { return wd->fd; };
- void adjustTimeout(const struct timeval &delta);
- int timeoutExpired() { return((timeout.tv_sec < 0) ||
- (timeout.tv_sec == 0 && timeout.tv_usec == 0)); }
- };
-
-private:
- bool f_exit;
- int num_workers;
- pthread_t *workers;
- int work_count;
- int wait_count;
- int ufds_size;
- std::list<WorkDescription *> work_queue;
- std::list<WaitDesc *> wait_queue;
- pthread_mutex_t work_queue_mutex;
- pthread_cond_t work_queue_cond_ready;
- pthread_cond_t work_queue_cond_full;
- pthread_mutex_t wait_queue_mutex;
- pthread_cond_t wait_queue_cond_ready;
- struct pollfd *ufds;
- int pd[2];
- struct timeval min_timeout;
-
- void prepareDescriptorArray();
- void removeWaitDesc(std::list<WaitDesc *>::iterator &i);
- void removeWorkDesc();
- void queueWork(WaitDesc *);
-
- static void *threadMain(void *);
- static void threadCleanup(void *);
-};
-
-#endif
+++ /dev/null
-#include <time.h>
-#include <pthread.h>
-#include <poll.h>
-#include <sys/time.h>
-#include <time.h>
-#include <stdlib.h>
-
-#include <iostream>
-
-#include "ThreadPool.H"
-#include "Exception.H"
-
-
-static inline
-void
-tv_sub(struct timeval &a, const struct timeval &b) {
- a.tv_usec -= b.tv_usec;
- a.tv_sec -= b.tv_sec;
- if (a.tv_usec < 0) {
- a.tv_sec--;
- a.tv_usec += 1000000;
- }
-}
-
-
-static inline
-int
-tv_cmp(const struct timeval &a, const struct timeval &b) {
- if(a.tv_sec < b.tv_sec) {
- return -1;
- } else if(a.tv_sec > b.tv_sec) {
- return 1;
- } else {
- if (a.tv_usec < b.tv_usec) {
- return -1;
- } else if(a.tv_usec > b.tv_usec) {
- return 1;
- } else {
- return 0;
- }
- }
-}
-
-
-inline
-void
-ThreadPool::WorkDescription::doWork() {
- switch(event) {
- case READY:
- onReady();
- break;
- case TIMEOUT:
- onTimeout();
- break;
- case ERROR:
- onError();
- break;
- default:
- break;
- }
-}
-
-
-inline
-void
-ThreadPool::WaitDesc::adjustTimeout(const struct timeval &delta)
-{
- tv_sub(timeout, delta);
-}
-
-
-ThreadPool::ThreadPool()
- : work_count(0), wait_count(0), ufds_size(0), ufds(NULL), f_exit(false)
-{
- pthread_mutex_init(&wait_queue_mutex, NULL);
- pthread_mutex_init(&work_queue_mutex, NULL);
- pthread_cond_init(&work_queue_cond_ready, NULL);
- pthread_cond_init(&work_queue_cond_full, NULL);
- pthread_cond_init(&wait_queue_cond_ready, NULL);
- pipe(pd);
- ufds = static_cast<struct pollfd *>(malloc(sizeof(struct pollfd)));
- ufds->fd = pd[0];
- ufds->events = POLLIN;
- ufds_size = 1;
-}
-
-
-ThreadPool::~ThreadPool()
-{
- pthread_cond_destroy(&work_queue_cond_full);
- pthread_cond_destroy(&work_queue_cond_ready);
- pthread_cond_destroy(&wait_queue_cond_ready);
- pthread_mutex_destroy(&work_queue_mutex);
- pthread_mutex_destroy(&wait_queue_mutex);
-}
-
-
-void
-ThreadPool::startWorkers(unsigned int n)
-{
- workers = new pthread_t[n];
-
- num_workers = n;
- for(unsigned int i = 0; i < n; i++) {
- pthread_create(&workers[i], NULL, ThreadPool::threadMain, NULL);
- }
-}
-
-
-void
-ThreadPool::stopWorkers()
-{
- for(int i = 0; i < num_workers; i++) {
- pthread_cancel(workers[i]);
- pthread_join(workers[i], NULL);
- }
- delete[] workers;
-}
-
-
-void
-ThreadPool::postWork(WorkDescription *work_unit)
-{
- pthread_mutex_lock(&work_queue_mutex);
- work_queue.push_back(work_unit);
- work_count++;
- pthread_cond_signal(&work_queue_cond_ready);
- pthread_mutex_unlock(&work_queue_mutex);
-}
-
-
-inline
-void
-ThreadPool::queueWork(WaitDesc *wd)
-{
- pthread_mutex_lock(&wait_queue_mutex);
- wait_queue.push_back(wd);
- wait_count++;
- pthread_cond_signal(&wait_queue_cond_ready);
- pthread_mutex_unlock(&wait_queue_mutex);
- write(pd[1], "1", 1);
-}
-
-
-void
-ThreadPool::queueWorkAccept(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, POLLIN));
-}
-
-
-void
-ThreadPool::queueWorkRead(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, POLLIN));
-}
-
-
-void
-ThreadPool::queueWorkWrite(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, POLLOUT));
-}
-
-
-void
-ThreadPool::queueWorkTimeout(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, 0));
-}
-
-
-void
-ThreadPool::queueWorkConnect(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, POLLIN));
-}
-
-
-void
-ThreadPool::setWorkAccept(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, POLLIN, true));
-}
-
-
-void
-ThreadPool::setWorkRead(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, POLLIN, true));
-}
-
-
-void
-ThreadPool::setWorkWrite(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, POLLOUT, true));
-}
-
-
-void
-ThreadPool::setWorkTimeout(WorkDescription *work_unit)
-{
- queueWork(new WaitDesc(work_unit, 0, true));
-}
-
-
-ThreadPool::WorkDescription *
-ThreadPool::getWork()
-{
- WorkDescription *work_unit = NULL;
- struct timespec timeout;
-
- pthread_mutex_lock(&work_queue_mutex);
- if(work_count == 0) {
- timeout.tv_sec = 1;
- timeout.tv_nsec = 0;
-// pthread_cond_timedwait(&work_queue_cond_ready, &work_queue_mutex, &timeout);
- pthread_cond_wait(&work_queue_cond_ready, &work_queue_mutex);
- }
- if(work_count > 0) {
- work_count--;
- work_unit = work_queue.front();
- work_queue.pop_front();
- }
- pthread_mutex_unlock(&work_queue_mutex);
- return work_unit;
-}
-
-void
-ThreadPool::threadCleanup(void *data)
-{
- ThreadPool *pool = ThreadPool::instance();
-
- pthread_mutex_unlock(&(pool->work_queue_mutex));
-}
-
-
-void *
-ThreadPool::threadMain(void *data)
-{
- ThreadPool *pool = ThreadPool::instance();
- WorkDescription *work_unit;
-
- pthread_cleanup_push(ThreadPool::threadCleanup, NULL);
- while(true) {
-
- work_unit = pool->getWork();
- if(work_unit) {
- // something to work on
- work_unit->doWork();
- } else {
- // timed out waiting for work
- }
- }
- pthread_cleanup_pop(1);
-}
-
-
-void
-ThreadPool::removeWaitDesc(std::list<WaitDesc *>::iterator &i)
-{
- std::list<WaitDesc *>::iterator j = i;
-
- // actually this is safe even for the first element
- pthread_mutex_lock(&wait_queue_mutex);
- j--;
- wait_queue.erase(i);
- wait_count--;
- i = j;
- pthread_mutex_unlock(&wait_queue_mutex);
-}
-
-
-void
-ThreadPool::prepareDescriptorArray()
-{
- std::list<WaitDesc *>::iterator theIterator;
- struct pollfd *p;
-
- pthread_mutex_lock(&wait_queue_mutex);
- if(wait_count == 0) {
- pthread_cond_wait(&wait_queue_cond_ready, &wait_queue_mutex);
- }
- if(wait_count == 0) {
- pthread_mutex_unlock(&wait_queue_mutex);
- return;
- }
- if(ufds_size != wait_count + 1) {
- ufds = static_cast<struct pollfd *>(realloc(ufds, (1 + wait_count) * sizeof(struct pollfd)));
- if(ufds == NULL) {
-// throw new Exception();
- }
- ufds_size = wait_count + 1;
- }
- min_timeout.tv_sec = default_timeout;
- min_timeout.tv_usec = 0;
- for(theIterator = wait_queue.begin(), p = ufds + 1;
- theIterator != wait_queue.end();
- theIterator++, p++) {
- WaitDesc *w = *theIterator;
- p->fd = w->get_fd();
- p->events = w->event;
- if(tv_cmp(min_timeout, w->timeout) > 0) {
- min_timeout = w->timeout;
- }
- }
- pthread_mutex_unlock(&wait_queue_mutex);
-}
-
-
-void
-ThreadPool::run()
-{
- f_exit = false;
- while(!f_exit) {
- struct pollfd *p;
- struct timeval before, after;
- int ret;
-
- // may block waiting for new work
- prepareDescriptorArray();
-
- gettimeofday(&before, NULL);
- ret = poll(ufds, ufds_size, 1000*min_timeout.tv_sec + min_timeout.tv_usec/1000);
- gettimeofday(&after, NULL);
- tv_sub(after, before);
-
- if((ret >= 0) || // ready or timeout
- ((ret < 0) && (errno == EINTR))) { // interrupted
- std::list<WaitDesc *>::iterator i;
- WaitDesc *w;
-
- // handle the pipe
- if(ufds->revents & POLLIN) {
- char discard[1];
- read(ufds->fd, discard, 1);
- }
-
- // at least we have to adjust timeouts
- pthread_mutex_lock(&wait_queue_mutex);
- i = wait_queue.begin();
- pthread_mutex_unlock(&wait_queue_mutex);
- // the wait queue mutex is unlocked inside the loop
- // to allow handlers to add queue new
- // WorkDescriptions - these are added at the
- // end of the list so we should be safe
- for(p = ufds + 1; p - ufds < ufds_size; p++) {
- enum WorkDescription::Event event = WorkDescription::NONE;
-
- w = *i;
- // check for consistency
- if(p->fd != w->get_fd()) {
- // mismatch, what shall we do?
- abort();
- }
-
- // subtract the time passed from timeout
- w->adjustTimeout(after);
-
- // see what happened
- if(ret <= 0) {
- // timeout or interrupted
- if(w->timeoutExpired()) {
- event = WorkDescription::TIMEOUT;
- }
- } else {
- // ready or error
- if(p->revents & POLLERR) {
- event = WorkDescription::ERROR;
- } else if(p->revents & w->event) {
- event = WorkDescription::READY;
- } else if(w->timeoutExpired()) {
- event = WorkDescription::TIMEOUT;
- }
- }
- if(event != WorkDescription::NONE) {
- WorkDescription *wd;
- wd = w->wd;
- wd->event = event;
- if(!w->f_permanent) {
- postWork(wd);
- removeWaitDesc(i);
- delete w;
- } else {
- w->wd->doWork();
- // we have to reset the timeout
- w->timeout.tv_sec = default_timeout;
- w->timeout.tv_usec = 0;
- }
- }
- pthread_mutex_lock(&wait_queue_mutex);
- i++;
- pthread_mutex_unlock(&wait_queue_mutex);
- }
- } else {
- // some nasty error
- }
- }
-}
-
+++ /dev/null
-#ifndef _TRANSPORT_H
-#define _TRANSPORT_H
-
-#include "Connection.H"
-
-
-class Transport: public ThreadPool::WorkDescription {
-public:
- class Factory {
- public:
- virtual Transport *newTransport(Connection *conn) const = 0;
- };
-
- Transport(Connection *a_conn)
- : conn(a_conn),
- ThreadPool::WorkDescription(a_conn ? a_conn->getFD() : -1)
- {}
-
- virtual ~Transport()
- { if(conn) delete conn; }
-
-protected:
- Connection *conn;
-
-};
-#endif
+++ /dev/null
-#include "PluginManager.H"
-#include "ThreadPool.H"
-#include "SocketInput.H"
-#include "PlainConnection.H"
-#include "HTTPTransport.H"
-
-const int num_threads = 2;
-const char *sock_path = "/tmp/il_sock";
-
-int main(int argc, char *argv[])
-{
- SocketInput *input;
-
- // initialize plugins
- PluginManager::instance()->initialize();
-
- // create unix socket with plain IO and HTTP transport
- input = new SocketInput(sock_path,
- &PlainConnection::theFactory,
- &HTTPTransport::theFactory);
-
- // start worker threads
- ThreadPool::instance()->startWorkers(num_threads);
-
- // run the main loop
- ThreadPool::instance()->run();
-
- // cleanup & exit
- delete input;
- PluginManager::instance()->cleanup();
-
- return 0;
-}
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "EventManager.H"
-
-class EventManagerTest: public CppUnit::TestFixture {
- CPPUNIT_TEST_SUITE(EventManagerTest);
- CPPUNIT_TEST_SUITE_END();
-public:
-
- void setUp() {
- }
-
- void tearDown() {
- }
-
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( EventManagerTest );
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "PluginManager.H"
-
-class TestPlugin : public PluginManager::Plugin {
-public:
- bool inited, cleaned;
-
- virtual bool initialize() {
- inited = true;
- }
-
- virtual bool cleanup() {
- cleaned = true;
- }
-
- static TestPlugin theTestPlugin;
-
-private:
- TestPlugin() : PluginManager::Plugin("test plugin"),
- inited(false),
- cleaned(false)
- {}
-
-
-
-};
-
-
-class PluginManagerTest : public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE(PluginManagerTest);
- CPPUNIT_TEST(testInit);
- CPPUNIT_TEST(testClean);
- CPPUNIT_TEST_SUITE_END();
-
-public:
- void setUp() {
- }
-
- void tearDown() {
- }
-
- void testInit() {
- PluginManager::instance()->initialize();
- CPPUNIT_ASSERT(TestPlugin::theTestPlugin.inited);
- }
-
- void testClean() {
- PluginManager::instance()->cleanup();
- CPPUNIT_ASSERT(TestPlugin::theTestPlugin.cleaned);
- }
-};
-
-
-TestPlugin TestPlugin::theTestPlugin;
-
-CPPUNIT_TEST_SUITE_REGISTRATION( PluginManagerTest );
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "Singleton.H"
-
-class one : public Singleton<one> {
- friend class Singleton<one>;
-};
-
-class two : public Singleton<two> {
- friend class Singleton<two>;
-};
-
-class SingletonTest: public CppUnit::TestFixture {
- CPPUNIT_TEST_SUITE(SingletonTest);
- CPPUNIT_TEST(getInstance);
- CPPUNIT_TEST(pair);
- CPPUNIT_TEST(noCreate);
- CPPUNIT_TEST_SUITE_END();
-public:
-
- void setUp() {
- }
-
- void tearDown() {
- }
-
- void getInstance() {
- one *p;
- one *q;
-
- p = one::instance();
- q = one::instance();
- CPPUNIT_ASSERT(p != NULL);
- CPPUNIT_ASSERT(q != NULL);
- CPPUNIT_ASSERT(p == q);
- }
-
- void pair() {
- one *p;
- two *q;
-
- p = one::instance();
- q = two::instance();
- CPPUNIT_ASSERT(p != NULL);
- CPPUNIT_ASSERT(q != NULL);
- CPPUNIT_ASSERT((void*)p != (void*)q);
- }
-
- void noCreate() {
- one *p = new one;
-
- }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( SingletonTest );
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-
-#include <iostream>
-
-#include "ThreadPool.H"
-
-class TestWork : public ThreadPool::WorkDescription {
-public:
- int done;
-
- TestWork(int fd) : ThreadPool::WorkDescription(fd), done(0) {};
-
- virtual void onReady() {
- done++;
- }
-
-};
-
-
-class TestConsumer : public ThreadPool::WorkDescription {
-public:
- char buf[2];
-
- TestConsumer(int fd) : ThreadPool::WorkDescription(fd) {};
-
- virtual void onReady() {
- int r;
-
- r = read(fd, buf, 1);
- buf[1] = 0;
- ThreadPool::instance()->exit();
- }
-
- virtual void onTimeout() {
- }
-
-};
-
-
-class TestProducer : public ThreadPool::WorkDescription {
-public:
- TestProducer(int fd) : ThreadPool::WorkDescription(fd) {};
-
- virtual void onReady() {
- write(fd, "a", 1);
- }
-
- virtual void onTimeout() {
- }
-
-};
-
-
-class TestSocketRead: public ThreadPool::WorkDescription {
-public:
- char buffer[10];
-
- TestSocketRead(int fd) : ThreadPool::WorkDescription(fd) {
- }
-
- virtual void onReady() {
-
- int len = recv(fd, buffer, sizeof(buffer), MSG_NOSIGNAL);
- ThreadPool::instance()->exit();
- }
-
- virtual void onError() {
- }
-};
-
-
-class TestSocketWrite: public ThreadPool::WorkDescription {
-public:
- static char buffer[];
-
- TestSocketWrite(const char *name)
- : ThreadPool::WorkDescription(0) {
- struct sockaddr_un saddr;
- int ret;
- fd = socket(PF_UNIX, SOCK_STREAM, 0);
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, name);
- if((ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr))) < 0) {
- }
- }
-
- virtual void onReady() {
- int ret;
-
- ret = send(fd, buffer, strlen(buffer)+1, MSG_NOSIGNAL);
- close(fd);
- }
-
-};
-
-char TestSocketWrite::buffer[] = "ahoj";
-
-class TestSocketAccept : public ThreadPool::WorkDescription {
-public:
- TestSocketRead *reader;
-
- TestSocketAccept(const char *name)
- : ThreadPool::WorkDescription(0) {
- struct sockaddr_un saddr;
-
- fd = socket(PF_UNIX, SOCK_STREAM, 0);
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, name);
- bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
- listen(fd, 1);
- }
-
- virtual void onReady() {
- int nfd;
-
- nfd = accept(fd, NULL, NULL);
- if(nfd < 0) {
- } else {
- ThreadPool *pool = ThreadPool::instance();
-
- reader = new TestSocketRead(nfd);
- pool->queueWorkRead(reader);
- }
- }
-};
-
-
-class ThreadPoolTest: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE( ThreadPoolTest );
-// CPPUNIT_TEST( testWorkQueue );
- CPPUNIT_TEST( testPoll );
- CPPUNIT_TEST( testAccept );
- CPPUNIT_TEST_SUITE_END();
-
-public:
- void setUp() {
- pool = ThreadPool::instance();
- unlink("/tmp/smazat.sock");
- pool->startWorkers(2);
- }
-
- void tearDown() {
- pool->stopWorkers();
- }
-
- void testWorkQueue() {
- TestWork *work_unit = new TestWork(0);
- pool->postWork(work_unit);
- }
-
- void testPoll() {
- int fd[2];
- TestProducer *p = new TestProducer(0);
- TestConsumer *c = new TestConsumer(0);
-
- pipe(fd);
- c->fd = fd[0];
- p->fd = fd[1];
- pool->queueWorkRead(c);
- pool->queueWorkWrite(p);
- pool->run();
- CPPUNIT_ASSERT(c->buf[0] == 'a');
- CPPUNIT_ASSERT(c->buf[1] == 0);
- }
-
- void testAccept() {
- TestSocketAccept *consumer = new TestSocketAccept("/tmp/smazat.sock");
- TestSocketWrite *producer;
-
- pool->queueWorkAccept(consumer);
- producer = new TestSocketWrite("/tmp/smazat.sock");
- ThreadPool::instance()->queueWorkWrite(producer);
- pool->run();
- CPPUNIT_ASSERT(consumer->reader != NULL);
- CPPUNIT_ASSERT(strcmp(consumer->reader->buffer, TestSocketWrite::buffer) == 0);
- }
-
-private:
- ThreadPool *pool;
-};
-
-
-CPPUNIT_TEST_SUITE_REGISTRATION( ThreadPoolTest );
+++ /dev/null
-#include <assert.h>
-#include <fstream>
-
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/CompilerOutputter.h>
-//#include <cppunit/XmlOutputter.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-
-int main (int argc,const char *argv[])
-{
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-
-// assert(argc == 2);
-// std::ofstream xml(argv[1]);
-
- CppUnit::TestResult controller;
- CppUnit::TestResultCollector result;
- controller.addListener( &result );
-
- CppUnit::TestRunner runner;
- runner.addTest(suite);
- runner.run(controller);
-
-// CppUnit::XmlOutputter xout( &result, xml );
- CppUnit::CompilerOutputter tout( &result, std::cout);
-// xout.write();
- tout.write();
-
- return result.wasSuccessful() ? 0 : 1 ;
-}
+++ /dev/null
-#ident "$Header$"
-
-/*
- * - general queue handling routines (insert, get)
- */
-
-#include <netdb.h>
-#include <sys/socket.h>
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "glite/wmsutils/jobid/cjobid.h"
-
-#include "interlogd.h"
-
-struct event_queue_msg {
- struct server_msg *msg;
- struct event_queue_msg *prev;
-};
-
-struct event_queue *
-event_queue_create(char *server_name)
-{
- struct event_queue *eq;
- char *p;
-
- p = strchr(server_name, ':');
-
- if(p)
- *p++ = 0;
-
- if((eq = malloc(sizeof(*eq))) == NULL) {
- set_error(IL_NOMEM, ENOMEM, "event_queue_create: error allocating event queue");
- return(NULL);
- }
-
- memset(eq, 0, sizeof(*eq));
-
- eq->dest_name = strdup(server_name);
-
- if(p)
- *(p-1) = ':';
-
-#if defined(IL_NOTIFICATIONS)
- eq->dest_port = atoi(p);
-#else
- eq->dest_port = p ? atoi(p)+1 : GLITE_WMSC_JOBID_DEFAULT_PORT+1;
-#endif
- /* create all necessary locks */
- if(pthread_rwlock_init(&eq->update_lock, NULL)) {
- set_error(IL_SYS, errno, "event_queue_create: error creating update lock");
- free(eq);
- return(NULL);
- }
- if(pthread_mutex_init(&eq->cond_lock, NULL)) {
- set_error(IL_SYS, errno, "event_queue_create: error creating cond mutex");
- free(eq);
- return(NULL);
- }
- if(pthread_cond_init(&eq->ready_cond, NULL)) {
- set_error(IL_SYS, errno, "event_queue_create: error creating cond variable");
- free(eq);
- return(NULL);
- }
-
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
- if(pthread_cond_init(&eq->flush_cond, NULL)) {
- set_error(IL_SYS, errno, "event_queue_create: error creating cond variable");
- free(eq);
- return(NULL);
- }
-#endif
-
- return(eq);
-}
-
-
-int
-event_queue_free(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(!event_queue_empty(eq))
- return(-1);
-
- if(eq->thread_id)
- pthread_cancel(eq->thread_id);
-
-
- pthread_rwlock_destroy(&eq->update_lock);
- pthread_mutex_destroy(&eq->cond_lock);
- pthread_cond_destroy(&eq->ready_cond);
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
- pthread_cond_destroy(&eq->flush_cond);
-#endif
- free(eq);
-
- return(0);
-}
-
-
-int
-event_queue_empty(struct event_queue *eq)
-{
- int ret;
-
- assert(eq != NULL);
-
- event_queue_lock_ro(eq);
- ret = (eq->head == NULL);
- event_queue_unlock(eq);
-
- return(ret);
-}
-
-
-int
-event_queue_insert(struct event_queue *eq, struct server_msg *msg)
-{
- struct event_queue_msg *el;
-#if defined(INTERLOGD_EMS)
- struct event_queue_msg *tail;
-#endif
-
- assert(eq != NULL);
-
- if((el = malloc(sizeof(*el))) == NULL)
- return(set_error(IL_NOMEM, ENOMEM, "event_queue_insert: not enough room for queue element"));
-
- el->msg = server_msg_copy(msg);
- if(el->msg == NULL) {
- free(el);
- return(-1);
- };
-
- /* this is critical section */
- event_queue_lock(eq);
-#if defined(INTERLOGD_EMS)
- if(server_msg_is_priority(msg)) {
- /* priority messages go first */
- tail = eq->tail_ems;
- if(tail) {
- el->prev = tail->prev;
- tail->prev = el;
- if (tail == eq->tail)
- eq->tail = el;
- } else {
- el->prev = eq->head;
- eq->head = el;
- if(eq->tail == NULL)
- eq->tail = el;
- }
- eq->tail_ems = el;
- } else
-#endif
- {
- /* normal messages */
- if(eq->tail)
- eq->tail->prev = el;
- else
- eq->head = el;
- eq->tail = el;
- el->prev = NULL;
- }
-#if defined(INTERLOGD_EMS)
- /* if we are inserting message between mark_prev and mark_this,
- we have to adjust mark_prev accordingly */
- if(eq->mark_this && (el->prev == eq->mark_this))
- eq->mark_prev = el;
-#endif
-
- if(++eq->cur_len > eq->max_len)
- eq->max_len = eq->cur_len;
-
- event_queue_unlock(eq);
- /* end of critical section */
-
- return(0);
-}
-
-
-int
-event_queue_get(struct event_queue *eq, struct server_msg **msg)
-{
- struct event_queue_msg *el;
-
- assert(eq != NULL);
- assert(msg != NULL);
-
- event_queue_lock(eq);
- el = eq->head;
-#if defined(INTERLOGD_EMS)
- /* this message is marked for removal, it is first on the queue */
- eq->mark_this = el;
- eq->mark_prev = NULL;
-#endif
- event_queue_unlock(eq);
-
- if(el == NULL)
- return(-1);
-
- *msg = el->msg;
-
- return(0);
-}
-
-
-int
-event_queue_remove(struct event_queue *eq)
-{
- struct event_queue_msg *el;
-#if defined(INTERLOGD_EMS)
- struct event_queue_msg *prev;
-#endif
-
- assert(eq != NULL);
-
- /* this is critical section */
- event_queue_lock(eq);
-#if defined(INTERLOGD_EMS)
- el = eq->mark_this;
- prev = eq->mark_prev;
-
- if(el == NULL) {
- event_queue_unlock(eq);
- return(-1);
- }
-
- if(prev == NULL) {
- /* removing from head of the queue */
- eq->head = el->prev;
- } else {
- /* removing from middle of the queue */
- prev->prev = el->prev;
- }
- if(el == eq->tail) {
- /* we are removing the last message */
- eq->tail = prev;
- }
- if(el == eq->tail_ems) {
- /* we are removing last priority message */
- eq->tail_ems = prev;
- }
-
- eq->mark_this = NULL;
- eq->mark_prev = NULL;
-#else
- el = eq->head;
- if(el == NULL) {
- event_queue_unlock(eq);
- return(-1);
- }
- eq->head = el->prev;
- if(el == eq->tail) {
- eq->tail = NULL;
- }
-#endif
- if(--eq->cur_len == 0)
- eq->times_empty++;
-
- event_queue_unlock(eq);
- /* end of critical section */
-
- server_msg_free(el->msg);
- free(el);
-
- return(0);
-}
-
-#if defined(IL_NOTIFICATIONS)
-
-int
-event_queue_move_events(struct event_queue *eq_s, struct event_queue *eq_d, char *notif_id)
-{
- struct event_queue_msg *p, **source_prev, **dest_tail;
-
- assert(eq_s != NULL);
- assert(notif_id != NULL);
-
- event_queue_lock(eq_s);
- if(eq_d) {
- event_queue_lock(eq_d);
- /* dest tail is set to point to the last (NULL) pointer in the list */
- dest_tail = (eq_d->head == NULL) ? &(eq_d->head) : &(eq_d->tail->prev);
- }
- source_prev = &(eq_s->head);
- p = *source_prev;
- eq_s->tail = NULL;
- while(p) {
- if(strcmp(p->msg->job_id_s, notif_id) == 0) {
- il_log(LOG_DEBUG, " moving event at offset %d from %s:%d to %s:%d\n",
- p->msg->offset, eq_s->dest_name,eq_s->dest_port, eq_d ? eq_d->dest_name : "trash",eq_d ? eq_d->dest_port : -1);
- il_log(LOG_DEBUG, " current: %x, next: %x\n", p, p->prev);
- /* remove the message from the source list */
- *source_prev = p->prev;
- if(eq_d) {
- /* append the message at the end of destination list */
- p->prev = NULL;
- *dest_tail = p;
- dest_tail = &(p->prev);
- eq_d->tail = p;
- } else {
- /* free the message */
- server_msg_free(p->msg);
- free(p);
- }
- } else {
- /* message stays */
- source_prev = &(p->prev);
- eq_s->tail = p;
- }
- p = *source_prev;
- }
- if(eq_d) event_queue_unlock(eq_d);
- event_queue_unlock(eq_s);
- return(0);
-}
-
-#endif
+++ /dev/null
-#ident "$Header$"
-
-#include <assert.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-
-#include "glite/lb/consumer.h"
-#include "glite/lb/events_parse.h"
-
-#include "interlogd.h"
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-static char *file_prefix = NULL;
-
-
-struct event_store_list {
- struct event_store *es;
- struct event_store_list *next;
-};
-
-
-static struct event_store_list *store_list;
-static pthread_rwlock_t store_list_lock = PTHREAD_RWLOCK_INITIALIZER;
-
-
-/* ----------------
- * helper functions
- * ----------------
- */
-static
-char *
-jobid2eventfile(IL_EVENT_ID_T job_id)
-{
- char *buffer;
- char *hash;
-
- if(job_id) {
- hash = IL_EVENT_GET_UNIQUE(job_id);
- asprintf(&buffer, "%s.%s", file_prefix, hash);
- free(hash);
- } else
- asprintf(&buffer, "%s.default", file_prefix);
-
- return(buffer);
-}
-
-
-static
-char *
-jobid2controlfile(IL_EVENT_ID_T job_id)
-{
- char buffer[256];
- char *hash;
-
- if(job_id) {
- hash = IL_EVENT_GET_UNIQUE(job_id);
- snprintf(buffer, 256, "%s.%s.ctl", file_prefix, hash);
- free(hash);
- } else
- snprintf(buffer, 256, "%s.default.ctl", file_prefix);
-
- return(strdup(buffer));
-}
-
-
-static
-char *
-read_event_string(FILE *file)
-{
- char *buffer, *p, *n;
- int len, c;
-
- buffer=malloc(1024);
- if(buffer == NULL) {
- set_error(IL_NOMEM, ENOMEM, "read_event_string: no room for event");
- return(NULL);
- }
- p = buffer;
- len = 1024;
-
- while((c=fgetc(file)) != EOF) {
-
- /* we have to have free room for one byte */
- /* if(len - (p - buffer) < 1) */
- if(p - buffer >= len) {
- n = realloc(buffer, len + 8192);
- if(n == NULL) {
- free(buffer);
- set_error(IL_NOMEM, ENOMEM, "read_event_string: no room for event");
- return(NULL);
- }
- p = p - buffer + n;
- buffer = n;
- len += 8192;
- }
-
- if(c == EVENT_SEPARATOR) {
- *p++ = 0;
- break;
- } else
- *p++ = (char) c;
- }
-
- if(c != EVENT_SEPARATOR) {
- free(buffer);
- return(NULL);
- }
-
- return(buffer);
-}
-
-
-
-/* ------------------------------
- * event_store 'member' functions
- * ------------------------------
- */
-static
-int
-event_store_free(struct event_store *es)
-{
- assert(es != NULL);
-
- if(es->job_id_s) free(es->job_id_s);
- if(es->event_file_name) free(es->event_file_name);
- if(es->control_file_name) free(es->control_file_name);
- pthread_rwlock_destroy(&es->use_lock);
- pthread_rwlock_destroy(&es->update_lock);
- free(es);
-
- return(0);
-}
-
-
-static
-struct event_store *
-event_store_create(char *job_id_s)
-{
- struct event_store *es;
- IL_EVENT_ID_T job_id;
-
- es = malloc(sizeof(*es));
- if(es == NULL) {
- set_error(IL_NOMEM, ENOMEM, "event_store_create: error allocating room for structure");
- return(NULL);
- }
-
- memset(es, 0, sizeof(*es));
-
- il_log(LOG_DEBUG, " creating event store for id %s\n", job_id_s);
-
- job_id = NULL;
- if(strcmp(job_id_s, "default") && IL_EVENT_ID_PARSE(job_id_s, &job_id)) {
- set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "event_store_create: error parsing id");
- free(es);
- return(NULL);
- }
-
- es->job_id_s = strdup(job_id_s);
- es->event_file_name = jobid2eventfile(job_id);
- es->control_file_name = jobid2controlfile(job_id);
- IL_EVENT_ID_FREE(job_id);
-
- if(pthread_rwlock_init(&es->update_lock, NULL))
- abort();
- if(pthread_rwlock_init(&es->use_lock, NULL))
- abort();
-
- return(es);
-}
-
-
-static
-int
-event_store_lock_ro(struct event_store *es)
-{
- assert(es != NULL);
-
- if(pthread_rwlock_rdlock(&es->update_lock))
- abort();
-
- return(0);
-}
-
-
-static
-int
-event_store_lock(struct event_store *es)
-{
- assert(es != NULL);
-
- if(pthread_rwlock_wrlock(&es->update_lock))
- abort();
-
- return(0);
-}
-
-
-static
-int
-event_store_unlock(struct event_store *es)
-{
- assert(es != NULL);
-
- if(pthread_rwlock_unlock(&es->update_lock))
- abort();
- return(0);
-}
-
-
-static
-int
-event_store_read_ctl(struct event_store *es)
-{
- FILE *ctl_file;
-
- assert(es != NULL);
-
- event_store_lock(es);
- if((ctl_file = fopen(es->control_file_name, "r")) == NULL) {
- /* no control file, new event file */
- es->last_committed_ls = 0;
- es->last_committed_bs = 0;
- } else {
- /* read last seen and last committed counts */
- fscanf(ctl_file, "%*s\n%ld\n%ld\n",
- &es->last_committed_ls,
- &es->last_committed_bs);
- fclose(ctl_file);
- }
- event_store_unlock(es);
-
- return(0);
-}
-
-
-static
-int
-event_store_write_ctl(struct event_store *es)
-{
- FILE *ctl;
-
- assert(es != NULL);
-
- ctl = fopen(es->control_file_name, "w");
- if(ctl == NULL) {
- set_error(IL_SYS, errno, "event_store_write_ctl: error opening control file");
- return(-1);
- }
-
- if(fprintf(ctl, "%s\n%ld\n%ld\n",
- es->job_id_s,
- es->last_committed_ls,
- es->last_committed_bs) < 0) {
- set_error(IL_SYS, errno, "event_store_write_ctl: error writing control record");
- return(-1);
- }
-
- if(fclose(ctl) < 0) {
- set_error(IL_SYS, errno, "event_store_write_ctl: error closing control file");
- return(-1);
- }
-
- return(0);
-}
-
-
-/*
- * event_store_recover()
- * - recover after restart or catch up when events missing in IPC
- * - if offset > 0, read everything behind it
- * - if offset == 0, read everything behind min(last_committed_bs, last_committed_es)
- */
-int
-event_store_recover(struct event_store *es)
-{
- struct event_queue *eq_l = NULL, *eq_b, *eq_b_new;
- struct server_msg *msg;
- char *event_s;
- int fd, ret;
- long last;
- FILE *ef;
- struct flock efl;
- char err_msg[128];
-
- assert(es != NULL);
-
-#if defined(IL_NOTIFICATIONS)
- eq_b = queue_list_get(es->dest);
-#else
- /* find bookkepping server queue */
- eq_b = queue_list_get(es->job_id_s);
-#endif
- if(eq_b == NULL)
- return(-1);
-
-#if !defined(IL_NOTIFICATIONS)
- /* get log server queue */
- eq_l = queue_list_get(NULL);
-#endif
-
- event_store_lock(es);
-
- il_log(LOG_DEBUG, " reading events from %s\n", es->event_file_name);
-
- /* open event file */
- ef = fopen(es->event_file_name, "r");
- if(ef == NULL) {
- snprintf(err_msg, sizeof(err_msg),
- "event_store_recover: error opening event file %s",
- es->event_file_name);
- set_error(IL_SYS, errno, err_msg);
- event_store_unlock(es);
- return(-1);
- }
-
- /* lock the file for reading (we should not read while dglogd is writing) */
- fd = fileno(ef);
- efl.l_type = F_RDLCK;
- efl.l_whence = SEEK_SET;
- efl.l_start = 0;
- efl.l_len = 0;
- if(fcntl(fd, F_SETLKW, &efl) < 0) {
- snprintf(err_msg, sizeof(err_msg),
- "event_store_recover: error locking event file %s",
- es->event_file_name);
- set_error(IL_SYS, errno, err_msg);
- event_store_unlock(es);
- fclose(ef);
- return(-1);
- }
-
- while(1) { /* try, try, try */
-
- /* get the position in file to be sought */
- if(es->offset)
- last = es->offset;
- else {
-#if !defined(IL_NOTIFICATIONS)
- if(eq_b == eq_l)
- last = es->last_committed_ls;
- else
-#endif
- /* last = min(ls, bs) */
- /* I took the liberty to optimize this,
- since LS is not used. */
- /* last = (es->last_committed_bs <
- es->last_committed_ls) ? es->last_committed_bs :
- es->last_committed_ls; */
- last = es->last_committed_bs;
- }
-
- il_log(LOG_DEBUG, " setting starting file position to %ld\n", last);
- il_log(LOG_DEBUG, " bytes sent to logging server: %d\n", es->last_committed_ls);
- il_log(LOG_DEBUG, " bytes sent to bookkeeping server: %d\n", es->last_committed_bs);
-
- if(last > 0) {
- int c;
-
- /* skip all committed or already enqueued events */
- /* be careful - check, if the offset really points to the
- beginning of event string */
- if(fseek(ef, last-1, SEEK_SET) < 0) {
- set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
- event_store_unlock(es);
- fclose(ef);
- return(-1);
- }
- /* the last enqueued event MUST end with EVENT_SEPARATOR,
- even if the offset points at EOF */
- if((c=fgetc(ef)) != EVENT_SEPARATOR) {
- /* Houston, we have got a problem */
- il_log(LOG_WARNING,
- " file position %ld does not point at the beginning of event string, backing off!\n",
- last);
- /* now, where were we? */
- if(es->offset) {
- /* next try will be with
- last_commited_bs */
- es->offset = 0;
- } else {
- /* this is really weird... back off completely */
- es->last_committed_ls = es->last_committed_bs = 0;
- }
- } else {
- /* OK, break out of the loop */
- break;
- }
- } else {
- /* this breaks out of the loop, we are starting at
- * the beginning of file
- */
- if(fseek(ef, 0, SEEK_SET) < 0) {
- set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
- event_store_unlock(es);
- fclose(ef);
- return(-1);
- }
- break;
- }
- }
-
- /* enqueue all remaining events */
- ret = 1;
- msg = NULL;
- while((event_s=read_event_string(ef)) != NULL) {
-
- /* last holds the starting position of event_s in file */
- il_log(LOG_DEBUG, " reading event at %ld\n", last);
-
- /* break from now on means there was some error */
- ret = -1;
-
- /* create message for server */
- {
- il_octet_string_t e;
-
- e.data = event_s;
- e.len = strlen(event_s);
- msg = server_msg_create(&e, last);
- free(event_s);
- }
- if(msg == NULL) {
- il_log(LOG_ALERT, " event file corrupted! Please move it to quarantine (ie. somewhere else) and restart interlogger.\n");
- break;
- }
- msg->es = es;
-
- /* first enqueue to the LS */
- if(!bs_only && (last >= es->last_committed_ls)) {
-
- il_log(LOG_DEBUG, " queueing event at %ld to logging server\n", last);
-
-#if !defined(IL_NOTIFICATIONS)
- if(enqueue_msg(eq_l, msg) < 0)
- break;
-#endif
- }
-
-#ifdef IL_NOTIFICATIONS
- eq_b_new = queue_list_get(msg->dest);
- if (eq_b_new != eq_b) {
- free(es->dest);
- es->dest = strdup(msg->dest);
- eq_b = eq_b_new;
- }
-#endif
-
- /* now enqueue to the BS, if neccessary */
- if((eq_b != eq_l) &&
- (last >= es->last_committed_bs)) {
-
- il_log(LOG_DEBUG, " queueing event at %ld to bookkeeping server\n", last);
-
- if(enqueue_msg(eq_b, msg) < 0)
- break;
- }
- server_msg_free(msg);
- msg = NULL;
-
- /* now last is also the offset behind the last successfully queued event */
- last = ftell(ef);
-
- /* ret == 0 means EOF or incomplete event found */
- ret = 0;
-
- } /* while */
-
- /* due to this little assignment we had to lock the event_store for writing */
- es->offset = last;
- il_log(LOG_DEBUG, " event store offset set to %ld\n", last);
-
- if(msg)
- server_msg_free(msg);
-
- fclose(ef);
- il_log(LOG_DEBUG, " finished reading events with %d\n", ret);
-
- event_store_unlock(es);
- return(ret);
-}
-
-
-/*
- * event_store_sync()
- * - check the position of event and fill holes from file
- * - return 1 if the event is new,
- * 0 if it was seen before,
- * -1 if there was an error
- */
-int
-event_store_sync(struct event_store *es, long offset)
-{
- int ret;
-
- assert(es != NULL);
-
- event_store_lock_ro(es);
- if(es->offset == offset)
- /* we are up to date */
- ret = 1;
- else if(es->offset > offset)
- /* we have already seen this event */
- ret = 0;
- else {
- /* es->offset < offset, i.e. we have missed some events */
- event_store_unlock(es);
- ret = event_store_recover(es);
- /* XXX possible room for intervention by another thread - is there
- * any other thread messing with us?
- * 1) After recover() es->offset is set at the end of file.
- * 2) es->offset is set only by recover() and next().
- * 3) Additional recover can not do much harm.
- * 4) And next() is only called by the same thread as sync().
- * 5) use_lock is in place, so no cleanup possible
- * => no one is messing with us right now */
- event_store_lock_ro(es);
- if(ret < 0)
- ret = -1;
- else
- if(es->offset <= offset) {
- /* Apparently there is something wrong - we are receiving an event
- * which is beyond the end of file. Someone must have removed the file
- * when we were not looking. The question is - what should we do with the event?
- * We have to send it, as this is the only one occasion when we see it.
- * However, we must not allow the es->offset to be set using this event,
- * as it would point after the end of file. Sort this out in event_store_next().
- */
- ret = 1;
- } else if(es->offset > offset) {
- /* we have seen at least this event */
- ret = 0;
- }
- }
- event_store_unlock(es);
- return(ret);
-}
-
-
-int
-event_store_next(struct event_store *es, long offset, int len)
-{
- assert(es != NULL);
-
- event_store_lock(es);
- /* Whoa, be careful now. The es->offset points right after the last enqueued event,
- * but it may not be the offset of the event WE have just enqueued, because:!
- * 1) someone could have removed the event file behind our back
- * 2) the file could have been recover()ed and more events read
- * In either case the offset should not be moved.
- */
- if(es->offset == offset) {
- es->offset += len;
- }
- event_store_unlock(es);
-
- return(0);
-}
-
-
-/*
- * event_store_commit()
- *
- */
-int
-event_store_commit(struct event_store *es, int len, int ls)
-{
- assert(es != NULL);
-
- event_store_lock(es);
-
- if(ls)
- es->last_committed_ls += len;
- else {
- es->last_committed_bs += len;
- if (bs_only) es->last_committed_ls += len;
- }
-
- if(event_store_write_ctl(es) < 0) {
- event_store_unlock(es);
- return(-1);
- }
-
- event_store_unlock(es);
-
-
- return(0);
-}
-
-
-/*
- * event_store_clean()
- * - remove the event files (event and ctl), if they are not needed anymore
- * - returns 0 if event_store is in use, 1 if it was removed and -1 on error
- *
- * Q: How do we know that we can safely remove the files?
- * A: When all events from file have been committed both by LS and BS.
- */
-static
-int
-event_store_clean(struct event_store *es)
-{
- long last;
- int fd;
- FILE *ef;
- struct flock efl;
-
- assert(es != NULL);
-
- /* prevent sender threads from updating */
- event_store_lock(es);
-
- il_log(LOG_DEBUG, " trying to cleanup event store %s\n", es->job_id_s);
- il_log(LOG_DEBUG, " bytes sent to logging server: %d\n", es->last_committed_ls);
- il_log(LOG_DEBUG, " bytes sent to bookkeeping server: %d\n", es->last_committed_bs);
-
- /* preliminary check to avoid opening event file */
- /* if the positions differ, some events still have to be sent */
- if(es->last_committed_ls != es->last_committed_bs) {
- event_store_unlock(es);
- il_log(LOG_DEBUG, " not all events sent, cleanup aborted\n");
- return(0);
- }
-
- /* the file can only be removed when all the events were succesfully sent
- (ie. committed both by LS and BS */
- /* That also implies that the event queues are 'empty' at the moment. */
- ef = fopen(es->event_file_name, "r+");
- if(ef == NULL) {
- /* if we can not open the event store, it is an error and the struct should be removed */
- /* XXX - is it true? */
- event_store_unlock(es);
- il_log(LOG_ERR, " event_store_clean: error opening event file: %s\n", strerror(errno));
- return(1);
- }
-
- fd = fileno(ef);
-
- /* prevent local-logger from writing into event file */
- efl.l_type = F_WRLCK;
- efl.l_whence = SEEK_SET;
- efl.l_start = 0;
- efl.l_len = 0;
- if(fcntl(fd, F_SETLK, &efl) < 0) {
- il_log(LOG_DEBUG, " could not lock event file, cleanup aborted\n");
- fclose(ef);
- event_store_unlock(es);
- if(errno != EACCES &&
- errno != EAGAIN) {
- set_error(IL_SYS, errno, "event_store_clean: error locking event file");
- return(-1);
- }
- return(0);
- }
-
- /* now the file should not contain partially written event, so it is safe
- to get offset behind last event by seeking the end of file */
- if(fseek(ef, 0, SEEK_END) < 0) {
- set_error(IL_SYS, errno, "event_store_clean: error seeking the end of file");
- event_store_unlock(es);
- fclose(ef);
- return(-1);
- }
-
- last = ftell(ef);
- il_log(LOG_DEBUG, " total bytes in file: %d\n", last);
-
- if(es->last_committed_ls < last) {
- fclose(ef);
- event_store_unlock(es);
- il_log(LOG_DEBUG, " events still waiting in queue, cleanup aborted\n");
- return(0);
- } else if( es->last_committed_ls > last) {
- il_log(LOG_WARNING, " warning: event file seems to shrink!\n");
- }
-
- /* now we are sure that all events were sent and the event queues are empty */
- il_log(LOG_INFO, " removing event file %s\n", es->event_file_name);
-
- /* remove the event file */
- unlink(es->event_file_name);
- unlink(es->control_file_name);
-
- /* clear the counters */
- es->last_committed_ls = 0;
- es->last_committed_bs = 0;
- es->offset = 0;
-
- /* unlock the event_store even if it is going to be removed */
- event_store_unlock(es);
-
- /* close the event file (that unlocks it as well) */
- fclose(ef);
-
- /* indicate that it is safe to remove this event_store */
- return(1);
-}
-
-
-
-/* --------------------------------
- * event store management functions
- * --------------------------------
- */
-struct event_store *
-event_store_find(char *job_id_s)
-{
- struct event_store_list *q, *p;
- struct event_store *es;
-
- if(pthread_rwlock_wrlock(&store_list_lock)) {
- abort();
- }
-
- es = NULL;
-
- q = NULL;
- p = store_list;
-
- while(p) {
- if(strcmp(p->es->job_id_s, job_id_s) == 0) {
- es = p->es;
- if(pthread_rwlock_rdlock(&es->use_lock))
- abort();
- if(pthread_rwlock_unlock(&store_list_lock))
- abort();
- return(es);
- }
-
- q = p;
- p = p->next;
- }
-
- es = event_store_create(job_id_s);
- if(es == NULL) {
- if(pthread_rwlock_unlock(&store_list_lock))
- abort();
- return(NULL);
- }
-
- p = malloc(sizeof(*p));
- if(p == NULL) {
- set_error(IL_NOMEM, ENOMEM, "event_store_find: no room for new event store");
- if(pthread_rwlock_unlock(&store_list_lock))
- abort();
- return(NULL);
- }
-
- p->next = store_list;
- store_list = p;
-
- p->es = es;
-
- if(pthread_rwlock_rdlock(&es->use_lock))
- abort();
-
- if(pthread_rwlock_unlock(&store_list_lock))
- abort();
-
- return(es);
-}
-
-
-int
-event_store_release(struct event_store *es)
-{
- assert(es != NULL);
-
- if(pthread_rwlock_unlock(&es->use_lock))
- abort();
- il_log(LOG_DEBUG, " released lock on %s\n", es->job_id_s);
- return(0);
-}
-
-
-static
-int
-event_store_from_file(char *filename)
-{
- struct event_store *es;
- FILE *event_file;
- char *event_s, *job_id_s = NULL;
- int ret;
-#if defined(IL_NOTIFICATIONS)
- edg_wll_Event *notif_event;
- edg_wll_Context context;
- char *dest_name = NULL;
-
- edg_wll_InitContext(&context);
-#endif
-
- il_log(LOG_INFO, " attaching to event file: %s\n", filename);
-
- event_file = fopen(filename, "r");
- if(event_file == NULL) {
- set_error(IL_SYS, errno, "event_store_from_file: error opening event file");
- return(-1);
- }
- event_s = read_event_string(event_file);
- fclose(event_file);
- if(event_s == NULL)
- return(0);
-
-#if defined(IL_NOTIFICATIONS)
- if((ret=edg_wll_ParseNotifEvent(context, event_s, ¬if_event))) {
- set_error(IL_LBAPI, ret, "event_store_from_file: could not parse event");
- ret = -1;
- goto out;
- }
- if(notif_event->notification.notifId == NULL) {
- set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM,
- "event_store_from_file: parse error - no notif id");
- ret = -1;
- goto out;
- }
- if((job_id_s = edg_wll_NotifIdUnparse(notif_event->notification.notifId)) == NULL) {
- set_error(IL_SYS, ENOMEM, "event_store_from_file: could not copy id");
- ret = -1;
- goto out;
- }
- if(notif_event->notification.dest_host &&
- (strlen(notif_event->notification.dest_host) > 0)) {
- asprintf(&dest_name, "%s:%d", notif_event->notification.dest_host, notif_event->notification.dest_port);
- }
-
-#else
- job_id_s = edg_wll_GetJobId(event_s);
-#endif
- il_log(LOG_DEBUG, " event id: '%s'\n", job_id_s);
- if(job_id_s == NULL) {
- il_log(LOG_NOTICE, " skipping file, could not parse event\n");
- ret = 0;
- goto out;
- }
-
- es=event_store_find(job_id_s);
-
- if(es == NULL) {
- ret = -1;
- goto out;
- }
-
-#if defined(IL_NOTIFICATIONS)
- es->dest = dest_name;
-#endif
-
- if((es->last_committed_ls == 0) &&
- (es->last_committed_bs == 0) &&
- (es->offset == 0)) {
- ret = event_store_read_ctl(es);
- } else
- ret = 0;
-
- event_store_release(es);
-
-out:
-#if defined(IL_NOTIFICATIONS)
- if(notif_event) {
- edg_wll_FreeEvent(notif_event);
- free(notif_event);
- }
-#endif
- if(event_s) free(event_s);
- if(job_id_s) free(job_id_s);
- return(ret);
-}
-
-
-int
-event_store_init(char *prefix)
-{
- if(file_prefix == NULL) {
- file_prefix = strdup(prefix);
- store_list = NULL;
- }
-
- /* read directory and get a list of event files */
- {
- int len;
-
- char *p, *dir;
- DIR *event_dir;
- struct dirent *entry;
-
-
- /* get directory name */
- p = strrchr(file_prefix, '/');
- if(p == NULL) {
- dir = strdup(".");
- p = "";
- len = 0;
- } else {
- *p = '\0';
- dir = strdup(file_prefix);
- *p++ = '/';
- len = strlen(p);
- }
-
- event_dir = opendir(dir);
- if(event_dir == NULL) {
- free(dir);
- set_error(IL_SYS, errno, "event_store_init: error opening event directory");
- return(-1);
- }
-
- while((entry=readdir(event_dir))) {
- char *s;
-
- /* skip all files that do not match prefix */
- if(strncmp(entry->d_name, p, len) != 0)
- continue;
-
- /* skip all control files */
- if((s=strstr(entry->d_name, ".ctl")) != NULL &&
- s[4] == '\0')
- continue;
-
- s = malloc(strlen(dir) + strlen(entry->d_name) + 2);
- if(s == NULL) {
- free(dir);
- set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for file name");
- return(-1);
- }
-
- *s = '\0';
- strcat(s, dir);
- strcat(s, "/");
- strcat(s, entry->d_name);
-
- if(event_store_from_file(s) < 0) {
- free(dir);
- free(s);
- closedir(event_dir);
- return(-1);
- }
-
- free(s);
- }
- closedir(event_dir);
-
- /* one more pass - this time remove stale .ctl files */
- event_dir = opendir(dir);
- if(event_dir == NULL) {
- free(dir);
- set_error(IL_SYS, errno, "event_store_init: error opening event directory");
- return(-1);
- }
-
- while((entry=readdir(event_dir))) {
- char *s;
-
- /* skip all files that do not match prefix */
- if(strncmp(entry->d_name, p, len) != 0)
- continue;
-
- /* find all control files */
- if((s=strstr(entry->d_name, ".ctl")) != NULL &&
- s[4] == '\0') {
- char *ef;
- struct stat st;
-
- /* is there corresponding event file? */
- ef = malloc(strlen(dir) + strlen(entry->d_name) + 2);
- if(ef == NULL) {
- free(dir);
- set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for event file name");
- return(-1);
- }
-
- s[0] = 0;
- *ef = '\0';
- strcat(ef, dir);
- strcat(ef, "/");
- strcat(ef, entry->d_name);
- s[0] = '.';
-
- if(stat(ef, &st) == 0) {
- /* something is there */
- /* XXX - it could be something else than event file, but do not bother now */
- } else {
- /* could not stat file, remove ctl */
- strcat(ef, s);
- il_log(LOG_DEBUG, " removing stale file %s\n", ef);
- if(unlink(ef))
- il_log(LOG_ERR, " could not remove file %s: %s\n", ef, strerror(errno));
-
- }
- free(ef);
-
- }
- }
- closedir(event_dir);
- free(dir);
- }
-
- return(0);
-}
-
-
-int
-event_store_recover_all()
-{
- struct event_store_list *sl;
-
-
- if(pthread_rwlock_rdlock(&store_list_lock))
- abort();
-
- /* recover all event stores */
- sl = store_list;
- while(sl != NULL) {
-
- /* recover this event store */
- /* no need to lock use_lock in event_store, the store_list_lock is in place */
- if(event_store_recover(sl->es) < 0) {
- il_log(LOG_ERR, " error recovering event store %s:\n %s\n", sl->es->event_file_name, error_get_msg());
- clear_error();
- }
- sl = sl->next;
- }
-
- if(pthread_rwlock_unlock(&store_list_lock))
- abort();
-
- return(0);
-}
-
-
-#if 0
-int
-event_store_remove(struct event_store *es)
-{
- struct event_store_list *p, **q;
-
- assert(es != NULL);
-
- switch(event_store_clean(es)) {
- case 0:
- il_log(LOG_DEBUG, " event store not removed, still used\n");
- return(0);
-
- case 1:
- if(pthread_rwlock_wrlock(&store_list_lock) < 0) {
- set_error(IL_SYS, errno, " event_store_remove: error locking event store list");
- return(-1);
- }
-
- p = store_list;
- q = &store_list;
-
- while(p) {
- if(p->es == es) {
- (*q) = p->next;
- event_store_free(es);
- free(p);
- break;
- }
- q = &(p->next);
- p = p->next;
- }
-
- if(pthread_rwlock_unlock(&store_list_lock) < 0) {
- set_error(IL_SYS, errno, " event_store_remove: error unlocking event store list");
- return(-1);
- }
- return(1);
-
- default:
- return(-1);
- }
- /* not reached */
- return(0);
-}
-#endif
-
-int
-event_store_cleanup()
-{
- struct event_store_list *sl;
- struct event_store_list *slnext;
- struct event_store_list **prev;
-
- /* try to remove event files */
-
- if(pthread_rwlock_wrlock(&store_list_lock))
- abort();
-
- sl = store_list;
- prev = &store_list;
-
- while(sl != NULL) {
- int ret;
-
- slnext = sl->next;
-
- /* one event store at time */
- ret = pthread_rwlock_trywrlock(&sl->es->use_lock);
- if(ret == EBUSY) {
- il_log(LOG_DEBUG, " event_store %s is in use by another thread\n",
- sl->es->job_id_s);
- sl = slnext;
- continue;
- } else if (ret < 0)
- abort();
-
- switch(event_store_clean(sl->es)) {
-
- case 1:
- /* remove this event store */
- (*prev) = slnext;
- event_store_free(sl->es);
- free(sl);
- break;
-
- case -1:
- il_log(LOG_ERR, " error removing event store %s (file %s):\n %s\n",
- sl->es->job_id_s, sl->es->event_file_name, error_get_msg());
- event_store_release(sl->es);
- clear_error();
- /* go on to the next */
-
- default:
- event_store_release(sl->es);
- prev = &(sl->next);
- break;
- }
-
- sl = slnext;
- }
-
- if(pthread_rwlock_unlock(&store_list_lock))
- abort();
-
- return(0);
-}
-
+++ /dev/null
-#ident "$Header$"
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <netdb.h>
-#include <assert.h>
-#include <pthread.h>
-#include <stdlib.h>
-
-#ifdef LB_PROF
-#include <sys/gmon.h>
-extern void _start (void), etext (void);
-#endif
-
-/* XXX DK: */
-#include <err.h> // SSL header file
-
-#include "glite/security/glite_gss.h"
-
-#include "il_error.h"
-
-
-extern int log_level;
-
-static pthread_key_t err_key;
-
-static int IL_ERR_MSG_LEN = 1024;
-
-static
-void
-error_key_delete(void *err)
-{
- free(err);
-}
-
-static
-void
-error_key_create()
-{
- pthread_key_create(&err_key, error_key_delete);
-}
-
-static
-struct error_inf *
-error_get_err ()
-{
- struct error_inf *err;
-
- /* get thread specific error structure */
- err = (struct error_inf *)pthread_getspecific(err_key);
- assert(err != NULL);
-
- return(err);
-}
-
-
-int
-init_errors(int level)
-{
- static pthread_once_t error_once = PTHREAD_ONCE_INIT;
- struct error_inf *err;
-
- /* create the key for thread specific error only once */
- pthread_once(&error_once, error_key_create);
-
- /* there is no thread error yet, try to create one */
- if((err = (struct error_inf *)malloc(sizeof(*err)))) {
- /* allocation successfull, make it thread specific data */
- if(pthread_setspecific(err_key, err)) {
- free(err);
- return(-1);
- }
- } else
- return(-1);
-
- err->code_maj = 0;
- err->code_min = 0;
- err->msg = malloc(IL_ERR_MSG_LEN + 1);
- if(err->msg == NULL)
- return(-1);
-
- if(level)
- log_level = level;
-
-#ifdef LB_PROF
- monstartup((u_long)&_start, (u_long)&etext);
-#endif
-
- return(0);
-}
-
-int
-set_error(int code, long minor, char *msg)
-{
- struct error_inf *err;
-
- err = error_get_err();
-
- err->code_maj = code;
- err->code_min = minor;
-
- switch(code) {
-
- case IL_SYS:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, strerror(err->code_min));
- break;
-
- case IL_HOST:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, hstrerror(err->code_min));
- break;
-
- /* XXX DK: je tahle hodnota k necemu potreba? */
- case IL_AUTH:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, ERR_error_string(err->code_min, NULL));
- break;
-
- case IL_DGGSS:
- switch(err->code_min) {
-
- case EDG_WLL_GSS_ERROR_GSS:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s", msg);
- break;
-
- case EDG_WLL_GSS_ERROR_TIMEOUT:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s: Timeout in GSS connection.", msg);
- break;
-
- case EDG_WLL_GSS_ERROR_EOF:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s: Connection lost.", msg);
- break;
-
- case EDG_WLL_GSS_ERROR_ERRNO:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, strerror(errno));
- break;
-
- case EDG_WLL_GSS_ERROR_HERRNO:
- snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, hstrerror(errno));
- break;
- }
-
- default:
- strncpy(err->msg, msg, IL_ERR_MSG_LEN);
- }
-
- return(code);
-}
-
-
-int
-clear_error() {
- struct error_inf *err;
-
- err = error_get_err();
-
- err->code_maj = IL_OK;
- err->code_min = 0;
- *(err->msg) = 0;
-
- return(0);
-}
-
-
-int
-error_get_maj()
-{
- struct error_inf *err;
-
- err = error_get_err();
-
- return(err->code_maj);
-}
-
-
-long
-error_get_min()
-{
- struct error_inf *err;
-
- err = error_get_err();
-
- return(err->code_min);
-}
-
-
-char *
-error_get_msg()
-{
- struct error_inf *err;
-
- err = error_get_err();
-
- return(err->msg);
-}
+++ /dev/null
-#ifndef IL_ERROR_H
-#define IL_ERROR_H
-
-#ident "$Header$"
-
-#include <syslog.h>
-
-enum err_code_maj { /* minor = */
- IL_OK, /* 0 */
- IL_SYS, /* errno */
- IL_NOMEM, /* ENOMEM */
- IL_AUTH, /* 0 (SSL error) */
- IL_PROTO, /* LB_* */
- IL_LBAPI, /* dgLBErrCode */
- IL_DGGSS, /* EDG_WLL_GSS_* */
- IL_HOST /* h_errno */
-};
-
-struct error_inf {
- int code_maj;
- long code_min;
- char *msg;
-};
-
-int init_errors(int);
-int set_error(int, long, char *);
-int clear_error();
-int error_get_maj();
-long error_get_min();
-char *error_get_msg();
-
-int il_log(int, char *, ...);
-
-#endif
+++ /dev/null
-#ident "$Header$"
-
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "glite/wmsutils/jobid/cjobid.h"
-#include "glite/lb/context.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/il_string.h"
-
-#include "interlogd.h"
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-int
-enqueue_msg(struct event_queue *eq, struct server_msg *msg)
-{
-#if defined(IL_NOTIFICATIONS)
- struct event_queue *eq_known;
-
- /* now we have a new event with possibly changed destination,
- so check for the already known destination and possibly move
- events from the original output queue to a new one */
- eq_known = notifid_map_get_dest(msg->job_id_s);
- if(eq != eq_known) {
- /* client has changed delivery address for this notification */
- if(notifid_map_set_dest(msg->job_id_s, eq) < 0)
- return(-1);
- /* move all events with this notif_id from eq_known to eq */
- if(eq_known != NULL)
- event_queue_move_events(eq_known, eq, msg->job_id_s);
- }
-#endif
-
- /* fire thread to take care of this queue */
- if(event_queue_create_thread(eq) < 0)
- return(-1);
-
-#if defined(IL_NOTIFICATIONS)
- /* if there are no data to send, do not send anything
- (messsage was just to change the delivery address) */
- if(msg->len == 0)
- return(0);
-#endif
- /* avoid losing signal to thread */
- event_queue_cond_lock(eq);
-
- /* insert new event */
- if(event_queue_insert(eq, msg) < 0) {
- event_queue_cond_unlock(eq);
- return(-1);
- }
-
- /* signal thread that we have a new message */
- event_queue_signal(eq);
-
- /* allow thread to continue */
- event_queue_cond_unlock(eq);
-
- return(0);
-}
-
-
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-pthread_mutex_t flush_lock = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t flush_cond = PTHREAD_COND_INITIALIZER;
-#endif /* INTERLOGD_FLUSH */
-
-#ifdef INTERLOGD_HANDLE_CMD
-static
-int
-parse_cmd(char *event, char **job_id_s, long *receipt, int *timeout)
-{
- char *token, *r;
- int ret;
-
- if(strstr(event, "DG.TYPE=\"command\"") == NULL)
- return(-1);
-
- *job_id_s = NULL;
- *timeout = 0;
- *receipt = 0;
- ret = 0;
-
- for(token = strtok(event, " "); token != NULL; token = strtok(NULL, " ")) {
- r = index(token, '=');
- if(r == NULL) {
- ret = -1;
- continue;
- }
- if(strncmp(token, "DG.COMMAND", r - token) == 0) {
-#if defined(INTERLOGD_FLUSH)
- if(strcmp(++r, "\"flush\"")) {
-#endif
- il_log(LOG_WARNING, " command %s not implemented\n", r);
- ret = -1;
- continue;
-#if defined(INTERLOGD_FLUSH)
- }
-#endif
- } else if(strncmp(token, "DG.JOBID", r - token) == 0) {
- char *p;
-
- r += 2; /* skip =" */
- p = index(r, '"');
- if(p == NULL) { ret = -1; continue; }
- *job_id_s = strndup(r, p-r);
-
- } else if(strncmp(token, "DG.TIMEOUT", r - token) == 0) {
- sscanf(++r, "\"%d\"", timeout);
- } else if(strncmp(token, "DG.LLLID", r - token) == 0) {
- sscanf(++r, "%ld", receipt);
- }
-
- }
- return(0);
-}
-
-
-/* return value:
- * 0 - not command
- * 1 - success
- * -1 - failure
- */
-
-static
-int
-handle_cmd(il_octet_string_t *event, long offset)
-{
- char *job_id_s;
- struct event_queue *eq;
- int num_replies, num_threads = 0;
- int timeout, result;
- long receipt;
- struct timespec endtime;
- struct timeval tv;
-
- /* parse command */
- if(parse_cmd(event->data, &job_id_s, &receipt, &timeout) < 0)
- return(0);
-
-#if defined(INTERLOGD_FLUSH)
- il_log(LOG_DEBUG, " received FLUSH command\n");
-
- /* catchup with all neccessary event files */
- if(job_id_s) {
- struct event_store *es = event_store_find(job_id_s);
-
- if(es == NULL) {
- goto cmd_error;
- }
- result = event_store_recover(es);
- /* NOTE: if flush had been stored in file, there would have been
- no need to lock the event_store at all */
- event_store_release(es);
- if(result < 0) {
- il_log(LOG_ERR, " error trying to catch up with event file: %s\n",
- error_get_msg());
- clear_error();
- }
- } else
- /* this call does not fail :-) */
- event_store_recover_all();
-
- il_log(LOG_DEBUG, " alerting threads to report status\n");
-
- /* prevent threads from reporting too early */
- if(pthread_mutex_lock(&flush_lock) < 0) {
- /*** this error is considered too serious to allow the program run anymore!
- set_error(IL_SYS, errno, "pthread_mutex_lock: error locking flush lock");
- goto cmd_error;
- */
- abort();
- }
-
- /* wake up all threads */
- if(job_id_s) {
- /* find appropriate queue */
- eq = queue_list_get(job_id_s);
- if(eq == NULL) goto cmd_error;
- if(!event_queue_empty(eq) && !queue_list_is_log(eq)) {
- num_threads++;
- event_queue_cond_lock(eq);
- eq->flushing = 1;
- event_queue_wakeup(eq);
- event_queue_cond_unlock(eq);
- }
- } else {
- /* iterate over event queues */
- for(eq=queue_list_first(); eq != NULL; eq=queue_list_next()) {
- if(!event_queue_empty(eq) && !queue_list_is_log(eq)) {
- num_threads++;
- event_queue_cond_lock(eq);
- eq->flushing = 1;
- event_queue_wakeup(eq);
- event_queue_cond_unlock(eq);
- }
- }
- }
- if(!bs_only) {
- eq = queue_list_get(NULL);
- if(eq == NULL) goto cmd_error;
- if(!event_queue_empty(eq)) {
- num_threads++;
- event_queue_cond_lock(eq);
- eq->flushing = 1;
- event_queue_wakeup(eq);
- event_queue_cond_unlock(eq);
- }
- }
-
- /* wait for thread replies */
- num_replies = 0;
- result = 1;
- gettimeofday(&tv, NULL);
- endtime.tv_sec = tv.tv_sec + timeout;
- endtime.tv_nsec = 1000 * tv.tv_usec;
- while(num_replies < num_threads) {
- int ret;
- if((ret=pthread_cond_timedwait(&flush_cond, &flush_lock, &endtime)) < 0) {
- il_log(LOG_ERR, " error waiting for thread reply: %s\n", strerror(errno));
- result = (ret == ETIMEDOUT) ? 0 : -1;
- break;
- }
-
- /* collect results from reporting threads */
- if(job_id_s) {
- /* find appropriate queue */
- eq = queue_list_get(job_id_s);
- if(eq == NULL) goto cmd_error;
- if(!queue_list_is_log(eq)) {
- event_queue_cond_lock(eq);
- if(eq->flushing == 2) {
- eq->flushing = 0;
- num_replies++;
- result = ((result == 1) || (eq->flush_result < 0)) ?
- eq->flush_result : result;
- }
- event_queue_cond_unlock(eq);
- }
- } else {
- /* iterate over event queues */
- for(eq=queue_list_first(); eq != NULL; eq=queue_list_next()) {
- if(!queue_list_is_log(eq)) {
- event_queue_cond_lock(eq);
- if(eq->flushing == 2) {
- eq->flushing = 0;
- num_replies++;
- il_log(LOG_DEBUG, " thread reply: %d\n", eq->flush_result);
- result = ((result == 1) || (eq->flush_result < 0)) ?
- eq->flush_result : result;
- }
- event_queue_cond_unlock(eq);
- }
- }
- }
- if(!bs_only) {
- eq = queue_list_get(NULL);
- if(eq == NULL) goto cmd_error;
- event_queue_cond_lock(eq);
- if(eq->flushing == 2) {
- eq->flushing = 0;
- num_replies++;
- result = ((result == 1) || (eq->flush_result < 0)) ?
- eq->flush_result : result;
- }
- event_queue_cond_unlock(eq);
- }
- }
-
- /* prevent deadlock in next flush */
- if(pthread_mutex_unlock(&flush_lock) < 0)
- abort();
-
-
- /* report back to local logger */
- switch(result) {
- case 1:
- result = 0; break;
- case 0:
- result = EDG_WLL_IL_EVENTS_WAITING; break;
- default:
- result = EDG_WLL_IL_SYS; break;
- }
- if(job_id_s) free(job_id_s);
- result = send_confirmation(receipt, result);
- if(result <= 0)
- il_log(LOG_ERR, "handle_cmd: error sending status: %s\n", error_get_msg());
- return(1);
-
-
-cmd_error:
- if(job_id_s) free(job_id_s);
- return(-1);
-#else
- return(0);
-#endif /* INTERLOGD_FLUSH */
-}
-#endif /* INTERLOGD_HANDLE_CMD */
-
-
-static
-int
-handle_msg(il_octet_string_t *event, long offset)
-{
- struct server_msg *msg = NULL;
-#if !defined(IL_NOTIFICATIONS)
- struct event_queue *eq_l;
-#endif
- struct event_queue *eq_s;
- struct event_store *es;
-
- int ret;
-
- /* convert event to message for server */
- if((msg = server_msg_create(event, offset)) == NULL) {
- il_log(LOG_ERR, " handle_msg: error parsing event '%s':\n %s\n", event, error_get_msg());
- return(0);
- }
-
- /* sync event store with IPC (if neccessary)
- * This MUST be called before inserting event into output queue! */
- if((es = event_store_find(msg->job_id_s)) == NULL)
- return(-1);
- msg->es = es;
-
-#ifdef LB_PERF
- if(nosync)
- ret = 1;
- else
-#endif
- ret = event_store_sync(es, offset);
- il_log(LOG_DEBUG, " syncing event store at %d with event at %d, result %d\n", es->offset, offset, ret);
- if(ret < 0) {
- il_log(LOG_ERR, " handle_msg: error syncing event store:\n %s\n", error_get_msg());
- /* XXX should error during event store recovery cause us to drop the message? */
- /* Probably no, because the attempt to recover means we have missed some events,
- and delivery of this one will not move offset ahead. So try our best and deliver it
- even if it may cause duplicates on server. */
- /* COMMENTED OUT:
- server_msg_free(msg);
- event_store_release(es);
- return(0);
- */
- } else if(ret == 0) {
- /* we have seen this event already */
- server_msg_free(msg);
- event_store_release(es);
- return(1);
- }
-
- /* find apropriate queue for this event */
-#if defined(IL_NOTIFICATIONS)
- eq_s = queue_list_get(msg->dest);
-#else
- eq_s = queue_list_get(msg->job_id_s);
-#endif
- if(eq_s == NULL) {
- il_log(LOG_ERR, " handle_msg: apropriate queue not found: %s\n", error_get_msg());
- clear_error();
- } else {
- if(enqueue_msg(eq_s, msg) < 0)
- goto err;
- }
-
-#if !defined(IL_NOTIFICATIONS)
- eq_l = queue_list_get(NULL);
- if(!bs_only && eq_l != eq_s) {
- /* send to default queue (logging server) as well */
- if(enqueue_msg(eq_l, msg) < 0)
- goto err;
- }
-#endif
-
- /* if there was no error, set the next expected event offset */
- event_store_next(es, offset, msg->ev_len);
-
- /* allow cleanup thread to check on this event_store */
- event_store_release(es);
-
- /* free the message */
- server_msg_free(msg);
- return(1);
-
-err:
- event_store_release(es);
- server_msg_free(msg);
- return(-1);
-}
-
-
-
-int
-loop()
-{
- /* receive events */
- while(1) {
- il_octet_string_t msg;
- long offset;
- int ret;
-
- if(killflg)
- exit(0);
-
- clear_error();
- if((ret = input_queue_get(&msg, &offset, INPUT_TIMEOUT)) < 0)
- {
- if(error_get_maj() == IL_PROTO) {
- il_log(LOG_DEBUG, " premature EOF while receiving event\n");
- /* problems with socket input, try to catch up from files */
-#ifndef PERF_EMPTY
- event_store_recover_all();
-#endif
- continue;
- } else
- return(-1);
- }
- else if(ret == 0) {
- continue;
- }
-
-#ifdef PERF_EMPTY
- glite_wll_perftest_consumeEventString(msg.data);
- free(msg.data);
- continue;
-#endif
-
-#ifdef INTERLOGD_HANDLE_CMD
- ret = handle_cmd(&msg, offset);
- if(ret == 0)
-#endif
- ret = handle_msg(&msg, offset);
- free(msg.data);
- if(ret < 0)
- switch (error_get_maj()) {
- case IL_SYS:
- case IL_NOMEM:
- return (ret);
- break;
- default:
- il_log(LOG_ERR, "Error: %s\n", error_get_msg());
- break;
- }
- } /* while */
-}
+++ /dev/null
-#ident "$Header$"
-
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-#include "interlogd.h"
-
-
-static const int SOCK_QUEUE_MAX = 50;
-extern char *socket_path;
-
-static int sock;
-static int accepted;
-
-int
-input_queue_attach()
-{
- struct sockaddr_un saddr;
-
- if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
- set_error(IL_SYS, errno, "input_queue_attach: error creating socket");
- return(-1);
- }
-
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, socket_path);
-
- /* test for the presence of the socket and another instance
- of interlogger listening */
- if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
- if(errno == ECONNREFUSED) {
- /* socket present, but no one at the other end; remove it */
- il_log(LOG_WARNING, " removing stale input socket %s\n", socket_path);
- unlink(socket_path);
- }
- /* ignore other errors for now */
- } else {
- /* connection was successful, so bail out - there is
- another interlogger running */
- set_error(IL_SYS, EADDRINUSE, "input_queue_attach: another instance of interlogger is running");
- return(-1);
- }
-
- if(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
- set_error(IL_SYS, errno, "input_queue_attach: error binding socket");
- return(-1);
- }
-
- if (listen(sock, SOCK_QUEUE_MAX)) {
- set_error(IL_SYS, errno, "input_queue_attach: error listening on socket");
- return -1;
- }
-
- return(0);
-}
-
-void input_queue_detach()
-{
- if (sock >= 0)
- close(sock);
- unlink(socket_path);
-}
-
-
-#define DEFAULT_CHUNK_SIZE 1024
-
-static
-int
-read_event(int sock, long *offset, il_octet_string_t *msg)
-{
- char *buffer, *p, *n;
- int len, alen, i, chunk_size = DEFAULT_CHUNK_SIZE;
- static char buf[1024];
-
- msg->data = NULL;
- msg->len = 0;
-
- /* receive offset */
- len = recv(sock, offset, sizeof(*offset), MSG_NOSIGNAL);
- if(len < sizeof(*offset)) {
- set_error(IL_PROTO, errno, "read_event: error reading offset");
- return(-1);
- }
-
- /* receive event string */
- buffer=malloc(8*chunk_size);
- if(buffer == NULL) {
- set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
- return(-1);
- }
- p = buffer;
- alen = 8*chunk_size;
-
- /* Variables used here:
- - buffer points to allocated memory,
- - alen is the allocated memory size,
- - p points to the first free location in buffer,
- - len is the amount actually read by recv,
- - i is the amount of data belonging to the current event (including separator).
- - n points to event separator or is NULL
- Hence:
- (p - buffer) gives the amount of valid data read so far,
- (alen - (p - buffer)) is the free space,
- */
-
-#if 1
- /* Reading events - optimized version. Attempts to increase chunks read by recv
- * when there are more data, reads directly into destination memory (instead of
- * copying from static buffer) etc.
- *
- * For some reason it is not much faster than the old variant.
- */
- do {
- /* prepare at least chunk_size bytes for next data */
- if(alen - (p - buffer) < chunk_size) {
- alen += (chunk_size < 8192) ? 8192 : 8*chunk_size;
- n = realloc(buffer, alen);
- if(n == NULL) {
- free(buffer);
- set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
- return(-1);
- }
- p = n + (p - buffer);
- buffer = n;
- }
-
- /* read chunk */
- if((len=recv(sock, p, chunk_size, MSG_PEEK | MSG_NOSIGNAL)) > 0) {
- /* find the end of event, if any */
- /* faster (and dirty) way of doing strnchr (which is not in libc, anyway) */
- if((n=memccpy(p, p, EVENT_SEPARATOR, len)) != NULL) {
- i = n - p; /* length including separator */
- } else {
- i = len;
- /* long event, huh? try reading more data at once */
- chunk_size += 1024;
- }
- /* remove the relevant data from input */
- /* i > 0 */
- if(recv(sock, p, i, MSG_NOSIGNAL) != i) {
- set_error(IL_SYS, errno, "read_event: error reading data");
- free(buffer);
- return(-1);
- }
- /* move the pointer to the first free place, separator is considered free space */
- p = (n == NULL) ? p + len : n - 1;
- }
- } while ( (len > 0) && (n == NULL) );
-
-#else
- /* Reading events - original version.
- * Appears to behave quite good, anyway.
- */
- while((len=recv(sock, buf, sizeof(buf), MSG_PEEK | MSG_NOSIGNAL)) > 0) {
-
- /* we have to be prepared for sizeof(buf) bytes */
- if(alen - (p - buffer) < (int)sizeof(buf)) {
- alen += 8192;
- n = realloc(buffer, alen);
- if(n == NULL) {
- free(buffer);
- set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
- return(-1);
- }
- p = p - buffer + n;
- buffer = n;
- }
-
- /* copy all relevant bytes from buffer */
- n = (char*)memccpy(p, buf, EVENT_SEPARATOR, len);
- if(n) {
- /* separator found */
- n--; /* but do not preserve it */
- i = n - p;
- p = n;
- } else {
- /* separator not found */
- i = len;
- p += len;
- }
- /* This was definitely slowing us down:
- * for(i=0; (i < len) && (buf[i] != EVENT_SEPARATOR); i++)
- * *p++ = buf[i];
- */
-
- /* remove the data from queue */
- if(i > 0)
- if(recv(sock, buf, i, MSG_NOSIGNAL) != i) {
- set_error(IL_SYS, errno, "read_event: error reading data");
- free(buffer);
- return(-1);
- }
- if(i < len)
- /* the event is complete */
- break;
- }
-#endif
-
- /* terminate buffer */
- *p = 0;
-
- if(len < 0) {
- set_error(IL_SYS, errno, "read_event: error reading data");
- free(buffer);
- return(-1);
- }
-
- /* if len == 0, we have not encountered EVENT_SEPARATOR and thus the event is not complete */
- if(len == 0) {
- set_error(IL_PROTO, errno, "read_event: error reading data - premature EOF");
- free(buffer);
- return(-1);
- }
-
-#if 0
- /* this is probably not necessary at all:
- either len <=0, which was covered before,
- or 0 <= i < len => p > buffer;
- I would say this condition can not be satisfied.
- */
- if(p == buffer) {
- set_error(IL_PROTO, errno, "read_event: error reading data - no data received");
- free(buffer);
- return(-1);
- }
-#endif
-
- msg->data = buffer;
- msg->len = p - buffer;
- return(msg->len);
-}
-
-
-/*
- * Returns: -1 on error, 0 if no message available, message length otherwise
- *
- */
-#ifdef PERF_EVENTS_INLINE
-int
-input_queue_get(il_octet_string *buffer, long *offset, int timeout)
-{
- static long o = 0;
- int len;
- char *jobid;
-
- len = glite_wll_perftest_produceEventString(&buffer->data, &jobid);
- buffer->len = len;
- if(len) {
- o += len;
- *offset = o;
- } else if (len == 0) {
- sleep(timeout);
- }
- return(len);
-}
-#else
-int
-input_queue_get(il_octet_string_t *buffer, long *offset, int timeout)
-{
- fd_set fds;
- struct timeval tv;
- int msg_len;
-
- assert(buffer != NULL);
-
- FD_ZERO(&fds);
- FD_SET(sock, &fds);
-
- tv.tv_sec = timeout;
- tv.tv_usec = 0;
-
- msg_len = select(sock + 1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL);
- switch(msg_len) {
-
- case 0: /* timeout */
- return(0);
-
- case -1: /* error */
- switch(errno) {
- case EINTR:
- il_log(LOG_DEBUG, " interrupted while waiting for event!\n");
- return(0);
-
- default:
- set_error(IL_SYS, errno, "input_queue_get: error waiting for event");
- return(-1);
- }
- default:
- break;
- }
-
- if((accepted=accept(sock, NULL, NULL)) < 0) {
- set_error(IL_SYS, errno, "input_queue_get: error accepting connection");
- return(-1);
- }
-
- read_event(accepted, offset, buffer);
- close(accepted);
-
- if(buffer->data == NULL) {
- if(error_get_maj() != IL_OK)
- return(-1);
- else
- return(0);
- }
-
- return(buffer->len);
-}
-#endif
+++ /dev/null
-#ident "$Header$"
-
-/*
- interlogger - collect events from local-logger and send them to logging and bookkeeping servers
-
-*/
-#include <getopt.h>
-#include <string.h>
-#include <signal.h>
-#include <pthread.h>
-
-#include <globus_common.h>
-
-#include "interlogd.h"
-#include "glite/lb/consumer.h"
-#include "glite/lb/log_proto.h"
-#include "glite/security/glite_gss.h"
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-#define EXIT_FAILURE 1
-#if defined(IL_NOTIFICATIONS)
-#define DEFAULT_PREFIX "/tmp/notif_events"
-#define DEFAULT_SOCKET "/tmp/notif_interlogger.sock"
-#else
-#define DEFAULT_PREFIX EDG_WLL_LOG_PREFIX_DEFAULT
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-#endif
-
-
-/* The name the program was run with, stripped of any leading path. */
-char *program_name;
-int killflg = 0;
-
-int TIMEOUT = DEFAULT_TIMEOUT;
-
-gss_cred_id_t cred_handle = GSS_C_NO_CREDENTIAL;
-pthread_mutex_t cred_handle_lock = PTHREAD_MUTEX_INITIALIZER;
-
-time_t key_mtime = 0, cert_mtime = 0;
-
-static void usage (int status)
-{
- printf("%s - \n"
- " collect events from local-logger and send them to logging and bookkeeping servers\n"
- "Usage: %s [OPTION]... [FILE]...\n"
- "Options:\n"
- " -h, --help display this help and exit\n"
- " -V, --version output version information and exit\n"
- " -d, --debug do not run as daemon\n"
- " -v, --verbose print extensive debug output\n"
- " -f, --file-prefix <prefix> path and prefix for event files\n"
- " -c, --cert <file> location of server certificate\n"
- " -k, --key <file> location of server private key\n"
- " -C, --CAdir <dir> directory containing CA certificates\n"
- " -b, --book send events to bookkeeping server only\n"
- " -l, --log-server <host> specify address of log server\n"
- " -s, --socket <path> non-default path of local socket\n"
- " -L, --lazy [<timeout>] be lazy when closing connections to servers\n"
-#ifdef LB_PERF
- " -n, --nosend PERFTEST: consume events instead of sending\n"
- " -S, --nosync PERFTEST: do not check logd files for lost events\n"
- " -R, --norecover PERFTEST: do not start recovery thread\n"
- " -P, --noparse PERFTEST: do not parse messages, use built-in server address\n"
-#ifdef PERF_EVENTS_INLINE
- " -e, --event_file <file> PERFTEST: file to read test events from\n"
- " -j, --njobs <n> PERFTEST: number of jobs to send\n"
-#endif
-#endif
- , program_name, program_name);
- exit(status);
-}
-
-
-/* Option flags and variables */
-static int debug;
-static int verbose = 0;
-char *file_prefix = DEFAULT_PREFIX;
-int bs_only = 0;
-int lazy_close = 0;
-int default_close_timeout;
-#ifdef LB_PERF
-int nosend = 0, norecover=0, nosync=0, noparse=0;
-char *event_source = NULL;
-int njobs = 0;
-#endif
-
-char *cert_file = NULL;
-char *key_file = NULL;
-char *CAcert_dir = NULL;
-char *log_server = NULL;
-char *socket_path = DEFAULT_SOCKET;
-
-static struct option const long_options[] =
-{
- {"help", no_argument, 0, 'h'},
- {"version", no_argument, 0, 'V'},
- {"verbose", no_argument, 0, 'v'},
- {"debug", no_argument, 0, 'd'},
- {"file-prefix", required_argument, 0, 'f'},
- {"cert", required_argument, 0, 'c'},
- {"key", required_argument, 0, 'k'},
- {"book", no_argument, 0, 'b'},
- {"CAdir", required_argument, 0, 'C'},
- {"log-server", required_argument, 0, 'l'},
- {"socket", required_argument, 0, 's'},
- {"lazy", optional_argument, 0, 'L'},
-#ifdef LB_PERF
- {"nosend", no_argument, 0, 'n'},
- {"nosync", no_argument, 0, 'S'},
- {"norecover", no_argument, 0, 'R'},
- {"noparse", no_argument, 0, 'P'},
-#ifdef PERF_EVENTS_INLINE
- {"event_file", required_argument, 0, 'e'},
- {"njobs", required_argument, NULL, 'j'},
-#endif
-#endif
- {NULL, 0, NULL, 0}
-};
-
-
-
-/* Set all the option flags according to the switches specified.
- Return the index of the first non-option argument. */
-static int
-decode_switches (int argc, char **argv)
-{
- int c;
-
- debug = 0;
-
- while ((c = getopt_long (argc, argv,
- "f:" /* file prefix */
- "h" /* help */
- "V" /* version */
- "v" /* verbose */
- "c:" /* certificate */
- "k:" /* key */
- "C:" /* CA dir */
- "b" /* only bookeeping */
- "l:" /* log server */
- "d" /* debug */
-#ifdef LB_PERF
- "n" /* nosend */
- "S" /* nosync */
- "R" /* norecover */
- "P" /* noparse */
-#ifdef PERF_EVENTS_INLINE
- "e:" /* event file */
- "j:" /* num jobs */
-#endif
-#endif
- "L::" /* lazy */
- "s:", /* socket */
- long_options, (int *) 0)) != EOF)
- {
- switch (c)
- {
- case 'V':
- printf ("interlogger %s\n", VERSION);
- exit (0);
-
- case 'v':
- verbose = 1;
- break;
-
- case 'h':
- usage (0);
-
- case 'd':
- debug = 1;
- break;
-
- case 'f':
- file_prefix = strdup(optarg);
- break;
-
- case 'c':
- cert_file = strdup(optarg);
- break;
-
- case 'k':
- key_file = strdup(optarg);
- break;
-
- case 'b':
- bs_only = 1;
- break;
-
- case 'l':
- log_server = strdup(optarg);
- break;
-
- case 'C':
- CAcert_dir = strdup(optarg);
- break;
-
- case 's':
- socket_path = strdup(optarg);
- break;
-
- case 'L':
- lazy_close = 1;
- if(optarg)
- default_close_timeout = atoi(optarg);
- else
- default_close_timeout = TIMEOUT;
- break;
-
-#ifdef LB_PERF
- case 'n':
- nosend = 1;
- break;
-
- case 'R':
- norecover = 1;
- break;
-
- case 'S':
- nosync = 1;
- break;
-
- case 'P':
- noparse = 1;
- break;
-
-#ifdef PERF_EVENTS_INLINE
- case 'e':
- event_source = strdup(optarg);
- break;
-
- case 'j':
- njobs = atoi(optarg);
- break;
-#endif
-#endif
-
- default:
- usage (EXIT_FAILURE);
- }
- }
-
- return optind;
-}
-
-
-void handle_signal(int num) {
- il_log(LOG_DEBUG, "Received signal %d\n", num);
- killflg++;
-}
-
-int
-main (int argc, char **argv)
-{
- int i;
- char *p;
- edg_wll_GssStatus gss_stat;
- int ret;
-
- program_name = argv[0];
-
- setlinebuf(stdout);
- setlinebuf(stderr);
-
- if ((p = getenv("EDG_WL_INTERLOG_TIMEOUT"))) TIMEOUT = atoi(p);
-
- i = decode_switches (argc, argv);
-
- /* force -b if we do not have log server */
- if(log_server == NULL) {
- log_server = strdup(DEFAULT_LOG_SERVER);
- bs_only = 1;
- }
-
- if(init_errors(verbose ? LOG_DEBUG : LOG_WARNING)) {
- fprintf(stderr, "Failed to initialize error message subsys. Exiting.\n");
- exit(EXIT_FAILURE);
- }
-
- if (signal(SIGPIPE, handle_signal) == SIG_ERR
- || signal(SIGABRT, handle_signal) == SIG_ERR
- || signal(SIGTERM, handle_signal) == SIG_ERR
- || signal(SIGINT, handle_signal) == SIG_ERR) {
- perror("signal");
- exit(EXIT_FAILURE);
- }
-
-#ifdef LB_PERF
- /* this must be called after installing signal handlers */
- glite_wll_perftest_init(NULL, /* host */
- NULL, /* user */
- NULL, /* test name */
- event_source,
- njobs);
-#endif
-
- il_log(LOG_INFO, "Initializing input queue...\n");
- if(input_queue_attach() < 0) {
- il_log(LOG_CRIT, "Failed to initialize input queue: %s\n", error_get_msg());
- exit(EXIT_FAILURE);
- }
-
- /* initialize output queues */
- il_log(LOG_INFO, "Initializing event queues...\n");
- if(queue_list_init(log_server) < 0) {
- il_log(LOG_CRIT, "Failed to initialize output event queues: %s\n", error_get_msg());
- exit(EXIT_FAILURE);
- }
- if(lazy_close)
- il_log(LOG_DEBUG, " using lazy mode when closing connections, timeout %d\n",
- default_close_timeout);
-
- if (CAcert_dir)
- setenv("X509_CERT_DIR", CAcert_dir, 1);
-
- edg_wll_gss_watch_creds(cert_file,&cert_mtime);
- ret = edg_wll_gss_acquire_cred_gsi(cert_file, key_file, &cred_handle, NULL, &gss_stat);
- if (ret) {
- char *gss_err = NULL;
- char *str;
-
- if (ret == EDG_WLL_GSS_ERROR_GSS)
- edg_wll_gss_get_error(&gss_stat, "edg_wll_gss_acquire_cred_gsi()", &gss_err);
- asprintf(&str, "Failed to load GSI credential: %s\n",
- (gss_err) ? gss_err : "edg_wll_gss_acquire_cred_gsi() failed");
- il_log(LOG_CRIT, str);
- free(str);
- if (gss_err)
- free(gss_err);
- exit(EXIT_FAILURE);
- }
-
- if(!debug &&
- (daemon(0,0) < 0)) {
- perror("daemon");
- exit(EXIT_FAILURE);
- }
-
- if (globus_module_activate(GLOBUS_COMMON_MODULE) != GLOBUS_SUCCESS) {
- il_log(LOG_CRIT, "Failed to initialize Globus common module\n");
- exit(EXIT_FAILURE);
- }
-
-#ifndef PERF_EMPTY
- /* find all unsent events waiting in files */
-#ifdef LB_PERF
- if(norecover) {
- if(event_store_init(file_prefix) < 0) {
- il_log(LOG_CRIT, "Failed to init event stores: %s\n", error_get_msg());
- exit(EXIT_FAILURE);
- }
- } else
-#endif
- {
- pthread_t rid;
-
- il_log(LOG_INFO, "Starting recovery thread...\n");
- if(pthread_create(&rid, NULL, recover_thread, NULL) < 0) {
- il_log(LOG_CRIT, "Failed to start recovery thread: %s\n", strerror(errno));
- exit(EXIT_FAILURE);
- }
- pthread_detach(rid);
- }
-#endif
-
- il_log(LOG_INFO, "Entering main loop...\n");
-
- /* do the work */
- if(loop() < 0) {
- il_log(LOG_CRIT, "Fatal error: %s\n", error_get_msg());
- if (killflg) {
- input_queue_detach();
- exit(EXIT_FAILURE);
- }
- }
- il_log(LOG_INFO, "Done!\n");
- input_queue_detach();
-
- exit (0);
-}
+++ /dev/null
-#ifndef INTERLOGGER_P_H
-#define INTERLOGGER_P_H
-
-#ident "$Header$"
-
-#include "il_error.h"
-#include "glite/security/glite_gss.h"
-#include "glite/lb/il_msg.h"
-
-#include <pthread.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#ifdef HAVE_DMALLOC_H
-#include <dmalloc.h>
-#endif
-
-#define INTERLOGD_HANDLE_CMD
-#define INTERLOGD_FLUSH
-#define INTERLOGD_EMS
-
-#define DEFAULT_USER "michal"
-#define DEFAULT_LOG_SERVER "localhost"
-#define DEFAULT_TIMEOUT 60
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-#if defined(IL_NOTIFICATIONS)
-
-#include "glite/lb/notifid.h"
-
-#undef INTERLOGD_HANDLE_CMD
-#undef INTERLOGD_FLUSH
-#undef INTERLOGD_EMS
-#define IL_EVENT_ID_T edg_wll_NotifId
-#define IL_EVENT_GET_UNIQUE(a) edg_wll_NotifIdGetUnique((a))
-#define IL_EVENT_ID_FREE(a) edg_wll_NotifIdFree((a))
-#define IL_EVENT_ID_PARSE(a,b) edg_wll_NotifIdParse((a),(b))
-
-#else
-
-#define INTERLOGD_HANDLE_CMD
-#define INTERLOGD_FLUSH
-#define INTERLOGD_EMS
-#define IL_EVENT_ID_T edg_wlc_JobId
-#define IL_EVENT_GET_UNIQUE(a) edg_wlc_JobIdGetUnique((a))
-#define IL_EVENT_ID_FREE(a) edg_wlc_JobIdFree((a))
-#define IL_EVENT_ID_PARSE(a,b) edg_wlc_JobIdParse((a),(b))
-
-#endif
-
-
-#define EVENT_SEPARATOR '\n'
-
-// #define TIMEOUT 5
-extern int TIMEOUT;
-#define INPUT_TIMEOUT (60)
-
-
-extern gss_cred_id_t cred_handle;
-extern pthread_mutex_t cred_handle_lock;
-extern char *cert_file;
-extern char *key_file;
-extern char *CAcert_dir;
-extern int bs_only;
-extern int killflg;
-extern int lazy_close;
-extern int default_close_timeout;
-#ifdef LB_PERF
-extern int nosend, nosync, norecover, noparse;
-#ifdef PERF_EVENTS_INLINE
-extern char *event_source;
-#endif
-#endif
-
-/* shared data for thread communication */
-#ifdef INTERLOGD_FLUSH
-extern pthread_mutex_t flush_lock;
-extern pthread_cond_t flush_cond;
-#endif
-
-struct event_store {
- char *event_file_name; /* file with events from local logger */
- char *control_file_name; /* file with control information */
- char *job_id_s; /* string form of the job id */
- long last_committed_bs; /* offset behind event that was last committed by BS */
- long last_committed_ls; /* -"- LS */
- long offset; /* expected file position of next event */
- int recovering; /* flag for recovery mode */
- pthread_rwlock_t update_lock; /* lock to prevent simultaneous updates */
- pthread_rwlock_t use_lock; /* lock to prevent struct deallocation */
-#if defined(IL_NOTIFICATIONS)
- char *dest; /* host:port destination */
-#endif
-};
-
-
-struct server_msg {
- char *job_id_s; /* necessary for commit */
- long offset; /* just for printing more information to debug */
- char *msg;
- int len;
- int ev_len;
- struct event_store *es; /* cache for corresponding event store */
- long receipt_to; /* receiver (long local-logger id - LLLID) of delivery confirmation (for priority messages) */
-#if defined(IL_NOTIFICATIONS)
- char *dest_name;
- int dest_port;
- char *dest;
-#endif
-};
-
-
-struct event_queue {
- edg_wll_GssConnection gss; /* GSS connection */
- char *dest_name;
- int dest_port;
- int timeout; /* queue timeout */
- struct event_queue_msg *tail; /* last message in the queue */
- struct event_queue_msg *head; /* first message in the queue */
-#if defined(INTERLOGD_EMS)
- struct event_queue_msg *tail_ems; /* last priority message in the queue (or NULL) */
- struct event_queue_msg *mark_this; /* mark message for removal */
- struct event_queue_msg *mark_prev; /* predecessor of the marked message */
-#endif
- pthread_t thread_id; /* id of associated thread */
- pthread_rwlock_t update_lock; /* mutex for queue updates */
- pthread_mutex_t cond_lock; /* mutex for condition variable */
- pthread_cond_t ready_cond; /* condition variable for message arrival */
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
- int flushing;
- int flush_result; /* result of flush operation */
- pthread_cond_t flush_cond; /* condition variable for flush operation */
-#endif
- /* statistics */
- int times_empty; /* number of times the queue was emptied */
- int max_len; /* max queue length */
- int cur_len; /* current length */
-};
-
-
-/* server msg methods */
-struct server_msg *server_msg_create(il_octet_string_t *, long);
-struct server_msg *server_msg_copy(struct server_msg *);
-int server_msg_init(struct server_msg *, il_octet_string_t *);
-#if defined(INTERLOGD_EMS)
-int server_msg_is_priority(struct server_msg *);
-#endif
-int server_msg_free(struct server_msg *);
-
-/* general event queue methods */
-struct event_queue *event_queue_create(char *);
-int event_queue_free(struct event_queue *);
-int event_queue_empty(struct event_queue *);
-int event_queue_insert(struct event_queue *, struct server_msg *);
-int event_queue_get(struct event_queue *, struct server_msg **);
-int event_queue_remove(struct event_queue *);
-int event_queue_enqueue(struct event_queue *, char *);
-/* helper */
-int enqueue_msg(struct event_queue *, struct server_msg *);
-
-/* protocol event queue methods */
-int event_queue_connect(struct event_queue *);
-int event_queue_send(struct event_queue *);
-int event_queue_close(struct event_queue *);
-int send_confirmation(long, int);
-
-/* thread event queue methods */
-int event_queue_create_thread(struct event_queue *);
-int event_queue_lock(struct event_queue *);
-int event_queue_unlock(struct event_queue *);
-int event_queue_lock_ro(struct event_queue *);
-int event_queue_signal(struct event_queue *);
-int event_queue_wait(struct event_queue *, int);
-int event_queue_sleep(struct event_queue *);
-int event_queue_wakeup(struct event_queue *);
-int event_queue_cond_lock(struct event_queue *);
-int event_queue_cond_unlock(struct event_queue *);
-
-/* input queue */
-int input_queue_attach();
-void input_queue_detach();
-int input_queue_get(il_octet_string_t *, long *, int);
-
-/* queue management functions */
-int queue_list_init(char *);
-struct event_queue *queue_list_get(char *);
-struct event_queue *queue_list_first();
-struct event_queue *queue_list_next();
-int queue_list_is_log(struct event_queue *);
-
-#if defined(IL_NOTIFICATIONS)
-struct event_queue *notifid_map_get_dest(const char *);
-int notifid_map_set_dest(const char *, struct event_queue *);
-int event_queue_move_events(struct event_queue *, struct event_queue *, char *);
-#endif
-
-/* event store functions */
-int event_store_init(char *);
-int event_store_cleanup();
-int event_store_recover_all(void);
-struct event_store *event_store_find(char *);
-int event_store_sync(struct event_store *, long);
-int event_store_next(struct event_store *, long, int);
-int event_store_commit(struct event_store *, int, int);
-int event_store_recover(struct event_store *);
-int event_store_release(struct event_store *);
-/* int event_store_remove(struct event_store *); */
-
-/* master main loop */
-int loop();
-
-/* recover thread */
-void *recover_thread(void*);
-
-#endif
+++ /dev/null
-#ident "$Header$"
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <unistd.h>
-#include <string.h>
-#include <getopt.h>
-
-#include <globus_common.h>
-
-#include "glite/lb/context-int.h"
-#include "logd_proto.h"
-#include "glite/lb/consumer.h"
-#include "glite/security/glite_gss.h"
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-static const char rcsid[] = "@(#)$Id$";
-static int verbose = 0;
-static int debug = 0;
-static int port = EDG_WLL_LOG_PORT_DEFAULT;
-static char *prefix = EDG_WLL_LOG_PREFIX_DEFAULT;
-static char *cert_file = NULL;
-static char *key_file = NULL;
-static char *CAcert_dir = NULL;
-static int noAuth = 0;
-static int noIPC = 0;
-static int noParse = 0;
-
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-char *socket_path = DEFAULT_SOCKET;
-
-extern int confirm_sock;
-extern char confirm_sock_name[256];
-
-static struct option const long_options[] = {
- { "help", no_argument, 0, 'h' },
- { "version", no_argument, 0, 'V' },
- { "verbose", no_argument, 0, 'v' },
- { "debug", no_argument, 0, 'd' },
- { "port", required_argument, 0, 'p' },
- { "file-prefix", required_argument, 0, 'f' },
- { "cert", required_argument, 0, 'c' },
- { "key", required_argument, 0, 'k' },
- { "CAdir", required_argument, 0, 'C' },
- { "socket",required_argument, 0, 's' },
- { "noAuth", no_argument, 0, 'x' },
- { "noIPC", no_argument, 0, 'y' },
- { "noParse", no_argument, 0, 'z' },
- { NULL, 0, NULL, 0}
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * usage - print usage
- *
- *----------------------------------------------------------------------
- */
-
-static void
-usage(char *program_name) {
- fprintf(stdout,"%s\n"
- "- collect events from logging API calls,\n"
- "- save them to files and\n"
- "- send them to inter-logger\n\n"
- "Usage: %s [option]\n"
- "-h, --help display this help and exit\n"
- "-V, --version output version information and exit\n"
- "-d, --debug do not run as daemon\n"
- "-v, --verbose print extensive debug output\n"
- "-p, --port <num> port to listen\n"
- "-f, --file-prefix <prefix> path and prefix for event files\n"
- "-c, --cert <file> location of server certificate\n"
- "-k, --key <file> location of server private key\n"
- "-C, --CAdir <dir> directory containing CA certificates\n"
- "-s, --socket <dir> interlogger's socket to send messages to\n"
- "--noAuth do not check caller's identity\n"
- "--noIPC do not send messages to inter-logger\n"
- "--noParse do not parse messages for correctness\n",
- program_name,program_name);
-}
-
-static sighandler_t mysignal(int num,sighandler_t handler)
-{
- struct sigaction sa,osa;
-
- memset(&sa,0,sizeof(sa));
- sa.sa_handler = handler;
- sa.sa_flags = SA_RESTART;
- return sigaction(num,&sa,&osa) ? SIG_ERR : osa.sa_handler;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * handle_signal -
- * USR1 - increase the verbosity of the program
- * USR2 - decrease the verbosity of the program
- *
- *----------------------------------------------------------------------
- */
-void handle_signal(int num) {
- if (num != SIGCHLD) edg_wll_ll_log(LOG_NOTICE,"Received signal %d\n", num);
- switch (num) {
- case SIGUSR1:
- if (edg_wll_ll_log_level < LOG_DEBUG) edg_wll_ll_log_level++;
- edg_wll_ll_log(LOG_NOTICE,"Logging level is now %d\n", edg_wll_ll_log_level);
- break;
- case SIGUSR2:
- if (edg_wll_ll_log_level > LOG_EMERG) edg_wll_ll_log_level--;
- edg_wll_ll_log(LOG_NOTICE,"Logging level is now %d\n", edg_wll_ll_log_level);
- break;
- case SIGPIPE:
- edg_wll_ll_log(LOG_NOTICE,"Broken pipe, lost communication channel.\n");
- break;
- case SIGCHLD:
- while (wait3(NULL,WNOHANG,NULL) > 0);
- break;
- case SIGINT:
- case SIGTERM:
- case SIGQUIT:
- if (confirm_sock) {
- edg_wll_ll_log(LOG_NOTICE,"Closing confirmation socket.\n");
- close(confirm_sock);
- unlink(confirm_sock_name);
- }
- exit(1);
- break;
- default: break;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * doit - do all the dirty work
- *
- *----------------------------------------------------------------------
- */
-static int
-doit(int socket, gss_cred_id_t cred_handle, char *file_name_prefix, int noipc, int noparse)
-{
- char *subject;
- int ret,fd,count;
- struct timeval timeout;
- edg_wll_GssConnection con;
- edg_wll_GssStatus gss_stat;
- gss_buffer_desc gss_token = GSS_C_EMPTY_BUFFER;
- gss_name_t client_name = GSS_C_NO_NAME;
- OM_uint32 min_stat;
- gss_OID name_type = GSS_C_NO_OID;
- fd_set fdset;
-
- ret = count = 0;
- FD_ZERO(&fdset);
-
- /* accept */
- timeout.tv_sec = ACCEPT_TIMEOUT;
- timeout.tv_usec = 0;
- edg_wll_ll_log(LOG_DEBUG,"Accepting connection (remaining timeout %d.%06d sec)\n",
- (int)timeout.tv_sec, (int) timeout.tv_usec);
- if ((ret = edg_wll_gss_accept(cred_handle,socket,&timeout,&con, &gss_stat)) < 0) {
- edg_wll_ll_log(LOG_DEBUG,"timeout after gss_accept is %d.%06d sec\n",
- (int)timeout.tv_sec, (int) timeout.tv_usec);
- return edg_wll_log_proto_server_failure(ret,&gss_stat,"edg_wll_gss_accept() failed\n");
- }
-
- /* authenticate */
- edg_wll_ll_log(LOG_INFO,"Processing authentication:\n");
- gss_stat.major_status = gss_inquire_context(&gss_stat.minor_status, con.context,
- &client_name, NULL, NULL, NULL, NULL,
- NULL, NULL);
- if (GSS_ERROR(gss_stat.major_status)) {
- char *gss_err;
- edg_wll_gss_get_error(&gss_stat, "Cannot read client identification", &gss_err);
- edg_wll_ll_log(LOG_WARNING, "%s\n", gss_err);
- free(gss_err);
- } else {
- gss_stat.major_status = gss_display_name(&gss_stat.minor_status, client_name,
- &gss_token, &name_type);
- if (GSS_ERROR(gss_stat.major_status)) {
- char *gss_err;
- edg_wll_gss_get_error(&gss_stat, "Cannot process client identification", &gss_err);
- edg_wll_ll_log(LOG_WARNING, "%s\n", gss_err);
- free(gss_err);
- }
- }
-
- if (GSS_ERROR(gss_stat.major_status) || edg_wll_gss_oid_equal(name_type, GSS_C_NT_ANONYMOUS)) {
- edg_wll_ll_log(LOG_INFO," User not authenticated, setting as \"%s\". \n",EDG_WLL_LOG_USER_DEFAULT);
- subject=strdup(EDG_WLL_LOG_USER_DEFAULT);
- } else {
- edg_wll_ll_log(LOG_INFO," User successfully authenticated as:\n");
- edg_wll_ll_log(LOG_INFO, " %s\n", (char *)gss_token.value);
- subject=gss_token.value;
- memset(&gss_token.value, 0, sizeof(gss_token.value));
- }
-
- /* get and process the data */
- timeout.tv_sec = CONNECTION_TIMEOUT;
- timeout.tv_usec = 0;
-
- while (timeout.tv_sec > 0) {
- count++;
- edg_wll_ll_log(LOG_DEBUG,"Waiting for data delivery no. %d (remaining timeout %d.%06d sec)\n",
- count, (int)timeout.tv_sec, (int) timeout.tv_usec);
- FD_SET(con.sock,&fdset);
- fd = select(con.sock+1,&fdset,NULL,NULL,&timeout);
- switch (fd) {
- case 0: /* timeout */
- edg_wll_ll_log(LOG_DEBUG,"Connection timeout expired\n");
- timeout.tv_sec = 0;
- break;
- case -1: /* error */
- switch(errno) {
- case EINTR:
- edg_wll_ll_log(LOG_DEBUG,"XXX: Waking up (remaining timeout %d.%06d sec)\n",
- (int)timeout.tv_sec, (int) timeout.tv_usec);
- continue;
- default:
- SYSTEM_ERROR("select");
- timeout.tv_sec = 0;
- break;
- }
- break;
- default:
- edg_wll_ll_log(LOG_DEBUG,"Waking up (remaining timeout %d.%06d sec)\n",
- (int)timeout.tv_sec, (int) timeout.tv_usec);
- break;
- }
- if (FD_ISSET(con.sock,&fdset)) {
- ret = edg_wll_log_proto_server(&con,&timeout,subject,file_name_prefix,noipc,noparse);
- if (ret != 0) {
- edg_wll_ll_log(LOG_DEBUG,"timeout after edg_wll_log_proto_server is %d.%06d sec\n",
- (int)timeout.tv_sec, (int) timeout.tv_usec);
- if (ret != EDG_WLL_GSS_ERROR_EOF)
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): Error\n");
- else if (count == 1)
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): Error. EOF occured.\n");
- timeout.tv_sec = 0;
- timeout.tv_usec = 0;
- break;
- } else {
- timeout.tv_sec = CONNECTION_TIMEOUT;
- timeout.tv_usec = 0;
- }
- }
-
- }
-
-doit_end:
- edg_wll_ll_log(LOG_DEBUG, "Closing descriptor '%d'...",con.sock);
- edg_wll_gss_close(&con, NULL);
- if (con.sock == -1)
- edg_wll_ll_log(LOG_DEBUG, "o.k.\n");
- if (subject) free(subject);
- if (gss_token.length)
- gss_release_buffer(&min_stat, &gss_token);
- if (client_name != GSS_C_NO_NAME)
- gss_release_name(&min_stat, &client_name);
- return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Main -
- *
- *----------------------------------------------------------------------
- */
-int main(int argc, char *argv[])
-{
- int ret;
- int childpid;
- int opt;
-
- int listener_fd;
- int client_fd;
- struct sockaddr_in client_addr;
- int client_addr_len;
-
- char *my_subject_name = NULL;
-
- time_t cert_mtime = 0, key_mtime = 0;
- OM_uint32 min_stat;
- edg_wll_GssStatus gss_stat;
- gss_cred_id_t cred = GSS_C_NO_CREDENTIAL;
-
-
- setlinebuf(stdout);
- setlinebuf(stderr);
-
- /* welcome */
- fprintf(stdout,"\
-This is LocalLogger, part of Workload Management System in EU DataGrid & EGEE.\n");
-
- /* get arguments */
- while ((opt = getopt_long(argc,argv,
- "h" /* help */
- "V" /* version */
- "v" /* verbose */
- "d" /* debug */
- "p:" /* port */
- "f:" /* file prefix */
- "c:" /* certificate */
- "k:" /* key */
- "C:" /* CA dir */
- "s:" /* socket */
- "x" /* noAuth */
- "y" /* noIPC */
- "z", /* noParse */
- long_options, (int *) 0)) != EOF) {
-
- switch (opt) {
- case 'V': fprintf(stdout,"%s:\t%s\n",argv[0],rcsid); exit(0);
- case 'v': verbose = 1; break;
- case 'd': debug = 1; break;
- case 'p': port = atoi(optarg); break;
- case 'f': prefix = optarg; break;
- case 'c': cert_file = optarg; break;
- case 'k': key_file = optarg; break;
- case 'C': CAcert_dir = optarg; break;
- case 's': socket_path = optarg; break;
- case 'x': noAuth = 1; break;
- case 'y': noIPC = 1; break;
- case 'z': noParse = 1; break;
- case 'h':
- default:
- usage(argv[0]); exit(0);
- }
- }
-#ifdef LB_PERF
- edg_wll_ll_log_init(verbose ? LOG_INFO : LOG_ERR);
-#else
- edg_wll_ll_log_init(verbose ? LOG_DEBUG : LOG_INFO);
-#endif
- edg_wll_ll_log(LOG_INFO,"Initializing...\n");
-
- /* check noParse */
- if (noParse) {
- edg_wll_ll_log(LOG_INFO,"Parse messages for correctness... [no]\n");
- } else {
- edg_wll_ll_log(LOG_INFO,"Parse messages for correctness... [yes]\n");
- }
-
- /* check noIPC */
- if (noIPC) {
- edg_wll_ll_log(LOG_INFO,"Send messages also to inter-logger... [no]\n");
- } else {
- edg_wll_ll_log(LOG_INFO,"Send messages also to inter-logger... [yes]\n");
- }
-
- /* check prefix correctness */
- if (strlen(prefix) > FILENAME_MAX - 34) {
- edg_wll_ll_log(LOG_CRIT,"Too long prefix (%s) for file names, would not be able to write to log files. Exiting.\n",prefix);
- exit(1);
- }
- /* TODO: check for write permisions */
- edg_wll_ll_log(LOG_INFO,"Messages will be stored with the filename prefix \"%s\".\n",prefix);
-
- if (CAcert_dir)
- setenv("X509_CERT_DIR", CAcert_dir, 1);
-
- /* initialize Globus common module */
-/* XXX: obsolete?
- edg_wll_ll_log(LOG_INFO,"Initializing Globus common module...");
- if (globus_module_activate(GLOBUS_COMMON_MODULE) != GLOBUS_SUCCESS) {
- edg_wll_ll_log(LOG_NOTICE,"no.\n");
- edg_wll_ll_log(LOG_CRIT, "Failed to initialize Globus common module. Exiting.\n");
- exit(1);
- } else {
- edg_wll_ll_log(LOG_INFO,"yes.\n");
- }
-*/
-
- /* initialize signal handling */
- if (mysignal(SIGUSR1, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
- if (mysignal(SIGUSR2, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
- if (mysignal(SIGPIPE, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
- if (mysignal(SIGHUP, SIG_DFL) == SIG_ERR) { perror("signal"); exit(1); }
- if (mysignal(SIGINT, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
- if (mysignal(SIGQUIT, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
- if (mysignal(SIGTERM, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
- if (mysignal(SIGCHLD, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-
-#ifdef LB_PERF
- glite_wll_perftest_init(NULL, NULL, NULL, NULL, 0);
-#endif
-
- edg_wll_gss_watch_creds(cert_file,&cert_mtime);
- /* XXX DK: support noAuth */
- ret = edg_wll_gss_acquire_cred_gsi(cert_file, key_file, &cred, &my_subject_name,
- &gss_stat);
- if (ret) {
- /* XXX DK: call edg_wll_gss_get_error() */
- edg_wll_ll_log(LOG_CRIT,"Failed to get GSI credentials. Exiting.\n");
- exit(1);
- }
-
- if (my_subject_name!=NULL) {
- edg_wll_ll_log(LOG_INFO,"Server running with certificate: %s\n",my_subject_name);
- free(my_subject_name);
- } else if (noAuth) {
- edg_wll_ll_log(LOG_INFO,"Server running without certificate\n");
-#if 0
- /* XXX DK: */
- } else {
- edg_wll_ll_log(LOG_CRIT,"No server credential found. Exiting.\n");
- exit(1);
-#endif
- }
-
- /* do listen */
- edg_wll_ll_log(LOG_INFO,"Listening on port %d\n",port);
- listener_fd = do_listen(port);
- if (listener_fd == -1) {
- edg_wll_ll_log(LOG_CRIT,"Failed to listen on port %d\n",port);
- gss_release_cred(&min_stat, &cred);
- exit(-1);
- } else {
- edg_wll_ll_log(LOG_DEBUG,"Listener's socket descriptor is '%d'\n",listener_fd);
- }
-
- client_addr_len = sizeof(client_addr);
- bzero((char *) &client_addr, client_addr_len);
-
- /* daemonize */
- if (debug) {
- edg_wll_ll_log(LOG_INFO,"Running as daemon... [no]\n");
- } else {
- edg_wll_ll_log(LOG_INFO,"Running as daemon... [yes]\n");
- if (daemon(0,0) < 0) {
- edg_wll_ll_log(LOG_CRIT,"Failed to run as daemon. Exiting.\n");
- SYSTEM_ERROR("daemon");
- exit(1);
- }
- }
-
- /*
- * Main loop
- */
- while (1) {
- edg_wll_ll_log(LOG_INFO,"Accepting incomming connections...\n");
- client_fd = accept(listener_fd, (struct sockaddr *) &client_addr,
- &client_addr_len);
- if (client_fd < 0) {
- close(listener_fd);
- edg_wll_ll_log(LOG_CRIT,"Failed to accept incomming connections\n");
- SYSTEM_ERROR("accept");
- gss_release_cred(&min_stat, &cred);
- exit(-1);
- } else {
- edg_wll_ll_log(LOG_DEBUG,"Incomming connection on socket '%d'\n",client_fd);
- }
-
- switch (edg_wll_gss_watch_creds(cert_file,&cert_mtime)) {
- gss_cred_id_t newcred;
- case 0: break;
- case 1:
- ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file,&newcred,NULL,&gss_stat);
- if (ret) {
- edg_wll_ll_log(LOG_WARNING,"Reloading credentials failed, continue with older\n");
- } else {
- edg_wll_ll_log(LOG_INFO,"Reloading credentials\n");
- gss_release_cred(&min_stat, &cred);
- cred = newcred;
- }
- break;
- case -1:
- edg_wll_ll_log(LOG_WARNING,"edg_wll_gss_watch_creds failed\n");
- break;
- }
-
- /* FORK - change next line if fork() is not needed (for debugging for example) */
-#if 1
- if ((childpid = fork()) < 0) {
- SYSTEM_ERROR("fork");
- if (client_fd) close(client_fd);
- }
- if (childpid == 0) {
- ret = doit(client_fd,cred,prefix,noIPC,noParse);
- if (client_fd) close(client_fd);
- }
- if (childpid > 0) {
- edg_wll_ll_log(LOG_DEBUG,"Forked a new child with PID %d\n",childpid);
- if (client_fd) close(client_fd);
- }
-#else
- ret = doit(client_fd,cred,prefix,noIPC,noParse);
- if (client_fd) close(client_fd);
-
-#endif
- } /* while */
-
-end:
- if (listener_fd) close(listener_fd);
- gss_release_cred(&min_stat, &cred);
- exit(ret);
-}
+++ /dev/null
-#ident "$Header$"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <string.h>
-#include <syslog.h>
-#include <fcntl.h>
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/escape.h"
-#include "glite/lb/events_parse.h"
-
-#include "logd_proto.h"
-
-static const int one = 1;
-
-extern char* socket_path;
-
-int edg_wll_ll_log_level;
-
-#define tv_sub(a,b) {\
- (a).tv_usec -= (b).tv_usec;\
- (a).tv_sec -= (b).tv_sec;\
- if ((a).tv_usec < 0) {\
- (a).tv_sec--;\
- (a).tv_usec += 1000000;\
- }\
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * send_answer_back -
- *
- *----------------------------------------------------------------------
- */
-static int send_answer_back(edg_wll_GssConnection *con, int answer, struct timeval *timeout) {
- size_t count = 0;
- int err = 0;
- int ans = answer;
- u_int8_t ans_end[4];
- edg_wll_GssStatus gss_stat;
-
- edg_wll_ll_log(LOG_INFO,"Sending answer \"%d\" back to client...",answer);
- ans_end[0] = ans & 0xff; ans >>= 8;
- ans_end[1] = ans & 0xff; ans >>= 8;
- ans_end[2] = ans & 0xff; ans >>= 8;
- ans_end[3] = ans;
- if ((err = edg_wll_gss_write_full(con,ans_end,4,timeout,&count, &gss_stat)) < 0 ) {
- edg_wll_ll_log(LOG_INFO,"error.\n");
- return edg_wll_log_proto_server_failure(err,&gss_stat,"Error sending answer");
- } else {
- edg_wll_ll_log(LOG_INFO,"o.k.\n");
- return 0;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * wait_for_confirmation -
- *
- * Args: timeout - number of seconds to wait, 0 => wait indefinitely
- *
- * Returns: 1 => OK, *code contains error code sent by interlogger
- * 0 => timeout expired before anything interesting happened
- * -1 => some error (see errno for details)
- *
- *----------------------------------------------------------------------
- */
-int confirm_sock;
-char confirm_sock_name[256];
-
-static
-int init_confirmation()
-{
- struct sockaddr_un saddr;
-
- /* create socket */
- if((confirm_sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
- SYSTEM_ERROR("socket");
- edg_wll_ll_log(LOG_ERR,"init_confirmation(): error creating socket\n");
- return(-1);
- }
-
- /* set the socket parameters */
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, confirm_sock_name);
-
- /* bind the socket */
- if(bind(confirm_sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
- SYSTEM_ERROR("bind");
- edg_wll_ll_log(LOG_ERR,"init_confirmation(): error binding socket\n");
- close(confirm_sock);
- unlink(confirm_sock_name);
- return(-1);
- }
-
- /* and listen */
- if(listen(confirm_sock, 5) < 0) {
- SYSTEM_ERROR("listen");
- edg_wll_ll_log(LOG_ERR,"init_confirmation(): error listening on socket\n");
- close(confirm_sock);
- unlink(confirm_sock_name);
- return(-1);
- }
-
- return(0);
-}
-
-
-int wait_for_confirmation(struct timeval *timeout, int *code)
-{
- fd_set fds;
- struct timeval to,before,after;
- int ret = 0, tmp = 0;
-
- *code = 0;
-
- FD_ZERO(&fds);
- FD_SET(confirm_sock, &fds);
-
- /* set timeout */
- if (timeout) {
- memcpy(&to,timeout,sizeof to);
- gettimeofday(&before,NULL);
- }
-
- /* wait for confirmation at most timeout seconds */
- if ((tmp=select(confirm_sock+1, &fds, NULL, NULL, timeout?&to:NULL)) < 0) {
- SYSTEM_ERROR("select");
- edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error selecting socket\n");
- ret = -1;
- } else {
- if (tmp == 0)
- ret = 0;
- else {
- int nsd = accept(confirm_sock, NULL, NULL);
- ret = 1;
- if(nsd < 0) {
- SYSTEM_ERROR("accept");
- edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error accepting a connection on a socket\n");
- ret = -1;
- } else {
- if(recv(nsd, code, sizeof(*code), MSG_NOSIGNAL) < 0) {
- SYSTEM_ERROR("recv");
- edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error receiving a message from a socket\n");
- ret = -1;
- }
- close(nsd);
- }
- }
- }
- close(confirm_sock);
- unlink(confirm_sock_name);
- if (timeout) {
- gettimeofday(&after,NULL);
- tv_sub(after,before);
- tv_sub(*timeout,after);
- if (timeout->tv_sec < 0) {
- timeout->tv_sec = 0;
- timeout->tv_usec = 0;
- }
- }
- return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * do_listen - listen on given port
- *
- * Returns: socket handle or -1 if something fails
- *
- * Calls: socket, bind, listen
- *
- * Algorithm:
- *
- *----------------------------------------------------------------------
- */
-int do_listen(int port)
-{
- int ret;
- int sock;
- struct sockaddr_in my_addr;
-
- memset(&my_addr, 0, sizeof(my_addr));
- my_addr.sin_family = AF_INET;
- my_addr.sin_addr.s_addr = INADDR_ANY;
- my_addr.sin_port = htons(port);
-
- sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock == -1) {
- SYSTEM_ERROR("socket");
- edg_wll_ll_log(LOG_ERR,"do_listen(): error creating socket\n");
- return -1;
- }
-
- setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
- ret = bind(sock, (struct sockaddr *)&my_addr, sizeof(my_addr));
- if (ret == -1) {
- SYSTEM_ERROR("bind");
- edg_wll_ll_log(LOG_ERR,"do_listen(): error binding socket\n");
- return -1;
- }
-
- ret = listen(sock, 5);
- if (ret == -1) {
- SYSTEM_ERROR("listen");
- edg_wll_ll_log(LOG_ERR,"do_listen(): error listening on socket\n");
- close(sock);
- return -1;
- }
-
- return sock;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_log_proto_server - handle incoming data
- *
- * Returns: 0 if done properly or errno
- *
- * Calls:
- *
- * Algorithm:
- *
- *----------------------------------------------------------------------
- */
-int edg_wll_log_proto_server(edg_wll_GssConnection *con, struct timeval *timeout, char *name, char *prefix, int noipc, int noparse)
-{
- char *buf,*dglllid,*dguser,*jobId,*name_esc;
- char header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1];
- char outfilename[FILENAME_MAX];
- size_t count;
- int count_total,size;
- u_int8_t size_end[4];
- size_t msg_size,dglllid_size,dguser_size;
- int i,answer,answer_sent;
- int msg_sock;
- char *msg,*msg_begin;
- FILE *outfile;
- int filedesc,filelock_status,flags;
- long filepos;
- struct flock filelock;
- int priority;
- long lllid;
- int unique;
- int err;
- edg_wll_Context context;
- edg_wll_Event *event;
- edg_wlc_JobId j;
- edg_wll_GssStatus gss_stat;
-
- errno = i = answer = answer_sent = size = msg_size = dglllid_size = dguser_size = count = count_total = msg_sock = filedesc = filelock_status = /* priority */ unique = err = 0;
- buf = dglllid = dguser = jobId = name_esc = msg = msg_begin = NULL;
- event = NULL;
-
- /* init */
- if (edg_wll_InitContext(&context) != 0) {
- edg_wll_ll_log(LOG_ERR,"edg_wll_InitContex(): error.\n");
- answer = ENOMEM;
- goto edg_wll_log_proto_server_end;
- }
- if (edg_wll_ResetError(context) != 0) {
- edg_wll_ll_log(LOG_ERR,"edg_wll_ResetError(): error.\n");
- answer = ENOMEM;
- goto edg_wll_log_proto_server_end;
- }
-
- /* look for the unique unused long local-logger id (LLLID) */
- lllid = 1000*getpid();
- for (i=0; (i<1000)&&(!unique); i++) {
- lllid += i;
- snprintf(confirm_sock_name, sizeof(confirm_sock_name), "/tmp/dglogd_sock_%ld", lllid);
- if ((filedesc = open(confirm_sock_name,O_CREAT)) == -1) {
- if (errno == EEXIST) {
- edg_wll_ll_log(LOG_WARNING,"Warning: LLLID %ld already in use.\n",lllid);
- } else {
- SYSTEM_ERROR("open");
- }
- } else {
- unique = 1;
- close(filedesc); filedesc = 0;
- unlink(confirm_sock_name);
- }
- }
- if (!unique) {
- edg_wll_ll_log(LOG_ERR,"Cannot determine the unique long local-logger id (LLLID)!\n",lllid);
- return EAGAIN;
- }
- edg_wll_ll_log(LOG_INFO,"Long local-logger id (LLLID): %ld\n",lllid);
-
- /* receive socket header */
- edg_wll_ll_log(LOG_INFO,"Reading socket header...");
- memset(header, 0, EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1);
- if ((err = edg_wll_gss_read_full(con, header, EDG_WLL_LOG_SOCKET_HEADER_LENGTH, timeout, &count, &gss_stat)) < 0) {
- if (err == EDG_WLL_GSS_ERROR_EOF) {
- edg_wll_ll_log(LOG_INFO,"no data available.\n");
- answer = err;
- answer_sent = 1; /* i.e. do not try to send answer back */
- } else {
- edg_wll_ll_log(LOG_INFO,"error.\n");
- answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving header");
- }
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_INFO,"o.k.\n");
- }
-
- edg_wll_ll_log(LOG_DEBUG,"Checking socket header...");
- header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH] = '\0';
- if (strncmp(header,EDG_WLL_LOG_SOCKET_HEADER,EDG_WLL_LOG_SOCKET_HEADER_LENGTH)) {
- /* not the proper socket header text */
- edg_wll_ll_log(LOG_DEBUG,"error.\n");
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): invalid socket header\n");
- edg_wll_ll_log(LOG_DEBUG,"edg_wll_log_proto_server(): read header '%s' instead of '%s'\n",
- header,EDG_WLL_LOG_SOCKET_HEADER);
- answer = EINVAL;
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
- }
-
-/* XXX: obsolete
- edg_wll_ll_log(LOG_DEBUG,"Reading message priority...");
- count = 0;
- if ((err = edg_wll_gss_read_full(con, &priority, sizeof(priority), timeout, &count, &gss_stat)) < 0) {
- edg_wll_ll_log(LOG_DEBUG,"error.\n");
- answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving message priority");
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
- }
-*/
-
- edg_wll_ll_log(LOG_DEBUG,"Reading message size...");
- count = 0;
- if ((err = edg_wll_gss_read_full(con, size_end, 4, timeout, &count,&gss_stat)) < 0) {
- edg_wll_ll_log(LOG_DEBUG,"error.\n");
- answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving message size");
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
- }
- size = size_end[3]; size <<=8;
- size |= size_end[2]; size <<=8;
- size |= size_end[1]; size <<=8;
- size |= size_end[0];
- edg_wll_ll_log(LOG_DEBUG,"Checking message size...");
- if (size <= 0) {
- edg_wll_ll_log(LOG_DEBUG,"error.\n");
- /* probably wrong size in the header or nothing to read */
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): invalid size read from socket header\n");
- edg_wll_ll_log(LOG_DEBUG,"Read size '%d'.\n",size);
- answer = EINVAL;
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
- edg_wll_ll_log(LOG_DEBUG,"- Size read from header: %d bytes.\n",size);
- }
-
- /* format the DG.LLLID string */
- if (asprintf(&dglllid,"DG.LLLID=%ld ",lllid) == -1) {
- SYSTEM_ERROR("asprintf");
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): nomem for DG.LLLID\n");
- answer = ENOMEM;
- goto edg_wll_log_proto_server_end;
- }
- dglllid_size = strlen(dglllid);
-
- /* format the DG.USER string */
- name_esc = edg_wll_LogEscape(name);
- if (asprintf(&dguser,"DG.USER=\"%s\" ",name_esc) == -1) {
- SYSTEM_ERROR("asprintf");
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): nomem for DG.USER\n");
- answer = ENOMEM;
- goto edg_wll_log_proto_server_end;
- }
- dguser_size = strlen(dguser);
-
- /* allocate enough memory for all data */
- msg_size = dglllid_size + dguser_size + size + 1;
- if ((msg = malloc(msg_size)) == NULL) {
- SYSTEM_ERROR("malloc");
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): out of memory for allocating message\n");
- answer = ENOMEM;
- goto edg_wll_log_proto_server_end;
- }
- strncpy(msg,dglllid,dglllid_size);
- msg_begin = msg + dglllid_size; // this is the "official" beginning of the message
- strncpy(msg_begin,dguser,dguser_size);
-
- /* receive message */
- edg_wll_ll_log(LOG_INFO,"Reading message from socket...");
- buf = msg_begin + dguser_size;
- count = 0;
- if ((err = edg_wll_gss_read_full(con, buf, size, timeout, &count, &gss_stat)) < 0) {
- edg_wll_ll_log(LOG_INFO,"error.\n");
- answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving message");
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_INFO,"o.k.\n");
- }
-
- if (buf[count] != '\0') buf[count] = '\0';
-
- /* parse message and get jobId and priority from it */
- if (!noparse && strstr(msg, "DG.TYPE=\"command\"") == NULL) {
- edg_wll_ll_log(LOG_INFO,"Parsing message for correctness...");
- if (edg_wll_ParseEvent(context,msg_begin,&event) != 0) {
- edg_wll_ll_log(LOG_INFO,"error.\n");
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): edg_wll_ParseEvent error\n");
- edg_wll_ll_log(LOG_ERR,"edg_wll_ParseEvent(): %s\n",context->errDesc);
- answer = edg_wll_Error(context,NULL,NULL);
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_INFO,"o.k.\n");
- }
- edg_wll_ll_log(LOG_DEBUG,"Getting jobId from message...");
- jobId = edg_wlc_JobIdGetUnique(event->any.jobId);
- priority = event->any.priority;
- edg_wll_FreeEvent(event);
- event->any.priority = priority;
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
- } else {
- if ((event = edg_wll_InitEvent(EDG_WLL_EVENT_UNDEF)) == NULL) {
- edg_wll_ll_log(LOG_ERR, "edg_wll_InitEvent(): out of memory\n");
- answer = ENOMEM;
- goto edg_wll_log_proto_server_end;
- }
- edg_wll_ll_log(LOG_DEBUG,"Getting jobId from message...");
- jobId = edg_wll_GetJobId(msg);
- if (!jobId || edg_wlc_JobIdParse(jobId,&j)) {
- edg_wll_ll_log(LOG_DEBUG,"error.\n");
- edg_wll_ll_log(LOG_ERR,"ParseJobId(%s)\n",jobId?jobId:"NULL");
- answer = EINVAL;
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
- }
- free(jobId);
- jobId = edg_wlc_JobIdGetUnique(j);
- edg_wlc_JobIdFree(j);
-
-/* TODO: get the priority from message some better way */
- if (strstr(msg, "DG.PRIORITY=1") != NULL)
- event->any.priority = 1;
- else event->any.priority = 0;
- }
-
-
- /* if not command, save message to file */
- if(strstr(msg, "DG.TYPE=\"command\"") == NULL) {
- /* compose the name of the log file */
-// edg_wll_ll_log(LOG_DEBUG,"Composing filename from prefix \"%s\" and unique jobId \"%s\"...",prefix,jobId);
- count = strlen(prefix);
- strncpy(outfilename,prefix,count); count_total=count;
- strncpy(outfilename+count_total,".",1); count_total+=1; count=strlen(jobId);
- strncpy(outfilename+count_total,jobId,count); count_total+=count;
- outfilename[count_total]='\0';
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-
- /* fopen and properly handle the filelock */
-#ifdef LOGD_NOFILE
- edg_wll_ll_log(LOG_NOTICE,"NOT writing message to \"%s\".\n",outfilename);
- filepos = 0;
-#else
- edg_wll_ll_log(LOG_INFO,"Writing message to \"%s\"...",outfilename);
- if ( edg_wll_log_event_write(context, outfilename, msg, FCNTL_ATTEMPTS, FCNTL_TIMEOUT, &filepos) ) {
- char *errd;
- SYSTEM_ERROR("edg_wll_log_event_write");
- answer = edg_wll_Error(context, NULL, &errd);
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_event_write error: %s\n",errd);
- free(errd);
- goto edg_wll_log_proto_server_end;
- } else edg_wll_ll_log(LOG_INFO,"o.k.\n");
-#endif
- } else {
- filepos = 0;
- }
-
-#ifdef LB_PERF
- edg_wll_ll_log(LOG_INFO,"Calling perftest\n");
- glite_wll_perftest_consumeEventString(msg);
- edg_wll_ll_log(LOG_INFO,"o.k.\n");
-#endif
-
- /* if not priority send now the answer back to client */
- if (!event->any.priority) {
- if (!send_answer_back(con,answer,timeout)) {
- answer_sent = 1;
- }
- }
-
- /* send message via IPC (UNIX socket) */
- if (!noipc) {
- if (event->any.priority) {
- edg_wll_ll_log(LOG_DEBUG,"Initializing 2nd UNIX socket (%s) for priority messages confirmation...",confirm_sock_name);
- if(init_confirmation() < 0) {
- edg_wll_ll_log(LOG_DEBUG,"error.\n");
- answer = errno;
- goto edg_wll_log_proto_server_end;
- } else {
- edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
- }
- }
-
- edg_wll_ll_log(LOG_DEBUG,
- "Sending via IPC (UNIX socket \"%s\")\n\t"
- "the message position %ld (%d bytes)",
- socket_path, filepos, sizeof(filepos));
- if ( edg_wll_log_event_send(context, socket_path, filepos, msg, msg_size, CONNECT_ATTEMPTS, timeout) ) {
- char *errd;
- SYSTEM_ERROR("edg_wll_log_event_send");
- answer = edg_wll_Error(context, NULL, &errd);
- edg_wll_ll_log(LOG_ERR,"edg_wll_log_event_send error: %s\n",errd);
- free(errd);
- goto edg_wll_log_proto_server_end_1;
- } else edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-
- if (event->any.priority) {
- edg_wll_ll_log(LOG_INFO,"Waiting for confirmation...");
- if ((count = wait_for_confirmation(timeout, &answer)) < 0) {
- edg_wll_ll_log(LOG_INFO,"error.\n");
- edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error.\n");
- answer = errno;
- } else {
- edg_wll_ll_log(LOG_INFO,"o.k.\n");
- if (count == 0) {
- edg_wll_ll_log(LOG_DEBUG,"Waking up, timeout expired.\n");
- answer = EAGAIN;
- } else {
- edg_wll_ll_log(LOG_DEBUG,"Confirmation received, waking up.\n");
- }
- }
- }
- } else {
- edg_wll_ll_log(LOG_DEBUG,"NOT sending via IPC.\n");
- }
-
-edg_wll_log_proto_server_end:
- /* if not sent already, send the answer back to client */
- if (!answer_sent) {
- answer = send_answer_back(con,answer,timeout);
- }
- /* clean */
- edg_wll_FreeContext(context);
- if (name_esc) free(name_esc);
- if (dglllid) free(dglllid);
- if (dguser) free(dguser);
- if (jobId) free(jobId);
- if (msg) free(msg);
- if (event) free(event);
-
-// edg_wll_ll_log(LOG_INFO,"Done.\n");
-
- return answer;
-
-edg_wll_log_proto_server_end_1:
- if (event->any.priority) {
- close(confirm_sock);
- unlink(confirm_sock_name);
- }
- goto edg_wll_log_proto_server_end;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_log_proto_server_failure - handle protocol failures on the server side
- *
- * Returns: errno
- *
- *----------------------------------------------------------------------
- */
-int edg_wll_log_proto_server_failure(int code, edg_wll_GssStatus *gss_code, const char *text)
-{
- const char *func = "edg_wll_log_proto_server()";
- int ret = 0;
-
- if(code>0) {
- return(0);
- }
- switch(code) {
- case EDG_WLL_GSS_ERROR_EOF:
- edg_wll_ll_log(LOG_ERR,"%s: %s, EOF occured\n", func, text);
- ret = EAGAIN;
- break;
- case EDG_WLL_GSS_ERROR_TIMEOUT:
- edg_wll_ll_log(LOG_ERR,"%s: %s, timeout expired\n", func, text);
- ret = EAGAIN;
- break;
- case EDG_WLL_GSS_ERROR_ERRNO:
- SYSTEM_ERROR(func);
- edg_wll_ll_log(LOG_ERR,"%s: %s, system error occured\n", func, text);
- ret = EAGAIN;
- break;
- case EDG_WLL_GSS_ERROR_GSS:
- {
- char *gss_err;
-
- edg_wll_gss_get_error(gss_code, "GSS error occured", &gss_err);
- edg_wll_ll_log(LOG_ERR,"%s: %s, %s\n", func, text, gss_err);
- free(gss_err);
- ret = EAGAIN;
- break;
- }
- default:
- edg_wll_ll_log(LOG_ERR,"%s: %s, unknown error occured\n");
- break;
- }
- return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_ll_log_init - initialize the logging level
- *
- *----------------------------------------------------------------------
- */
-void edg_wll_ll_log_init(int level) {
- edg_wll_ll_log_level = level;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_ll_log - print to stderr according to logging level
- * serious messages are also written to syslog
- *
- *----------------------------------------------------------------------
- */
-void edg_wll_ll_log(int level, const char *fmt, ...) {
- char *err_text;
- va_list fmt_args;
-
- va_start(fmt_args, fmt);
- vasprintf(&err_text, fmt, fmt_args);
- va_end(fmt_args);
-
- if(level <= edg_wll_ll_log_level)
- fprintf(stderr, "[%d] %s", (int) getpid(), err_text);
- if(level <= LOG_ERR) {
- openlog("edg-wl-logd", LOG_PID | LOG_CONS, LOG_DAEMON);
- syslog(level, "%s", err_text);
- closelog();
- }
-
- if (err_text) free(err_text);
-}
+++ /dev/null
-#ifndef __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__
-#define __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__
-
-#ident "$Header$"
-
-/**
- * \file edg/workload/logging/locallogger/logd_proto.h
- * \brief server part of the logging protocol
- * \note private
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#include <syslog.h>
-
-#include "glite/lb/log_proto.h"
-#include "glite/security/glite_gss.h"
-
-int edg_wll_log_proto_server(edg_wll_GssConnection *con, struct timeval *timeout, char *name, char *prefix, int noipc, int noparse);
-int edg_wll_log_proto_server_failure(int code, edg_wll_GssStatus *gss_code, const char *text);
-
-#define SYSTEM_ERROR(my_err) { \
- if (errno !=0 ) \
- edg_wll_ll_log(LOG_ERR,"%s: %s\n",my_err,strerror(errno)); \
- else \
- edg_wll_ll_log(LOG_ERR,"%s\n",my_err); }
-
-/* locallogger daemon error handling */
-extern int edg_wll_ll_log_level;
-void edg_wll_ll_log_init(int level);
-void edg_wll_ll_log(int level, const char *fmt, ...);
-
-
-/* fcntl defaults */
-#define FCNTL_ATTEMPTS 5
-#define FCNTL_TIMEOUT 1
-
-/* connect defaults */
-#define CONNECT_ATTEMPTS 5
-
-/* accept defaults */
-#define ACCEPT_TIMEOUT 30
-
-/* connection defaults */
-#define CONNECTION_TIMEOUT EDG_WLL_LOG_SYNC_TIMEOUT_MAX
-
-/* locallogger daemon listen and connect functions prototypes */
-int do_listen(int port);
-int do_connect(char *hostname, int port);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__ */
+++ /dev/null
-#!/bin/bash
-
-numjobs=10
-
-# XXX - there must be better way to find stage
-if [ -z "${GLITE_LOCATION}" ]; then
- STAGEDIR=/home/michal/shared/egee/jra1-head/stage
-else
- STAGEDIR=${GLITE_LOCATION}
-fi
-
-. $STAGEDIR/sbin/perftest_common.sh
-
-DEBUG=${DEBUG:-0}
-# CONSUMER_ARGS=
-# PERFTEST_COMPONENT=
-# COMPONENT_ARGS=
-#LOGJOBS_ARGS=""
-
-check_test_files || exit 1
-
-COMM_ARGS="-s /tmp/interlogger.perftest --file-prefix=/tmp/perftest.log"
-
-#TEST_GROUP=
-#TEST_VARIANT=
-
-SILENT=0
-while getopts "G:t:n:s" OPTION
-do
- case "$OPTION" in
- "G") TEST_GROUP=$OPTARG
- ;;
-
- "t") TEST_VARIANT=$OPTARG
- ;;
-
- "n") numjobs=$OPTARG
- ;;
-
- "s") SILENT=1
- ;;
-
- esac
-done
-
-
-group_a ()
-{
-if [[ $SILENT -eq 0 ]]
-then
-echo "-------------------------------------------"
-echo "Logging test:"
-echo " - events sent through IPC and/or files"
-echo " - events discarded by IL immediately"
-echo "-------------------------------------------"
-echo "a) events sent only by IPC"
-echo "b) events stored to files and sent by IPC"
-echo ""
-fi
-
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf-empty
-CONSUMER_ARGS="-d $COMM_ARGS"
-}
-
-group_a_test_a ()
-{
- LOGJOBS_ARGS="--nofile $COMM_ARGS"
- echo -n "a)"
- run_test il $numjobs
- print_result
-}
-
-group_a_test_b () {
- LOGJOBS_ARGS=" $COMM_ARGS"
- echo -n "b)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-
-
-# echo "--------------------------------"
-# echo "Interlogger test:"
-# echo " - events sent through IPC only"
-# echo " - events discarded in IL"
-# echo "--------------------------------"
-# echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-# echo "b) disabled event synchronization from files"
-# echo "c) disabled recovery thread"
-# echo "d) lazy bkserver connection close"
-# echo "e) normal operation"
-# echo ""
-# echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-
-# PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf
-# LOGJOBS_ARGS="--nofile $COMM_ARGS"
-
-# CONSUMER_ARGS="-d --nosend --noparse $COMM_ARGS"
-# echo -n "a)"
-# run_test il $numjobs
-# print_result
-
-# CONSUMER_ARGS="-d --nosend --nosync $COMM_ARGS"
-# echo -n "b)"
-# run_test il $numjobs
-# print_result
-
-# CONSUMER_ARGS="-d --nosend --norecover $COMM_ARGS"
-# echo -n "c)"
-# run_test il $numjobs
-# print_result
-
-# echo "d) this test is not yet implemented"
-
-# CONSUMER_ARGS="-d --nosend $COMM_ARGS"
-# echo -n "e)"
-# run_test il $numjobs
-# print_result
-
-
-group_b () {
-if [[ $SILENT -eq 0 ]]
-then
-echo "-----------------------------------"
-echo "Interlogger test:"
-echo " - events sent through IPC & files"
-echo " - events discarded in IL"
-echo "-----------------------------------"
-echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-echo "b) disabled event synchronization from files"
-echo "c) disabled recovery thread"
-echo "x) disabled sync and recovery"
-echo "d) lazy bkserver connection close"
-echo "e) normal operation"
-echo ""
-fi
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf
-LOGJOBS_ARGS=" $COMM_ARGS"
-}
-
-group_b_test_a ()
-{
- CONSUMER_ARGS="-d --nosend --noparse $COMM_ARGS"
- echo -n "a)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_b_test_b ()
-{
- CONSUMER_ARGS="-d --nosend --nosync $COMM_ARGS"
- echo -n "b)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_b_test_c ()
-{
- CONSUMER_ARGS="-d --nosend --norecover $COMM_ARGS"
- echo -n "c)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_b_test_x ()
-{
- CONSUMER_ARGS="-d --nosend --nosync --norecover $COMM_ARGS"
- echo -n "x)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_b_test_d ()
-{
- echo "d) this test is not applicable"
-}
-
-group_b_test_e ()
-{
- CONSUMER_ARGS="-d --nosend $COMM_ARGS"
- echo -n "e)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-# echo "-------------------------------"
-# echo "Interlogger test:"
-# echo " - events sent through IPC"
-# echo " - events consumed by empty BS"
-# echo "-------------------------------"
-# echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-# echo "b) disabled event synchronization from files"
-# echo "c) disabled recovery thread"
-# echo "d) lazy bkserver connection close"
-# echo "e) normal operation"
-# echo ""
-# echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-
-# PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-bkserverd
-# CONSUMER_ARGS="-d --perf-sink=1"
-# PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-interlogd-perf
-# LOGJOBS_ARGS="--nofile $COMM_ARGS"
-
-
-# COMPONENT_ARGS="-d --noparse $COMM_ARGS"
-# echo -n "a)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-# COMPONENT_ARGS="-d --nosync $COMM_ARGS"
-# echo -n "b)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-# COMPONENT_ARGS="-d --norecover $COMM_ARGS"
-# echo -n "c)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-# echo "d) this test is not yet implemented"
-
-# COMPONENT_ARGS="-d $COMM_ARGS"
-# echo -n "e)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-
-group_c ()
-{
-if [[ $SILENT -eq 0 ]]
-then
-echo "-----------------------------------"
-echo "Interlogger test:"
-echo " - events sent through IPC & files"
-echo " - events consumed by empty BS"
-echo "-----------------------------------"
-echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-echo "b) disabled event synchronization from files"
-echo "c) disabled recovery thread"
-echo "x) disabled sync and recovery"
-echo "d) lazy bkserver connection close"
-echo "e) normal operation"
-echo ""
-fi
-
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-bkserverd
-CONSUMER_ARGS="-d --perf-sink=1"
-PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-interlogd-perf
-LOGJOBS_ARGS=" $COMM_ARGS"
-}
-
-group_c_test_a ()
-{
- COMPONENT_ARGS="-d --noparse $COMM_ARGS"
- echo -n "a)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_c_test_b ()
-{
- COMPONENT_ARGS="-d --nosync $COMM_ARGS"
- echo -n "b)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_c_test_c ()
-{
- COMPONENT_ARGS="-d --norecover $COMM_ARGS"
- echo -n "c)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_c_test_x ()
-{
- COMPONENT_ARGS="-d --nosync --norecover $COMM_ARGS"
- echo -n "x)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_c_test_d ()
-{
- COMPONENT_ARGS="-d --lazy=10 --nosync --norecover $COMM_ARGS"
- echo -n "d)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-group_c_test_e ()
-{
- COMPONENT_ARGS="-d $COMM_ARGS"
- echo -n "e)"
- run_test il $numjobs
- print_result
- rm -f /tmp/perftest.log.*
-}
-
-
-if [[ $SILENT -eq 0 ]]
-then
- while [[ -z $TEST_GROUP ]]
- do
- echo "Choose test group:"
- echo " a) logging source tests"
- echo " b) interlogger tests"
- echo " c) interlogger with external consumer tests"
- echo -n "Your choice: "
- read TEST_GROUP
- done
-fi
-TEST_GROUP=`echo $TEST_GROUP | tr '[A-Z]' '[a-z]'`
-
-if [[ "x$TEST_GROUP" = "x*" ]]
-then
- TEST_GROUP="a b c"
-fi
-
-for group in $TEST_GROUP
-do
- group_$group
-
- if [[ $SILENT -eq 0 ]]
- then
- while [[ -z $TEST_VARIANT ]]
- do
- echo -n "Your choice: "
- read -e TEST_VARIANT
- done
- echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
- fi
-
- if [[ "x$TEST_VARIANT" = "x*" ]]
- then
- case $TEST_GROUP in
- "a") TEST_VARIANT="a b" ;;
- *) TEST_VARIANT="a b c x d e" ;;
- esac
- fi
-
- for variant in $TEST_VARIANT
- do
- group_${group}_test_${variant}
- done
-done
-
-exit;
-
+++ /dev/null
-#!/bin/bash
-
-numjobs=1
-
-# XXX - there must be better way to find stage
-if [ -z "${GLITE_LOCATION}" ]; then
- STAGEDIR=/home/michal/shared/egee/jra1-head/stage
-else
- STAGEDIR=${GLITE_LOCATION}
-fi
-
-. $STAGEDIR/sbin/perftest_common.sh
-
-SILENT=0
-while getopts "t:n:s" OPTION
-do
- case "$OPTION" in
- "t") TEST_VARIANT=$OPTARG
- ;;
-
- "n") numjobs=$OPTARG
- ;;
-
- "s") SILENT=1
- ;;
-
- esac
-done
-
-DEBUG=${DEBUG:-0}
-# CONSUMER_ARGS=
-# PERFTEST_COMPONENT=
-# COMPONENT_ARGS=
-# LOGJOBS_ARGS=""
-COMM_ARGS="--file-prefix /tmp/perftest.log -p 45678"
-export EDG_WL_LOG_DESTINATION="localhost:45678"
-
-check_test_files || exit 1
-
-group_a () {
-echo "----------------
-Locallogger test
-----------------
-a) glite-lb-logd-perf-nofile --noParse --noIPC
-b) glite-lb-logd-perf-nofile --noIPC
-c) glite-lb-logd-perf --noIPC
-d) glite-lb-logd-perf
-
-Number of jobs: $numjobs
-"
-}
-
-
-# a)
-group_a_test_a ()
-{
-echo -n "a)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf-nofile
-CONSUMER_ARGS="-d --noIPC --noParse $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-}
-
-# b)
-group_a_test_b ()
-{
-echo -n "b)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf-nofile
-CONSUMER_ARGS="-d --noIPC $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-}
-
-# c)
-group_a_test_c ()
-{
-echo -n "c)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf
-CONSUMER_ARGS="-d --noIPC $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-rm -f /tmp/perftest.log.*
-}
-
-# d)
-group_a_test_d ()
-{
-echo -n "d)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf-empty
-CONSUMER_ARGS="-d -s /tmp/perftest.sock"
-PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-logd-perf
-COMPONENT_ARGS="-d -s /tmp/perftest.sock $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-rm -f /tmp/perftest.log.*
-}
-
-group="a"
-
-group_$group
-
-if [[ $SILENT -eq 0 ]]
-then
- while [[ -z $TEST_VARIANT ]]
- do
- echo -n "Your choice: "
- read -e TEST_VARIANT
- done
- echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-fi
-
-if [[ "x$TEST_VARIANT" = "x*" ]]
-then
- TEST_VARIANT="a b c d"
-fi
-
-for variant in $TEST_VARIANT
-do
- group_${group}_test_${variant}
-done
+++ /dev/null
-#ident "$Header$"
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#include "glite/lb/consumer.h"
-
-#include "interlogd.h"
-
-struct queue_list {
- struct event_queue *queue;
- char *dest;
- struct queue_list *next;
-};
-
-static struct event_queue *log_queue;
-static struct queue_list *queues;
-
-
-static
-int
-queue_list_create()
-{
- queues = NULL;
-
- return(0);
-}
-
-
-static
-int
-queue_list_find(struct queue_list *ql, const char *dest, struct queue_list **el, struct queue_list **prev)
-{
- struct queue_list *q, *p;
-
- assert(el != NULL);
-
- *el = NULL;
- if(prev)
- *prev = NULL;
-
- if(ql == NULL)
- return(0);
-
- q = NULL;
- p = ql;
-
- while(p) {
- if(strcmp(p->dest, dest) == 0) {
- *el = p;
- if(prev)
- *prev = q;
- return(1);
- }
-
- q = p;
- p = p->next;
- };
-
- return(0);
-}
-
-
-static
-int
-queue_list_add(struct queue_list **ql, const char *dest, struct event_queue *eq)
-{
- struct queue_list *el;
-
- assert(dest != NULL);
- assert(eq != NULL);
- assert(ql != NULL);
-
- el = malloc(sizeof(*el));
- if(el == NULL) {
- set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough room for new queue");
- return(-1);
- }
-
- el->dest = strdup(dest);
- if(el->dest == NULL) {
- free(el);
- set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough memory for new queue");
- return(-1);
- }
- el->queue = eq;
- el->next = queues;
- *ql = el;
- return 0;
-}
-
-
-/*
-static
-int
-queue_list_remove(struct queue_list *el, struct queue_list *prev)
-{
- assert(el != NULL);
-
- if(prev)
- prev->next = el->next;
- else
- queues = el->next;
-
- free(el);
- return(1);
-}
-*/
-
-
-#if !defined(IL_NOTIFICATIONS)
-static
-char *
-jobid2dest(edg_wlc_JobId jobid)
-{
- char *server_name,*out;
- unsigned int server_port;
-
- if (!jobid) {
- set_error(IL_PROTO, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "jobid2dest: invalid job id");
- return(NULL);
- }
- edg_wlc_JobIdGetServerParts(jobid,&server_name,&server_port);
-
- asprintf(&out,"%s:%d",server_name,server_port);
- free(server_name);
- if(!out)
- set_error(IL_SYS, ENOMEM, "jobid2dest: error creating server name");
- return(out);
-}
-#endif
-
-struct event_queue *
-queue_list_get(char *job_id_s)
-{
- char *dest;
- struct queue_list *q;
- struct event_queue *eq;
-#if !defined(IL_NOTIFICATIONS)
- IL_EVENT_ID_T job_id;
-
- if(job_id_s == NULL || strcmp(job_id_s, "default") == 0)
- return(log_queue);
-
- if(edg_wlc_JobIdParse(job_id_s, &job_id)) {
- set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "queue_list_get: invalid job id");
- return(NULL);
- }
-
- dest = jobid2dest(job_id);
- edg_wlc_JobIdFree(job_id);
-#else
- dest = job_id_s;
-#endif
-
- if(dest == NULL)
- return(NULL);
-
- if(queue_list_find(queues, dest, &q, NULL)) {
-#if !defined(IL_NOTIFICATIONS)
- free(dest);
-#endif
- return(q->queue);
- } else {
- eq = event_queue_create(dest);
- if(eq)
- queue_list_add(&queues, dest, eq);
-#if !defined(IL_NOTIFICATIONS)
- free(dest);
-#endif
- return(eq);
- }
-}
-
-
-int
-queue_list_is_log(struct event_queue *eq)
-{
- return(eq == queue_list_get(NULL));
-}
-
-
-int
-queue_list_init(char *ls)
-{
-#if !defined(IL_NOTIFICATIONS)
- /* create queue for log server */
- log_queue = event_queue_create(ls);
- if(log_queue == NULL)
- return(-1);
-#endif
-
- return(queue_list_create());
-}
-
-
-static struct queue_list *current;
-
-
-struct event_queue *
-queue_list_first()
-{
- current = queues;
- return(current ? current->queue : NULL);
-}
-
-
-struct event_queue *
-queue_list_next()
-{
- current = current ? current->next : NULL;
- return(current ? current->queue : NULL);
-}
-
-#if defined(IL_NOTIFICATIONS)
-
-static struct queue_list *notifid_map = NULL;
-
-struct event_queue *
-notifid_map_get_dest(const char * notif_id)
-{
- struct queue_list *q = NULL;
-
- queue_list_find(notifid_map, notif_id, &q, NULL);
- return(q ? q->queue : NULL);
-}
-
-
-/* returns 1 if mapping was changed, 0 if new one had to be created, -1 on error */
-int
-notifid_map_set_dest(const char *notif_id, struct event_queue *eq)
-{
- struct queue_list *q;
-
- if(queue_list_find(notifid_map, notif_id, &q, NULL)) {
- q->queue = eq;
- return(1);
- } else {
- return(queue_list_add(¬ifid_map, notif_id, eq));
- }
-}
-
-#endif
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-#include <signal.h>
-
-#include "interlogd.h"
-
-static
-void
-queue_thread_cleanup(void *q)
-{
- struct event_queue *eq = (struct event_queue *)q;
-
- il_log(LOG_WARNING, "thread %d exits\n", eq->thread_id);
-
- /* unlock all held locks */
- /* FIXME: check that the thread always exits when holding these locks;
- unlock them at appropriate places if this condition is not met
- event_queue_unlock(eq);
- event_queue_cond_unlock(eq);
- */
-
- /* clear thread id */
- eq->thread_id = 0;
-}
-
-
-static
-void *
-queue_thread(void *q)
-{
- struct event_queue *eq = (struct event_queue *)q;
- int ret, exit;
- int retrycnt;
- int close_timeout;
-
- if(init_errors(0) < 0) {
- il_log(LOG_ERR, "Error initializing thread specific data, exiting!");
- pthread_exit(NULL);
- }
-
- il_log(LOG_DEBUG, " started new thread for delivery to %s:%d\n", eq->dest_name, eq->dest_port);
-
- pthread_cleanup_push(queue_thread_cleanup, q);
-
- event_queue_cond_lock(eq);
-
- exit = 0;
- retrycnt = 0;
- while(!exit) {
-
- clear_error();
-
- /* if there are no events, wait for them */
- ret = 0;
- while (event_queue_empty(eq)
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
- && (eq->flushing != 1)
-#endif
- ) {
- if(lazy_close && close_timeout) {
- ret = event_queue_wait(eq, close_timeout);
- if(ret == 1) {/* timeout? */
- event_queue_close(eq);
- il_log(LOG_DEBUG, " connection to %s:%d closed\n",
- eq->dest_name, eq->dest_port);
- }
- close_timeout = 0;
- } else
- ret = event_queue_wait(eq, 0);
- if(ret < 0) {
- /* error waiting */
- il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
- event_queue_cond_unlock(eq);
- pthread_exit((void*)-1);
- }
- } /* END while(empty) */
-
- il_log(LOG_DEBUG, " attempting delivery to %s:%d\n", eq->dest_name, eq->dest_port);
-
- /* allow other threads to signal us, ie. insert new events while
- * we are sending or request flush operation
- */
- event_queue_cond_unlock(eq);
-
- /* connect to server */
- if((ret=event_queue_connect(eq)) == 0) {
- /* not connected */
- if(error_get_maj() != IL_OK)
- il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
-#if defined(IL_NOTIFICATIONS)
- il_log(LOG_INFO, " could not connect to client %s, waiting for retry\n", eq->dest_name);
-#else
- il_log(LOG_INFO, " could not connect to bookkeeping server %s, waiting for retry\n", eq->dest_name);
-#endif
- retrycnt++;
- } else {
- retrycnt = 0;
- /* connected, send events */
- switch(ret=event_queue_send(eq)) {
-
- case 0:
- /* there was an error and we still have events to send */
- if(error_get_maj() != IL_OK)
- il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
- il_log(LOG_DEBUG, " events still waiting\n");
- break;
-
- case 1:
- /* hey, we are done for now */
- il_log(LOG_DEBUG, " all events for %s sent\n", eq->dest_name);
- break;
-
- default:
- /* internal error */
- il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
- exit = 1;
- break;
-
- } /* switch */
-
- /* we are done for now anyway, so close the queue */
- if((ret == 1) && lazy_close)
- close_timeout = default_close_timeout;
- else {
- event_queue_close(eq);
- il_log(LOG_DEBUG, " connection to %s:%d closed\n",
- eq->dest_name, eq->dest_port);
- }
- }
-
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
- if(pthread_mutex_lock(&flush_lock) < 0)
- abort();
- event_queue_cond_lock(eq);
-
- /* Check if we are flushing and if we are, report status to master */
- if(eq->flushing == 1) {
- il_log(LOG_DEBUG, " flushing mode detected, reporting status\n");
- /* 0 - events waiting, 1 - events sent, < 0 - some error */
- eq->flush_result = ret;
- eq->flushing = 2;
- if(pthread_cond_signal(&flush_cond) < 0)
- abort();
- }
- if(pthread_mutex_unlock(&flush_lock) < 0)
- abort();
-#else
- event_queue_cond_lock(eq);
-#endif
-
- /* if there was some error with server, sleep for a while */
- /* iff !event_queue_empty() */
- /* also allow for one more try immediately after server disconnect,
- which may cure server kicking us out after given number of connections */
-#ifndef LB_PERF
- if((ret == 0) && (retrycnt > 0)) {
- il_log(LOG_WARNING, " sleeping\n");
- event_queue_sleep(eq);
- }
-#endif
-
- if(exit) {
- /* we have to clean up before exiting */
- event_queue_cond_unlock(eq);
- }
-
- } /* while */
-
- pthread_cleanup_pop(1);
-
- return(eq);
-}
-
-
-int
-event_queue_create_thread(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- event_queue_lock(eq);
-
- /* if there is a thread already, just return */
- if(eq->thread_id > 0) {
- event_queue_unlock(eq);
- return(0);
- }
-
- /* create the thread itself */
- if(pthread_create(&eq->thread_id, NULL, queue_thread, eq) < 0) {
- eq->thread_id = 0;
- set_error(IL_SYS, errno, "event_queue_create_thread: error creating new thread");
- event_queue_unlock(eq);
- return(-1);
- }
-
- /* the thread is never going to be joined */
- pthread_detach(eq->thread_id);
-
- event_queue_unlock(eq);
-
- return(1);
-}
-
-
-
-int
-event_queue_lock(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(pthread_rwlock_wrlock(&eq->update_lock)) {
- /*** abort instead, this is too serious
- set_error(IL_SYS, errno, "event_queue_lock: error acquiring write lock");
- return(-1);
- */
- abort();
- }
-
- return(0);
-}
-
-
-int
-event_queue_lock_ro(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(pthread_rwlock_rdlock(&eq->update_lock)) {
- /*** abort instead, this is too serious
- set_error(IL_SYS, errno, "event_queue_lock_ro: error acquiring read lock");
- return(-1);
- */
- abort();
- }
-
- return(0);
-}
-
-
-int
-event_queue_unlock(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(pthread_rwlock_unlock(&eq->update_lock)) {
- /*** abort instead, this is too serious
- set_error(IL_SYS, errno, "event_queue_unlock: error releasing lock");
- return(-1);
- */
- abort();
- }
-
- return(0);
-}
-
-
-int
-event_queue_signal(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(pthread_cond_signal(&eq->ready_cond)) {
- /*** abort instead, this is too serious
- set_error(IL_SYS, errno, "event_queue_signal: error signaling queue thread");
- return(-1);
- */
- abort();
- }
- return(0);
-}
-
-
-int
-event_queue_wait(struct event_queue *eq, int timeout)
-{
- assert(eq != NULL);
-
- if(timeout) {
- struct timespec endtime;
- int ret = 0;
-
- endtime.tv_sec = time(NULL) + timeout;
- endtime.tv_nsec = 0;
-
- if((ret=pthread_cond_timedwait(&eq->ready_cond, &eq->cond_lock, &endtime))) {
- if(ret == ETIMEDOUT)
- return(1);
- /*** abort instead, this is too serious
- set_error(IL_SYS, errno, "event_queue_wait: error waiting on condition variable");
- return(-1);
- */
- abort();
- }
- } else {
- if(pthread_cond_wait(&eq->ready_cond, &eq->cond_lock)) {
- /*** abort instead, this is too serious
- set_error(IL_SYS, errno, "event_queue_wait: error waiting on condition variable");
- return(-1);
- */
- abort();
- }
- }
- return(0);
-}
-
-
-int event_queue_sleep(struct event_queue *eq)
-{
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
- struct timespec ts;
- struct timeval tv;
- int ret;
-
- assert(eq != NULL);
-
- gettimeofday(&tv, NULL);
- ts.tv_sec = tv.tv_sec + eq->timeout;
- ts.tv_nsec = 1000 * tv.tv_usec;
- if((ret=pthread_cond_timedwait(&eq->flush_cond, &eq->cond_lock, &ts)) < 0) {
- if(ret != ETIMEDOUT) {
- /*** abort instead, this is too serious
- set_error(IL_SYS, errno, "event_queue_sleep: error waiting on condition");
- return(-1);
- */
- abort();
- }
- }
-#else
- sleep(eq->timeout);
-#endif
- return(0);
-}
-
-
-#if defined(INTERLOGD_HANDLE_CMD)
-int event_queue_wakeup(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(pthread_cond_signal(&eq->ready_cond)) {
- /**
- set_error(IL_SYS, errno, "event_queue_wakeup: error signaling queue thread");
- return(-1);
- */
- abort();
- }
-#if defined(INTERLOGD_FLUSH)
- if(pthread_cond_signal(&eq->flush_cond)) {
- /**
- set_error(IL_SYS, errno, "event_queue_wakeup: error signaling queue thread");
- return(-1);
- */
- abort();
- }
-#endif
- return(0);
-}
-#endif
-
-int event_queue_cond_lock(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(pthread_mutex_lock(&eq->cond_lock)) {
- /**
- set_error(IL_SYS, errno, "event_queue_cond_lock: error locking condition mutex");
- return(-1);
- */
- abort();
- }
-
- return(0);
-}
-
-
-int event_queue_cond_unlock(struct event_queue *eq)
-{
- assert(eq != NULL);
-
- if(pthread_mutex_unlock(&eq->cond_lock)) {
- /**
- set_error(IL_SYS, errno, "event_queue_cond_unlock: error locking condition mutex");
- return(-1);
- */
- abort();
- }
-
- return(0);
-}
+++ /dev/null
-#ident "$Header$"
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-
-#include "interlogd.h"
-
-extern char *file_prefix;
-
-extern time_t cert_mtime, key_mtime;
-
-void *
-recover_thread(void *q)
-{
- if(init_errors(0) < 0) {
- il_log(LOG_ERR, "Error initializing thread specific data, exiting!");
- pthread_exit(NULL);
- }
-
- while(1) {
- il_log(LOG_INFO, "Looking up event files...\n");
- if(event_store_init(file_prefix) < 0) {
- il_log(LOG_ERR, "recover_thread: %s\n", error_get_msg());
- exit(1);
- }
- if(event_store_recover_all() < 0) {
- il_log(LOG_ERR, "recover_thread: %s\n", error_get_msg());
- exit(1);
- }
- if(event_store_cleanup() < 0) {
- il_log(LOG_ERR, "recover_thread: %s\n", error_get_msg());
- exit(1);
- }
- il_log(LOG_INFO, "Checking for new certificate...\n");
- if(pthread_mutex_lock(&cred_handle_lock) < 0)
- abort();
- if (edg_wll_gss_watch_creds(cert_file, &cert_mtime) > 0) {
- gss_cred_id_t new_cred_handle = GSS_C_NO_CREDENTIAL;
- OM_uint32 min_stat;
- int ret;
-
- ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file,
- &new_cred_handle, NULL, NULL);
- if (new_cred_handle != GSS_C_NO_CREDENTIAL) {
- gss_release_cred(&min_stat, &cred_handle);
- cred_handle = new_cred_handle;
- il_log(LOG_INFO, "New certificate found and deployed.\n");
- }
- }
- if(pthread_mutex_unlock(&cred_handle_lock) < 0)
- abort();
- sleep(INPUT_TIMEOUT);
- }
-}
+++ /dev/null
-#ident "$Header$"
-
-#include <assert.h>
-#include <errno.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-
-/*
- * - L/B server protocol handling routines
- */
-
-#include "glite/wmsutils/jobid/cjobid.h"
-#include "glite/lb/il_string.h"
-#include "glite/lb/context.h"
-
-#include "interlogd.h"
-
-#if defined(INTERLOGD_EMS) || (defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH))
-/*
- * Send confirmation to client.
- *
- */
-int
-send_confirmation(long lllid, int code)
-{
- struct sockaddr_un saddr;
- char sname[256];
- int sock, ret;
-
- if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
- set_error(IL_SYS, errno, "send_confirmation: error creating socket");
- return(-1);
- }
-
- if(fcntl(sock, F_SETFL, O_NONBLOCK) < 0) {
- set_error(IL_SYS, errno, "send_confirmation: error setting socket options");
- return(-1);
- }
-
- ret = 0;
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- snprintf(sname, sizeof(sname), "/tmp/dglogd_sock_%ld", lllid);
- strcpy(saddr.sun_path, sname);
- if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
- set_error(IL_SYS, errno, "send_confirmation: error connecting socket");
- goto out;
- }
-
- if(send(sock, &code, sizeof(code), MSG_NOSIGNAL) < 0) {
- set_error(IL_SYS, errno, "send_confirmation: error sending data");
- goto out;
- }
- ret = 1;
-
- il_log(LOG_DEBUG, " sent code %d back to client\n", code);
-
- out:
- close(sock);
- return(ret);
-}
-
-
-static
-int
-confirm_msg(struct server_msg *msg, int code, int code_min)
-{
- switch(code) {
- case LB_OK:
- code_min = 0;
- break;
- case LB_DBERR:
- /* code_min already contains apropriate error code */
- break;
- case LB_PROTO:
- code_min = EDG_WLL_IL_PROTO;
- break;
- default:
- code_min = EDG_WLL_IL_SYS;
- break;
- }
-
- return(send_confirmation(msg->receipt_to, code_min));
-}
-#endif
-
-
-
-struct reader_data {
- edg_wll_GssConnection *gss;
- struct timeval *timeout;
-};
-
-
-static
-int
-gss_reader(void *user_data, char *buffer, int max_len)
-{
- int ret, len;
- struct reader_data *data = (struct reader_data *)user_data;
- edg_wll_GssStatus gss_stat;
-
- ret = edg_wll_gss_read_full(data->gss, buffer, max_len, data->timeout, &len, &gss_stat);
- if(ret < 0) {
- char *gss_err = NULL;
-
- if(ret == EDG_WLL_GSS_ERROR_GSS) {
- edg_wll_gss_get_error(&gss_stat, "get_reply", &gss_err);
- set_error(IL_DGGSS, ret, gss_err);
- free(gss_err);
- } else
- set_error(IL_DGGSS, ret, "get_reply");
- }
- return(ret);
-}
-
-
-/*
- * Read reply from server.
- * Returns: -1 - error reading message,
- * code > 0 - error code from server
- */
-static
-int
-get_reply(struct event_queue *eq, char **buf, int *code_min)
-{
- char *msg=NULL;
- int ret, code;
- int len, l;
- struct timeval tv;
- struct reader_data data;
-
- tv.tv_sec = TIMEOUT;
- tv.tv_usec = 0;
- data.gss = &eq->gss;
- data.timeout = &tv;
- len = read_il_data(&data, &msg, gss_reader);
- if(len < 0) {
- set_error(IL_PROTO, LB_PROTO, "get_reply: error reading server reply");
- return(-1);
- }
- ret = decode_il_reply(&code, code_min, buf, msg);
- if(msg) free(msg);
- if(ret < 0) {
- set_error(IL_PROTO, LB_PROTO, "get_reply: error decoding server reply");
- return(-1);
- }
- return(code);
-}
-
-
-
-/*
- * Returns: 0 - not connected, timeout set, 1 - OK
- */
-int
-event_queue_connect(struct event_queue *eq)
-{
- int ret;
- struct timeval tv;
- edg_wll_GssStatus gss_stat;
-
- assert(eq != NULL);
-
-#ifdef LB_PERF
- if(!nosend) {
-#endif
-
- if(eq->gss.context == GSS_C_NO_CONTEXT) {
-
- tv.tv_sec = TIMEOUT;
- tv.tv_usec = 0;
- if(pthread_mutex_lock(&cred_handle_lock) < 0)
- abort();
- il_log(LOG_DEBUG, " trying to connect to %s:%d\n", eq->dest_name, eq->dest_port);
- ret = edg_wll_gss_connect(cred_handle, eq->dest_name, eq->dest_port, &tv, &eq->gss, &gss_stat);
- if(pthread_mutex_unlock(&cred_handle_lock) < 0)
- abort();
- if(ret < 0) {
- char *gss_err = NULL;
-
- if (ret == EDG_WLL_GSS_ERROR_GSS)
- edg_wll_gss_get_error(&gss_stat, "event_queue_connect: edg_wll_gss_connect", &gss_err);
- set_error(IL_DGGSS, ret,
- (ret == EDG_WLL_GSS_ERROR_GSS) ? gss_err : "event_queue_connect: edg_wll_gss_connect");
- if (gss_err) free(gss_err);
- eq->gss.context = GSS_C_NO_CONTEXT;
- eq->timeout = TIMEOUT;
- return(0);
- }
- }
-
-#ifdef LB_PERF
- }
-#endif
-
- return(1);
-}
-
-
-int
-event_queue_close(struct event_queue *eq)
-{
- assert(eq != NULL);
-
-#ifdef LB_PERF
- if(!nosend) {
-#endif
-
- if(eq->gss.context != GSS_C_NO_CONTEXT) {
- edg_wll_gss_close(&eq->gss, NULL);
- eq->gss.context = GSS_C_NO_CONTEXT;
- }
-#ifdef LB_PERF
- }
-#endif
- return(0);
-}
-
-
-/*
- * Send all events from the queue.
- * Returns: -1 - system error, 0 - not send, 1 - queue empty
- */
-int
-event_queue_send(struct event_queue *eq)
-{
- assert(eq != NULL);
-
-#ifdef LB_PERF
- if(!nosend) {
-#endif
- if(eq->gss.context == GSS_C_NO_CONTEXT)
- return(0);
-#ifdef LB_PERF
- }
-#endif
-
- /* feed the server with events */
- while (!event_queue_empty(eq)) {
- struct server_msg *msg;
- char *rep;
- int ret, code, code_min;
- size_t bytes_sent;
- struct timeval tv;
- edg_wll_GssStatus gss_stat;
- int events_sent = 0;
-
- clear_error();
-
- if(event_queue_get(eq, &msg) < 0)
- return(-1);
-
- il_log(LOG_DEBUG, " trying to deliver event at offset %d for job %s\n", msg->offset, msg->job_id_s);
-
-#ifdef LB_PERF
- if(!nosend) {
-#endif
- tv.tv_sec = TIMEOUT;
- tv.tv_usec = 0;
- ret = edg_wll_gss_write_full(&eq->gss, msg->msg, msg->len, &tv, &bytes_sent, &gss_stat);
- if(ret < 0) {
- eq->timeout = TIMEOUT;
- return(0);
- }
- if(ret < 0) {
- if (ret == EDG_WLL_GSS_ERROR_ERRNO && errno == EPIPE && events_sent > 0)
- eq->timeout = 0;
- else
- eq->timeout = TIMEOUT;
- return(0);
- }
-
- if((code = get_reply(eq, &rep, &code_min)) < 0) {
- /* could not get the reply properly, so try again later */
- il_log(LOG_ERR, " error reading server %s reply:\n %s\n", eq->dest_name, error_get_msg());
- eq->timeout = TIMEOUT;
- return(0);
- }
-#ifdef LB_PERF
- } else {
- glite_wll_perftest_consumeEventIlMsg(msg->msg+17);
- code = LB_OK;
- rep = strdup("OK");
- }
-#endif
-
- il_log(LOG_DEBUG, " event sent, server %s replied with %d, %s\n", eq->dest_name, code, rep);
- free(rep);
-
- /* the reply is back here */
- switch(code) {
-
- /* NOT USED: case LB_TIME: */
- case LB_NOMEM:
- /* NOT USED: case LB_SYS: */
- /* NOT USED: case LB_AUTH: */
- /* non fatal errors (for us) */
- eq->timeout = TIMEOUT;
- return(0);
-
- case LB_OK:
- /* event succesfully delivered */
-
- default: /* LB_DBERR, LB_PROTO */
- /* the event was not accepted by the server */
- /* update the event pointer */
- if(event_store_commit(msg->es, msg->ev_len, queue_list_is_log(eq)) < 0)
- /* failure committing message, this is bad */
- return(-1);
- /* if we have just delivered priority message from the queue, send confirmation */
- ret = 1;
-#if defined(INTERLOGD_EMS)
- if(server_msg_is_priority(msg) &&
- ((ret=confirm_msg(msg, code, code_min)) < 0))
- return(ret);
-#endif
-
- if((ret == 0) &&
- (error_get_maj() != IL_OK))
- il_log(LOG_ERR, "send_event: %s\n", error_get_msg());
-
- event_queue_remove(eq);
- events_sent++;
- break;
-
- } /* switch */
- } /* while */
-
- return(1);
-
-} /* send_events */
-
-
+++ /dev/null
-#ident "$Header$"
-
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-#include "interlogd.h"
-#include "glite/lb/il_msg.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/consumer.h"
-#include "glite/lb/context.h"
-
-static
-int
-create_msg(il_octet_string_t *ev, char **buffer, long *receipt)
-{
- char *p; int len;
- char *event = ev->data;
-
- *receipt = 0;
-
-#if defined(INTERLOGD_EMS)
- /* find DG.LLLID */
- if(strncmp(event, "DG.LLLID",8) == 0 ||
- strncmp(event, "DG.LLPID",8) == 0) { /* 8 == strlen("DG.LLLID") */
-
- /* skip the key */
- event += 9; /* 9 = strlen("DG.LLLID=") */
- *receipt = atol(event);
- p = strchr(event, ' ');
- if(!p) {
- set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM,
- "create_msg: error parsing locallogger PID");
- return(-1);
- }
- /* skip the value */
- event = p + 1;
-
- /* find DG.PRIORITY */
- p = strstr(event, "DG.PRIORITY");
- if(p) {
- int n;
-
- p += 12; /* skip the key and = */
- if((n = atoi(p)) == 0) {
- /* normal asynchronous message */
- *receipt = 0;
- }
- } else {
- /* could not find priority key */
- *receipt = 0;
- }
-
- } else {
- /* could not find local logger PID, confirmation can not be sent */
- *receipt = 0;
- }
-#endif
-
- len = encode_il_msg(buffer, ev);
- if(len < 0) {
- set_error(IL_NOMEM, ENOMEM, "create_msg: out of memory allocating message");
- return(-1);
- }
- return(len);
-}
-
-
-struct server_msg *
-server_msg_create(il_octet_string_t *event, long offset)
-{
- struct server_msg *msg;
-
- msg = malloc(sizeof(*msg));
- if(msg == NULL) {
- set_error(IL_NOMEM, ENOMEM, "server_msg_create: out of memory allocating message");
- return(NULL);
- }
-
- if(server_msg_init(msg, event) < 0) {
- server_msg_free(msg);
- return(NULL);
- }
- msg->offset = offset;
-
- return(msg);
-}
-
-
-struct server_msg *
-server_msg_copy(struct server_msg *src)
-{
- struct server_msg *msg;
-
- msg = malloc(sizeof(*msg));
- if(msg == NULL) {
- set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating message");
- return(NULL);
- }
-
- msg->msg = malloc(src->len);
- if(msg->msg == NULL) {
- set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating server message");
- server_msg_free(msg);
- return(NULL);
- }
- msg->len = src->len;
- memcpy(msg->msg, src->msg, src->len);
-
- msg->job_id_s = strdup(src->job_id_s);
- msg->ev_len = src->ev_len;
- msg->es = src->es;
- msg->receipt_to = src->receipt_to;
- msg->offset = src->offset;
-#if defined(IL_NOTIFICATIONS)
- msg->dest_name = strdup(src->dest_name);
- msg->dest_port = src->dest_port;
- msg->dest = strdup(src->dest);
-#endif
- return(msg);
-}
-
-
-int
-server_msg_init(struct server_msg *msg, il_octet_string_t *event)
-{
-#if defined(IL_NOTIFICATIONS)
- edg_wll_Context context;
- edg_wll_Event *notif_event;
- int ret;
-#endif
-
- assert(msg != NULL);
- assert(event != NULL);
-
- memset(msg, 0, sizeof(*msg));
-
-
-#if defined(IL_NOTIFICATIONS)
- edg_wll_InitContext(&context);
-
- /* parse the notification event */
- if((ret=edg_wll_ParseNotifEvent(context, event, ¬if_event))) {
- set_error(IL_LBAPI, ret, "server_msg_init: error parsing notification event");
- return(-1);
- }
- /* FIXME: check for allocation error */
- if(notif_event->notification.dest_host &&
- (strlen(notif_event->notification.dest_host) > 0)) {
- msg->dest_name = strdup(notif_event->notification.dest_host);
- msg->dest_port = notif_event->notification.dest_port;
- asprintf(&msg->dest, "%s:%d", msg->dest_name, msg->dest_port);
- }
- msg->job_id_s = edg_wll_NotifIdUnparse(notif_event->notification.notifId);
- if(notif_event->notification.jobstat &&
- (strlen(notif_event->notification.jobstat) > 0)) {
- msg->len = create_msg(event, &msg->msg, &msg->receipt_to);
- }
- edg_wll_FreeEvent(notif_event);
- free(notif_event);
- if(msg->len < 0) {
- return(-1);
- }
-#else
- msg->len = create_msg(event, &msg->msg, &msg->receipt_to);
- if(msg->len < 0) {
- return(-1);
- }
-#ifdef LB_PERF
- if(noparse) {
- msg->job_id_s = strdup("https://localhost:9000/not_so_unique_string");
- } else
-#endif
- msg->job_id_s = edg_wll_GetJobId(event->data);
-#endif
- /* remember to add event separator to the length */
- msg->ev_len = event->len + 1;
-
- if(msg->job_id_s == NULL) {
- set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "server_msg_init: error getting id");
- return(-1);
- }
-
- return(0);
-}
-
-
-int
-server_msg_is_priority(struct server_msg *msg)
-{
- assert(msg != NULL);
-
- return(msg->receipt_to != 0);
-}
-
-
-int
-server_msg_free(struct server_msg *msg)
-{
- assert(msg != NULL);
-
- if(msg->msg) free(msg->msg);
- if(msg->job_id_s) free(msg->job_id_s);
-#if defined(IL_NOTIFICATIONS)
- if(msg->dest_name) free(msg->dest_name);
- if(msg->dest) free(msg->dest);
-#endif
- free(msg);
- return 0;
-}
+++ /dev/null
-#include "IlTestBase.h"
-
-#include <string.h>
-
-const char *IlTestBase::msg = "DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.USER=\"/C=CZ/O=Cesnet/CN=Michal Vocu\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"";
-
-const char *IlTestBase::msg_enc = " 429\n6 michal\n415 DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.USER=\"/C=CZ/O=Cesnet/CN=Michal Vocu\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"\n";
-
-const struct server_msg IlTestBase::smsg = {
- "https://some.host:1234/x67qr549qc",
- (char*)IlTestBase::msg_enc,
- strlen(IlTestBase::msg_enc),
- strlen(IlTestBase::msg) + 1,
- NULL
-};
+++ /dev/null
-extern "C" {
-#include "interlogd.h"
-}
-
-class IlTestBase {
-public:
- static const char *msg;
- static const char *msg_enc;
- static const struct server_msg smsg;
-};
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "IlTestBase.h"
-
-extern "C" {
-struct event_queue_msg {
- struct server_msg *msg;
- struct event_queue_msg *prev;
-};
-}
-
-#include <string>
-using namespace std;
-
-class event_queueTest: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE( event_queueTest );
- CPPUNIT_TEST( testEventQueueCreate );
- CPPUNIT_TEST( testEventQueueInsert );
- CPPUNIT_TEST( testEventQueueGet );
- CPPUNIT_TEST( testEventQueueRemove );
- CPPUNIT_TEST_SUITE_END();
-
-public:
- void setUp() {
- server = strdup("localhost:8080");
- eq = event_queue_create(server);
- free(server);
- }
-
- void tearDown() {
- struct event_queue_msg *mp;
- struct server_msg *m;
-
- for(mp = eq->head; mp != NULL; ) {
- struct event_queue_msg *mq;
-
- server_msg_free(mp->msg);
- mq = mp;
- mp = mp->prev;
- free(mq);
- }
- eq->head = NULL;
- event_queue_free(eq);
- }
-
- void testEventQueueCreate() {
- CPPUNIT_ASSERT( eq != NULL );
- CPPUNIT_ASSERT_EQUAL( string(eq->dest_name), string("localhost") );
- CPPUNIT_ASSERT_EQUAL( eq->dest_port, 8081 );
- CPPUNIT_ASSERT( eq->tail == NULL );
- CPPUNIT_ASSERT( eq->head == NULL );
- CPPUNIT_ASSERT( eq->tail_ems == NULL );
- CPPUNIT_ASSERT( eq->mark_this == NULL );
- CPPUNIT_ASSERT( eq->mark_prev == NULL );
- CPPUNIT_ASSERT( eq->thread_id == 0 );
- CPPUNIT_ASSERT( eq->flushing == 0 );
- CPPUNIT_ASSERT( eq->flush_result == 0 );
- }
-
- void testEventQueueInsert() {
- struct event_queue_msg *mp;
- struct server_msg *m;
-
- doSomeInserts();
- mp = eq->head;
- m = mp->msg;
- CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("2") );
- CPPUNIT_ASSERT_EQUAL( mp, eq->tail_ems );
- mp = mp->prev;
- m = mp->msg;
- CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("1") );
- mp = mp->prev;
- m = mp->msg;
- CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("3") );
- CPPUNIT_ASSERT_EQUAL( mp, eq->tail );
- CPPUNIT_ASSERT( mp->prev == NULL );
- }
-
- void testEventQueueGet() {
- struct event_queue_msg *mp;
- struct server_msg *m,sm;
- int ret;
-
- doSomeInserts();
- mp = eq->head;
- eq->head = mp->prev;
- eq->tail_ems = NULL;
- server_msg_free(mp->msg);
- free(mp);
- ret = event_queue_get(eq, &m);
- CPPUNIT_ASSERT( ret == 0 );
- CPPUNIT_ASSERT( eq->mark_this == eq->head );
- CPPUNIT_ASSERT( eq->mark_prev == NULL );
- CPPUNIT_ASSERT_EQUAL( string("1"), string(m->job_id_s) );
- sm = IlTestBase::smsg;
- sm.job_id_s = "4";
- sm.receipt_to = 1;
- ret = event_queue_insert(eq, &sm);
- CPPUNIT_ASSERT( ret == 0 );
- CPPUNIT_ASSERT( eq->mark_prev == eq->head );
- CPPUNIT_ASSERT( eq->mark_this == eq->head->prev );
- ret = event_queue_insert(eq, &sm);
- CPPUNIT_ASSERT( ret == 0 );
- CPPUNIT_ASSERT( eq->mark_prev == eq->head->prev );
- CPPUNIT_ASSERT( eq->mark_this == eq->head->prev->prev );
- }
-
- void testEventQueueRemove() {
- struct event_queue_msg *mp;
- struct server_msg *m,sm;
- int ret;
-
- doSomeInserts();
- ret = event_queue_get(eq, &m);
- mp = eq->mark_this->prev;
- sm = IlTestBase::smsg;
- sm.job_id_s = "4";
- sm.receipt_to = 1;
- event_queue_insert(eq, &sm);
- ret = event_queue_remove(eq);
- CPPUNIT_ASSERT( eq->head->prev == mp );
- CPPUNIT_ASSERT( eq->mark_this == NULL );
- CPPUNIT_ASSERT( eq->mark_prev == NULL );
- }
-
-protected:
- char *server;
- struct event_queue *eq;
-
- void doSomeInserts() {
- struct server_msg m = IlTestBase::smsg;
-
- m.job_id_s = "1";
- event_queue_insert(eq, &m);
- m.receipt_to = 1;
- m.job_id_s = "2";
- event_queue_insert(eq, &m);
- m.job_id_s = "3";
- m.receipt_to = 0;
- event_queue_insert(eq, &m);
- }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( event_queueTest );
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "IlTestBase.h"
-
-class event_storeTest: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE( event_storeTest );
- CPPUNIT_TEST( event_store_recoverTest );
- CPPUNIT_TEST( event_store_syncTest );
- CPPUNIT_TEST( event_store_nextTest );
- CPPUNIT_TEST( event_store_commitTest );
- CPPUNIT_TEST( event_store_cleanTest );
- CPPUNIT_TEST( event_store_findTest );
- CPPUNIT_TEST( event_store_releaseTest );
- CPPUNIT_TEST( event_store_initTest );
- CPPUNIT_TEST( event_store_recover_allTest );
- CPPUNIT_TEST( event_store_cleanupTest );
- CPPUNIT_TEST_SUITE_END();
-
-public:
- void setUp() {
- }
-
- void tearDown() {
- }
-
- void event_store_recoverTest() {
- }
-
- void event_store_syncTest() {
- }
-
- void event_store_nextTest() {
- }
-
- void event_store_commitTest() {
- }
-
- void event_store_cleanTest() {
- }
-
- void event_store_findTest() {
- }
-
- void event_store_releaseTest() {
- }
-
- void event_store_initTest() {
- }
-
- void event_store_recover_allTest() {
- }
-
- void event_store_cleanupTest() {
- }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( event_storeTest );
+++ /dev/null
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-extern "C" {
-#include <pthread.h>
-#include "glite/wmsutils/tls/ssl_helpers/ssl_inits.h"
-#include "glite/wmsutils/tls/ssl_helpers/ssl_pthreads.h"
-#include "glite/security/glite_gss.h"
-#include "interlogd.h"
-#include "glite/lb/consumer.h"
-}
-
-#if defined(IL_NOTIFICATIONS)
-#define DEFAULT_PREFIX "/tmp/notif_events"
-#define DEFAULT_SOCKET "/tmp/notif_interlogger.sock"
-#else
-#define DEFAULT_PREFIX "/tmp/dglogd.log"
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-#endif
-
-int TIMEOUT = DEFAULT_TIMEOUT;
-
-gss_cred_id_t cred_handle = GSS_C_NO_CREDENTIAL;
-pthread_mutex_t cred_handle_lock = PTHREAD_MUTEX_INITIALIZER;
-
-char *file_prefix = DEFAULT_PREFIX;
-int bs_only = 0;
-
-char *cert_file = NULL;
-char *key_file = NULL;
-char *CAcert_dir = NULL;
-char *log_server = NULL;
-char *socket_path = DEFAULT_SOCKET;
-
-
-int
-main (int ac,const char *av[])
-{
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
- CppUnit::TextUi::TestRunner runner;
-
- runner.addTest(suite);
- return runner.run() ? 0 : 1;
-}
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "IlTestBase.h"
-
-extern "C" {
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-
-#include "interlogd.h"
-
- extern char *socket_path;
-}
-
-#include <string>
-using namespace std;
-
-class input_queue_socketTest: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE( input_queue_socketTest );
- CPPUNIT_TEST( input_queue_getTest );
- CPPUNIT_TEST_SUITE_END();
-
-public:
-
- void setUp() {
- struct sockaddr_un saddr;
- int sock;
- long offset = 0;
-
- int ret = input_queue_attach();
- CPPUNIT_ASSERT(ret == 0);
-
- sock=socket(PF_UNIX, SOCK_STREAM, 0);
- CPPUNIT_ASSERT(sock >= 0);
-
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, socket_path);
- ret = connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path));
- CPPUNIT_ASSERT(ret >= 0);
-
- ret = write(sock, &offset, sizeof(offset));
- CPPUNIT_ASSERT( ret == sizeof(offset) );
- ret = write(sock, IlTestBase::msg, strlen(IlTestBase::msg));
- CPPUNIT_ASSERT( ret == strlen(IlTestBase::msg) );
- ret = write(sock, "\n", 1);
- CPPUNIT_ASSERT( ret == 1 );
- }
-
- void tearDown() {
- input_queue_detach();
- }
-
-
- void input_queue_getTest() {
- char *event;
- long offset;
- int ret;
-
- ret = input_queue_get(&event, &offset, 10);
- CPPUNIT_ASSERT( ret >= 0 );
- CPPUNIT_ASSERT_EQUAL( 0L, offset );
- CPPUNIT_ASSERT_EQUAL( string(IlTestBase::msg), string(event) );
- free(event);
- }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION(input_queue_socketTest);
+++ /dev/null
-#include <iostream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-extern "C" {
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-char *socket_path = DEFAULT_SOCKET;
-int edg_wll_log_proto_server(int *,char *,char *,int,int);
-void edg_wll_ll_log_init(int);
-}
-
-class LLTest: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE(LLTest);
- CPPUNIT_TEST(testProtoServer);
- CPPUNIT_TEST_SUITE_END();
-
-public:
-
- void setUp() {
- char *msg = "DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"";
- pipe(pd);
- log_proto_client(pd[1], msg);
- input_queue_attach();
- }
-
- void tearDown() {
- close(pd[0]);
- close(pd[1]);
- input_queue_detach();
- }
-
- void testProtoServer() {
- int ret;
- edg_wll_ll_log_init(255);
- ret = edg_wll_log_proto_server(&pd[0],
- "michal",
- "/tmp/dglogd.log",
- 0,
- 0);
- CPPUNIT_ASSERT( ret == 0 );
- }
-
-private:
- int pd[2];
-
- int log_proto_client(int con, char *logline) {
- char header[32];
- int err;
- int size;
- u_int8_t size_end[4];
-
- err = 0;
- size = strlen(logline)+1;
- size_end[0] = size & 0xff; size >>= 8;
- size_end[1] = size & 0xff; size >>= 8;
- size_end[2] = size & 0xff; size >>= 8;
- size_end[3] = size;
- size = strlen(logline)+1;
-
- err = write(con, "DGLOG", 5);
- CPPUNIT_ASSERT(err == 5);
- err = write(con, size_end, 4);
- CPPUNIT_ASSERT(err == 4);
- err = write(con, logline, size);
- CPPUNIT_ASSERT( err == size );
-}
-
- int sock;
- int accepted;
-
-int
-input_queue_attach()
-{
- struct sockaddr_un saddr;
-
- CPPUNIT_ASSERT((sock=socket(PF_UNIX, SOCK_STREAM, 0)) >= 0);
-
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, socket_path);
-
- CPPUNIT_ASSERT(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) >= 0);
- CPPUNIT_ASSERT(listen(sock, 5) >= 0 );
- return(0);
-}
-
-void input_queue_detach()
-{
- if (sock >= 0)
- close(sock);
- unlink(socket_path);
-}
-
-};
-
-
-CPPUNIT_TEST_SUITE_REGISTRATION( LLTest );
-
-int
-main (int ac,const char *av[])
-{
- CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
- CppUnit::TextUi::TestRunner runner;
-
- runner.addTest(suite);
- return runner.run() ? 0 : 1;
-}
+++ /dev/null
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <string.h>
-#include <syslog.h>
-#include <fcntl.h>
-
-#define edg_wll_gss_read_full(a,b,c,d,e,f) test_edg_wll_gss_read_full(a,b,c,d,e,f)
-#define edg_wll_gss_write_full(a,b,c,d,e,f) test_edg_wll_gss_write_full(a,b,c,d,e,f)
-#define edg_wll_GssConnection int
-
-#include "logd_proto.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/escape.h"
-#include "glite/lb/events_parse.h"
-
-int
-test_edg_wll_gss_read_full(int *fd,
- void *buf,
- size_t bufsize,
- struct timeval *timeout,
- size_t *total,
- edg_wll_GssStatus *code)
-{
- *total = read(*fd, buf, bufsize);
- return(*total < 0 ? *total : 0);
-}
-
-int
-test_edg_wll_gss_write_full(int *fd,
- const void *buf,
- size_t bufsize,
- struct timeval *timeout,
- size_t *total,
- edg_wll_GssStatus *code)
-{
- return(0);
-}
-
-#include "logd_proto.c"
+++ /dev/null
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "IlTestBase.h"
-
-#include <string.h>
-
-using namespace std;
-
-class server_msgTest: public CppUnit::TestFixture
-{
- CPPUNIT_TEST_SUITE(server_msgTest);
- CPPUNIT_TEST( server_msg_createTest );
- CPPUNIT_TEST( server_msg_copyTest );
- CPPUNIT_TEST_SUITE_END();
-
-public:
-
- void setUp() {
- msg = server_msg_create((char *)IlTestBase::msg);
- }
-
- void tearDown() {
- server_msg_free(msg);
- }
-
- void server_msg_createTest() {
- CPPUNIT_ASSERT( msg != NULL );
- CPPUNIT_ASSERT_EQUAL( string(msg->job_id_s), string(IlTestBase::smsg.job_id_s) );
- CPPUNIT_ASSERT_EQUAL( string(msg->msg), string(IlTestBase::smsg.msg) );
- CPPUNIT_ASSERT_EQUAL( msg->len, IlTestBase::smsg.len );
- CPPUNIT_ASSERT_EQUAL( msg->ev_len, IlTestBase::smsg.ev_len );
- CPPUNIT_ASSERT_EQUAL( msg->es, IlTestBase::smsg.es );
- CPPUNIT_ASSERT( !server_msg_is_priority(msg) );
- }
-
- void server_msg_copyTest() {
- struct server_msg *msg2;
-
- msg2 = server_msg_copy(msg);
- CPPUNIT_ASSERT( msg2 != NULL );
- CPPUNIT_ASSERT( msg2 != msg );
- CPPUNIT_ASSERT_EQUAL( string(msg->job_id_s), string(msg2->job_id_s) );
- CPPUNIT_ASSERT( msg->job_id_s != msg2->job_id_s);
- CPPUNIT_ASSERT_EQUAL( string(msg->msg), string(msg2->msg) );
- CPPUNIT_ASSERT( msg->msg != msg2->msg );
- CPPUNIT_ASSERT_EQUAL( msg->len, msg2->len );
- CPPUNIT_ASSERT_EQUAL( msg->ev_len, msg2->ev_len );
- CPPUNIT_ASSERT_EQUAL( msg->es, msg2->es );
- server_msg_free(msg2);
- }
-
-private:
- struct server_msg *msg;
-};
-
-
-CPPUNIT_TEST_SUITE_REGISTRATION(server_msgTest);
# defaults
top_srcdir=.
+builddir=build
+top_builddir=${top_srcdir}/${builddir}
stagedir=.
distdir=.
globalprefix=glite
PREFIX=/opt/glite
glite_location=/opt/glite
+globus_prefix=/opt/globus
+nothrflavour=gcc32
+thrflavour=gcc32pthr
+expat_prefix=/opt/expat
+cares_prefix=/opt/c-ares
CC=gcc
#Fri Sep 02 14:17:59 CEST 2005
-module.version=2.2.4
-module.age=1
+module.version=2.2.2
+module.age=0
if ( newconn >= 0 )
{
- int ret;
-
conn = newconn;
srv = newsrv;
gettimeofday(&client_start, NULL);
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)) )
+ && 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);
+ dprintf(("[%d] Connection not estabilished.\n", getpid()));
+ if ( !debug ) syslog(LOG_ERR, "Connection not estabilished.\n");
close(conn);
conn = srv = -1;
- if (ret < 0) exit(1);
continue;
}
gettimeofday(&client_done, NULL);
module.version = 1.1.1
-module.age = 2
+module.age = 0
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite Middleware Loggin and Bookkeeping Subsystem
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.42 2006/03/24 08:26:11 akrenek
- missing utils->client dependency (should fix nightly build)
-
- Revision 1.41 2006/03/15 17:35:35 akrenek
- cares
-
- Revision 1.40 2006/03/15 17:33:24 akrenek
- merge of 1.5 branch
-
- Revision 1.39 2005/11/27 21:51:18 eronchie
- Applied fix for bug 13928
-
- Revision 1.38 2005/11/22 12:13:47 eronchie
- Removed one utils
-
- Revision 1.37 2005/11/04 14:39:20 akrenek
- merge in the "lbonly" hack
-
- Revision 1.36.4.6 2006/02/06 12:10:00 akrenek
- make proxy depend on logger explicitely
-
- Revision 1.36.4.5 2005/12/02 11:15:33 akrenek
- resolved logger dependency conflict
-
- Revision 1.36.4.4 2005/12/02 10:04:14 jpospi
- server depends on logger
-
- Revision 1.36.4.3 2005/11/28 10:39:08 akrenek
- merge bug #13928 fix on the pre_cares branch
-
- Revision 1.36.4.2 2005/11/24 12:59:36 akrenek
- server depends on bones
-
- Revision 1.36.4.1 2005/11/24 12:32:02 akrenek
- merged in "lbonly"
-
- Revision 1.39 2005/11/27 21:51:18 eronchie
- Applied fix for bug 13928
-
- Revision 1.38 2005/11/22 12:13:47 eronchie
- Removed one utils
-
- Revision 1.37 2005/11/04 14:39:20 akrenek
- merge in the "lbonly" hack
-
- Revision 1.36 2005/10/15 13:36:26 akrenek
- added lb.utils
-
- Revision 1.35 2005/10/14 17:19:08 akrenek
- build also lb.utils
-
- Revision 1.34 2005/10/14 11:02:06 akrenek
- depends on jp.primary
-
- Revision 1.33 2005/09/19 15:23:45 akrenek
- "The gigantic merge"; from release 1.4 branch to HEAD
-
- Revision 1.32.2.2 2005/10/31 12:45:10 akrenek
- conditional disabling of cross-subsystem builds via "lbonly" property
-
- Revision 1.32.2.1 2005/08/18 10:36:05 eronchie
- Added cross-subsystem dependencies feature in org.glite.lb subsystem.
- Added wms-utils.jobid and security.gsoap-plugin among common dependencies.
- Added security.voms among server dependencies.
- At the moment I have not consider gridsite.core component.
- Once built gridsiste component, run ant in org.glite.lb to build the whole lb
- and its external gLite dependencies.
-
- Revision 1.32 2005/08/03 11:58:25 akrenek
- Merged the release 1.0 branch
-
- Revision 1.31 2005/05/26 15:13:37 zurek
- inserted module.build.file
-
- Revision 1.30 2005/03/17 09:59:31 zsalvet
- Add proxy target.
-
- Revision 1.29 2005/03/16 10:02:52 zsalvet
- proxy component added
-
- Revision 1.28.2.1 2005/02/12 01:38:13 glbuild
- Changed start time
-
- Revision 1.28 2004/11/29 15:16:26 zsalvet
- Add ws-interface to checkout/build machinery.
-
- Revision 1.27 2004/11/29 13:55:02 akrenek
- added dependence on ws-interface
-
- Revision 1.26 2004/10/29 22:53:41 dimeglio
- Use envset target
-
- Revision 1.25 2004/10/28 22:57:36 dimeglio
- Quoted ant command line parameters
-
- Revision 1.24 2004/10/28 18:19:30 dimeglio
- Added envcheck to individual components
-
- Revision 1.23 2004/10/26 15:12:06 dimeglio
- Fixed spelling error in envchecks
-
- Revision 1.22 2004/10/26 13:11:13 dimeglio
- Added dependency of clean on envchecks
-
- Revision 1.21 2004/10/25 20:57:38 dimeglio
- Use antExec
-
- Revision 1.20 2004/10/21 10:37:48 akrenek
- make server depend on logger due to notification interlogger
-
- Revision 1.19 2004/10/15 12:30:01 akrenek
- build with lb.sever-bones
-
- Revision 1.18 2004/09/29 13:35:39 flammer
- Only update of line formatting.
-
- Revision 1.17 2004/09/09 21:05:29 dimeglio
- Moved tag target to targets-common
-
- Revision 1.16 2004/08/27 03:03:12 dimeglio
- Preserve original timestamp when copying file and overwrite when new
-
- Revision 1.15 2004/08/27 02:46:52 dimeglio
- Added logic to create the tagged dependencies properties file
-
- Revision 1.14 2004/08/26 23:48:26 dimeglio
- Added generation of cruisecontrol config file entry
-
- Revision 1.13 2004/08/09 04:56:14 dimeglio
- Replaced rtag with tag
-
- Revision 1.12 2004/08/09 04:36:44 dimeglio
- Fixed inheritance of do.cvs.tag property
-
- Revision 1.11 2004/08/09 03:06:11 dimeglio
- Fixed inheritance of failonerror property
-
- Revision 1.10 2004/08/09 02:35:35 dimeglio
- Set default value for failonerror
-
- Revision 1.9 2004/08/08 19:07:17 dimeglio
- Added small.memory type of build
-
- Revision 1.8 2004/07/29 10:47:46 dimeglio
- Added server and logger
-
- Revision 1.7 2004/07/29 07:39:57 dimeglio
- Removed local envinfo and envcheck target (must use common ones)
-
- Revision 1.6 2004/07/16 16:25:43 flammer
- Added tags for automated adding of components.
-
- Revision 1.5 2004/07/06 17:43:33 flammer
- Update of classpath definitions, targets & configure file.
-
- Revision 1.4 2004/06/23 00:24:03 dimeglio
- Added common and client modules
-
- Revision 1.3 2004/06/22 18:24:35 dimeglio
- Added client interface module
-
- Revision 1.2 2004/06/18 23:05:12 dimeglio
- Added/upgraded default build scripts
-
--->
-
-<project name="lb" default="dist">
-
- <description>
- Ant build file to build the GLite Logging and Bookkeping Subsystem
- </description>
-
- <!-- =========================================
- Builds the GLite LB subsystem
- ========================================= -->
-
- <!-- Import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- Import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="./project/properties.xml" />
-
- <!-- Import global build properties and global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependencies properties files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${subsystem.dependencies.file}"/>
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options
- ========================================= -->
- <import file="${global.configure.options.file}"/>
-
- <!-- =========================================
- Import global task definitions
- ========================================= -->
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Import global compiler definitions
- ========================================= -->
- <import file="${global.compilerdefs.file}" />
-
- <!-- =========================================
- Import targets
- ========================================= -->
- <import file="${global.targets-common.file}"/>
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
- <property file="${module.build.file}"/>
-
- <!-- ===============================================
- Public common targets
- =============================================== -->
-
- <target name="localinit" depends="envcheck">
-
- <echo> Preparing directories ... </echo>
-
- <mkdir dir="${stage.bin.dir}" />
- <mkdir dir="${stage.lib.dir}" />
- <mkdir dir="${stage.java.dir}" />
- <mkdir dir="${stage.inc.dir}" />
- <mkdir dir="${stage.int.dir}" />
-
- <mkdir dir="${dist.dir}" />
-
- </target>
-
- <target name="init" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="init"/>
- </antcall>
- </target>
-
- <target name="checkstyle" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="checkstyle"/>
- </antcall>
- </target>
-
- <target name="compile" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compile"/>
- </antcall>
- </target>
-
- <target name="compiletest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compiletest"/>
- </antcall>
- </target>
-
- <target name="unittest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unittest"/>
- </antcall>
- </target>
-
- <target name="unitcoverage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unitcoverage"/>
- </antcall>
- </target>
-
- <target name="stage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="stage"/>
- </antcall>
- </target>
-
- <target name="dist" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="dist"/>
- </antcall>
- </target>
-
- <target name="install" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="install"/>
- </antcall>
- </target>
-
- <target name="doc" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="doc"/>
- </antcall>
- </target>
-
- <target name="all" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="all"/>
- </antcall>
- </target>
-
- <target name="clean" depends="envcheck">
-
- <property name="offline.repository" value="true" />
- <antcall target="buildmodules">
- <param name="target" value="clean"/>
- </antcall>
-
- <delete dir="${module.bin.dir}" />
- <delete dir="${module.lib.dir}" />
- <delete dir="${module.autosrc.dir}" />
- <delete dir="${module.autodoc.dir}" />
- <delete dir="${module.test.reports.dir}" />
-
- </target>
-
- <target name="cleanAll" depends="clean"/>
-
- <!-- ===============================================
- Private targets
- =============================================== -->
-
- <!-- ===============================================
- Modules proxy targets
- =============================================== -->
-
- <!-- component targets definitions tag = do not remove = -->
-
- <target name="security.gsoap-plugin" unless="lbonly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${security.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="gsoap-plugin -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${security.subsystem.dir}"
- target="gsoap-plugin"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <target name="security.voms-api-c" unless="lbonly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${security.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="voms-api-c -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${security.subsystem.dir}"
- target="voms-api-c"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <target name="wms-utils.jobid" unless="lbonly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${wms-utils.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="jobid -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${wms-utils.subsystem.dir}"
- target="jobid"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <target name="jp.primary" unless="lbonly" depends="envset">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${jp.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
- <arg line="primary -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}"
- target="primary"
- inheritall="false" >
- <property name="target" value="${target}"/>
- </ant>
- </else>
- </if>
- </target>
-
- <if>
- <isset property="setenvonly"/>
- <then>
- <property name="lbonly" value="yes"/>
- </then>
- </if>
-
- <target name="client-interface" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.client-interface" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.client-interface"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="ws-interface" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.ws-interface" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.ws-interface"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="server-bones" unless="setenvonly" depends="envset">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.server-bones" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.server-bones"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="common" unless="setenvonly" depends="envset, globus, expat, c-ares, wms-utils.jobid, security.gsoap-plugin, client-interface">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.common" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.common"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="client" unless="setenvonly" depends="envset, globus, expat, c-ares, client-interface, common">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.client" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.client"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="server" unless="setenvonly" depends="envset, globus, expat, c-ares, mysql, gsoap, security.voms-api-c, jp.primary, client-interface, ws-interface, common, server-bones, logger">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.server" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.server"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="proxy" unless="setenvonly" depends="envset, globus, expat, c-ares, client-interface, common, server, logger">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.proxy" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.proxy"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="logger" unless="setenvonly" depends="envset, globus, expat, c-ares, client-interface, common">
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${lb.subsystem.dir}.logger" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.logger"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="utils" unless="setenvonly" depends="envset, globus, expat, c-ares, client, server, jp.primary">
- <if>
- <isset property="small.memory"/>
- <then>
- <exec dir="${lb.subsystem.dir}.utils" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
- </exec>
- </then>
- <else>
- <ant dir="${lb.subsystem.dir}.utils"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <!-- Main proxy -->
- <target name="buildmodules" depends="envset,
- utils,
- client-interface,
- ws-interface,
- client,
- server-bones,
- common,
- server,
- proxy,
- logger">
- <echo append="true" file="${global.project.dir}/cruisecontrol-stub.xml">
- <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/>
- </echo>
- </target>
-
-</project>
+++ /dev/null
-deploy_all.diff - against RC31
-deploy_lb, deploy_jp - older patches
+++ /dev/null
-Index: org.glite/project/global.dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite/project/global.dependencies.properties,v
-retrieving revision 1.482.2.279
-diff -u -p -u -r1.482.2.279 global.dependencies.properties
---- org.glite/project/global.dependencies.properties 4 Aug 2006 12:21:59 -0000 1.482.2.279
-+++ org.glite/project/global.dependencies.properties 1 Sep 2006 14:23:09 -0000
-@@ -1819,7 +1819,25 @@ ext.globus-sdk.description = The Globus
- ext.globus-sdk.rpm.name = vdt_globus_sdk
- ext.globus-sdk.rpm.version = ${ext.vdt.version}
- ext.globus-sdk.rpm.age = ${ext.vdt.age}
--
-+
-+# Globus vdt data server - grid ftp server
-+ext.globus-data-server.name = ${ext.globus.name}
-+ext.globus-data-server.vendor = ${ext.globus.vendor}
-+ext.globus-data-server.version = ${ext.globus.version}
-+ext.globus-data-server.platform = ${platform}
-+ext.globus-data-server.subdir = ${ext.globus-data-server.name}/${ext.globus-data-server.version}/${ext.globus-data-server.platform}
-+ext.globus-data-server.rep.base = ${jra1.rep.base}
-+ext.globus-data-server.rep.file =
-+ext.globus-data-server.rep.subdir =
-+ext.globus-data-server.rep.url = ${ext.globus-data-server.rep.base}/${ext.globus-data-server.subdir}/${ext.globus-data-server.rep.subdir}/${ext.globus-data-server.rep.file}
-+ext.globus-data-server.files =
-+ext.globus-data-server.download = http://www.cs.wisc.edu/vdt/releases/1.2.2/installing-rpms.html
-+ext.globus-data-server.homepage = http://www.cs.wisc.edu/vdt//index.html
-+ext.globus-data-server.description = The Globus Toolkit(R). This is the version packaged by VDT.
-+ext.globus-data-server.rpm.name = vdt_globus_data_server
-+ext.globus-data-server.rpm.version = ${ext.vdt.version}
-+ext.globus-data-server.rpm.age = 1
-+
- # GPT
- ext.gpt.name = gpt
- ext.gpt.vendor = gpt
-Index: org.glite.deployment/build.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/build.xml,v
-retrieving revision 1.61.2.2.2.12.2.26
-diff -u -p -u -r1.61.2.2.2.12.2.26 build.xml
---- org.glite.deployment/build.xml 24 Apr 2006 13:39:27 -0000 1.61.2.2.2.12.2.26
-+++ org.glite.deployment/build.xml 1 Sep 2006 14:23:09 -0000
-@@ -1619,6 +1619,39 @@
- </if>
- </target>
-
-+ <target name="jpps" unless="setenvonly" depends="envset,config">
-+ <if>
-+ <isset property="small.memory"/>
-+ <then>
-+ <exec dir="${deployment.subsystem.dir}.jpps" executable="${antExec}" failonerror="${failonerror}">
-+ <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </exec>
-+ </then>
-+ <else>
-+ <ant dir="${deployment.subsystem.dir}.jpps"
-+ target="${target}"
-+ inheritall="false" />
-+ </else>
-+ </if>
-+ </target>
-+
-+
-+ <target name="jpis" unless="setenvonly" depends="envset,config">
-+ <if>
-+ <isset property="small.memory"/>
-+ <then>
-+ <exec dir="${deployment.subsystem.dir}.jpis" executable="${antExec}" failonerror="${failonerror}">
-+ <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </exec>
-+ </then>
-+ <else>
-+ <ant dir="${deployment.subsystem.dir}.jpis"
-+ target="${target}"
-+ inheritall="false" />
-+ </else>
-+ </if>
-+ </target>
-+
- <target name="io-server" unless="setenvonly" depends="envset,config">
- <if>
- <isset property="small.memory"/>
-@@ -1730,6 +1763,8 @@
- wn,
- wms,
- lb,
-+ jpps,
-+ jpis,
- io-server,
- io-client,
- ce,
-Index: org.glite.deployment/project/dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/dependencies.properties,v
-retrieving revision 1.526.2.5.2.127.2.415.2.203
-diff -u -p -u -r1.526.2.5.2.127.2.415.2.203 dependencies.properties
---- org.glite.deployment/project/dependencies.properties 30 Aug 2006 07:41:36 -0000 1.526.2.5.2.127.2.415.2.203
-+++ org.glite.deployment/project/dependencies.properties 1 Sep 2006 14:23:09 -0000
-@@ -47,6 +47,8 @@
- org.glite.deployment.hydra.version = glite-deployment-hydra_R_1_0_3
- org.glite.deployment.io-client.version = glite-deployment-io-client_R_2_2_0
- org.glite.deployment.io-server.version = glite-deployment-io-server_R_2_1_8
-+ org.glite.deployment.jpps.version = HEAD
-+ org.glite.deployment.jpis.version = HEAD
- org.glite.deployment.lb.version = glite-deployment-lb_R_2_2_4
- org.glite.deployment.lcg-CE_torque.version = glite-deployment-lcg-CE_torque_R_3_0_4
- org.glite.deployment.lcg-CE.version = glite-deployment-lcg-CE_R_3_0_5
-Index: org.glite.deployment/project/glite.deployment.csf.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/glite.deployment.csf.xml,v
-retrieving revision 1.44.2.1.2.11.2.24
-diff -u -p -u -r1.44.2.1.2.11.2.24 glite.deployment.csf.xml
---- org.glite.deployment/project/glite.deployment.csf.xml 18 Apr 2006 15:42:14 -0000 1.44.2.1.2.11.2.24
-+++ org.glite.deployment/project/glite.deployment.csf.xml 1 Sep 2006 14:23:09 -0000
-@@ -667,6 +667,14 @@
- <equals arg1="${org.glite.deployment.lb.version}" arg2="HEAD" />
- </condition>
-
-+ <condition property="jpps.head">
-+ <equals arg1="${org.glite.deployment.jpps.version}" arg2="HEAD" />
-+ </condition>
-+
-+ <condition property="jpis.head">
-+ <equals arg1="${org.glite.deployment.jpis.version}" arg2="HEAD" />
-+ </condition>
-+
- <condition property="io-server.head">
- <equals arg1="${org.glite.deployment.io-server.version}" arg2="HEAD" />
- </condition>
-@@ -1571,6 +1579,28 @@
- tag="${org.glite.deployment.lb.version}" />
- </target>
-
-+ <!-- jpps component -->
-+ <target name="jpps" depends="get.jpps.head, get.jpps.tag"/>
-+ <target name="get.jpps.head" if="jpps.head">
-+ <cvs-co package="org.glite.deployment.jpps" />
-+ </target>
-+
-+ <target name="get.jpps.tag" unless="jpps.head">
-+ <cvs-co package="org.glite.deployment.jpps"
-+ tag="${org.glite.deployment.jpps.version}" />
-+ </target>
-+
-+ <!-- jpis component -->
-+ <target name="jpis" depends="get.jpis.head, get.jpis.tag"/>
-+ <target name="get.jpis.head" if="jpis.head">
-+ <cvs-co package="org.glite.deployment.jpis" />
-+ </target>
-+
-+ <target name="get.jpis.tag" unless="jpis.head">
-+ <cvs-co package="org.glite.deployment.jpis"
-+ tag="${org.glite.deployment.jpis.version}" />
-+ </target>
-+
- <!-- io-server component -->
- <target name="io-server" depends="get.io-server.head, get.io-server.tag"/>
- <target name="get.io-server.head" if="io-server.head">
-@@ -1667,6 +1697,8 @@
- wn,
- wms,
- lb,
-+ jpis,
-+ jpps,
- io-server,
- io-client,
- ce" />
-Index: org.glite.deployment.lb/config/scripts/glite-lb-config.py
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/scripts/glite-lb-config.py,v
-retrieving revision 1.65.2.4
-diff -u -p -u -r1.65.2.4 glite-lb-config.py
---- org.glite.deployment.lb/config/scripts/glite-lb-config.py 26 May 2006 12:24:22 -0000 1.65.2.4
-+++ org.glite.deployment.lb/config/scripts/glite-lb-config.py 1 Sep 2006 14:23:10 -0000
-@@ -129,7 +129,12 @@ python %s-config [OPTION...]""" % (self.
-
- if not os.path.exists('/tmp/mysql.sock'):
- os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock')
--
-+
-+
-+ #-------------------------------------------------------------------
-+ # start bkserver
-+ #-------------------------------------------------------------------
-+
- pid = glib.getPID('bkserverd')
- if pid != 0:
- print 'The gLite LB Server service is already running. Restarting...'
-@@ -142,7 +147,7 @@ python %s-config [OPTION...]""" % (self.
- pid = glib.getPID('bkserverd')
-
- if (pid != 0):
-- print "The gLite LB Server service has been started ",
-+ print "The gLite LB Server service has been started ",
- glib.printOkMessage()
- else:
- glib.printErrorMessage("Could not start the gLite LB Server service")
-@@ -151,6 +156,36 @@ python %s-config [OPTION...]""" % (self.
- return 1
-
- #-------------------------------------------------------------------
-+ # start jp-importer, if enabled
-+ #-------------------------------------------------------------------
-+
-+ lb_export = 0
-+ if params.has_key('lb.export.enabled'):
-+ if params['lb.export.enabled'] == "true":
-+ lb_export = 1
-+
-+ if lb_export:
-+ pid = glib.getPID('jp-importer')
-+ if pid != 0:
-+ print 'The gLite JP Importer service is already running. Restarting...'
-+ os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+ else:
-+ print 'Starting the gLite JP Importer service...'
-+
-+ os.system('%s/etc/init.d/glite-jp-importer start' % os.environ['GLITE_LOCATION'])
-+
-+ pid = glib.getPID('jp-importer')
-+
-+ if (pid != 0):
-+ print "The gLite JP Importer service has been started ",
-+ glib.printOkMessage()
-+ else:
-+ glib.printErrorMessage("Could not start the gLite JP Importer service")
-+ glib.printErrorMessage("Please verify and re-run the script "),
-+ glib.printFailedMessage()
-+ return 1
-+
-+ #-------------------------------------------------------------------
- # Start Servicetool
- #-------------------------------------------------------------------
-
-@@ -170,6 +205,10 @@ python %s-config [OPTION...]""" % (self.
- if (pid != 0):
- os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION'])
-
-+ #-------------------------------------------------------------------
-+ # Book Keeping Server
-+ #-------------------------------------------------------------------
-+
- pid = glib.getPID('bkserverd')
- if (pid != 0):
- print 'Could not stop the LB Server service ',
-@@ -180,6 +219,25 @@ python %s-config [OPTION...]""" % (self.
- glib.printOkMessage()
-
- #-------------------------------------------------------------------
-+ # JP Importer
-+ #-------------------------------------------------------------------
-+
-+ pid = glib.getPID('jp-importer')
-+ if (pid != 0):
-+ os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+
-+ pid = glib.getPID('jp-importer')
-+ if (pid != 0):
-+ print 'Could not stop the JP Importer service ',
-+ glib.printFailedMessage()
-+ error_level = 1
-+ else:
-+ if params.has_key('lb.export.enabled'):
-+ if params['lb.export.enabled'] == "true":
-+ print 'The JP Importer service has been stopped ',
-+ glib.printOkMessage()
-+
-+ #-------------------------------------------------------------------
- # MySQL
- #-------------------------------------------------------------------
-
-@@ -204,6 +262,10 @@ python %s-config [OPTION...]""" % (self.
- if retval != 0:
- error_level = 1
-
-+ retval = os.system('%s/etc/init.d/glite-jp-importer status' % os.environ['GLITE_LOCATION'])
-+ if retval != 0:
-+ error_level = 1
-+
- #-------------------------------------------------------------------
- # Servicetool
- #-------------------------------------------------------------------
-@@ -334,7 +396,29 @@ python %s-config [OPTION...]""" % (self.
- print "\n==> MySQL database %s already exist\n" % params['lb.database.name']
-
- self.mysql.stop()
--
-+
-+ # ------------------------------------------------------------------
-+ # export from bkserver to cron
-+ # ------------------------------------------------------------------
-+ if params['GLITE_LB_EXPORT_ENABLED'] == "true":
-+ file = open('%s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'], 'w')
-+ file.write('#! /bin/sh\n')
-+ file.write('. %s\n' % glib.getInstallerExportFile())
-+ file.write('$GLITE_LOCATION/sbin/glite-lb-export.sh\n')
-+ file.close()
-+ os.system('/bin/chmod 0755 %s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'])
-+
-+ file = open('/etc/cron.d/glite-lb-export.cron', 'w')
-+ file.write('# periodically run purge and export jobs from bkserver\n')
-+ file.write('00,30 * * * * %s %s/etc/glite-lb-export-cron-wrapper.sh 1>/dev/null\n' % (params['glite.user.name'], os.environ['GLITE_LOCATION']))
-+ file.close()
-+ os.system('/bin/chmod 0644 /etc/cron.d/glite-lb-export.cron')
-+ else
-+ os.system('/bin/rm -f /etc/cron.d/glite-lb-export.cron')
-+
-+ # Touch cron spool directory to cause reloading of the crontabs
-+ os.system("/bin/touch /var/spool/cron")
-+
- #-------------------------------------------------------------------
- # RGMA servicetool: configure servicetool
- #-------------------------------------------------------------------
-@@ -420,6 +504,19 @@ def set_env():
- # Perl
- glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION']))
-
-+ # LB export
-+ glib.export('GLITE_LB_EXPORT_ENABLED', params['lb.export.enabled']);
-+ glib.export('GLITE_LB_EXPORT_JPPS', params['lb.export.jpps']);
-+ glib.export('GLITE_LB_EXPORT_JPREG_MAILDIR', params['lb.export.jpreg']);
-+ glib.export('GLITE_LB_EXPORT_JPDUMP_MAILDIR', params['lb.export.jpdump']);
-+ glib.export('GLITE_LB_EXPORT_DUMPDIR', params['lb.export.dump']);
-+ glib.export('GLITE_LB_EXPORT_DUMPDIR_KEEP', params['lb.export.dump.keep']);
-+ glib.export('GLITE_LB_EXPORT_JOBSDIR', params['lb.export.jobs']);
-+ glib.export('GLITE_LB_EXPORT_JOBSDIR_KEEP', params['lb.export.jobs.keep']);
-+ glib.export('GLITE_LB_EXPORT_PURGEDIR', params['lb.export.purge']);
-+ glib.export('GLITE_LB_EXPORT_PURGEDIR_KEEP', params['lb.export.purge.keep']);
-+ glib.export('GLITE_LB_EXPORT_PURGE_ARGS', '%s' % params['lb.export.purgeargs']);
-+
- # Set environment
- glib.setUserEnv()
-
-Index: org.glite.deployment.lb/config/templates/glite-lb.cfg.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml,v
-retrieving revision 1.21
-diff -u -p -u -r1.21 glite-lb.cfg.xml
---- org.glite.deployment.lb/config/templates/glite-lb.cfg.xml 13 Mar 2006 15:19:21 -0000 1.21
-+++ org.glite.deployment.lb/config/templates/glite-lb.cfg.xml 1 Sep 2006 14:23:10 -0000
-@@ -17,9 +17,16 @@
- parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
- value="changeme"/>
-
-- <mysql.root.password
-- description="The mysql root password"
-- value="changeme"/>
-+ <mysql.root.password
-+ description="The mysql root password"
-+ value="changeme"/>
-+
-+ <lb.export.jpps
-+ description="Job Provenance Primary Storage.
-+ [Example: localhost:8901][Type: string]"
-+ value="changeme"/>
-+
-+
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- Advanced parameters - Change them if you know what you're doing -->
-@@ -55,6 +62,12 @@
- [Example: 17M][Type: Integer][Unit: MB]"
- value="17M"/>
-
-+ <lb.export.enabled
-+ description="Enables exports to Job Provenance.
-+ [Example: true][Type: boolean]"
-+ value="false"/>
-+
-+
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- System parameters - You should leave these alone -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-@@ -67,7 +80,47 @@
- <value>destination</value>
-
- </lb.index.list>
--
-+
-+ <lb.export.jpreg
-+ description="Spool directory where job registration requests are stored before delivered to JPPS.
-+ [Type: string]"
-+ value="/tmp/jpreg"/>
-+
-+ <lb.export.jpdump
-+ description="Spool directory where dump upload requests are stored before delivered to JPPS.
-+ [Type: string]"
-+ value="/tmp/jpdump"/>
-+
-+ <lb.export.dump
-+ description="Temporary directory for monitoring dumps, it's cleaned automatically.
-+ [Type: string]"
-+ value="/tmp/dump"/>
-+
-+ <lb.export.purge
-+ description="Temporary directory for dumps of purged jobs.
-+ [Type: string]"
-+ value="/tmp/purge"/>
-+
-+ <lb.export.purge.keep
-+ description="Directory for dumps of jobs that were already handled (sent to JPPS).
-+ [Type: string]"
-+ value=""/>
-+
-+ <lb.export.jobs
-+ description="Exported events in file per job form before delivered to JPPS.
-+ [Type: string]"
-+ value="/tmp/lb_export"/>
-+
-+ <lb.export.jobs.keep
-+ description="Keep the already handled exported events in file per job form.
-+ [Type: string]"
-+ value=""/>
-+
-+ <lb.export.purgeargs
-+ description="Arguments for LB purge process (a job in a given terminal state will be exported from the LB after timeouts defined here). See also glite-lb-purge documentation.
-+ [Example: -c 1h -a 1h -n 1h -o 1d][Type: string]"
-+ value="--cleared 2d --aborted 2w --cancelled 2w --other 2m"/>
-+
- </parameters>
-
- </config>
-Index: org.glite.deployment.lb/project/glite-lb.sdf.xml.template
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/project/glite-lb.sdf.xml.template,v
-retrieving revision 1.38.2.2
-diff -u -p -u -r1.38.2.2 glite-lb.sdf.xml.template
---- org.glite.deployment.lb/project/glite-lb.sdf.xml.template 2 May 2006 10:36:19 -0000 1.38.2.2
-+++ org.glite.deployment.lb/project/glite-lb.sdf.xml.template 1 Sep 2006 14:23:10 -0000
-@@ -57,6 +57,12 @@
- build="@org.glite.lb.server-bones.info.build@"
- arch="i386"/>
-
-+ <component name="glite-lb-client"
-+ version="@org.glite.lb.client.info.version@"
-+ age="@org.glite.lb.client.info.age@"
-+ build="@org.glite.lb.client.info.build@"
-+ arch="i386"/>
-+
- <component name="glite-wms-utils-jobid"
- version="@org.glite.wms-utils.jobid.info.version@"
- age="@org.glite.wms-utils.jobid.info.age@"
-@@ -105,6 +111,12 @@
- build="@org.glite.jp.ws-interface.info.build@"
- arch="i386"/>
-
-+ <component name="glite-jp-client"
-+ version="@org.glite.jp.client.info.version@"
-+ age="@org.glite.jp.client.info.age@"
-+ build="@org.glite.jp.client.info.build@"
-+ arch="i386"/>
-+
- <component name="gridsite"
- version="@org.gridsite.core.info.version@"
- age="@org.gridsite.core.info.age@"
+++ /dev/null
-This patch was merged to deploy_all.diff, don't use it anymore
-
-Index: org.glite/project/global.dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite/project/global.dependencies.properties,v
-retrieving revision 1.479.2.70.2.3.2.3.2.1
-diff -u -r1.479.2.70.2.3.2.3.2.1 global.dependencies.properties
---- org.glite/project/global.dependencies.properties 9 May 2006 16:17:50 -0000 1.479.2.70.2.3.2.3.2.1
-+++ org.glite/project/global.dependencies.properties 30 Jun 2006 11:13:49 -0000
-@@ -15,7 +15,7 @@
- # Authors: Joachim Flammer <joachim.flammer@cern.ch>
- #
- # Version info: $Id$
--# Release: $Name$
-+# Release: $Name$
- #
- # Revision history:
- # $Log$
- # Revision 1.3 2006/06/30 11:30:28 mmulac
- # actualized patches
- # - against org.glite a org.glite.deployment from glite_R_3_0_0
- #
-@@ -1562,7 +1562,26 @@
- ext.globus-sdk.rpm.name = vdt_globus_sdk
- ext.globus-sdk.rpm.version = ${ext.vdt.version}
- ext.globus-sdk.rpm.age = 1
--
-+
-+# Globus vdt data server - grid ftp server
-+ext.globus-data-server.name = ${ext.globus.name}
-+ext.globus-data-server.vendor = ${ext.globus.vendor}
-+ext.globus-data-server.version = ${ext.globus.version}
-+ext.globus-data-server.platform = ${platform}
-+ext.globus-data-server.subdir = ${ext.globus-data-server.name}/${ext.globus-data-server.version}/${ext.globus-data-server.platform}
-+ext.globus-data-server.rep.base = ${jra1.rep.base}
-+ext.globus-data-server.rep.file =
-+ext.globus-data-server.rep.subdir =
-+ext.globus-data-server.rep.url = ${ext.globus-data-server.rep.base}/${ext.globus-data-server.subdir}/${ext.globus-data-server.rep.subdir}/${ext.globus-data-server.rep.file}
-+ext.globus-data-server.files =
-+ext.globus-data-server.download = http://www.cs.wisc.edu/vdt/releases/1.2.2/installing-rpms.html
-+ext.globus-data-server.homepage = http://www.cs.wisc.edu/vdt//index.html
-+ext.globus-data-server.description = The Globus Toolkit(R). This is the version packaged by VDT.
-+ext.globus-data-server.rpm.name = vdt_globus_data_server
-+ext.globus-data-server.rpm.version = ${ext.vdt.version}
-+ext.globus-data-server.rpm.age = 1
-+
-+
- # GPT
- ext.gpt.name = gpt
- ext.gpt.vendor = gpt
-@@ -3266,8 +3285,9 @@
- org.glite.dgas.version = glite-dgas_R_1_1_16
- org.glite.gpbox.version = glite-gpbox_R_1_0_15
- org.glite.jdl.version = glite-jdl_R_1_0_0
--org.glite.jp.version = glite-jp_R_1_1_3
--org.glite.lb.version = glite-lb_R_1_2_9
-+org.glite.jp.version = glite-jp_R_1_3_0
-+org.glite.lb.version = glite-lb_R_1_2_11
-+
- org.glite.rgma.version = glite-rgma_R_5_0_26
- org.glite.security.version = glite-security_R_3_0_15
- org.glite.service-discovery.version = glite-service-discovery_R_2_0_12
-Index: org.glite.deployment/build.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/build.xml,v
-retrieving revision 1.61.2.2.2.12.2.26
-diff -u -r1.61.2.2.2.12.2.26 build.xml
---- org.glite.deployment/build.xml 24 Apr 2006 13:39:27 -0000 1.61.2.2.2.12.2.26
-+++ org.glite.deployment/build.xml 30 Jun 2006 11:13:49 -0000
-@@ -9,7 +9,7 @@
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
-
-- Release: $Name$
-+ Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2006/06/30 11:30:28 mmulac
- actualized patches
- - against org.glite a org.glite.deployment from glite_R_3_0_0
-
-@@ -1619,6 +1619,39 @@
- </if>
- </target>
-
-+ <target name="jpps" unless="setenvonly" depends="envset,config">
-+ <if>
-+ <isset property="small.memory"/>
-+ <then>
-+ <exec dir="${deployment.subsystem.dir}.jpps" executable="${antExec}" failonerror="${failonerror}">
-+ <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </exec>
-+ </then>
-+ <else>
-+ <ant dir="${deployment.subsystem.dir}.jpps"
-+ target="${target}"
-+ inheritall="false" />
-+ </else>
-+ </if>
-+ </target>
-+
-+
-+ <target name="jpis" unless="setenvonly" depends="envset,config">
-+ <if>
-+ <isset property="small.memory"/>
-+ <then>
-+ <exec dir="${deployment.subsystem.dir}.jpis" executable="${antExec}" failonerror="${failonerror}">
-+ <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </exec>
-+ </then>
-+ <else>
-+ <ant dir="${deployment.subsystem.dir}.jpis"
-+ target="${target}"
-+ inheritall="false" />
-+ </else>
-+ </if>
-+ </target>
-+
- <target name="io-server" unless="setenvonly" depends="envset,config">
- <if>
- <isset property="small.memory"/>
-@@ -1730,6 +1763,8 @@
- wn,
- wms,
- lb,
-+ jpps,
-+ jpis,
- io-server,
- io-client,
- ce,
-Index: org.glite.deployment/project/dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/dependencies.properties,v
-retrieving revision 1.526.2.5.2.127.2.415.2.22
-diff -u -r1.526.2.5.2.127.2.415.2.22 dependencies.properties
---- org.glite.deployment/project/dependencies.properties 9 May 2006 12:33:18 -0000 1.526.2.5.2.127.2.415.2.22
-+++ org.glite.deployment/project/dependencies.properties 30 Jun 2006 11:13:49 -0000
-@@ -80,6 +80,10 @@
-
- org.glite.deployment.lb.version = glite-deployment-lb_R_2_2_3
-
-+ org.glite.deployment.jpis.version = HEAD
-+
-+ org.glite.deployment.jpps.version = HEAD
-+
- org.glite.deployment.glite-WMSLB.version = glite-deployment-glite-WMSLB_R_2_4_2
-
- org.glite.deployment.wn.version = glite-deployment-wn_R_2_3_7
-Index: org.glite.deployment/project/glite.deployment.csf.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/glite.deployment.csf.xml,v
-retrieving revision 1.44.2.1.2.11.2.24
-diff -u -r1.44.2.1.2.11.2.24 glite.deployment.csf.xml
---- org.glite.deployment/project/glite.deployment.csf.xml 18 Apr 2006 15:42:14 -0000 1.44.2.1.2.11.2.24
-+++ org.glite.deployment/project/glite.deployment.csf.xml 30 Jun 2006 11:13:50 -0000
-@@ -9,7 +9,7 @@
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
-
- Version info: $Id$
-- Release: $Name$
-+ Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2006/06/30 11:30:28 mmulac
- actualized patches
- - against org.glite a org.glite.deployment from glite_R_3_0_0
-
-@@ -667,6 +667,14 @@
- <equals arg1="${org.glite.deployment.lb.version}" arg2="HEAD" />
- </condition>
-
-+ <condition property="jpps.head">
-+ <equals arg1="${org.glite.deployment.jpps.version}" arg2="HEAD" />
-+ </condition>
-+
-+ <condition property="jpis.head">
-+ <equals arg1="${org.glite.deployment.jpis.version}" arg2="HEAD" />
-+ </condition>
-+
- <condition property="io-server.head">
- <equals arg1="${org.glite.deployment.io-server.version}" arg2="HEAD" />
- </condition>
-@@ -1571,6 +1579,28 @@
- tag="${org.glite.deployment.lb.version}" />
- </target>
-
-+ <!-- jpps component -->
-+ <target name="jpps" depends="get.jpps.head, get.jpps.tag"/>
-+ <target name="get.jpps.head" if="jpps.head">
-+ <cvs-co package="org.glite.deployment.jpps" />
-+ </target>
-+
-+ <target name="get.jpps.tag" unless="jpps.head">
-+ <cvs-co package="org.glite.deployment.jpps"
-+ tag="${org.glite.deployment.jpps.version}" />
-+ </target>
-+
-+ <!-- jpis component -->
-+ <target name="jpis" depends="get.jpis.head, get.jpis.tag"/>
-+ <target name="get.jpis.head" if="jpis.head">
-+ <cvs-co package="org.glite.deployment.jpis" />
-+ </target>
-+
-+ <target name="get.jpis.tag" unless="jpis.head">
-+ <cvs-co package="org.glite.deployment.jpis"
-+ tag="${org.glite.deployment.jpis.version}" />
-+ </target>
-+
- <!-- io-server component -->
- <target name="io-server" depends="get.io-server.head, get.io-server.tag"/>
- <target name="get.io-server.head" if="io-server.head">
-@@ -1667,6 +1697,8 @@
- wn,
- wms,
- lb,
-+ jpis,
-+ jpps,
- io-server,
- io-client,
- ce" />
+++ /dev/null
-This patch was merged to deploy_all.diff, don't use it anymore.
-
-Index: org.glite.deployment.lb/config/scripts/glite-lb-config.py
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/scripts/glite-lb-config.py,v
-retrieving revision 1.65.2.3
-diff -u -r1.65.2.3 glite-lb-config.py
---- org.glite.deployment.lb/config/scripts/glite-lb-config.py 2 May 2006 10:36:16 -0000 1.65.2.3
-+++ org.glite.deployment.lb/config/scripts/glite-lb-config.py 30 Jun 2006 09:29:21 -0000
-@@ -127,7 +127,12 @@
-
- if not os.path.exists('/tmp/mysql.sock'):
- os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock')
--
-+
-+
-+ #-------------------------------------------------------------------
-+ # start bkserver
-+ #-------------------------------------------------------------------
-+
- pid = glib.getPID('bkserverd')
- if pid != 0:
- print 'The gLite LB Server service is already running. Restarting...'
-@@ -140,7 +145,7 @@
- pid = glib.getPID('bkserverd')
-
- if (pid != 0):
-- print "The gLite LB Server service has been started ",
-+ print "The gLite LB Server service has been started ",
- glib.printOkMessage()
- else:
- glib.printErrorMessage("Could not start the gLite LB Server service")
-@@ -149,6 +154,36 @@
- return 1
-
- #-------------------------------------------------------------------
-+ # start jp-importer, if enabled
-+ #-------------------------------------------------------------------
-+
-+ lb_export = 0
-+ if params.has_key('lb.export.enabled'):
-+ if params['lb.export.enabled'] == "true":
-+ lb_export = 1
-+
-+ if lb_export:
-+ pid = glib.getPID('jp-importer')
-+ if pid != 0:
-+ print 'The gLite JP Importer service is already running. Restarting...'
-+ os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+ else:
-+ print 'Starting the gLite JP Importer service...'
-+
-+ os.system('%s/etc/init.d/glite-jp-importer start' % os.environ['GLITE_LOCATION'])
-+
-+ pid = glib.getPID('jp-importer')
-+
-+ if (pid != 0):
-+ print "The gLite JP Importer service has been started ",
-+ glib.printOkMessage()
-+ else:
-+ glib.printErrorMessage("Could not start the gLite JP Importer service")
-+ glib.printErrorMessage("Please verify and re-run the script "),
-+ glib.printFailedMessage()
-+ return 1
-+
-+ #-------------------------------------------------------------------
- # Start Servicetool
- #-------------------------------------------------------------------
-
-@@ -168,6 +203,10 @@
- if (pid != 0):
- os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION'])
-
-+ #-------------------------------------------------------------------
-+ # Book Keeping Server
-+ #-------------------------------------------------------------------
-+
- pid = glib.getPID('bkserverd')
- if (pid != 0):
- print 'Could not stop the LB Server service ',
-@@ -178,6 +217,25 @@
- glib.printOkMessage()
-
- #-------------------------------------------------------------------
-+ # JP Importer
-+ #-------------------------------------------------------------------
-+
-+ pid = glib.getPID('jp-importer')
-+ if (pid != 0):
-+ os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+
-+ pid = glib.getPID('jp-importer')
-+ if (pid != 0):
-+ print 'Could not stop the JP Importer service ',
-+ glib.printFailedMessage()
-+ error_level = 1
-+ else:
-+ if params.has_key('lb.export.enabled'):
-+ if params['lb.export.enabled'] == "true":
-+ print 'The JP Importer service has been stopped ',
-+ glib.printOkMessage()
-+
-+ #-------------------------------------------------------------------
- # MySQL
- #-------------------------------------------------------------------
-
-@@ -202,6 +260,10 @@
- if retval != 0:
- error_level = 1
-
-+ retval = os.system('%s/etc/init.d/glite-jp-importer status' % os.environ['GLITE_LOCATION'])
-+ if retval != 0:
-+ error_level = 1
-+
- #-------------------------------------------------------------------
- # Servicetool
- #-------------------------------------------------------------------
-@@ -332,7 +394,27 @@
- print "\n==> MySQL database %s already exist\n" % params['lb.database.name']
-
- self.mysql.stop()
--
-+
-+ # ------------------------------------------------------------------
-+ # export from bkserver to cron
-+ # ------------------------------------------------------------------
-+ if params['GLITE_LB_EXPORT_ENABLED'] == "true":
-+ file = open('%s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'], 'w')
-+ file.write('#! /bin/sh\n')
-+ file.write('. %s\n' % glib.getInstallerExportFile())
-+ file.write('$GLITE_LOCATION/examples/glite-lb-export.sh\n')
-+ file.close()
-+ os.system('/bin/chmod 0755 %s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'])
-+
-+ file = open('/etc/cron.d/glite-lb-export.cron', 'w')
-+ file.write('# periodically run purge and export jobs from bkserver\n')
-+ file.write('00,30 * * * * %s %s/etc/glite-lb-export-cron-wrapper.sh\n' % (params['glite.user.name'], os.environ['GLITE_LOCATION']))
-+ file.close()
-+ os.system('/bin/chmod 0755 /etc/cron.d/glite-lb-export.cron')
-+
-+ # Touch cron spool directory to cause reloading of the crontabs
-+ os.system("/bin/touch /var/spool/cron")
-+
- #-------------------------------------------------------------------
- # RGMA servicetool: configure servicetool
- #-------------------------------------------------------------------
-@@ -418,6 +500,17 @@
- # Perl
- glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION']))
-
-+ # LB export
-+ glib.export('GLITE_LB_EXPORT_ENABLED', params['lb.export.enabled']);
-+ glib.export('GLITE_LB_EXPORT_BKSERVER', params['lb.export.bkserver']);
-+ glib.export('GLITE_LB_EXPORT_JPPS', params['lb.export.jpps']);
-+ glib.export('GLITE_LB_EXPORT_JPREG_MAILDIR', params['lb.export.jpreg']);
-+ glib.export('GLITE_LB_EXPORT_JPDUMP_MAILDIR', params['lb.export.jpdump']);
-+ glib.export('GLITE_LB_EXPORT_DUMPDIR', params['lb.export.dump']);
-+ glib.export('GLITE_LB_EXPORT_DUMPDIR_OLD', params['lb.export.dump.old']);
-+ glib.export('GLITE_LB_EXPORT_EXPORTDIR', params['lb.export.export']);
-+ glib.export('GLITE_LB_EXPORT_PURGE_ARGS', '"%s"' % params['lb.export.purgeargs']);
-+
- # Set environment
- glib.setUserEnv()
-
-Index: org.glite.deployment.lb/config/templates/glite-lb.cfg.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml,v
-retrieving revision 1.21
-diff -u -r1.21 glite-lb.cfg.xml
---- org.glite.deployment.lb/config/templates/glite-lb.cfg.xml 13 Mar 2006 15:19:21 -0000 1.21
-+++ org.glite.deployment.lb/config/templates/glite-lb.cfg.xml 30 Jun 2006 09:29:21 -0000
-@@ -17,9 +17,16 @@
- parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
- value="changeme"/>
-
-- <mysql.root.password
-- description="The mysql root password"
-- value="changeme"/>
-+ <mysql.root.password
-+ description="The mysql root password"
-+ value="changeme"/>
-+
-+ <lb.export.jpps
-+ description="Job Provenance Primary Storage.
-+ [Example: localhost:8901][Type: string]"
-+ value="changeme"/>
-+
-+
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- Advanced parameters - Change them if you know what you're doing -->
-@@ -55,6 +62,12 @@
- [Example: 17M][Type: Integer][Unit: MB]"
- value="17M"/>
-
-+ <lb.export.enabled
-+ description="Enables exports to Job Provenance.
-+ [Example: true][Type: boolean]"
-+ value="true"/>
-+
-+
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- System parameters - You should leave these alone -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-@@ -67,7 +80,42 @@
- <value>destination</value>
-
- </lb.index.list>
--
-+
-+ <lb.export.bkserver
-+ description="Book Keeping Server service when differs from default port on localhost.
-+ [Example: localhost:9000][Type: string]"
-+ value=""/>
-+
-+ <lb.export.jpreg
-+ description="Maildir for job registrations.
-+ [Example: /tmp/jpreg][Type: string]"
-+ value=""/>
-+
-+ <lb.export.jpdump
-+ description="Maildir for job dumps.
-+ [Example: /tmp/jpdump][Type: string]"
-+ value=""/>
-+
-+ <lb.export.dump
-+ description="Dump directory for purged jobs.
-+ [Example: /tmp/dump][Type: string]"
-+ value=""/>
-+
-+ <lb.export.dump.old
-+ description="Dump directory for handled purged jobs.
-+ [Example: /tmp/dump.old][Type: string]"
-+ value=""/>
-+
-+ <lb.export.export
-+ description="Exported events divided to file per job.
-+ [Example: /tmp/lb_export][Type: string]"
-+ value=""/>
-+
-+ <lb.export.purgeargs
-+ description="Purge arguments (with timeouts).
-+ [Example: -a 1h -c 1h -n 1h -o 1d][Type: string]"
-+ value="-a 1d -c 1d -n 1d -o 7d"/>
-+
- </parameters>
-
- </config>
-Index: org.glite.deployment.lb/project/glite-lb.sdf.xml.template
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/project/glite-lb.sdf.xml.template,v
-retrieving revision 1.38.2.2
-diff -u -r1.38.2.2 glite-lb.sdf.xml.template
---- org.glite.deployment.lb/project/glite-lb.sdf.xml.template 2 May 2006 10:36:19 -0000 1.38.2.2
-+++ org.glite.deployment.lb/project/glite-lb.sdf.xml.template 30 Jun 2006 09:29:21 -0000
-@@ -57,6 +57,12 @@
- build="@org.glite.lb.server-bones.info.build@"
- arch="i386"/>
-
-+ <component name="glite-lb-client"
-+ version="@org.glite.lb.client.info.version@"
-+ age="@org.glite.lb.client.info.age@"
-+ build="@org.glite.lb.client.info.build@"
-+ arch="i386"/>
-+
- <component name="glite-wms-utils-jobid"
- version="@org.glite.wms-utils.jobid.info.version@"
- age="@org.glite.wms-utils.jobid.info.age@"
-@@ -105,6 +111,12 @@
- build="@org.glite.jp.ws-interface.info.build@"
- arch="i386"/>
-
-+ <component name="glite-jp-client"
-+ version="@org.glite.jp.client.info.version@"
-+ age="@org.glite.jp.client.info.age@"
-+ build="@org.glite.jp.client.info.build@"
-+ arch="i386"/>
-+
- <component name="gridsite"
- version="@org.gridsite.core.info.version@"
- age="@org.gridsite.core.info.age@"
+++ /dev/null
-These are the instructions how to build LB for VDT:
-
-$ mkdir lb4vdt
-$ cd lb4vdt
-$ export CVSROOT=:pserver:anonymous@jra1mw.cvs.cern.ch:/cvs/jra1mw
-$ cvs co org.glite.lb
-
-you may need to edit ./org.glite.lb/lb4vdt/Makefile.inc
-to specify some paths (some of them should be set automaticaly,
-e.g. by VDT_LOCATION)
-
-and then (still from the top directory) run
-
-$ ./org.glite.lb/lb4vdt/LB_install.sh 2>&1 | tee log
-
-:)
+++ /dev/null
-%
-% Official text received on October 6, 2004
-%
-\vfill{\bf Copyright }\copyright{\bf Members of the EGEE Collaboration. 2004.
-See http://eu-egee.org/partners for details on the copyright holders.
-
-EGEE (``Enabling Grids for E-science in Europe'') is a project funded by
-the European Union. For more information on the project, its partners
-and contributors please see http://www.eu-egee.org.
-
-You are permitted to copy and distribute verbatim copies of this
-document containing this copyright notice, but modifying this document
-is not allowed. You are permitted to copy this document in whole or in
-part into other documents if you attach the following reference to the
-copied elements: ``Copyright }\copyright{\bf 2004. Members of the EGEE
-Collaboration. http://www.eu-egee.org''
-
-The information contained in this document represents the views of
-EGEE as of the date they are published. EGEE does not guarantee that
-any information contained herein is error-free, or up to date.
-
-EGEE MAKES NO WARRANTIES, EXPRESS, IMPLIED, OR STATUTORY, BY
-PUBLISHING THIS DOCUMENT.}
-
+++ /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} & Ale\v s K\v{r}enek et al.& CESNET & May 28, 2005 & \\
-\hline
-{\bf Reviewed by} & & & & \\
-
-\hline
-{\bf Approved by} & & & & \\
-\hline
-\end{tabularx}
-
-\begin{center}
-{\bf Document Change Log}
-\end{center}
-
-\begin{tabularx}{\textwidth}{|l|l|X|X|}
-\hline
-{\bf Issue } & {\bf Date } & {\bf Comment } & {\bf Author } \\ \hline
-Initial version & Feb 28, 2005 & & A. K\v{r}enek \\ \hline
-Reviewer's comments & Mar 25, 2005 & comments reflected & A. K\v{r}enek \\
-\hline
-\end{tabularx}
-
-\begin{center}
-{\bf Document Change Record}
-\end{center}
-
-\begin{tabularx}{\textwidth}{|l|l|X|}
-\hline
-{\bf Issue } & {\bf Item } & {\bf Reason for Change } \\ \hline
-
-
-\hline
-\end{tabularx}
-
-\input{copyright}
+++ /dev/null
-CLPR=1; for jobid in `./stage/sbin/glite-lb-perftest_logjobs -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf|grep https`; do stage/bin/glite-lb-logevent -x -S /tmp/proxy_michal.perfstore.sock -c $SEQCODE -j $jobid -s UserInterface -e Abort --reason Purge; done
+++ /dev/null
-./stage/sbin/glite-lb-purge -j /tmp/perftest_1000.jobids -m scientific.civ.zcu.cz:10000 -s
+++ /dev/null
- REG=1; for jobid in `./stage/sbin/glite-lb-perftest_logjobs -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf|grep https`; do stage/examples/glite-lb-job_reg -j $jobid -s UserInterface ; done
+++ /dev/null
-./shared/egee/jra1-head/stage/sbin/perftest_il.sh 10
--------------------------------------------
-Logging test:
- - events sent through IPC and/or files
- - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
- small_job big_job small_dag big_dag
-a) 154727793 11240340 101479915 621678
-[jobs/day]
-b) 11540156 594389 10416164 402240
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 14323607 547755 10158371 375594
-[jobs/day]
-b) 6284230 364547 4554967 300055
-[jobs/day]
-c) 7540122 412971 3186381 300417
-[jobs/day]
-x) 9672327 418137 2567653 297477
-[jobs/day]
-d) this test is not yet implemented
-e) 9650719 410507 3651840 301687
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 2639788 182196 2035014 246654
-[jobs/day]
-b) 1170308 45973 759842 74898
-[jobs/day]
-c) 1060595 42047 921386 76638
-[jobs/day]
-x) 1091863 42247 518302 82129
-[jobs/day]
-d) this test is not yet implemented
-e) 1147040 41790 489257 76627
-[jobs/day]
-
+++ /dev/null
-[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 10
--------------------------------------------
-Logging test:
- - events sent through IPC and/or files
- - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
- small_job big_job small_dag big_dag
-a) 149765990 10933663 100162299 619924
-[jobs/day]
-b) 11857056 479615 2753618 277679
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 13813170 268900 6448242 244203
-[jobs/day]
-b) 4525621 255055 6147103 241153
-[jobs/day]
-c) 9338319 217855 5497442 248429
-[jobs/day]
-x) 9335090 232292 3989195 236341
-[jobs/day]
-d) this test is not yet implemented
-e) 3283323 216013 7284868 256479
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 4019651 44496 766972 95556
-[jobs/day]
-b) 1366885 47501 564779 90055
-[jobs/day]
-c) 1152594 47656 603774 97465
-[jobs/day]
-x) 1049069 48779 607913 88692
-[jobs/day]
-d) this test is not yet implemented
-e) 942509 46271 523129 91103
-[jobs/day]
-
-
-*************************************************************************
-
-
-[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 100
--------------------------------------------
-Logging test:
- - events sent through IPC and/or files
- - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
- small_job big_job small_dag big_dag
-a) 157966907 0 0 620546
-[jobs/day]
-b) 13833450 558487 10210340 283454
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 12884330 316703 4447489 151870
-[jobs/day]
-b) 7980713 469667 4641283 244463
-[jobs/day]
-c) 8458472 556919 5657712 253640
-[jobs/day]
-x) 8149836 549678 4765300 257375
-[jobs/day]
-d) this test is not yet implemented
-e) 9687868 503933 4461079 247092
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 9389344 97159 450483 68610
-[jobs/day]
-b) 1195400 82681 560118 88216
-[jobs/day]
-c) 1351879 88207 830072 102285
-[jobs/day]
-x) 1173835 85897 562648 0
-[jobs/day]
-d) this test is not yet implemented
-e) 1205291 78355 567658 87770
-[jobs/day]
+++ /dev/null
-[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 10
--------------------------------------------
-Logging test:
- - events sent through IPC and/or files
- - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
- small_job big_job small_dag big_dag
-a) 153599999 11157889 101479915 539075
-[jobs/day]
-b) 10835893 1059003 2577803 351095
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 14148626 772362 11498383 376986
-[jobs/day]
-b) 5348851 489142 5558879 292071
-[jobs/day]
-c) 9042670 441000 5911613 287842
-[jobs/day]
-x) 7730298 414784 6579748 289834
-[jobs/day]
-d) this test is not applicable
-e) 9288325 365701 7189156 299604
-[jobs/day]
------------------------------------
-Interlogger test:
- - events sent through IPC & files
- - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
- small_job big_job small_dag big_dag
-a) 2219003 185867 1785164 258615
-[jobs/day]
-b) 1795503 48283 309380 77422
-[jobs/day]
-c) 1201618 39001 850436 74771
-[jobs/day]
-x) 1134249 48039 447017 74244
-[jobs/day]
-d) 5335078 207059 2438095 96295
-[jobs/day]
-e) 1019269 36465 875966 65565
-[jobs/day]
-
-
+++ /dev/null
-michal:~/shared/egee/jra1-head> ./stage/sbin/perftest_ll.sh 10
-----------------
-Locallogger test
-----------------
-a) glite-lb-logd-perf-nofile --noParse --noIPC
-b) glite-lb-logd-perf-nofile --noIPC
-c) glite-lb-logd-perf --noIPC
-d) glite-lb-logd-perf
-
-Number of jobs: 10
-
- small_job big_job small_dag big_dag
-a) 14.544066 14.590504 14.681760 9.264801 [events/sec]
- 125660 8404 97577 25821 [jobs/day]
-b) 14.614844 14.408043 14.279216 9.600877 [events/sec]
- 126272 8298 94901 26758 [jobs/day]
-c) 0.000000 0.000000 0.000000 0.000000 [events/sec]
- 0 0 0 0 [jobs/day]
-d) 13.331568 13.530218 13.420780 8.363152 [events/sec]
- 115184 7793 89196 23308 [jobs/day]
+++ /dev/null
--------------------
-LB chain test
--------------------
-- proxy & interlogger (lazy variant) running at umbar
-- bkserver running at sci
-- test variants:
- a) 10 jobs
- b) 100 jobs
- c) 1000 jobs
-
-
-Results:
-
- small_job big_job small_dag big_dag
----------------------------------------------------------------
-a) 3.0 x x x [mjobs/day]
-b) 1.0 x x x [mjobs/day]
-c) 0.6 x x x [mjobs/day]
-
-
+++ /dev/null
--------------------
-LB chain test
--------------------
-- proxy & interlogger (lazy variant) running at umbar
-- bkserver running at sci
-- test variants:
- a) 100 jobs, no background queries
- b) 1000 jobs, no background queries
- c) 10000 jobs, no background queries
- d) 100 jobs, 10 parallel queries
- e) 1000 jobs, 10 parallel queries, perf interlogger
- f) 1000 jobs, 10 parallel queries, normal interlogger
-- in d)-f) the server was queried by 10 independent clients for states
- of all jobs periodically with random sleep between queries (0-5sec)
-
-Results:
-
- small_job big_job small_dag big_dag
----------------------------------------------------------------
-a) 1.0 x x x [mjobs/day]
-b) 0.6 x x x [mjobs/day]
-c) 0.5 x x x [mjobs/day]
-d) 0.8 x x x [mjobs/day]
-e) 0.45 x x x [mjobs/day]
-f) 0.4 x x x [mjobs/day]
+++ /dev/null
-----------------------------------
-LB Proxy test
-----------------------------------
-Events are consumed:
-1) before parsing
-2) after parsing, before storing into database
-3) after storing into db, before computing state
-4) after computing state, before sending to IL
-5) by IL
-
- small_job big_job small_dag big_dag
-1) 43005186.489600 2852512.156800 31859581.824000 502823.721600
-[jobs/day]
-2) 37764713.548800 2438483.961600 26108871.523200 340065.648000
-[jobs/day]
-3) 1754530.243200 272980.540800 2051218.684800 0.000000
-[jobs/day]
-4) 1267110.000000 176052.182400 1506470.486400 0.000000
-[jobs/day]
-5) 329471.452800 48787.747200 318152.275200 0.000000
-[jobs/day]
+++ /dev/null
- ./stage/bin/glite-lb-interlogd -d -s /tmp/perftest_michal.sock --file-prefix=/tmp/perftest_michal.log --lazy
+++ /dev/null
-./stage/bin/glite-lb-proxy -d --silent -p /tmp/proxy_michal.perf --proxy-il-sock /tmp/perftest_michal.sock --proxy-il-fprefix /tmp/perftest_michal.log
+++ /dev/null
-./stage/bin/glite-lb-bkserverd -d --perf-sink=4 -p 10000 -w 10003 -S /tmp/purge_michal -D /tmp/dump_michal --silent
+++ /dev/null
-TEST=1; ./stage/sbin/glite-lb-perftest_logjobs -d proxy -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf
+++ /dev/null
-\documentclass{egee}
-\usepackage{comment}
-
-\def\LB{L\&B}
-
-\title{\LB\ Performance Test Plan}
-\author{CESNET EGEE JRA1 team}
-\DocIdentifier{EGEE-JRA1-??}
-\Date{\today}
-\Activity{JRA1: Middleware Engineering and Integration}
-\DocStatus{DRAFT}
-\Dissemination{PUBLIC}
-\DocumentLink{}
-
-%\def\req{\noindent\textbf{Prerequisities:}}
-%\def\how{\noindent\textbf{How to run:}}
-%\def\result{\noindent\textbf{Expected result:}}
-
-\def\path#1{{\normalfont\textsf{#1}}}
-\def\code#1{\texttt{#1}}
-\def\todo#1{\textbf{TODO:} #1}
-
-\begin{document}
-
-\input{frontmatter}
-\newpage
-\tableofcontents
-\newpage
-
-\section{Rationale}
-\todo{}
-
-\begin{verbatim}
-
-L&B Performance Testing
-=======================
-
-- all source modifications for tests are in CVS, conditionaly compiled
- only with appropriate symbol
-
-- binaries for all tests are built using special property
- for ant target (or environment variable for Makefile), which
- compiles sources using the right #define combinations
-
-- component tests are run by shell scripts located under component
- directories, these tests may require binaries from other components,
- though
-
-- all tests use sequence of events for typical jobs (small job, big
- job, small DAG, big DAG) prepared beforehand. These events are
- stored in files in ULM format in CVS.
-
-- events are generated by stresslog program, which reads ULM text of
- events for particular test job and logs the event sequence directly
- by calling *_DoLogEvent<variant>. The number of test jobs is
- configurable. Stresslog inserts into every event timestamp when the
- event was generated and sent.*
-
-- event are consumed by breaking normal event processing either in the
- component being tested or the next component in chain, that is
- instrumented to read and discard events immediately. The consumption
- itself is done by calling special function which takes current time,
- extracts timestamp from event and prints the difference (ie. the
- event processing time).* These "break points" are chosen to measure
- throughput of the various component parts and to identify possible
- bottlenecks within the components.
-
- * the only exception is test of the logging library itself
-
-- test jobs are preregistered within the LB if the test includes
- bookkeeping server and/or proxy by the test script program and
- their id's are stored in separate file to enable re-use by other
- load-generating tools (status queries, for example)
-
-- test results:
- - some numbers must be reported by component themselves, not by
- the event generator (due to the asynchronous LB nature). The
- test script collects those numbers and presents them as the test
- result at the end of testing.
-
- - after completion test scripts print the table described for the
- respective tests filled in with measured values (ie. the table
- is not filled in manually by human tester)
-
- - event throughput = 1/(time_delivered - time_arrived)
- * only if next event is sent after previous was delivered
-
-? measure job throughput for event patterns of typical jobs or deduce
-job throughput from throughput of selected types of events?
-
-
-I) Component tests
- ***************
-
-- tests of the isolated components on one node
-- may require binaries from other components to produce/consume events
-
---------------------
-Logging library test
---------------------
-
-* component:
- org.glite.lb.client
-
-* binaries required:
- logevent_libtest
-
-* test shell script:
- perftest_loglib
-
-* input required:
- - events
-
-* test description:
- - measures time required to format given events into ULM. Events
- are read from file, parsed into components, timestamped and
- produced.
-
- - events produced:
- - by calling logging function edg_wll_LogEvent*()
-
- - events consumed:
- - discarded by logging function instead of sending via
- appropriate protocol (LogEventMaster)
-
-* results:
-
- job type (size) throughput (100k jobs)
- -----------------------------------------
- small job
- big job
- small DAG
- big DAG
-
-
-
-----------------
-Locallogger test
-----------------
-
-* component:
- org.glite.lb.logger
-
-* binaries required:
- stresslog
- glite_lb_logd_perf
- glite_lb_logd_perf_nofile
- - does not store events in file
- glite_lb_interlogd_perf_empty
- - consumes immediately after reading event
-
-* test shell script:
- perftest_logd
-
-* input required:
- - client and host certificates
- - events
-
-* test description:
- - measures time required for event to be sent from client to
- local logger and processed by locallogger. Localloger is
- either instructed (by option) or instrumented to skip some
- parts of event processing:
- a) no parse, no file, no ipc
- glite_lb_logd_perf_nofile --noParse --noIPC
- b) no file, no ipc
- glite_lb_logd_perf_nofile --noIPC
- c) no ipc
- glite_lb_logd_perf --noIPC
- d) normal operation
- glite_lb_logd_perf
-
- no parse - LL does not parse events
- no file - LL does not store events into files
- no ipc - LL does not send events through socket to IL
-
- - events produced:
- - stresslog sends events to logd using client->logd
- protocol (*_DoLogEvent())
-
- - events consumed:
- i) after storing into files
- ii) by "empty" IL
-
-* results:
-
-
-
-i) events stored in files
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- a)
- b)
- c)
- d)
-
-ii) events sent to IL
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- a)
- b)
- c)
- d)
-
-
-
-----------------
-Interlogger test
-----------------
-
-* component:
- org.glite.lb.logger
-
-* binaries required:
- stresslog
- glite_lb_interlogd_perf
- glite_lb_interlogd_perf_noparse
- - does not parse events, server address is hardcoded
- glite_lb_interlogd_perf_nosync
- - does not call event_store_sync()
- glite_lb_interlogd_perf_norecover
- - recovery thread disabled
- glite_lb_interlogd_perf_nosend
- - events are consumed instead of sending
- glite_lb_interlogd_perf_lazy
- - lazy closing connection to bkserver
- glite_lb_bkserverd_perf_empty
- - consumes event immediately after receiving
-
-* test shell script:
- perftest_interlogd
-
-* input required:
- - host certificate
- - events
-
-* test description:
- - measures time the event travels through interlogger.
- Interlogger is instrumented to skip some parts of eventh
- processing for particular test, specifically tests include
- these variants:
- a) disabled event parsing. The server address
- (eg. jobid) is hardcoded.
- b) disabled event synchronization from files
- c) disabled recovery thread
- d) lazy bkserver connection close
- e) normal operation
-
- - events produced:
- 1) stresslog sends events to interlogger using the unix
- domain socket and logd->interlogger protocol, events are
- stored in files (stresslog behaves like logd)
- TODO: pro toto neni funkce v producerske knihovne
- 2) interlogger reads events from event files created by
- stresslog (by recovery thread)
- 3) stresslog stores events to files and every n-th
- (optional argument) is sent also through the unix socket
-
- - events consumed:
- i) discarded instead of being sent
- ii) by "empty" bkserver
-
-* results:
-
-
-i) events discarded
-1) events received on socket
-(options 2 and 3 are not tested)
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- a)
- b)
- c)
- e)
-
-
-ii) events sent to empty bkserver
-1) events received on socket
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- a)
- b)
- c)
- d)
- e)
-
-
-2) events recovered from files
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- d)
- e)
-
-
-3) events synced from files, every 10th event sent on socket
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- a)
- b)
- c)
- d)
- e)
-
-
-------------
-LBProxy test
-------------
-
-* component:
- org.glite.lb.proxy
-
-* binaries required:
- stresslog
- glite_lb_proxy_perf_noparse
- - consumes events before parsing
- glite_lb_proxy_perf_nostore
- - consumes events before storing into database
- glite_lb_proxy_perf_nostate
- - consumes events before computing job status
- glite_lb_proxy_perf_nosend
- - consumes events before sending to interlogger
- glite_lb_interlogd_perf_empty
- - consumes immediately after reading event
-
-* test shell script:
- perftest_proxy
-
-* input required:
- - events
-
-* test description:
- - measures time required for processing event by LB proxy. Test
- is performed with (a)) and without (b)) checking for duplicit
- events.
-
- - events produced:
- - stresslog sends events using the IL protokol on local
- socket (using DoLogEventProxy())
-
- - events consumed:
- i) before parsing
- ii) before storing into database
- iii) after storing into database
- iv) after job status computation
- v) normal operation
-
-
-
-
-* results:
-
-a) with duplicity check:
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- i)
- ii)
- iii)
- iv)
- v)
-
-
-b) without duplicity check:
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- i)
- ii)
- iii)
- iv)
- v)
-
-
---------------
-LB server test
---------------
-
-* component:
- org.glite.lb.server
-
-* binaries required:
- stresslog
- glite_lb_server_perf_noparse
- - consumes events before parsing
- glite_lb_server_perf_nostore
- - consumes events before storing into database
- glite_lb_server_perf_nostate
- - consumes events before computing job status
-
-* test shell script:
- perftest_server
-
-* input required:
- - host certificates
- - events
-
-* test description:
- - measures time required for processing event by LB server. Test
- is performed with (a)) and without (b)) checking for duplicit
- events.
-
- - events produced:
- - stresslog sends events using the IL protokol (using DoLogEventDirect())
-
- - events consumed:
- i) before parsing
- ii) before storing into database
- iii) after storing into database
- iv) normal operation
-
-* results:
-
-a) with duplicity check:
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- i)
- ii)
- iii)
- iv)
-
-
-b) without duplicity check:
-
- throughput: small big small big
- job job DAG DAG
- -------------------------------------------------
- i)
- ii)
- iii)
- iv)
-
-
-
----------------------
-Job registration test
----------------------
-
-* component:
- org.glite.lb.server
- org.glite.lb.proxy
-
-* binaries required:
- stressreg
- - generates registration events
- glite_lb_bkserverd
- glite_lb_proxy
- glite_lb_bkserverd_perf_empty
- glite_lb_proxy_perf_empty
-
-* test shell script:
- perftest_jobreg
-
-* input required:
- - host & user certificates
-
-* test description:
- - measures time required to register given number of jobs (time
- to process registration event). The registration event is
- synchronous in principle, so it is possible to get results just
- from the client (stressreg). Test variants include:
- a) current implementation
- b) implementation of connection pool at the client
- c) parallel communication with server and proxy
-
-
- - events produced:
- - stressreg sends registration events by calling
- edg_wll_RegisterJob*()
-
- - events consumed:
- i) normally processed by server & proxy
- ii) server replies immediate success
- iii) proxy replies immediate success
-
-* results:
-
-a) current implementation
-
- throughput: one DAG DAG DAG
- job (1000 nodes) (5000 nodes) (10000 nodes)
- -----------------------------------------------------------------
- i)
- ii)
- iii)
-
-
-b) connection pool
-
- throughput: one DAG DAG DAG
- job (1000 nodes) (5000 nodes) (10000 nodes)
- -----------------------------------------------------------------
- i)
- ii)
- iii)
-
-
-c) parallel communication
-
- throughput: one DAG DAG DAG
- job (1000 nodes) (5000 nodes) (10000 nodes)
- -----------------------------------------------------------------
- i)
-
-
-
-\end{verbatim}
-
-\end{document}
\ No newline at end of file
+++ /dev/null
-\documentclass{egee}
-\usepackage{comment}
-
-\def\LB{L\&B}
-
-\title{\LB\ Test Plan}
-\author{CESNET EGEE JRA1 team}
-\DocIdentifier{EGEE-JRA1-??}
-\Date{\today}
-\Activity{JRA1: Middleware Engineering and Integration}
-\DocStatus{DRAFT}
-\Dissemination{PUBLIC}
-\DocumentLink{}
-
-\def\req{\noindent\textbf{Prerequisities:}}
-\def\how{\noindent\textbf{How to run:}}
-\def\result{\noindent\textbf{Expected result:}}
-
-\def\path#1{{\normalfont\textsf{#1}}}
-\def\code#1{\texttt{#1}}
-
-\def\todo#1{\textbf{TODO:} #1}
-
-
-\specialcomment{hints}{\par\noindent\textbf{Hints: }\begingroup\slshape}{\endgroup}
-%\includecomment{hints}
-
-\begin{document}
-
-\input{frontmatter}
-\newpage
-\tableofcontents
-\newpage
-
-\section{Rationale}
-\todo{}
-
-\section{Test Coverage}
-\todo{}
-
-\section{Test Cases}
-
-\subsection{Event delivery}
-
-% locallogger
-% bez dalsich demonu, registrovat job, vrati EAGAIN, objevi se fajly
-\subsubsection{Standalone locallogger -- job registration}
-\label{reg}
-\req\ running \path{glite-lb-logd} on the test node, don't start either
-\path{glite-lb-interlogd} or \path{glite-lb-bkserverd}
-
-\how\ call \code{edg\_wll\_RegisterJob}. Jobid's should preferably point
-to a~remote \LB\ server.
-
-\result\ The API call returns EAGAIN, but locallogger creates an event file
-in its storage.
-The file should contain single line RegJob event.
-
-\begin{hints}
-\path{glite-lb-regjob} example can be used. It generates a~unique jobid,
-prints it and calls \LB\ API appropriately.
-\end{hints}
-
-% async -- prida do fajlu, OK
-% logevent
-\subsubsection{Standalone locallogger -- log event}
-\label{log}
-\req\ running \path{glite-lb-logd} only, files generated in test~\ref{reg}.
-
-\how\ call \code{edg\_wll\_Log*} for various event types in a~sequence
-resebmling real \LB\ usage, using the same jobid's as in test~\ref{reg}
-
-\result\ API calls return 0, events are added one per line to the locallogger files
-
-\begin{hints}
-\path{glite-lb-logev} client program can be used.
-
-\path{glite-lb-*.sh} examples may be adapted to produce reasonable seqences
-of events.
-\end{hints}
-
-\subsubsection{Interlogger recovery}
-\label{recover}
-% recover interloggeru
-% il & server (remote)
-% spustit, protlaci soubory na server, soubory zmizi, lze se dotazat na stav
-\req\ running \path{glite-lb-bkserverd} on the machine and port where
-jobid's from \ref{reg} point to; files generated in~\ref{log}.
-
-\how\ Make a~copy of the files created in~\ref{log}, then start
-\path{glite-lb-interlogd}. After approx. 10s check the jobs
-with \code{edg\_wll\_JobLog} call.
-
-\result \code{edg\_wll\_JobLog} should return the same events that were
-contained in the locallogger files. The files should be removed by
-interlogger after approx. 1 min.
-
-\begin{hints}
-\path{glite-lb-joblog} example outputs the events in (almost) the same
-format as the locallogger files.
-\end{hints}
-
-% event delivery
-% poslat .sh, job log vrati to, co bylo ve fajlech
-\subsubsection{Normal event delivery}
-\label{normal}
-\req\ all \LB\ daemons running (\path{glite-lb-logd}, \path{glite-lb-interlogd},
-\path{glite-lb-bkserverd}
-
-\how\
-\begin{enumerate}
-
-\item Register jobs with \code{edg\_wll\_RegsterJob}
-\item Log reasonable sequences of events with \code{edg\_wll\_Log*}.
-\item Check with \code{edg\_wll\_JobLog}
-that the events got delivered afterwards (approx. 10s).
-\end{enumerate}
-
-\result\ API calls should return 0. The same events that were logged must be returned.
-
-\begin{hints}
-\path{glite-lb-*.sh} scripts produce reasonable seqences of events, including
-the job initial registration.
-
-There is approx. 1min time window in which the locallogger files exist.
-They can be grabbed and used for comparing the events as in~\ref{recover}.
-
-\end{hints}
-
-\subsection{Job state computation}
-
-% normal event delivery & job state machine
-% .sh, dotaz na stav
-\subsubsection{Normal job states}
-\label{state}
-\req\ \path{glite-lb-bkserverd} running, events from \ref{normal} logged.
-
-\how\ Check state of the jobs with \code{edg\_wll\_JobStatus}.
-
-\result\ The API call should return 0, the jobs should be in the expected
-states. Thorough tests may also cross check the values supplied in the
-events (e.g. destination computing element) wrt. the values reported in the job states.
-
-\begin{hints}
-\path{glite-lb-*.sh} scripts produce sequences of events resultning
-in the job state same as the `*' part of the script name.
-\end{hints}
-
-\subsubsection{DAG job states}
-\todo{}
-% specialni stav DAGu, histogram potomku
-
-\subsection{LB proxy}
-\req\ running \path{glite-lb-proxy}, \path{glite-lb-interlogd} and
-\path{glite-lb-bkserverd}
-
-\how\ Register jobs with \code{edg\_wll\_RegisterJobProxy}, log events
-using \code{edg\_wll\_LogEventProxy} and check the job states against
-both lbproxy (using \code{edg\_wll\_JobStatusProxy}) and bkserver
-(using \code{edg\_wll\_JobStatus}).
-
-\result\ A new job state should be available immediately at the
-lbproxy and probably with a small delay also at the bkserver.
-
-\begin{hints}
-There is already a script \path{test.sh} in
-\path{org.glite.lb.proxy/examples} that can be used together with
-above mentioned scripts \path{glite-lb-*.sh} (they are called from
-\path{test.sh}) to test all this.
-\end{hints}
-
-\subsection{WS interface}
-\req\ \path{glite-lb-bkserverd} running, events from \ref{normal} logged
-
-\how\ retrieve both events and job states with the \LB\ WS interface
-(operations \code{JobStatus}, \code{QueryEvents}).
-
-\result\ the returened data should match those returned by the legacy
-API calls.
-
-\begin{hints}
-Examples \path{org.glite.lb.server/examples/ws\_*.c} convert the WS
-responses back to the legacy \LB\ data structures and print them in
-the same form as e.g. \path{glite-lb-jobstat}.
-\end{hints}
-
-\subsection{Notifications}
-
-% notifikace
-% regjob, reg notifikace na vsechno, poslat udalosti, hlidat notif
-\subsubsection{Single job, any state change}
-\label{notif1}
-\req\ All \LB\ services running
-
-\how
-\begin{enumerate}
-\item Register a job.
-\item Start a~notification client (preferably on another machine),
-register with \code{edg\_wll\_NotifNew} for any state changes of the job,
-and repeatedly invoke \code{edg\_wll\_NotifReceive}.
-\item One by one send events triggering job state change.
-\end{enumerate}
-
-\result\ All the events should trigger notification reported by the running
-notification client.
-
-\begin{hints}
-\path{glite-lb-notify} example can be used with its \path{test} command.
-\end{hints}
-
-\subsubsection{Additional notification criteria}
-\label{notif-complex}
-\req\ All \LB\ services running
-
-\how\ Like~\ref{notif1} but include additional criteria,
-e.g. job is scheduled for a~specific destination.
-
-\result\ Only notifications matching the criteria should be delivered.
-
-% rozsireni dotazu o dalsi job
-\subsubsection{Include another job}
-\label{notif2}
-\req\ All \LB\ services running, notification from \ref{notif1} still active
-
-\how\
-\begin{enumerate}
-\item Register another job.
-\item Augment the notification registration with the new jobid using
-\code{edg\_wll\_NotifChange}.
-\item Start notification client, bind to the registration with
-\code{edg\_wll\_NotifBind}.
-\item Send events for the new job.
-\end{enumerate}
-
-\result\ Notifications should be received by the client.
-
-\begin{hints}
-Commands \path{change} and \path{receive} of \path{glite-lb-notify}
-can be used.
-\end{hints}
-
-% notifikace -- zmena adresy/portu
-% pak poslat udalost, musi dojit
-% uz je v predchozim implicitne
-
-\subsubsection{Delayed delivery}
-% notifikace -- zpozdene doruceni
-% registrovat, odpojit, poslat udalosti, pripojit se
-
-\req\ All \LB\ services running
-
-\how\
-\begin{enumerate}
-\item Register another job.
-\item Register a~notification as in~\ref{notif1} but terminate the client
-immediately.
-\item Log events for the job.
-\item Restart the client, binding to the notification and call
-\code{edg\_wll\_NotifReceive} repeatedly.
-\end{enumerate}
-
-\result\ Delayed notifications should be received by the client almost
-immediately.
-
-\subsection{Server purge}
-
-\textbf{WARNING: This test is destructive, it destroys ALL data in an
-existing \LB\ database.}
-
-The test is fairly complex but it does not make too much sense to split it
-artificially.
-
-\req\ All \LB services running, preferably a~dedicated server for this test.
-
-\how
-\begin{enumerate}
-\item Purge all data on the server with \path{glite-lb-purge}
-\item Log two sets of jobs, separated with delay of at least 60s so
-that the sets can be distinguished from each other.
-\item \label{purgel}
-Using \code{edg\_wll\_JobLog} retrieve events of all the jobs
-\item \label{purge1}
-Purge the first set of jobs (by specifying appropriate timestamp),
-letting the server dump the purged events.
-\item \label{purge2} Purge the other set of jobs, also dumping the events.
-\item \label{purge3} Run purge once more.
-\end{enumerate}
-
-\result\ The data dumped in steps \ref{purge1}, \ref{purge2} should be the
-same as retrieved in~\ref{purgel}. The final purge invocation should
-do nothing (i.e. nothing was left in the database).
-
-% test_purge
-\begin{hints}
-The example \path{glite-lb-test\_purge} does exactly this sequence of steps,
-including the checks.
-\end{hints}
-
-
-\end{document}
+++ /dev/null
-#!/bin/sh
-
-set -e
-
-#OFFLINE=true
-TOPDIR=${PWD}
-
-export LB4VDTDIR=${TOPDIR}/org.glite.lb/lb4vdt
-export STAGEDIR=${TOPDIR}/stage
-mkdir -p ${STAGEDIR}
-
-if [ ! -f ${LB4VDTDIR}/Makefile.inc ]; then
- echo "Error: There is no ${LB4VDTDIR}/Makefile.inc. Exiting."
- exit 1
-fi
-
-if [ -z "${CVSROOT}" ]; then
- export CVSROOT=:pserver:anonymous@jra1mw.cvs.cern.ch:/cvs/jra1mw
-# export CVSROOT=:ext:jpospi@jra1mw.cvs.cern.ch:/cvs/jra1mw
- echo "Using CVSROOT=${CVSROOT}"
-fi
-
-dep_modules="org.glite.wms-utils.jobid
-org.gridsite.core"
-
-modules="org.glite.security.gsoap-plugin
-org.glite.lb.client-interface
-org.glite.lb.common
-org.glite.lb.client
-org.glite.lb.logger
-org.glite.lb.ws-interface
-org.glite.lb.server-bones
-org.glite.lb.server
-org.glite.lb.proxy"
-#org.glite.lb.utils
-
-for i in $dep_modules;
-do
- echo "*********************************************************"
- echo "* Module $i"
- echo "*********************************************************"
- cd ${TOPDIR}
- if [ -n "${OFFLINE}" ]; then
- echo "Working offline"
- else
- echo "Getting sources from CVS"
- cvs co -A $i;
- fi
- if [ -d $i -a -f ${LB4VDTDIR}/patches/$i.patch -a ! -f .$i.patched ]; then
- echo "Patching $i"
- patch -p0 < ${LB4VDTDIR}/patches/$i.patch
- touch .$i.patched
- fi
- if [ -d $i ]; then
- touch .$i.timestamp
- if [ -f ${LB4VDTDIR}/scripts/$i.build ]; then
- echo "Building"
- sh -x ${LB4VDTDIR}/scripts/$i.build
- fi
- cd ${TOPDIR}
- find ${STAGEDIR} -newer .$i.timestamp > .$i.filelist
- else
- echo "WARNING: directory $i not found"
- fi
-done
-
-for i in $modules;
-do
- echo "*********************************************************"
- echo "* Module $i"
- echo "*********************************************************"
- cd ${TOPDIR}
- if [ -n "${OFFLINE}" ]; then
- echo "Working offline"
- else
- echo "Getting sources from CVS"
- cvs co -A $i;
- fi
- if [ -d $i -a -f ${LB4VDTDIR}/patches/$i.patch -a ! -f .$i.patched ]; then
- echo "Patching $i"
- patch -p0 < ${LB4VDTDIR}/patches/$i.patch
- touch .$i.patched
- fi
- if [ -d $i ]; then
- touch .$i.timestamp
- echo "Entering directory ${TOPDIR}/$i"
- cd ${TOPDIR}/$i
- echo "Copying supporting files"
- cp -rv ${TOPDIR}/org.glite.lb/project/{at3,*.T,*.pm} ./project/
- mkdir -p build
- echo "Entering directory ${TOPDIR}/$i/build"
- cd build
- ln -fsv ../Makefile
-# ln -fsv ../../Makefile.inc Makefile.inc
- ln -fsv ${LB4VDTDIR}/Makefile.inc
- echo "Building"
- make LB_STANDALONE=yes
- make stage LB_STANDALONE=yes
- cd ${TOPDIR}
- find ${STAGEDIR} -newer .$i.timestamp > .$i.filelist
- else
- echo "WARNING: directory $i not found"
- fi
- echo "Done"
-done
-
-cd ${TOPDIR}
-echo "Creating filelists"
-cat .org.glite.wms-utils.jobid.filelist .org.gridsite.core.filelist .org.glite.security.gsoap-plugin.filelist .org.glite.lb.common.filelist | sort | uniq > LB-common.filelist
-cat .org.glite.lb.client-interface.filelist .org.glite.lb.client.filelist | sort | uniq > LB-client.filelist
-cat .org.glite.lb.logger.filelist | sort | uniq > LB-logger.filelist
-cat .org.glite.lb.logger.filelist .org.glite.lb.server-bones.filelist .org.glite.lb.proxy.filelist | sort | uniq > LB-proxy.filelist
-cat .org.glite.lb.ws-interface.filelist .org.glite.lb.server-bones.filelist .org.glite.lb.server.filelist | sort | uniq > LB-server.filelist
+++ /dev/null
-#
-# common setting
-#
-
-#vdt_location=/home/honik/egee/vdt-1.5.0
-vdt_location=${VDT_LOCATION}
-
-# missing packages could be for example downloaded to repository from
-# http://eticssoft.web.cern.ch/eticssoft/repository/externals
-
-repository=/home/honik/egee/repository/externals/
-platform=slc3_ia32_gcc323
-
-
-#
-# external dependencies that are already part of VDT (vdt-1.5.0):
-#
-
-#classads_prefix=${repository}/classads/0.9.8/${platform}
-classads_prefix=${vdt_location}/classads
-
-#globus_prefix=${repository}/globus/2.4.3-VDT-1.2.5/${platform}
-globus_prefix=${vdt_location}/globus
-
-#expat_prefix=/usr
-expat_prefix=${vdt_location}/expat
-
-#mysql_prefix=${repository}/mysql-devel/4.1.11/${platform}
-mysql_prefix=${vdt_location}/mysql
-mysql_version=4.1.21
-
-voms_prefix=${vdt_location}/glite
-#voms_prefix=/home/honik/egee/glite/stage
-
-
-#
-# external dependencies that are NOT (yet) part of VDT (vdt-1.5.0):
-#
-
-#cares_prefix=${repository}/c-ares/1.3.0/${platform}
-cares_prefix=/software/cares-1.3
-
-# probably not needed (used "only" for unit tests - 'make check'):
-#cppunit_prefix=${repository}/cppunit/1.10.2/${platform}
-cppunit_prefix=/software/cppunit-1.10.2
-
-# probably not needed:
-#gridsite_prefix=${stagedir}
-
-gsoap_default_version=2.7.6b
-gsoap_versions=${gsoap_default_version}
-#gsoap_prefix=${repository}/gsoap/${gsoap_default_version}/${platform}
-gsoap_prefix=/software/gsoap-${gsoap_default_version}
-
-
-#
-# some other defaults:
-#
-
-#PREFIX=${vdt_location}/glite
-PREFIX=/tmp/lb4vdt
-globalprefix=glite
-lbprefix=lb
-
-builddir=build
-distdir=${STAGEDIR}/../dist
-stagedir=${STAGEDIR}
-top_srcdir=..
-
-#thrflavour=gcc64dbgpthr
-#nothrflavour=gcc64dbg
-thrflavour=gcc32dbgpthr
-nothrflavour=gcc32dbg
-
-# needed by org.glite.lb.client:
-glite_location=${stagedir}
-
+++ /dev/null
-#!/bin/sh
-
-set -e
-
-TOPDIR=${PWD}
-source ${LB4VDTDIR}/Makefile.inc
-cd org.gridsite.core/src
-make build-lib OPENSSL_FLAGS=-I${globus_prefix}/include/${nothrflavour} OPENSSL_LIBS=-L${globus_prefix}/lib FLAVOR_EXT=_${nothrflavour}
-make install-lib prefix=${STAGEDIR}
-cd ${TOPDIR}
-
+++ /dev/null
-package MultiStruct;
-
-use StructField;
-
-sub new {
- shift;
- my $self = {};
- $self->{comments} = {}; # typ->comment
- $self->{fields} = {}; # typ->{ name->StructField, ... }
- $self->{order} = {};
-
- bless $self;
-}
-
-sub selectType {
- my $self = shift;
- my $type = shift;
- $self->{type} = $type;
- 1;
-}
-
-sub addType {
- my $self = shift;
- my $type = shift;
- my $comment = shift;
- $self->selectType($type);
- $self->{comments}->{$type} = $comment;
- $self->{fields}->{$type} = {};
- 1;
-}
-
-sub selectField {
- my $self = shift;
- $self->{field} = shift;
- $self->getField;
-}
-
-sub addField {
- my $self = shift;
- my $field = shift;
-
- die "unselected type" unless $self->{type};
- $self->{fields}->{$self->{type}}->{$field->{name}} = $field;
- $self->selectField($field->{name});
- 1;
-}
-
-sub getField {
- my $self = shift;
- my $f = $self->{fields}->{$self->{type}}->{$self->{field}};
- return $f ? $f : $self->{fields}->{_common_}->{$self->{field}};
-}
-
-sub load {
- my $self = shift;
- my $fh = shift;
- local $_;
-
- while ($_ = <$fh>) {
-
- chomp;
- s/#.*$//;
- next if /^\s*$/;
-
- if (/^\@type\s+(\S+)\s*(.*$)$/) {
- $self->addType($1,$2);
- $self->{order}->{$1} = $.;
- next;
- }
-
- s/^\s*//;
- my ($ftype,$fname,$comment) = split /\s+/,$_,3;
- if ($ftype eq '_code_') {
- my $f = $self->getField();
- addCode $f $fname,$comment;
- }
- elsif ($ftype eq '_alias_') {
- my $f = $self->getField();
- addAlias $f $fname,$comment;
- }
- elsif ($ftype eq '_special_') {
- my $f = $self->getField();
- addSpecial $f $fname;
- }
- elsif ($ftype eq '_null_') {
- my $f = $self->getField();
- setNull $f $fname;
- }
- elsif ($ftype eq '_optional_') {
- my $f = $self->getField();
- $f->{optional} = 1;
- }
- elsif ($ftype eq '_index_') {
- my $f = $self->getField();
- $f->{index} = 1;
- }
- else {
- my $f = new StructField $fname,$ftype,$comment,$.;
- $self->addField($f);
- }
- }
-}
-
-sub getTypes {
- my $self = shift;
- my @out;
- local $_;
-
- for (keys %{$self->{fields}}) {
- push @out,$_ unless $_ eq '_common_';
- }
- @out;
-}
-
-sub getTypesOrdered {
- my $self = shift;
- my @names = getTypes $self;
-
- sort {
- my $oa = $self->{order}->{$a};
- my $ob = $self->{order}->{$b};
- $oa <=> $ob;
- } @names;
-}
-
-sub getTypeComment {
- my $self = shift;
- my $type = shift || $self->{type};
- $self->{comments}->{$type};
-}
-
-sub getFieldComment {
- my $self = shift;
- my $fname = shift;
- $self->{fields}->{$self->{type}}->{$fname}->{comment};
-}
-
-sub getFields {
- my $self = shift;
- keys %{$self->{fields}->{$self->{type}}};
-}
-
-sub getFieldsOrdered {
- my $self = shift;
- my @names = $self->getFields;
- sort {
- my $oa = $self->selectField($a)->{order};
- my $ob = $self->selectField($b)->{order};
- $oa <=> $ob;
- } @names;
-}
-
-sub getFieldOccurence {
- my $self = shift;
- my $fname = shift;
- my @out;
- local $_;
-
- for (keys %{$self->{fields}}) {
- push @out,$_ if $self->{fields}->{$_}->{$fname};
- }
- @out;
-}
-
-sub getAllFields {
- my $self = shift;
- my %out;
- local $_;
-
- for my $t (values %{$self->{fields}}) {
- $out{$_->{name}} = 1 for (values %$t);
- }
- keys %out;
-}
-
-sub getAllFieldsOrdered {
- my $self = shift;
- my @names = getAllFields $self;
-
- sort {
- my @occ = $self->getFieldOccurence($a);
- $self->selectType($occ[0]);
- my $oa = $self->selectField($a)->{order};
- @occ = $self->getFieldOccurence($b);
- $self->selectType($occ[0]);
- my $ob = $self->selectField($b)->{order};
- $oa <=> $ob;
- } @names;
-}
-
-1;
+++ /dev/null
-package StructField;
-
-$lang = 'C';
-1;
-
-sub new {
- shift;
- my $self = {};
- $self->{name} = shift;
- $self->{type} = shift;
- $self->{comment} = shift;
- $self->{order} = shift;
- $self->{null} = $main::DefaultNullValue{$self->{type}};
- bless $self;
-}
-
-sub addCode {
- my $self = shift;
- my $code = shift;
- my $comment = shift;
- push @{$self->{codes}},{name=>$code,comment=>$comment};
- 1;
-}
-
-sub addSpecial {
- my $self = shift;
- my $special = shift;
- $self->{special} = $special;
- 1;
-}
-
-sub addAlias {
- my $self = shift;
- my $name = shift;
- my $lang = shift;
- $self->{aliases}->{$lang} = $name;
- 1;
-}
-
-sub hasAlias {
- my $self = shift;
- my $lang = shift;
- return $self->{aliases}->{$lang} ? 1 : 0;
-}
-
-sub getName {
- my $self = shift;
- my $lang = shift || $lang;
- $self->{aliases}->{$lang} || $self->{name};
-# return $self->{aliases}->{$lang} ? $self->{aliases}->{$lang} : $self->{name};
-}
-
-sub getComment {
- my $self = shift;
- $self->{comment};
-}
-
-sub getDefaultNullValue {
- my $self = shift;
- $self->{null};
-}
-
-sub toString {
- my $self = shift;
- my $src = shift;
- my $dst = shift;
-
- eval $main::toString{$lang}->{$self->{type}};
-}
-
-sub fromString {
- my $self = shift;
- my $src = shift;
- my $dst = shift;
-
- eval $main::fromString{$lang}->{$self->{type}};
-}
-
-sub isNULL {
- my $self = shift;
- my $a = shift;
- my $b = $self->{null};
-
- eval $main::compare{$lang}->{$self->{type}};
-}
-
-sub isnotNULL {
- my $self = shift;
- my $src = shift;
-
- '!('.$self->isNULL($src).')';
-}
-
-sub compare {
- my $self = shift;
- my $a = shift;
- my $b = shift;
- eval $main::compare{$lang}->{$self->{type}};
-}
-
-sub toFormatString {
- my $self = shift;
-
- eval $main::toFormatString{$lang}->{$self->{type}};
-}
-
-sub setNull {
- my $self = shift;
- $self->{null} = shift;
-}
-
-sub getType {
- my $self = shift;
-
- eval $main::types{$lang}->{$self->{type}};
-}
+++ /dev/null
-#!/usr/bin/perl -w
-
-use File::Basename;
-my $dir;
-BEGIN{
- $dir = dirname $0;
-}
-
-my $lines = $ENV{AT3_LINES};
-
-use lib $dir;
-use MultiStruct;
-require 'types.T';
-
-my $eventsn;
-for (@INC) {
- if (-f "$_/events.T") {
- $eventsn="$_/events.T";
- last;
- }
-}
-
-my $statusn;
-for (@INC) {
- if (-f "$_/status.T") {
- $statusn = "$_/status.T";
- last;
- }
-}
-
-my $indent = '';
-
-my $event = new MultiStruct;
-my $status = new MultiStruct;
-
-sub gen {
- local $_ = shift;
-
- s/^\n!//;
- s/\n!/\n/g;
- print $_;
-}
-
-
-open EVENTS,$eventsn or die "$eventsn: $!\n";
-$event->load(\*EVENTS);
-close EVENTS;
-
-open STATUS,$statusn or die "$statusn: $!\n";
-$status->load(\*STATUS);
-close STATUS;
-
-my $code;
-my $startcode;
-while (<>) {
- chomp;
- if (/^\@\@\@LANG: (\S+)$/) {
- $StructField::lang = $1;
- next;
- }
-
- if ($code) {
- if (/^\@\@\@}$/) {
- $code .= "1;\n";
- print "#line $startcode \"$ARGV\"\n/* begin */\n" if $lines;
- eval $code or warn "eval: $@ at $ARGV:$.\n";
- my $nxtline = $.+1;
- print "/* end */\n#line $nxtline \"$ARGV\"\n" if $lines;
- undef $code;
- }
- else { $code .= $_."\n"; }
- }
- else {
- if (/^\@\@\@{$/) {
- $startcode = $.;
- $code = "\n";
- }
- elsif (/^\@\@\@AUTO$/) {
- print qq{
- !! Automatically generated file
- !! Do not edit, your changes will be discarded upon build
- !! Change the corresponding template file $ARGV
-
-};
- print "#line $. \"$ARGV\"\n" if $lines;
- }
- else {
- print "$_\n";
- }
- }
-}
-
-# print $event_common{prog}->copy('bla','hu');
+++ /dev/null
-#Fri Aug 18 12:35:01 CEST 2006
-module.build=0242
+++ /dev/null
-ext.gsoap.version=2.7.0f
-ext.gsoap.rep.file=gSOAP-2.7.0f.tar.gz
-
+++ /dev/null
-
-###################################################################
-# System dependencies
-###################################################################
-
-org.glite.version = HEAD
-org.glite.lb.version = HEAD
-
-# Component dependencies tag = do not remove this line =
-org.glite.lb.client-interface.version = HEAD
-org.glite.lb.ws-interface.version = HEAD
-org.glite.lb.common.version = HEAD
-org.glite.lb.client.version = HEAD
-org.glite.lb.server.version = HEAD
-org.glite.lb.proxy.version = HEAD
-org.glite.lb.server-bones.version = HEAD
-org.glite.lb.logger.version = HEAD
-org.glite.lb.utils.version = HEAD
-
-ext.gsoap.version = 2.7.0f
+++ /dev/null
-@type _common_
- timeval timestamp Time the event was generated.
- _alias_ date ULM
- timeval arrived Time the event was stored into the bookkeeping server database.
- _alias_ arr_date ULM
- _optional_
- string host Hostname of the machine where the event was generated.
- _alias_ host ULM
- int level Logging level (in the range from DEBUG to EMERGENCY).
- _alias_ lvl ULM
- _code_ EMERGENCY emergency
- _code_ ALERT alert
- _code_ ERROR error
- _code_ WARNING warning
- _code_ AUTH authentication
- _code_ SECURITY security
- _code_ USAGE usage
- _code_ SYSTEM system
- _code_ IMPORTANT important
- _code_ DEBUG debug
- int priority Message priority (yet 0 for asynchronous and 1 for synchronous transfers).
- _null_ -1
- jobid jobId Grid job id of the job the event belongs to.
- string seqcode Sequence code assigned to the event.
- string user Identity (certificate subject) of the event sender.
- logsrc source Source (software component) which generated this event.
-# string prog name of program ("EDG WMS" of name of the application).
- string src_instance Instance of source component (e.g. service communication endpoint).
- _optional_
-
-@type Transfer Start, success, or failure of job transfer to another component.
- logsrc destination Destination where the job is being transfered to.
- string dest_host Hostname of server that takes over control of the job.
- string dest_instance Service (instance) that takes over control of the job.
- _optional_
- string job Job description in receiver's language.
- int result Result code of the transfer attempt (START, OK, REFUSED or FAIL).
- _code_ START The sending component has started or is about to start the transfer.
- _code_ OK The job was sent successfully.
- _code_ REFUSED The job was refused by the other component.
- _code_ FAIL The transfer failed for other reason than explicit refusal (eg. network timeout).
- string reason Detailed description of the transfer, especially reason of failure.
- _optional_
- string dest_jobid Job id as assigned by the receiving software component.
- _optional_
-
-@type Accepted Accepting job (successful counterpart to Transfer).
- logsrc from The software component the job was received from.
- string from_host Hostname of the component the job was received from.
- string from_instance Instance of the component the job was received from.
- _optional_
- string local_jobid New job id as assigned by the receiving component.
-
-@type Refused Refusing job (unsuccessful counterpart to Transfer).
- logsrc from The software component that tried to send the job.
- string from_host Hostname of the component that tried to send the job.
- string from_instance Instance of the component that tried to send the job.
- _optional_
- string reason Description of the reason why the job was refused.
-
-@type EnQueued The job has been enqueued in an inter-component queue.
- string queue Queue into which the job has been stored for retrieval by another component.
- string job Job description in the receiver's language.
- int result Result code of the attempt to put job into the queue (START, OK, REFUSED or FAIL).
- _code_ START The sending component has started or is about to start enqueuing the job.
- _code_ OK The job was enqueued successfully.
- _code_ REFUSED The job was refused by the other component.
- _code_ FAIL The transfer failed for other reason than explicit refusal.
- string reason Detailed description of the attempt to enqueue the job, especially the reason of failure.
-
-@type DeQueued The job has been dequeued from an inter-component queue.
- string queue Name of the queue the job was obtained from.
- string local_jobid New job id as assigned by the retreiving component.
-
-@type HelperCall Helper component is called.
- string helper_name Name of the called helper component.
- string helper_params Parameters of the call to the helper component.
- int src_role The role the event sender is playing in the helper call (CALLING or CALLEE).
- _code_ CALLING The logging component is caller.
- _code_ CALLED The logging component is callee.
-
-@type HelperReturn Helper component is returning the control.
- string helper_name Name of the called helper component.
- string retval Data returned by the call to the helper component.
- int src_role The role the event sender is playing in the helper call (CALLING or CALLEE).
- _code_ CALLING The logging component is caller.
- _code_ CALLED The logging component is callee.
-
-@type Running Job wrapper started.
- string node Worker node on which the job executable is being run.
-
-@type Resubmission Result of resubmission decision.
- int result Result code of the resubmission decision (WILLRESUB or WONTRESUB or SHALLOW).
- _code_ WILLRESUB The job will be resubmitted (deep resubmission).
- _code_ WONTRESUB The job will not be resubmitted.
- _code_ SHALLOW Shallow resubmission (user payload has not started yet)
- string reason Reason why the job will or will not be resubmitted.
- string tag Value of the attribute on which the decision to resubmit the job was based.
-
-@type Done Execution terminated (normally or abnormally).
- int status_code Reason code for the termination of the job (OK, FAILED or CANCELLED).
- _code_ OK The job terminated by itself.
- _code_ FAILED The job disappeared from LRMS.
- _code_ CANCELLED The job was cancelled by user request.
- string reason Detailed description why the job was terminated.
- int exit_code Exit code of the job's process.
- _null_ -1
-
-@type Cancel Cancel operation has been attempted on the job.
- int status_code Classification of the attempt to cancel the job (REQ, REFUSE, DONE or ABORT).
- _code_ REQ The request was acknowledged.
- _code_ REFUSE The request was declined by this component.
- _code_ DONE The request was completed by whole WMS.
- _code_ ABORT The request was refused by whole WMS.
- string reason Detailed description of the attempt to cancel the job, especially the reason of failure.
-
-@type Abort Job aborted by system.
- string reason Reason why the job was aborted by the system.
-
-@type Clear Job cleared, output sandbox removed
- int reason Description of the reason why the job was cleared and the output sandbox removed (USER, TIMEOUT or NOOUTPUT).
- _code_ USER User retrieved output sandbox.
- _code_ TIMEOUT Timed out, resource forced purge of the sandbox.
- _code_ NOOUTPUT No output was generated.
-
-@type Purge Job is purged from bookkepping server.
-
-@type Match Matching CE found.
- string dest_id Identification of the queue on the CE that the job could be send to.
-
-@type Pending No matching CE found yet.
- string reason Description why the matching CE for the job was not found (yet).
-
-@type RegJob New job registration.
- string jdl Job description of the job being registered.
- string ns NetworkServer handling the newly registered job.
- jobid parent Grid job id of the parent job registering this new one.
- _optional_
-
- int jobtype Type of the job being registered (SIMPLE, DAG, PARTITIONABLE or PARTITIONED).
- _code_ SIMPLE The job is simple job.
- _code_ DAG The job is dag (containing static set of subjobs).
- _code_ PARTITIONABLE The job is partitionable (may become partitioned).
- _code_ PARTITIONED The job is partitioned (dynamically created dag).
- _code_ COLLECTION The job is collection (containing static set of subjobs).
- _code_ PBS PBS job
- _code_ CONDOR Condor job
-
- int nsubjobs Number of subjobs this job plans to spawn.
- _optional_
- string seed Seed for subjob id generation.
- _optional_
-
-@type Chkpt Application-specific checkpoint record.
- string tag Application specific checkpoint tag.
- string classad Application specific checkpoint value.
-
-@type Listener Listening network port for interactive control.
- string svc_name Name of the port instance for interactive job control.
- string svc_host Hostname of the interactive job controller.
- port svc_port Port number of the interactive job controller.
-
-@type CurDescr Current state of job processing (optional event).
- string descr Description of the current job transformation (output of the helper).
-
-@type UserTag User tag -- arbitrary name=value pair.
- string name Arbitrary user tag name.
- string value Arbitrary user tag value.
-
-@type ChangeACL Management of ACL stored on bookkepping server.
- string user_id DN or VOMS parameter (in format VO:group).
- int user_id_type Type of information given in user_id (DN or VOMS).
- _null_ -1
- int permission ACL permission to change (currently only READ).
- _null_ -1
- int permission_type Type of permission requested ('allow', 'deny').
- _null_ -1
- int operation Operation requested to perform with ACL (add, remove).
- _null_ -1
-
-@type Notification Management of notification service.
- notifid notifId Notification id.
- string owner Identification of the job owner (certificate subject).
- string dest_host Hostname the notification is sent to.
- port dest_port Port number the notification is sent to.
- string jobstat Status of the job (the notification content).
-
-
-@type ResourceUsage Resource (CPU, memory etc.) consumption.
- string resource Resource's name.
- int quantity Resources's quantity (how much).
- string unit Units (sec, kB, etc.).
-
-@type ReallyRunning User payload started.
- _optional_
- string wn_seq Sequence code on the worker node.
-
-@type Suspend Job execution (queuing) was suspended.
- _optional_
- string reason Reason for the suspend.
-
-@type Resume Job execution (queuing) was resumed.
- _optional_
- string reason Reason for the resume.
-
-@type CollectionState State of the collection.
- string state New collection state.
- _optional_
- int done_code In case of (state == Done) contains done code
- _null_ -1
- string histogram User readable histogram; useful for debugging.
- jobid child JobId of subjob, which triggered the state change.
- string child_event Event which triggered the state change.
-
-
-@type PBSQueued Job enqued
- string queue Queue name
- string owner Job owner
- string name Job name
-
-@type PBSMatch Scheduler created exec_host
- string dest_host Aka exec_host
-
-@type PBSPending Scheduler is not able to find exec_host, or some error occured
- string reason Reasons of job pendation or errors
-
-@type PBSRun Job attempted to be run by the logging component
- string scheduler Scheduler ID
- _optional_
- string dest_host Where to run the job
- _optional_
- int pid Actual process ID
- _optional_
-
-@type PBSRerun Job rerun requested
-
-@type PBSDone Job terminated
- int exit_status Exit status
- _optional_ Bypass need of 'null value'
-
-@type PBSDequeued Job dequeued
-
-@type PBSResourceUsage Resources requested/consumed
- int usage Type of record
- _code_ REQUESTED Requested value
- _code_ USED Consumed quantity
- string name Name of resource
- int quantity The quantity
- _optional_ Bypass need of 'null value'
- string unit Units (sec, kB, etc.)
-
-@type PBSError Any error occured
- string error_desc Error reason
-
-@type CondorSubmit Job SUBMITed to Condor
- string universe Condor Universe
- string submit_host Submitting machine
- string condor_id Condor ID
-
-@type CondorMatch Job MATCHed
- string condor_id Condor ID
- string owner Owner
- string matched_host Matched host
- string preempting Preempting
- _optional_
-
-@type CondorRun Condor EXECUTEed
- string condor_id Condor ID
- string universe Condor Universe
- string scheduler Scheduler ID
- _optional_
- string dest_host Where to run the job
- _optional_
- int pid Actual process ID
- _optional_
-
-@type CondorChkpt
- string info Some useful info
-
-@type CondorEvict
- int shadow_exit_status Condor shadow exit status
- string reason reason
-
-@type CondorTerminate
- int shadow_exit_status Condor shadow exit status
- string reason reason
-
-@type CondorAbort
- int shadow_exit_status Condor shadow exit status
- string reason reason
-
-@type CondorSuspend
- int shadow_exit_status Condor shadow exit status
- string reason reason
-
-@type CondorUnsuspend
- int shadow_exit_status Condor shadow exit status
- string reason reason
-
-@type CondorHold
- int shadow_exit_status Condor shadow exit status
- string reason reason
-
-@type CondorRelease
- int shadow_exit_status Condor shadow exit status
- string reason reason
-
-@type CondorNodeExecute
- string info Some useful info
-
-@type CondorNodeTerminate
- string info Some useful info
-
-@type CondorPostSctiptTerminate
- string info Some useful info
-
-@type CondorGlobusSubmit
- int status_code
- _code_ OK The job was submitted successfully
- _code_ FAIL Job submission failed
- string info Some useful info
-
-@type CondorGlobusResource
- int status_code Status code
- _code_ UP Resource UP
- _code_ DOWN Resource DOWM
- string info Some useful info
+++ /dev/null
-<?xml version="1.0"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- gLite Middleware Logging and Bookkeping Configuration Specification File
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Joachim Flammer <Joachim.Flammer@cern.ch>
- Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.16 2006/03/15 17:33:24 akrenek
- merge of 1.5 branch
-
- Revision 1.15 2005/11/27 21:51:18 eronchie
- Applied fix for bug 13928
-
- Revision 1.14 2005/10/15 20:14:55 jpospi
- remove duplicate lb.utils section
-
- Revision 1.13.2.1.2.1 2005/11/28 10:39:08 akrenek
- merge bug #13928 fix on the pre_cares branch
-
- Revision 1.13.2.1 2005/10/17 16:27:48 akrenek
- merged in the duplicate utils targed patch
-
- Revision 1.15 2005/11/27 21:51:18 eronchie
- Applied fix for bug 13928
-
- Revision 1.14 2005/10/15 20:14:55 jpospi
- remove duplicate lb.utils section
-
- Revision 1.13 2005/10/15 13:36:26 akrenek
- added lb.utils
-
- Revision 1.12 2005/03/16 10:02:52 zsalvet
- proxy component added
-
- Revision 1.11 2004/12/01 18:01:55 zsalvet
- LB here, not R-GMA
-
- Revision 1.10 2004/11/29 16:01:21 zsalvet
- Evaluate component.{head,tag} conditions before use of get.* targets.
-
- Revision 1.9 2004/11/29 15:16:26 zsalvet
- Add ws-interface to checkout/build machinery.
-
- Revision 1.8 2004/10/18 22:55:14 dimeglio
- Added oscheck to various targets
-
- Revision 1.7 2004/10/15 12:30:01 akrenek
- build with lb.sever-bones
-
- Revision 1.6 2004/08/27 10:03:41 zurek
- typo problem
-
- Revision 1.5 2004/08/27 09:13:11 zurek
- changing thee order for build
-
- Revision 1.4 2004/07/29 10:47:46 dimeglio
- Added server and logger
-
- Revision 1.3 2004/07/16 16:25:43 flammer
- Added tags for automated adding of components.
-
- Revision 1.2 2004/06/23 00:22:11 dimeglio
- Added client and client-interface components
-
- Revision 1.1 2004/06/18 23:05:53 dimeglio
- Added/upgraded default build scripts
-
--->
-
-
-<project name="GLite Middleware Logging and Bookkeping CSF" default="all">
-
- <!-- ===============================================
- Determine workspace directory
- =============================================== -->
-
- <!-- Relative workspace root directory -->
- <property name="workspace.dir" value="../.." />
-
- <!-- ===============================================
- Load properties
- =============================================== -->
-
- <!-- load baseline and user properties -->
- <import file="${workspace.dir}/org.glite/project/baseline.properties.xml" />
-
- <!-- define build properties file location since we are already in project dir -->
- <property name="subsystem.build.properties.file" value="./build.properties" />
-
- <!-- Load subsystem-specific property file -->
- <property file="./properties.xml"/>
-
- <!-- load global properties -->
- <import file="${global.properties.file}" />
-
- <!-- ===============================================
- Load dependencies
- =============================================== -->
-
- <!-- Load user dependencies file -->
- <property file="${user.dependencies.file}" />
-
- <!-- Load subsystem dependencies file -->
- <property file="./dependencies.properties" />
-
- <!-- Load global dependencies file -->
- <property file="${global.dependencies.file}" />
-
- <!-- ===============================================
- Load targets
- =============================================== -->
- <import file="${global.targets-envchecks.file}" />
- <import file="${global.targets-external-dependencies.file}" />
-
- <!-- ===============================================
- Evaluate CVS tags
- =============================================== -->
-
- <target name="evaluate.cvs.tags" description="Figure out if we need tagged CVS checkout">
- <condition property="glite.head">
- <and>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
- <condition property="glite.tag">
- <and>
- <not>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- </not>
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
- <condition property="glite-lb.head">
- <and>
- <equals arg1="${org.glite.lb.version}" arg2="HEAD" />
- <istrue value="${update}" />
- </and>
- </condition>
- <condition property="glite-lb.tag">
- <and>
- <not>
- <equals arg1="${org.glite.lb.version}" arg2="HEAD" />
- </not>
- <istrue value="${update}" />
- </and>
- </condition>
-
- <!-- condition property tag = do not remove = -->
-
- <condition property="utils.head">
- <equals arg1="${org.glite.lb.utils.version}" arg2="HEAD" />
- </condition>
-
- <condition property="common.head">
- <equals arg1="${org.glite.lb.common.version}" arg2="HEAD" />
- </condition>
-
- <condition property="server-bones.head">
- <equals arg1="${org.glite.lb.server-bones.version}" arg2="HEAD" />
- </condition>
-
- <condition property="client-interface.head">
- <equals arg1="${org.glite.lb.client-interface.version}" arg2="HEAD" />
- </condition>
-
- <condition property="ws-interface.head">
- <equals arg1="${org.glite.lb.ws-interface.version}" arg2="HEAD" />
- </condition>
-
- <condition property="client.head">
- <equals arg1="${org.glite.lb.client.version}" arg2="HEAD" />
- </condition>
-
- <condition property="server.head">
- <equals arg1="${org.glite.lb.server.version}" arg2="HEAD" />
- </condition>
-
- <condition property="proxy.head">
- <equals arg1="${org.glite.lb.proxy.version}" arg2="HEAD" />
- </condition>
-
- <condition property="logger.head">
- <equals arg1="${org.glite.lb.logger.version}" arg2="HEAD" />
- </condition>
-
- </target>
-
- <presetdef name="cvs-co">
- <cvs command="checkout" dest="${workspace.dir}" />
- </presetdef>
-
- <!-- =====================================================
- Self-update if required
- ===================================================== -->
-
- <!-- Update main GLite module -->
- <target name="org.glite" depends="evaluate.cvs.tags, get.glite.head, get.glite.tag"/>
- <target name="get.glite.head" if="glite.head">
- <cvs-co package="org.glite" />
- </target>
- <target name="get.glite.tag" if="glite.tag">
- <cvs-co package="org.glite"
- tag="${org.glite.version}" />
- </target>
-
- <!-- Update the current module -->
- <target name="org.glite.lb" depends="evaluate.cvs.tags, get.glite-lb.head, get.glite-lb.tag"/>
- <target name="get.glite-lb.head" if="glite-lb.head">
- <cvs-co package="org.glite.lb" />
- <fail>The org.glite and org.glite.lb modules have been updated, please rerun the configuration file</fail>
- </target>
- <target name="get.glite-lb.tag" if="glite-lb.tag">
- <cvs-co package="org.glite.lb"
- tag="${org.glite.lb.version}" />
- <fail>The org.glite and org.glite.lb modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <!-- *****************************************************-->
- <!-- Development tools -->
- <!-- *****************************************************-->
-
- <!-- All development tools -->
- <target name="devtools" depends="oscheck,
- evaluate.cvs.tags,
- junitcheck,
- junit,
- chkstyle,
- jalopy,
- ant-contrib,
- cpptasks,
- egee-ant-ext"
- description="Get development tools into repository."/>
-
- <!-- =====================================================
- External libraries
- ===================================================== -->
-
- <!-- All external libraries -->
- <target name="external" depends="oscheck,
- evaluate.cvs.tags,
- classads,
- globus"
- description="Install external packages"/>
-
- <!-- =====================================================
- GLite Middleware LB modules
- ===================================================== -->
-
- <!-- component targets tag = do not remove = -->
-
- <!-- common -->
- <target name="common" depends="evaluate.cvs.tags, get.common.head, get.common.tag"/>
- <target name="get.common.head" if="common.head">
- <cvs-co package="org.glite.lb.common" />
- </target>
- <target name="get.common.tag" unless="common.head">
- <cvs-co package="org.glite.lb.common"
- tag="${org.glite.lb.common.version}" />
- </target>
-
- <!-- server-bones -->
- <target name="server-bones" depends="evaluate.cvs.tags, get.server-bones.head, get.server-bones.tag"/>
- <target name="get.server-bones.head" if="server-bones.head">
- <cvs-co package="org.glite.lb.server-bones" />
- </target>
- <target name="get.server-bones.tag" unless="server-bones.head">
- <cvs-co package="org.glite.lb.server-bones"
- tag="${org.glite.lb.server-bones.version}" />
- </target>
-
- <!-- client-interface -->
- <target name="client-interface" depends="evaluate.cvs.tags, get.client-interface.head, get.client-interface.tag"/>
- <target name="get.client-interface.head" if="client-interface.head">
- <cvs-co package="org.glite.lb.client-interface" />
- </target>
- <target name="get.client-interface.tag" unless="client-interface.head">
- <cvs-co package="org.glite.lb.client-interface"
- tag="${org.glite.lb.client-interface.version}" />
- </target>
-
- <!-- WS interface -->
- <target name="ws-interface" depends="evaluate.cvs.tags, get.ws-interface.head, get.ws-interface.tag"/>
- <target name="get.ws-interface.head" if="ws-interface.head">
- <cvs-co package="org.glite.lb.ws-interface" />
- </target>
- <target name="get.ws-interface.tag" unless="ws-interface.head">
- <cvs-co package="org.glite.lb.ws-interface"
- tag="${org.glite.lb.ws-interface.version}" />
- </target>
-
- <!-- client -->
- <target name="client" depends="evaluate.cvs.tags, get.client.head, get.client.tag"/>
- <target name="get.client.head" if="client.head">
- <cvs-co package="org.glite.lb.client" />
- </target>
- <target name="get.client.tag" unless="client.head">
- <cvs-co package="org.glite.lb.client"
- tag="${org.glite.lb.client.version}" />
- </target>
-
- <!-- server -->
- <target name="server" depends="evaluate.cvs.tags, get.server.head, get.server.tag"/>
- <target name="get.server.head" if="server.head">
- <cvs-co package="org.glite.lb.server" />
- </target>
- <target name="get.server.tag" unless="server.head">
- <cvs-co package="org.glite.lb.server"
- tag="${org.glite.lb.server.version}" />
- </target>
-
- <!-- proxy -->
- <target name="proxy" depends="evaluate.cvs.tags, get.proxy.head, get.proxy.tag"/>
- <target name="get.proxy.head" if="proxy.head">
- <cvs-co package="org.glite.lb.proxy" />
- </target>
- <target name="get.proxy.tag" unless="proxy.head">
- <cvs-co package="org.glite.lb.proxy"
- tag="${org.glite.lb.proxy.version}" />
- </target>
-
- <!-- logger -->
- <target name="logger" depends="evaluate.cvs.tags, get.logger.head, get.logger.tag"/>
- <target name="get.logger.head" if="logger.head">
- <cvs-co package="org.glite.lb.logger" />
- </target>
- <target name="get.logger.tag" unless="logger.head">
- <cvs-co package="org.glite.lb.logger"
- tag="${org.glite.lb.logger.version}" />
- </target>
-
- <!-- utils -->
- <target name="utils" depends="get.utils.head, get.utils.tag"/>
- <target name="get.utils.head" if="utils.head">
- <cvs-co package="org.glite.lb.utils" />
- </target>
- <target name="get.utils.tag" unless="utils.head">
- <cvs-co package="org.glite.lb.utils"
- tag="${org.glite.lb.utils.version}" />
- </target>
-
- <!-- All project modules -->
- <target name="project" depends="utils,
- client-interface,
- ws-interface,
- common,
- server-bones,
- client,
- server,
- proxy,
- logger"/>
-
-
- <!-- ====================================================
- Checkout all
- ==================================================== -->
-
- <!-- All libraries -->
- <target name="all" depends="oscheck,evaluate.cvs.tags, defaultenvchecks, org.glite, org.glite.lb, devtools, external, project" />
-
- <!-- ====================================================
- Print dependecies to console
- ==================================================== -->
-
- <target name="dependencies">
- <concat>
- <fileset dir="." includes="dependencies.properties" />
- </concat>
- </target>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the gLite LB modules
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Logging and Bookkeping subsystem common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property name="subsystem.build.properties.file" value="./project/build.properties" />
- <property file="${subsystem.build.properties.file}" />
-
- <!-- ======================================================
- Define subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${lb.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define general subsystem properties
- ====================================================== -->
-
- <!-- Include common subsystem properties -->
- <import file="${subsystem.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
\ No newline at end of file
+++ /dev/null
-#!/bin/sh
-
-cd ../..
-
-cvs co org.glite
-cvs co org.glite.lb
-
-cd org.glite.lb/project
-ant -f glite.lb.csf.xml
-
+++ /dev/null
-@type _common_
-jobid jobId Id of the job
-string owner Job owner
-_index_
-
-int jobtype Type of job
- _null_ -1
- _code_ SIMPLE simple job
- _code_ DAG composite job
- _code_ COLLECTION parent of collection of jobs
- _code_ PBS PBS job
- _code_ CONDOR Condor job
-jobid parent_job parent job of subjob
-
-string seed string used for generation of subjob IDs
-int children_num number of subjobs
-strlist children list of subjob IDs
- _special_ XMLstructured
-intlist children_hist summary (histogram) of children job states
- _special_ XMLstructured
-stslist children_states full status information of the children
- _special_ XMLstructured
-
-string condorId Id within Condor-G
-string globusId Globus allocated Id
-string localId Id within LRMS
-
-string jdl User submitted job description
-string matched_jdl Full job description after matchmaking
-string destination ID of CE where the job is being sent
-_index_
-string condor_jdl ClassAd passed to Condor-G for last job execution
-string rsl Job RSL sent to Globus
-
-string reason Reason of being in this status, if any
-
-string location Where the job is being processed
-_index_
-string ce_node Worker node where the job is executed
-string network_server Network server handling the job
-
-bool subjob_failed Subjob failed (the parent job will fail too)
-int done_code Return code
- _null_ -1
- _code_ OK Finished correctly
- _code_ FAILED Execution failed
- _code_ CANCELLED Cancelled by user
-int exit_code Unix exit code
-bool resubmitted The job was resubmitted
-
-bool cancelling Cancellation request in progress
-string cancelReason Reason of cancel
-
-int cpuTime Consumed CPU time
- _null_ -1
-
-taglist user_tags List of pairs (user_tag, user_value)
- _special_ XMLstructured
-
-timeval stateEnterTime When entered this status
-timeval lastUpdateTime Last known event of the job
-
-intlist stateEnterTimes When all previous states were entered
- _special_ XMLstructured
-
-bool expectUpdate Some logged information has not arrived yet
-string expectFrom Sources of the missing information
-string acl ACL of the job
-
-bool payload_running User payload started
-strlist possible_destinations Possible job destinations
- _special_ XMLstructured
-strlist possible_ce_nodes CE nodes matching to possible_destinations
- _special_ XMLstructured
-
-bool suspended Job is suspended
-string suspend_reason Reason for the suspend
-
-string pbs_state Job state which would probably return PBS qstat (Q/R/C/....)
-string pbs_queue Name of queue in which is job queued
-string pbs_owner Owner of job
-string pbs_name Name of job
-string pbs_reason Glued reasons/errors leading to pending events
-string pbs_scheduler Name of pbs scheduler
-string pbs_dest_host Hostname of node where job is running
-int pbs_pid PID of running job
-string pbs_resource_usage Glued resource usage
-int pbs_exit_status Job exit status
-string pbs_error_desc Glued error descriptions from error events
-
-string condor_status Condor job status
-string condor_universe Condor job Universe (in job ClassAds)
-string condor_owner Job owner
-string condor_pid PID of running job
-int condor_notification Condor notification
-int condor_job_exit_status Job exit status
-int condor_starter_exit_status Condor starter exit status
-int condor_shadow_exit_status Condor shadow exit status (see h/exit.h)
-
-
-@type Submitted Entered by the user to the User Interface or registered by Job Partitioner.
-@type Waiting Accepted by WMS, waiting for resource allocation.
-@type Ready Matching resources found.
-@type Scheduled Accepted by LRMS queue.
-@type Running Executable is running.
-@type Done Execution finished, output is available.
-@type Cleared Output transfered back to user and freed.
-@type Aborted Aborted by system (at any stage).
-@type Cancelled Cancelled by user.
-@type Unknown Status cannot be determined.
-@type Purged Job has been purged from bookkeeping server (for LB->RGMA interface).
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2004 on behalf of the EU EGEE Project:
- The European Organization for Nuclear Research (CERN),
- Istituto Nazionale di Fisica Nucleare (INFN), Italy
- Datamat Spa, Italy
- Centre National de la Recherche Scientifique (CNRS), France
- CS Systeme d'Information (CSSI), France
- Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
- Universiteit van Amsterdam (UvA), Netherlands
- University of Helsinki (UH.HIP), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common Ant task definition file for the gLite Logging and Bookeeping modules
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Logging and Bookeeping subsystem common tasks and types definitions">
-
- <!-- ======================================================
- Subsystem task definitions
- ====================================================== -->
-
-</project>
\ No newline at end of file
+++ /dev/null
-%types = (
- C=>{
- bool=>'"int"',
- string=>'"char *"',
- strlist=>'"char **"',
- intlist=>'"int *"',
- taglist=>'"edg_wll_TagValue *"',
- stslist=>'"struct _edg_wll_JobStat *"',
- timeval=>'"struct timeval"',
- jobid=>'"edg_wlc_JobId"',
- notifid=>'"edg_wll_NotifId"',
- logsrc=>'"edg_wll_Source"',
- port=>'"uint16_t"',
-# level=>'"enum edg_wll_Level"',
- int=>'"int"'
- },
- 'C++'=>{
- string=>'"std::string"',
- timeval=>'"struct timeval"',
- jobid=>'"edg::workload::common::jobid::JobId"',
- bool=>'"int"',
- intlist=>'"std::vector<int>"',
- strlist=>'"std::vector<std::string>"',
- taglist=>'"std::vector<std::pair<std::string>>"',
- stslist=>'"std::vector<JobStatus>"',
- logsrc=>'"int"',
- port=>'"int"',
- int=>'"int"'
- },
- 'wsdl'=>{
- bool=>'"xsd:boolean"',
- string=>'"xsd:string"',
- int=>'"xsd:int"',
- jobid=>'"xsd:string"',
- jobstat=>'"jobStatus"',
- usertag=>'"tagValue"',
- timeval=>'"timeval"',
- logsrc=>'"eventSource"',
- notifid=>'"xsd:string"',
- port=>'"xsd:int"',
- }
-);
-
-%baseTypes = (
- intlist=>'int',
- strlist=>'string',
- stslist=>'jobstat',
- taglist=>'usertag'
-);
-
-%toString = (
- C=>{
- int=>'qq{asprintf(&$dst,"%d",$src);}',
- port=>'qq{asprintf(&$dst,"%d",(int) $src);}',
- bool=>'qq{asprintf(&$dst,"%d",$src);}',
- string=>'qq{$dst = $src?strdup($src):NULL;}',
- timeval=>'qq{edg_wll_ULMTimevalToDate(($src).tv_sec,($src).tv_usec,$dst);}',
- jobid=>'qq{$dst = edg_wlc_JobIdUnparse($src);}',
- notifid=>'qq{$dst = edg_wll_NotifIdUnparse($src);}',
-# level=>'qq{$dst = edg_wll_LevelToString($src);}',
- logsrc=>'qq{$dst = edg_wll_SourceToString($src);}',
-# strlist, intlist, stslist are used only in consumer API, they don't need toString method
- }
-);
-
-%ULMasString = (
- logsrc=>1
-);
-
-%fromString = (
- C=>{
- int=>'qq{$dst = atoi($src);}',
- port=>'qq{$dst = (uint16_t) atoi($src);}',
- bool=>'qq{$dst = atoi($src);}',
- string=>'qq{$dst = strdup($src);}',
- timeval=>'qq{edg_wll_ULMDateToTimeval($src,&$dst);}',
- jobid=>'qq{edg_wlc_JobIdParse($src,&$dst);}',
- notifid=>'qq{edg_wll_NotifIdParse($src,&$dst);}',
-# level=>'qq{$dst = edg_wll_StringToLevel($src);}',
- logsrc=>'qq{$dst = edg_wll_StringToSource($src);}',
-# strlist, intlist, stslist are used only in consumer API, they don't need fromString method
- }
-);
-
-%DefaultNullValue = (
- int=>0,
- port=>0,
-# level=>'EDG_WLL_LEVEL_UNDEFINED',
- bool=>0,
- string=>'NULL',
- jobid=>'NULL',
- notifid=>'NULL',
- logsrc=>'EDG_WLL_SOURCE_NONE',
- timeval=>'null_timeval',
- strlist=>'NULL',
- intlist=>'NULL',
- taglist=>'NULL',
- stslist=>'NULL',
-);
-
-%compare = (
- C=>{
- int=>'"($a == $b)"',
- port=>'"($a == $b)"',
-# level=>'"($a == $b)"',
- bool=>'"(($a || !$b) && ($b || !$a))"',
- string=>'"(($a) == NULL && ($b) == NULL) || (($a)&&($b)&& !strcmp($a,$b))"',
- jobid=>'"(($a) == NULL && ($b) == NULL) || (($a)&&($b)&& !strcmp(edg_wlc_JobIdUnparse($a),edg_wlc_JobIdUnparse($b)))"',
- notifid=>'"($a) == ($b)"',
- logsrc=>'"($a) == ($b)"',
- timeval=>'"($a).tv_sec == ($b).tv_sec && ($a).tv_usec == ($b).tv_usec"',
- }
-);
-
-%toFormatString = (
- C=>{
- int=>'"%d"',
- port=>'"%d"',
- bool=>'"%d"',
-# level=>'"%s"',
- string=>'"%|Us"',
- jobid=>'"%s"',
- notifid=>'"%s"',
- logsrc=>'"%s"',
- timeval=>'"%s"',
- }
-);
+++ /dev/null
-#Fri Sep 02 14:19:10 CEST 2005
-module.version=1.3.3
-module.age=0
+++ /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
-#!/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 ""
-# 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 ;;
-
- *) echo "Unrecognized option $1 try -h for help"; exit 2 ;;
-
- esac
- shift
-done
-
-
-##
-# Ping the LB_HOST
-######################
-
-function ping_host
-{
- echo " 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 "Pinging $LB_HOST OK " >> $logfile
- else
- echo "" >> $logfile
- echo "Ping failed: The $LB_HOST is not accessible! " >> $logfile
- echo "" >> $logfile
- echo " 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 "OK" >> $logfile || echo "FAILED" >> $logfile
- return $RV
-}
-
-#
-# check the binaries
-#########################
-check_binaries()
-{
- check_exec 'LBJOBREG=`which $LBJOBREG`' "Checking binary $LBJOBREG ? " || exit 1
- check_exec 'LBJOBLOG=`which $LBJOBLOG`' "Checking binary $LBJOBLOG ? " || exit 1
- check_exec 'LBLOGEV=`which $LBLOGEV`' "Checking binary $LBLOGEV ?" || exit 1
- check_exec 'LBUSERJOBS=`which $LBUSERJOBS`' "Checking binary $LBUSERJOBS ?" || exit 1
- check_exec 'LBJOBSTAT=`which $LBJOBSTAT`' "Checking binary $LBJOBSTAT ? " || exit 1
- check_exec 'LBCHANGEACL=`which $LBCHANGEACL`' "Checking binary $LBCHANGEACL ?" || exit 1
- check_exec 'LBMON=`which $LBMON`' "Checking binary $LBMON " || exit 1
-}
-#
-# check the services
-##################"
-check_services()
-{
-echo "Listening to locallogger port (9002)" >> $logfile
-./testSocket $LB_HOST 9002 >> $logfile
-if [ $? -eq 0 ]; then
- echo "logd running ? - [OK]" >> $logfile
- else
- echo "logd running ? - [FAILED]" >> $logfile
- exit $TEST_ERROR
- fi
-echo "Listening to interlogger ports (9000-9001-9003)" >> $logfile
-./testSocket $LB_HOST 9000 >> $logfile &&
-./testSocket $LB_HOST 9001 >> $logfile &&
-./testSocket $LB_HOST 9003 >> $logfile
-if [ $? -eq 0 ]; then
- echo "Inetrlogd running ? - [OK]" >> $logfile
- else
- echo "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
-
+++ /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="pc900.iihe.ac.be"
-STATES="aborted cancelled done ready running scheduled waiting submitted "
-SOURCES="NetworkServer WorkloadManager BigHelper JobController LogMonitor LRMS Application UserInterface"
-
-stest=1
-i=0
-JOBS_ARRAY_SIZE=10
-INTERVAL=2
-
-init()
-{
-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 -m pc900.iihe.ac.be:9000 -s userInterface > 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
- dtest=0
- #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....." >> LoggedEvents.log
- cat -n events >> LoggedEvents.log
-# cat -n events
- echo "Events recorded in the LB server....." >> LoggedEvents.log
- cat -n events3 >> LoggedEvents.log
-# cat -n events3
- i=$[$i+1]
- cmp -s events events3
- done
- cmp -s events events3
- if [ $? -eq 0 ]; then
- dtest=1
- echo "Job $job_id ....................[OK]"
- i=0
-
- else
- echo "Job $job_id.....................[FAILED]"
- 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 LoggedEvents.log"
-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
-}
-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
-}
-
-#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 > LoggedEvents.log
- echo "Submitting events to the job: ${SAMPLE_JOBS_ARRAY[$job_id2]} " >> LoggedEvents.log
- echo >> LoggedEvents.log
-
- echo "event submitted.......................................[$state]" >> LoggedEvents.log
- 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 >> LoggedEvents.log
-job_id=$[$job_id+1]
-done
-}
-
-
-
-#input
-if [ -z "$1" ]; then
- showHelp
- exit 2
-fi
-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 ;;
- "-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
-echo
-
-
-#main..................................................................
-init
-array_job_reg
-logEvents
-logTags
-testLB
-testLB2
-#testProxy
-#eval $LBPURGE -h
-echo
-if [ $stest -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}
-
-# -m host
-BKSERVER="pc900.iihe.ac.be"
-STATES="aborted cancelled done ready running scheduled waiting submitted "
-SOURCES="NetworkServer WorkloadManager BigHelper JobController LogMonitor LRMS Application UserInterface"
-
-stest=1
-i=0
-JOBS_ARRAY_SIZE=10
-# timeouts for polling the bkserver
-timeout=10
-maxtimeout=300
-NB_TAGS=50
-INTERVAL=2
-
-init()
-{
-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 -m pc900.iihe.ac.be:9000 -s userInterface > 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
- exit 1;
- 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 LoggedEvents.log"
- echo
-}
-
-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
-}
-
-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]} " >> LoggedEvents.log
-echo >> LoggedEvents.log
-echo "event submitted.......................................[$state]" >> LoggedEvents.log
-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 >> LoggedEvents.log
-}
-
-
-
-#input
-if [ -z "$1" ]; then
- showHelp
- exit 2
-fi
-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_HOST=$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
-
-echo "Test of job status with several jobs "
-echo "***********************************"
-echo
-init
-array_job_reg
-testLBP
-echo
-if [ $stest -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
-
-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.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) 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.13 2006/03/20 15:29:52 eronchie
-# Increased version
-#
-# Revision 1.12 2005/10/15 07:54:17 eronchie
-# Increased version
-#
-# Revision 1.11 2005/09/20 10:20:52 eronchie
-# Started merged with 1.4
-#
-# Revision 1.10 2004/12/10 07:31:35 eronchie
-# Increased version
-#
-# Revision 1.9 2004/11/16 15:31:13 eronchie
-# Increased version
-#
-# Revision 1.8 2004/09/22 00:25:17 glbuild
-# Fixed missing parenthesis
-#
-# Revision 1.7 2004/09/21 19:21:57 glbuild
-# modified module.version
-#
-# Revision 1.6 2004/08/17 10:41:47 eronchie
-# Added optimize option
-#
-# Revision 1.5 2004/07/23 08:02:09 eronchie
-# Updated configure.ac
-#
-# Revision 1.4 2004/07/21 18:49:26 eronchie
-# Added AC_GLITE
-#
-# Revision 1.3 2004/07/21 18:47:49 eronchie
-# Removed obsolete things
-#
-# Revision 1.2 2004/07/21 18:44:22 eronchie
-# Updated header file
-#
-# Revision 1.1.1.1 2004/07/21 18:16:57 eronchie
-# Moved out exception from org.glite.wms.common/src/utilitiesY
-#
-#
-#
-
-# Process this file with autoconf to produce a configure script.
-
-AC_PREREQ(2.57)
-AC_INIT([GLite WMS Utils Exception], [3.1.1])
-AC_CONFIG_AUX_DIR([./project])
-AM_INIT_AUTOMAKE([1.6.3 subdir-objects])
-AC_CONFIG_SRCDIR([src/Exception.cpp])
-
-# Notices.
-AC_COPYRIGHT([Copyright (c) 2004 The EU EGEE Project
-See LICENCE file for details
-])
-AC_REVISION([$Revision$])
-
-#Environment.
-WORKDIR=`pwd`
-AC_SUBST(WORKDIR)
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_CPP
-AC_PROG_CXX
-AC_PROG_CXXCPP
-AM_PROG_CC_C_O
-AC_PROG_LIBTOOL
-
-# Checks for libraries.
-
-# Checks for header files.
-AC_CHECK_HEADERS([fcntl.h mntent.h sys/vfs.h syslog.h unistd.h])
-
-# Checks for typedefs, structures, and compiler characteristics.
-AC_HEADER_STDBOOL
-AC_C_CONST
-AC_C_INLINE
-AC_TYPE_OFF_T
-AC_TYPE_SIZE_T
-AC_CHECK_MEMBERS([struct stat.st_rdev])
-AC_TYPE_UID_T
-AC_CHECK_TYPES([ptrdiff_t])
-
-# Checks for library functions.
-AC_HEADER_STDC
-AC_FUNC_ERROR_AT_LINE
-AC_FUNC_GETMNTENT
-AC_FUNC_MEMCMP
-AC_FUNC_STAT
-AC_FUNC_STRFTIME
-AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([bzero endpwent ftruncate getmntent memset mkdir pow strerror strtol])
-
-AC_GLITE
-
-AC_OPTIMIZE
-
-# Configuration items
-AC_PREFIX_DEFAULT([/opt/glite])
-AM_CONFIG_HEADER([src/autogen/config.h])
-AC_CONFIG_FILES([Makefile])
-AC_CONFIG_FILES([src/Makefile])
-AC_CONFIG_FILES([interface/Makefile])
-
-AC_OUTPUT
-
+++ /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::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
-.project
\ No newline at end of file
+++ /dev/null
-* 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.5
-PATCH_VERSION=1.5.0
-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.
-##
-## You do not need to install the GridSite mod_ssl.so module if you
-## do not wish to use Globus Proxies or VOMS attributes, but you must
-## have the mod_gridsite.so in /usr/lib/httpd/modules
-##
-## We're assuming you have (a) the host's hostcert.pem and hostkey.pem
-## in /etc/grid-security/ and (b) the Certification Authorities' you
-## trust have their root certs in /etc/grid-security/certificates
-##
-## (You can get RPMs for many European and North American Grid CAs
-## from https://datagrid.in2p3.fr/distribution/datagrid/security/ )
-##
-## If you want to use DN Lists in ACLs, they should be placed/downloaded
-## in /etc/grid-security/dn-lists/
-##
-## To start serving files, make a directory /var/www/htdocs owned by
-## apache.apache, including the file .gacl containing:
-##
-## <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 15
-
-LoadModule log_config_module /usr/lib/httpd/modules/mod_log_config.so
-LoadModule ssl_module /usr/lib/httpd/modules/mod_ssl.so
-LoadModule gridsite_module /usr/lib/httpd/modules/mod_gridsite.so
-LoadModule mime_module /usr/lib/httpd/modules/mod_mime.so
-LoadModule dir_module /usr/lib/httpd/modules/mod_dir.so
-
-TypesConfig /etc/mime.types
-
-# User and group who will own files created by Apache
-User apache
-Group apache
-
-DocumentRoot "/var/www/htdocs"
-
-<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/htdocs">
- 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/htdocs">
- GridSiteIndexes on
- GridSiteAuth on
- GridSiteDNlists /etc/grid-security/dn-lists/
- GridSiteGSIProxyLimit 0
-# GridSiteMethods GET PUT DELETE MOVE
-</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.
-##
-## You do not need to install the GridSite mod_ssl.so module if you
-## do not wish to use Globus Proxies or VOMS attributes, but you must
-## have the mod_gridsite.so in /usr/lib/httpd/modules
-##
-## We're assuming you have (a) the host's hostcert.pem and hostkey.pem
-## in /etc/grid-security/ and (b) the Certification Authorities' you
-## trust have their root certs in /etc/grid-security/certificates
-##
-## (You can get RPMs for many European and North American Grid CAs
-## from https://datagrid.in2p3.fr/distribution/datagrid/security/ )
-##
-## If you want to use DN Lists in ACLs, they should be placed/downloaded
-## in /etc/grid-security/dn-lists/ or /var/www/htdocs/dn-lists/
-## (Lists in /etc/grid-security/dn-lists/ override lists elsewhere.)
-##
-## To start serving files, make a directory /var/www/htdocs owned by
-## apache.apache, including the file .gacl containing:
-##
-## <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/htdocs"
-
-<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/htdocs">
- ## 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/htdocs">
- ## 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/htdocs/dn-lists/
-
- ## This is used to form the URL at which DN Lists "owned" by this
- ## server are exported. https://FULL.SERVER.NAME/dn-lists/file
- ## ALL FILES WITH URLs ON THIS SERVER WILL BE EXPORTED IRRESPECTIVE
- ## OF WHERE THEY ARE FOUND ON THE DN-LISTS PATH!!
- GridSiteDNlistsURI /dn-lists/
-
- ## If this is greater than zero, we will accept GSI Proxies for clients
- ## (full client certificates - eg inside web browsers - are always ok)
- GridSiteGSIProxyLimit 0
-
- ## This directive allows authorized people to write/delete files
- ## from non-browser clients - eg with htcp(1)
- GridSiteMethods GET PUT DELETE MOVE
-
- ## These directives (and the ScriptAlias above) allow authorized
- ## people to manage files, ACLs and DN Lists through their web
- ## browsers via HTTPS. The value of GridSiteAdminFile appears to
- ## exist in every directory, but is internally redirected by
- ## mod_gridsite to the value of GridSiteAdminURI (the ScriptAlias
- ## then maps that onto the real-gridsite-admin.cgi executable.)
- GridSiteAdminURI /real-gridsite-admin.cgi
- GridSiteAdminFile gridsite-admin.cgi
-</Directory>
-
-</VirtualHost>
+++ /dev/null
-<title>GridSite 1.5.x Documentation</title>
-<body>
-<h1 align=center>GridSite 1.5.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 searched for as standard headers and footers
-for HTML pages. For each HTML page, the directory of that page is tried
-first, and then parent directories in ascending order until a header /
-footer file is found. Header files are inserted in place of HTML
-<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 "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 "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_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.
-
-.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.)
-
-.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 be share access to a common file store.
-
-.SH "OPTIONS"
-
-.TP
---debug
-Turn on debugging.
-
-.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-6, Andrew McNab, University of Manchester
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- o Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
- o Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*---------------------------------------------------------------*
- * For more about GridSite: http://www.gridsite.org/ *
- *---------------------------------------------------------------*/
-
-#ifndef HEADER_SSL_H
-#include <openssl/ssl.h>
-#endif
-
-#ifndef HEADER_CRYPTO_H
-#include <openssl/crypto.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__)
-
-#define GRSTerrorLog(GRSTerrorLevel, ...) if (GRSTerrorLogFunc != NULL) (GRSTerrorLogFunc)(__FILE__, __LINE__, GRSTerrorLevel, __VA_ARGS__)
-
-void (*GRSTerrorLogFunc)(char *, int, int, char *, ...);
-
-/* these levels are the same as Unix syslog() and Apache ap_log_error() */
-
-#define GRST_LOG_EMERG 0
-#define GRST_LOG_ALERT 1
-#define GRST_LOG_CRIT 2
-#define GRST_LOG_ERR 3
-#define GRST_LOG_WARNING 4
-#define GRST_LOG_NOTICE 5
-#define GRST_LOG_INFO 6
-#define GRST_LOG_DEBUG 7
-
-typedef struct { char *name;
- char *value;
- void *next; } GRSTgaclNamevalue;
-
-typedef struct { char *type;
- int delegation;
- GRSTgaclNamevalue *firstname;
- void *next; } GRSTgaclCred;
-
-typedef int GRSTgaclAction;
-typedef unsigned int GRSTgaclPerm;
-
-typedef struct { GRSTgaclCred *firstcred;
- GRSTgaclPerm allowed;
- GRSTgaclPerm denied;
- void *next; } GRSTgaclEntry;
-
-typedef struct { GRSTgaclEntry *firstentry; } GRSTgaclAcl;
-
-typedef struct { GRSTgaclCred *firstcred;
- char *dnlists; } GRSTgaclUser;
-
-#define GRST_PERM_NONE 0
-#define GRST_PERM_READ 1
-#define GRST_PERM_EXEC 2
-#define GRST_PERM_LIST 4
-#define GRST_PERM_WRITE 8
-#define GRST_PERM_ADMIN 16
-#define GRST_PERM_ALL 31
-
-/* DO NOT USE PermIsNone!! */
-#define GRSTgaclPermIsNone(perm) ((perm) == 0)
-
-#define GRSTgaclPermHasNone(perm) ((perm) == 0)
-#define GRSTgaclPermHasRead(perm) (((perm) & GRST_PERM_READ ) != 0)
-#define GRSTgaclPermHasExec(perm) (((perm) & GRST_PERM_EXEC ) != 0)
-#define GRSTgaclPermHasList(perm) (((perm) & GRST_PERM_LIST ) != 0)
-#define GRSTgaclPermHasWrite(perm) (((perm) & GRST_PERM_WRITE) != 0)
-#define GRSTgaclPermHasAdmin(perm) (((perm) & GRST_PERM_ADMIN) != 0)
-
-#define GRST_ACTION_ALLOW 0
-#define GRST_ACTION_DENY 1
-
-#define GRST_HIST_PREFIX ".grsthist"
-#define GRST_ACL_FILE ".gacl"
-#define GRST_DN_LISTS "/etc/grid-security/dn-lists"
-#define GRST_RECURS_LIMIT 9
-
-#define GRST_PROXYCERTINFO_OID "1.3.6.1.4.1.3536.1.222"
-#define GRST_VOMS_OID "1.3.6.1.4.1.8005.100.100.5"
-#define GRST_VOMS_DIR "/etc/grid-security/vomsdir"
-
-#define GRST_ASN1_MAXCOORDLEN 50
-#define GRST_ASN1_MAXTAGS 500
-
-struct GRSTasn1TagList { char treecoords[GRST_ASN1_MAXCOORDLEN+1];
- int start;
- int headerlength;
- int length;
- int tag; } ;
-
-typedef struct { int type; /* CA, user, proxy, VOMS, ... */
- int errors; /* unchecked, bad sig, bad time */
- char *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 start;
- time_t finish;
- int serial;
- char *ocsp; /* accessLocation field */
- void *raw; /* X509 or VOMS Extension object */
- void *next; } GRSTx509Cert;
-
-#define GRST_CERT_BAD_FORMAT 1
-#define GRST_CERT_BAD_CHAIN 2
-#define GRST_CERT_BAD_SIG 4
-#define GRST_CERT_BAD_TIME 8
-#define GRST_CERT_BAD_OCSP 16
-
-#define GRST_CERT_TYPE_CA 1
-#define GRST_CERT_TYPE_EEC 2
-#define GRST_CERT_TYPE_PROXY 3
-#define GRST_CERT_TYPE_VOMS 4
-
-/* a chain of certs, starting from the first CA */
-typedef struct { GRSTx509Cert *firstcert; } GRSTx509Chain;
-
-int GRSTx509CertLoad(GRSTx509Cert *, X509 *);
-int GRSTx509ChainLoadCheck(GRSTx509Chain **, STACK_OF(X509) *, X509 *, char *, char *);
-int GRSTx509ChainFree(GRSTx509Chain *);
-
-#define GRST_HTTP_PORT 777
-#define GRST_HTTPS_PORT 488
-#define GRST_HTCP_PORT 777
-#define GRST_GSIFTP_PORT 2811
-
-#define GRSThtcpNOPop 0
-#define GRSThtcpTSTop 1
-
-typedef struct { unsigned char length_msb;
- unsigned char length_lsb;
- char text[1]; } GRSThtcpCountstr;
-
-#define GRSThtcpCountstrLen(string) (256*((string)->length_msb) + (string)->length_lsb)
-
-typedef struct { unsigned char total_length_msb;
- unsigned char total_length_lsb;
- unsigned char version_msb;
- unsigned char version_lsb;
- unsigned char data_length_msb;
- unsigned char data_length_lsb;
- unsigned int response : 4;
- unsigned int opcode : 4;
- unsigned int rr : 1;
- unsigned int f1 : 1;
- unsigned int reserved : 6;
- unsigned int trans_id; /* must be 4 bytes */
- GRSThtcpCountstr *method;
- GRSThtcpCountstr *uri;
- GRSThtcpCountstr *version;
- GRSThtcpCountstr *req_hdrs;
- GRSThtcpCountstr *resp_hdrs;
- GRSThtcpCountstr *entity_hdrs;
- GRSThtcpCountstr *cache_hdrs; } GRSThtcpMessage;
-
-int GRSTgaclInit(void);
-
-/* #define GACLnewCred(x) GRSTgaclCredNew((x)) */
-GRSTgaclCred *GRSTgaclCredNew(char *);
-
-/* #define GACLaddToCred(x,y,z) GRSTgaclCredAddValue((x),(y),(z)) */
-int GRSTgaclCredAddValue(GRSTgaclCred *, char *, char *);
-
-#define GRSTgaclCredSetDelegation(cred, level) ((cred)->delegation = (level))
-#define GRSTgaclCredGetDelegation(cred) ((cred)->delegation)
-
-/* #define GACLfreeCred(x) GRSTgaclCredFree((x)) */
-int GRSTgaclCredFree(GRSTgaclCred *);
-
-/* #define GACLaddCred(x,y) GRSTgaclEntryAddCred((x),(y)) */
-int GRSTgaclEntryAddCred(GRSTgaclEntry *, GRSTgaclCred *);
-
-/* #define GACLdelCred(x,y) GRSTgaclEntryDelCred((x),(y)) */
-int GRSTgaclEntryDelCred(GRSTgaclEntry *, GRSTgaclCred *);
-
-/* #define GACLprintCred(x,y) GRSTgaclCredPrint((x),(y)) */
-int GRSTgaclCredCredPrint(GRSTgaclCred *, FILE *);
-
-
-/* #define GACLnewEntry(x) GRSTgaclEntryNew((x)) */
-GRSTgaclEntry *GRSTgaclEntryNew(void);
-
-/* #define GACLfreeEntry(x) GRSTgaclEntryFree((x)) */
-int GRSTgaclEntryFree(GRSTgaclEntry *);
-
-/* #define GACLaddEntry(x,y) GRSTgaclAclAddEntry((x),(y)) */
-int GRSTgaclAclAddEntry(GRSTgaclAcl *, GRSTgaclEntry *);
-
-/* #define GACLprintEntry(x,y) GRSTgaclEntryPrint((x),(y)) */
-int GRSTgaclEntryPrint(GRSTgaclEntry *, FILE *);
-
-
-/* #define GACLprintPerm(x,y) GRSTgaclPermPrint((x),(y)) */
-int GRSTgaclPermPrint(GRSTgaclPerm, FILE *);
-
-/* #define GACLallowPerm(x,y) GRSTgaclEntryAllowPerm((x),(y)) */
-int GRSTgaclEntryAllowPerm(GRSTgaclEntry *, GRSTgaclPerm);
-
-/* #define GACLunallowPerm(x,y) GRSTgaclEntryUnallowPerm((x),(y)) */
-int GRSTgaclEntryUnallowPerm(GRSTgaclEntry *, GRSTgaclPerm);
-
-/* #define GACLdenyPerm(x,y) GRSTgaclEntryDenyPerm((x),(y)) */
-int GRSTgaclEntryDenyPerm(GRSTgaclEntry *, GRSTgaclPerm);
-
-/* #define GACLundenyPerm(x,y) GRSTgaclEntryUndenyPerm((x),(y)) */
-int GRSTgaclEntryUndenyPerm(GRSTgaclEntry *, GRSTgaclPerm);
-
-/* #define GACLpermToChar(x) GRSTgaclPermToChar((x)) */
-char *GRSTgaclPermToChar(GRSTgaclPerm);
-
-/* #define GACLcharToPerm(x) GRSTgaclPermFromChar((x)) */
-GRSTgaclPerm GRSTgaclPermFromChar(char *);
-
-/* #define GACLnewAcl(x) GRSTgaclAclNew((x)) */
-GRSTgaclAcl *GRSTgaclAclNew(void);
-
-/* #define GACLfreeAcl(x) GRSTgaclAclFree((x)) */
-int GRSTgaclAclFree(GRSTgaclAcl *);
-
-/* #define GACLprintAcl(x,y) GRSTgaclAclPrint((x),(y)) */
-int GRSTgaclAclPrint(GRSTgaclAcl *, FILE *);
-
-/* #define GACLsaveAcl(x,y) GRSTgaclAclSave((y),(x)) */
-int GRSTgaclAclSave(GRSTgaclAcl *, char *);
-
-/* #define GACLloadAcl(x) GRSTgaclFileLoadAcl((x)) */
-GRSTgaclAcl *GRSTgaclAclLoadFile(char *);
-
-/* #define GACLfindAclForFile(x) GRSTgaclFileFindAclname((x)) */
-char *GRSTgaclFileFindAclname(char *);
-
-/* #define GACLloadAclForFile(x) GRSTgaclFileLoadAcl((x)) */
-GRSTgaclAcl *GRSTgaclAclLoadforFile(char *);
-
-/* #define GACLisAclFile(x) GRSTgaclFileIsAcl((x)) */
-int GRSTgaclFileIsAcl(char *);
-
-
-/* #define GACLnewUser(x) GRSTgaclUserNew((x)) */
-GRSTgaclUser *GRSTgaclUserNew(GRSTgaclCred *);
-
-/* #define GACLfreeUser(x) GRSTgaclUserFree((x)) */
-int GRSTgaclUserFree(GRSTgaclUser *);
-
-/* #define GACLuserAddCred(x,y) GRSTgaclUserAddCred((x),(y)) */
-int GRSTgaclUserAddCred(GRSTgaclUser *, GRSTgaclCred *);
-
-/* #define GACLuserHasCred(x,y) GRSTgaclUserHasCred((x),(y)) */
-int GRSTgaclUserHasCred(GRSTgaclUser *, GRSTgaclCred *);
-
-int GRSTgaclUserSetDNlists(GRSTgaclUser *, char *);
-
-/* #define GACLuserFindCredType(x,y) GRSTgaclUserFindCredtype((x),(y)) */
-GRSTgaclCred *GRSTgaclUserFindCredtype(GRSTgaclUser *, char *);
-
-/* #define GACLtestDnList(x,y) GRSTgaclDNlistHasUser((x),(y)) */
-int GRSTgaclDNlistHasUser(char *, GRSTgaclUser *);
-
-/* #define GACLtestUserAcl(x,y) GRSTgaclAclTestUser((x),(y)) */
-GRSTgaclPerm GRSTgaclAclTestUser(GRSTgaclAcl *, GRSTgaclUser *);
-
-/* #define GACLtestExclAcl(x,y) GRSTgaclAclTestexclUser((x),(y)) */
-GRSTgaclPerm GRSTgaclAclTestexclUser(GRSTgaclAcl *, GRSTgaclUser *);
-
-char *GRSThttpUrlDecode(char *);
-
-/* #define GACLurlEncode(x) GRSThttpUrlEncode((x)) */
-char *GRSThttpUrlEncode(char *);
-
-/* #define GACLmildUrlEncode(x) GRSThttpMildUrlEncode((x)) */
-char *GRSThttpUrlMildencode(char *);
-
-int GRSTx509NameCmp(char *, char *);
-
-int GRSTx509KnownCriticalExts(X509 *);
-
-int GRSTx509IsCA(X509 *);
-int GRSTx509CheckChain(int *, X509_STORE_CTX *);
-int GRSTx509VerifyCallback(int, X509_STORE_CTX *);
-
-int GRSTx509GetVomsCreds(int *, int, size_t, char *, X509 *, STACK_OF(X509) *, char *);
-GRSTgaclCred *GRSTx509CompactToCred(char *);
-int GRSTx509CompactCreds(int *, int, size_t, char *, STACK_OF(X509) *, char *, X509 *);
-char *GRSTx509CachedProxyFind(char *, char *, char *);
-char *GRSTx509FindProxyFileName(void);
-int GRSTx509MakeProxyCert(char **, FILE *, char *, char *, char *, int);
-char *GRSTx509CachedProxyKeyFind(char *, char *, char *);
-int GRSTx509ProxyDestroy(char *, char *, char *);
-int GRSTx509ProxyGetTimes(char *, char *, char *, time_t *, time_t *);
-int GRSTx509CreateProxyRequest(char **, char **, char *);
-int GRSTx509MakeProxyRequest(char **, char *, char *, char *);
-int GRSTx509StringToChain(STACK_OF(X509) **, char *);
-char *GRSTx509MakeDelegationID(void);
-char *GRSTx509MakeProxyFileName(char *, STACK_OF(X509) *);
-int GRSTx509CacheProxy(char *, char *, char *, char *);
-
-#define GRST_HEADFILE "gridsitehead.txt"
-#define GRST_FOOTFILE "gridsitefoot.txt"
-#define GRST_ADMIN_FILE "gridsite-admin.cgi"
-
-typedef struct { char *text;
- void *next; } GRSThttpCharsList;
-
-typedef struct { size_t size;
- GRSThttpCharsList *first;
- GRSThttpCharsList *last; } GRSThttpBody;
-
-void GRSThttpBodyInit(GRSThttpBody *);
-void GRSThttpPrintf(GRSThttpBody *, char *, ...);
-int GRSThttpCopy(GRSThttpBody *, char *);
-void GRSThttpWriteOut(GRSThttpBody *);
-int GRSThttpPrintHeaderFooter(GRSThttpBody *, char *, char *);
-char *GRSThttpGetCGI(char *);
-
-time_t GRSTasn1TimeToTimeT(char *, size_t);
-int GRSTasn1SearchTaglist(struct GRSTasn1TagList taglist[], int, char *);
-int GRSTasn1ParseDump(BIO *, unsigned char *, long,
- struct GRSTasn1TagList taglist[], int, int *);
-int GRSTasn1GetX509Name(char *, int, char *, char *,
- struct GRSTasn1TagList taglist[], int);
-
-int GRSThtcpNOPrequestMake(char **, int *, unsigned int);
-int GRSThtcpNOPresponseMake(char **, int *, unsigned int);
-int GRSThtcpTSTrequestMake(char **, int *, unsigned int, char *, char *, char *);
-int GRSThtcpTSTresponseMake(char **, int *, unsigned int, char *, char *, char *);
-int GRSThtcpMessageParse(GRSThtcpMessage *, char *, int);
+++ /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.5.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-6. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or
-# without modification, are permitted provided that the following
-# conditions are met:
-#
-# o Redistributions of source code must retain the above
-# copyright notice, this list of conditions and the following
-# disclaimer.
-# o Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following
-# disclaimer in the documentation and/or other materials
-# provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-#---------------------------------------------------------------
-# For more information about GridSite: http://www.gridsite.org/
-#---------------------------------------------------------------
-
-include ../VERSION
-
-RPMCMD=$(shell if [ -x /usr/bin/rpmbuild ] ; then echo /usr/bin/rpmbuild; else echo rpm; fi)
-
-ifndef MYRPMDIR
-export MYRPMDIR=$(shell pwd)/../RPMTMP
-endif
-
-ifndef prefix
-export prefix=/usr/local
-endif
-
-ifndef MYCFLAGS
-export MYCFLAGS=-I. -I../interface $(HTTPD_FLAGS) -I/usr/include/httpd -I/usr/include/apr-0 -I/opt/glite/include -fPIC
-endif
-
-ifndef MYLDFLAGS
-export MYLDFLAGS=-L.
-endif
-
-
-
-#
-# Build
-#
-
-build: apidoc build-lib \
- htcp gridsite-copy.cgi mod_gridsite.so \
- urlencode findproxyfile real-gridsite-admin.cgi gsexec
-
-build-lib: libgridsite_globus.so.$(VERSION) libgridsite_globus.a \
- libgridsite.so.$(VERSION) libgridsite.a
-
-# First, normal versions using system OpenSSL rather than Globus OpenSSL
-
-libgridsite.so.$(VERSION): grst_err.o grst_x509.o grst_gacl.o grst_xacml.o \
- grst_http.o grst_asn1.o grst_htcp.o
- gcc -shared -Wl,-soname,libgridsite.so.$(MINOR_VERSION) \
- -o libgridsite.so.$(PATCH_VERSION) -lcrypto `xml2-config --libs` \
- grst_err.o grst_x509.o grst_gacl.o grst_xacml.o grst_http.o \
- grst_asn1.o grst_htcp.o
- ln -sf libgridsite.so.$(VERSION) libgridsite.so
- ln -sf libgridsite.so.$(VERSION) libgridsite.so.$(MINOR_VERSION)
-
-libgridsite.a: grst_err.o grst_x509.o grst_gacl.o grst_xacml.o grst_http.o grst_asn1.o grst_htcp.o
- ar src libgridsite.a grst_err.o grst_x509.o grst_gacl.o grst_xacml.o grst_http.o grst_asn1.o grst_htcp.o
-
-grst_err.o: grst_err.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) \
- -I/usr/kerberos/include \
- -c grst_err.c
-
-grst_x509.o: grst_x509.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) \
- -I/usr/kerberos/include -c grst_x509.c
-
-grst_gacl.o: grst_gacl.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) \
- -I/usr/kerberos/include `xml2-config --cflags` -c grst_gacl.c
-
-grst_xacml.o: grst_xacml.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) \
- -I/usr/kerberos/include `xml2-config --cflags` -c grst_xacml.c
-
-grst_http.o: grst_http.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) \
- -I/usr/kerberos/include -c grst_http.c
-
-grst_asn1.o: grst_asn1.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) \
- -I/usr/kerberos/include -c grst_asn1.c
-
-grst_htcp.o: grst_htcp.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) \
- -I/usr/kerberos/include -c grst_htcp.c
-
-# Then build versions using Globus OpenSSL if configured
-
-ifdef OPENSSL_GLOBUS_LIBS
-
-libgridsite_globus.so.$(VERSION): grst_err_globus.o \
- grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o \
- grst_asn1_globus.o grst_xacml_globus.o grst_htcp_globus.o
- gcc -shared -Wl,-soname,libgridsite_globus.so.$(MINOR_VERSION) \
- -o libgridsite_globus.so.$(PATCH_VERSION) \
- grst_err_globus.o grst_x509_globus.o grst_gacl_globus.o grst_xacml_globus.o \
- grst_http_globus.o grst_asn1_globus.o
- ln -sf libgridsite_globus.so.$(VERSION) libgridsite_globus.so
-
-libgridsite_globus.a: grst_err_globus.o grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o grst_asn1_globus.o
- ar src libgridsite_globus.a \
- grst_err_globus.o grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o grst_asn1_globus.o
-
-grst_err_globus.o: grst_err.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \
- -I/usr/kerberos/include \
- -c grst_err.c \
- -o grst_err_globus.o
-
-grst_x509_globus.o: grst_x509.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \
- -I/usr/kerberos/include -c grst_x509.c \
- -o grst_x509_globus.o
-
-grst_gacl_globus.o: grst_gacl.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \
- -I/usr/kerberos/include `xml2-config --cflags` -c grst_gacl.c \
- -o grst_gacl_globus.o
-
-grst_xacml_globus.o: grst_xacml.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \
- -I/usr/kerberos/include `xml2-config --cflags` -c grst_xacml.c \
- -o grst_xacml_globus.o
-
-grst_http_globus.o: grst_http.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \
- -I/usr/kerberos/include -c grst_http.c \
- -o grst_http_globus.o
-
-grst_asn1_globus.o: grst_asn1.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \
- -I/usr/kerberos/include -c grst_asn1.c \
- -o grst_asn1_globus.o
-
-grst_htcp_globus.o: grst_htcp.c ../interface/gridsite.h
- gcc -g $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \
- -I/usr/kerberos/include -c grst_htcp.c \
- -o grst_htcp_globus.o
-
-else
-
-libgridsite_globus.so.$(VERSION): libgridsite.so.$(VERSION)
- cp -f libgridsite.so.$(VERSION) libgridsite_globus.so.$(VERSION)
-
-libgridsite_globus.a: libgridsite.a
- cp -f libgridsite.a libgridsite_globus.a
-
-endif
-
-gsexec: gsexec.c gsexec.h
- gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \
- -o gsexec gsexec.c
-
-urlencode: urlencode.c libgridsite.so.$(VERSION)
- gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \
- -o urlencode urlencode.c -L. \
- -I/usr/kerberos/include \
- -lgridsite
-
-htcp: htcp.c libgridsite.so.$(VERSION)
- gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \
- -o htcp htcp.c -L. \
- -I/usr/kerberos/include \
- `curl-config --cflags` `curl-config --libs` \
- -lgridsite
-
-gridsite-copy.cgi: gridsite-copy.c libgridsite.so.$(VERSION)
- gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \
- -o gridsite-copy.cgi gridsite-copy.c -L. \
- -I/usr/kerberos/include \
- `curl-config --cflags` `curl-config --libs` \
- $(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
-
-real-gridsite-admin.cgi: grst_admin_main.c grst_admin_gacl.c \
- grst_admin_file.c grst_admin.h
- gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o real-gridsite-admin.cgi \
- grst_admin_main.c \
- grst_admin_gacl.c \
- grst_admin_file.c \
- -I/usr/kerberos/include \
- -DVERSION=\"$(VERSION)\" -lgridsite -lssl -lcrypto -lxml2 -lz -lm
-
-findproxyfile: findproxyfile.c libgridsite.so.$(VERSION)
- gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) $(MYLDFLAGS) \
- -o findproxyfile findproxyfile.c -L. \
- -I/usr/kerberos/include -lgridsite \
- -lssl -lcrypto -lxml2 -lz -lm
-
-showx509exts: showx509exts.c libgridsite.so.$(VERSION)
- gcc -g -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) $(MYLDFLAGS) \
- -o showx509exts showx509exts.c -L. \
- -I/usr/kerberos/include \
- -lgridsite \
- -lssl -lcrypto -lxml2 -lz -lm
-
-slashgrid: slashgrid.c libgridsite.so.$(VERSION)
- gcc -g -o slashgrid -lfuse -lpthread slashgrid.c \
- $(MYCFLAGS) $(MYLDFLAGS) `xml2-config --cflags` \
- -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DFUSE_USE_VERSION=22 \
- -I/usr/kerberos/include `curl-config --cflags` \
- -L. `curl-config --libs` -lgridsite
-
-# This target is used by make-gridsite-spec to test for FUSE include+libs
-fuse-test: fuse-test.c
- gcc -g -lfuse fuse-test.c \
- $(MYCFLAGS) $(MYLDFLAGS) `xml2-config --cflags` \
- -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DFUSE_USE_VERSION=22
-
-apidoc:
- date
- doxygen Doxyfile
- mkdir -p ../doc/doxygen
- cp -f doxygen/*.html doxygen/*.css doxygen/*.png ../doc/doxygen
- cd ../doc ; for i in *.1 *.8 ; do ../src/roffit < $$i \
- > $$i.html ; done
-
-gaclexample: gaclexample.c libgridsite.a
- gcc -g -o gaclexample gaclexample.c -I. -L. \
- -I/usr/kerberos/include -lgridsite \
- -lssl -lcrypto -lxml2 -lz -lm
-
-xacmlexample: xacmlexample.c libgridsite.a
- gcc -g -o xacmlexample xacmlexample.c -I. -L. \
- -I/usr/kerberos/include -lgridsite \
- -lssl -lcrypto -lxml2 -lz -lm
-#
-# Delegation machinery, including SOAP delegation portType. To build this
-# you either need to use the gLite build environment and set REPOSITORY
-# or install gSOAP and set GSOAPDIR to the directory containing
-# soapcpp2 and stdsoap2.h (unless GSOAPDIR is set already)
-#
-
-ifndef GSOAPDIR
- export GSOAPDIR=/usr
-endif
-
-ifndef GRIDSITEDIR
- export GRIDSITEDIR=/usr
-endif
-
-
-DelegationService.wsdl: delegation.h
- $(GSOAPDIR)/bin/soapcpp2 -c delegation.h
-
-gridsite-delegation.cgi: grst-delegation.c delegation.h \
- DelegationService.wsdl libgridsite.so.$(VERSION)
- gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o gridsite-delegation.cgi \
- grst-delegation.c \
- -I/usr/kerberos/include -I. -I$(GSOAPDIR)/include \
- -I$(GRIDSITEDIR)/include \
- -DVERSION=\"$(VERSION)\" -L. -L$(GSOAPDIR)/lib \
- -L$(GRIDSITEDIR)/lib \
- soapC.c soapServer.c -lgsoap \
- -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm
-
-htproxyput: htproxyput.c delegation.h DelegationService.wsdl libgridsite.so.$(VERSION)
- gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o htproxyput \
- htproxyput.c \
- -I/usr/kerberos/include -I. \
- -g -DVERSION=\"$(VERSION)\" \
- -I$(GSOAPDIR)/include \
- -I$(GRIDSITEDIR)/include \
- -DWITH_OPENSSL -L. -L$(GSOAPDIR)/lib \
- $(STDSOAP2) \
- soapC.c soapClient.c -lgsoapssl \
- -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm
-
-# This target is used by make-gridsite-spec to test for gSOAP include+libs
-gsoap-test: gsoap-test.c
- gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o gsoap-test \
- gsoap-test.c \
- -I/usr/kerberos/include -I. \
- -g -DVERSION=\"$(VERSION)\" \
- -I$(GSOAPDIR)/include \
- -I$(GRIDSITEDIR)/include \
- -DWITH_OPENSSL -L$(GSOAPDIR)/lib \
- $(STDSOAP2) -L$(GRIDSITEDIR)/lib \
- -lgsoapssl -lz -lssl -lcrypto -lxml2 -lm
-
-gridsite-srm.cgi: gridsite-srm.c libgridsite.so.$(VERSION)
- gcc -g $(MYCFLAGS) $(MYLDFLAGS) -o gridsite-srm.cgi \
- gridsite-srm.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)/lib \
- $(prefix)/bin \
- $(prefix)/sbin \
- $(prefix)/share/man/man1 \
- $(prefix)/share/man/man8 \
- $(prefix)/lib/httpd/modules \
- $(prefix)/share/doc/gridsite-$(MINOR_VERSION)
- cp -f ../interface/gridsite.h $(prefix)/include
- cp -f ../interface/gridsite-gacl.h $(prefix)/include
- cp -f urlencode $(prefix)/bin
- cp -f findproxyfile $(prefix)/bin
- cp -f real-gridsite-admin.cgi $(prefix)/sbin
- cp -f gridsite-copy.cgi $(prefix)/sbin
- cp -f ../CHANGES ../README ../INSTALL ../LICENSE ../VERSION \
- $(prefix)/share/doc/gridsite-$(MINOR_VERSION)
- cp -f ../doc/index.html ../doc/*.conf ../doc/*.sh ../doc/*.spec \
- $(prefix)/share/doc/gridsite-$(MINOR_VERSION)
- for i in htcp.1 htfind.1 htll.1 htls.1 htmkdir.1 htmv.1 htping.1 \
- htrm.1 urlencode.1 findproxyfile.1 ; do \
- cp -f ../doc/$$i.html $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \
- cp -f ../doc/$$i $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \
- cp -f ../doc/$$i $(prefix)/share/man/man1 ; \
- gzip -f $(prefix)/share/man/man1/$$i ; done
- for i in mod_gridsite.8 gsexec.8 ; do \
- cp -f ../doc/$$i.html $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \
- cp -f ../doc/$$i $(prefix)/share/doc/gridsite-$(MINOR_VERSION) ; \
- cp -f ../doc/$$i $(prefix)/share/man/man8 ; \
- gzip -f $(prefix)/share/man/man8/$$i ; done
- cp -f htcp $(prefix)/bin
- ln -sf htcp $(prefix)/bin/htls
- ln -sf htcp $(prefix)/bin/htll
- ln -sf htcp $(prefix)/bin/htrm
- ln -sf htcp $(prefix)/bin/htmkdir
- ln -sf htcp $(prefix)/bin/htmv
- ln -sf htcp $(prefix)/bin/htping
- ln -sf htcp $(prefix)/bin/htfind
- cp -f gsexec $(prefix)/sbin
- cp -f mod_gridsite.so $(prefix)/lib/httpd/modules
-
-install-lib:
- mkdir -p $(prefix)/lib
- cp -f libgridsite.a $(prefix)/lib
- cp -f libgridsite.so.$(PATCH_VERSION) $(prefix)/lib
- ln -sf libgridsite.so.$(PATCH_VERSION) \
- $(prefix)/lib/libgridsite.so
- ln -sf libgridsite.so.$(PATCH_VERSION) \
- $(prefix)/lib/libgridsite.so.$(MAJOR_VERSION)
- ln -sf libgridsite.so.$(PATCH_VERSION) \
- $(prefix)/lib/libgridsite.so.$(MINOR_VERSION)
- cp -f libgridsite_globus.a $(prefix)/lib
- cp -f libgridsite_globus.so.$(PATCH_VERSION) $(prefix)/lib
- ln -sf libgridsite_globus.so.$(PATCH_VERSION) \
- $(prefix)/lib/libgridsite_globus.so
- ln -sf libgridsite_globus.so.$(PATCH_VERSION) \
- $(prefix)/lib/libgridsite_globus.so.$(MAJOR_VERSION)
- ln -sf libgridsite_globus.so.$(PATCH_VERSION) \
- $(prefix)/lib/libgridsite_globus.so.$(MINOR_VERSION)
-
-install-slashgrid: slashgrid
- cp -f slashgrid $(prefix)/sbin
- cp -f slashgrid.init $(RPM_BUILD_ROOT)/etc/rc.d/init.d/slashgrid
- 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/headers
- mkdir -p $(RPM_BUILD_ROOT)/var/spool/slashgrid/blocks
- mkdir -p $(RPM_BUILD_ROOT)/var/spool/slashgrid/tmp
-
-install-ws: gridsite-delegation.cgi htproxyput
- mkdir -p $(prefix)/include \
- $(prefix)/lib \
- $(prefix)/bin \
- $(prefix)/sbin \
- $(prefix)/share/man/man1 \
- $(prefix)/share/man/man8 \
- $(prefix)/share/doc/gridsite-$(MINOR_VERSION)
- cp -f ../doc/*.wsdl $(prefix)/share/doc/gridsite-$(MINOR_VERSION)
- for i in htproxyput.1 htproxytime.1 htproxyrenew.1 htproxydestroy.1 \
- htproxyunixtime.1 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 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-3, Andrew McNab, University of Manchester
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- o Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
- o Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*---------------------------------------------------------------*
- * For more about GridSite: http://www.gridsite.org/ *
- *---------------------------------------------------------------*/
-
-/*
- Example program using GACL
-
- Build with:
-
- gcc -o gaclexample gaclexample.c -L. -I. -lgridsite -lxml2 -lz -lm
-*/
-
-#include <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 = GRSTgaclCredNew("person");
-
- GRSTgaclCredAddValue(cred, "dn", "/O=Grid/CN=Mr Grid Person");
-
- /* create an entry to put it in */
-
- entry = GRSTgaclEntryNew();
-
- /* add the credential to it */
-
- GRSTgaclEntryAddCred(entry, cred);
-
- /* add another credential */
-
- cred = GRSTgaclCredNew("dn-list");
- GRSTgaclCredAddValue(cred, "url", "example-dn-list");
- GRSTgaclEntryAddCred(entry, cred);
-
- fp = fopen("example-dn-list", "w");
- fputs("/O=Grid/CN=Mr Grid Person\n", fp);
- fclose(fp);
-
- /* associate some permissions and denials to the credential */
-
- GRSTgaclEntryAllowPerm( entry, GRST_PERM_READ);
- GRSTgaclEntryAllowPerm( entry, GRST_PERM_WRITE);
- GRSTgaclEntryAllowPerm( entry, GRST_PERM_ADMIN);
- GRSTgaclEntryDenyPerm( entry, GRST_PERM_ADMIN);
- GRSTgaclEntryDenyPerm( entry, GRST_PERM_LIST);
-
- perm0 = GRST_PERM_READ | GRST_PERM_WRITE;
-
- printf("test perm should be %d\n", perm0);
-
- /* create a new ACL and add the entry to it */
-
- acl1 = GRSTgaclAclNew();
-
- GRSTgaclAclAddEntry(acl1, entry);
-
- /* create a GRSTgaclUser to compare with the ACL */
-
- usercred = GRSTgaclCredNew("person");
-
- GRSTgaclCredAddValue(usercred, "dn", "/O=Grid/CN=Mr Grid Person");
-
- user = GRSTgaclUserNew(usercred);
-
- GRSTgaclUserSetDNlists(user, getcwd(NULL, 0));
- printf("DN Lists dir %s\n", getcwd(NULL, 0));
-
-// putenv("GRST_DN_LISTS=.");
-
- perm1 = GRSTgaclAclTestUser(acl1, user);
-
- printf("test /O=Grid/CN=Mr Grid Person in acl = %d\n", perm1);
-
- /* print and save the whole ACL */
-
- GRSTgaclAclPrint(acl1, stdout);
-
- GRSTgaclAclSave(acl1, "example.gacl");
-
- puts("gridacl.out saved");
-
- puts("");
-
- /* load the ACL back off the disk, print and test it */
-
- acl2 = GRSTgaclAclLoadFile("example.gacl");
-
- puts("gridacl.out loaded");
-
- if (acl2 != NULL) GRSTgaclAclPrint(acl2, stdout); else puts("acl2 is NULL");
-
- perm2 = GRSTgaclAclTestUser(acl2, user);
-
- printf("test /O=Grid/CN=Mr Grid Person in acl = %d\n", perm2);
-
- if (perm1 != perm0) return 1;
- if (perm2 != perm0) return 2;
-
- return 0;
-}
+++ /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-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;
- GRSTgaclCred *cred = NULL;
-
- for (i=0; ; ++i)
- {
- asprintf(&p, "GRST_CRED_%d", i);
- s = getenv(p);
- free(p);
-
- if (s == NULL) break;
-
- if ((cred = GRSTx509CompactToCred(s)) == NULL) break;
-
- if ((strcmp(cred->type, "person") == 0) &&
- (cred->firstname != NULL) &&
- (cred->firstname->name != NULL) &&
- (strcmp(cred->firstname->name, "dn") == 0) &&
- (cred->firstname->value != NULL))
- {
- dn = strdup(cred->firstname->value);
- GRSTgaclCredFree(cred);
- return dn;
- }
-
- GRSTgaclCredFree(cred);
- }
-
- return NULL;
-}
-
-int ns__getProxyReq(struct soap *soap,
- char *delegation_id,
- struct ns__getProxyReqResponse *response)
-{
- int i;
- char *p, *user_dn, *docroot, *proxydir, *request;
-
- if ((user_dn = get_dn()) == NULL) return SOAP_ERR;
-
- if ((delegation_id == NULL) || (*delegation_id == '\0'))
- delegation_id = GRSTx509MakeDelegationID();
- else for (i=0; delegation_id[i] != '\0'; ++i)
- {
- if (!isalnum(delegation_id[i]) &&
- (delegation_id[i] != '.') &&
- (delegation_id[i] != ',') &&
- (delegation_id[i] != '_'))
- {
- delegation_id = NULL;
- break;
- }
- }
-
- docroot = getenv("DOCUMENT_ROOT");
- asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE);
-
- if ((user_dn != NULL) &&
- (user_dn[0] != '\0') &&
- (delegation_id != NULL) &&
- (GRSTx509MakeProxyRequest(&request, proxydir,
- delegation_id, user_dn) == 0))
- {
- response->getProxyReqReturn = request;
-
- free(user_dn);
- return SOAP_OK;
- }
-
- free(user_dn);
- return SOAP_ERR;
-}
-
-int ns__getNewProxyReq(struct soap *soap,
- struct ns__getNewProxyReqResponse *response)
-{
- char *p, *user_dn, *docroot, *proxydir, *request, *delegation_id;
-
- if ((user_dn = get_dn()) == NULL) return SOAP_ERR;
-
- delegation_id = GRSTx509MakeDelegationID();
-
- docroot = getenv("DOCUMENT_ROOT");
- asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE);
-
- if ((user_dn != NULL) &&
- (user_dn[0] != '\0') &&
- (delegation_id != NULL) &&
- (GRSTx509MakeProxyRequest(&request, proxydir,
- delegation_id, user_dn) == 0))
- {
- response->getNewProxyReqReturn = malloc(sizeof(struct ns__NewProxyReq));
- response->getNewProxyReqReturn->proxyRequest = request;
- response->getNewProxyReqReturn->delegationID = delegation_id;
-
- free(user_dn);
- return SOAP_OK;
- }
-
- free(user_dn);
- return SOAP_ERR;
-}
-
-int ns__putProxy(struct soap *soap, char *delegation_id,
- char *proxy,
- struct ns__putProxyResponse *response)
-{
- int fd, c, len = 0, i;
- char *docroot, *proxydir, *p, *user_dn;
-
- if ((user_dn = get_dn()) == NULL) return SOAP_ERR;
-
- if ((delegation_id == NULL) || (*delegation_id == '\0'))
- delegation_id = GRSTx509MakeDelegationID();
- else for (i=0; delegation_id[i] != '\0'; ++i)
- {
- if (!isalnum(delegation_id[i]) &&
- (delegation_id[i] != '.') &&
- (delegation_id[i] != ',') &&
- (delegation_id[i] != '_'))
- {
- delegation_id = NULL;
- break;
- }
- }
-
- docroot = getenv("DOCUMENT_ROOT");
- asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE);
-
- if ((user_dn == NULL) ||
- (user_dn[0] == '\0') ||
- (delegation_id == NULL) ||
- (GRSTx509CacheProxy(proxydir, delegation_id, user_dn, proxy)
- != GRST_RET_OK))
- {
- free(proxydir);
- free(user_dn);
- return SOAP_ERR;
- }
-
- free(proxydir);
- free(user_dn);
- return SOAP_OK;
-}
-
-int ns__renewProxyReq(struct soap *soap,
- char *delegation_id,
- struct ns__renewProxyReqResponse *response)
-{
- int i;
- char *p, *user_dn, *docroot, *proxydir, *request;
-
- if ((user_dn = get_dn()) == NULL) return SOAP_ERR;
-
- if (delegation_id == NULL)
- {
- free(user_dn);
- return SOAP_ERR;
- }
-
- for (i=0; delegation_id[i] != '\0'; ++i)
- {
- if (!isalnum(delegation_id[i]) &&
- (delegation_id[i] != '.') &&
- (delegation_id[i] != ',') &&
- (delegation_id[i] != '_'))
- {
- delegation_id = NULL;
- break;
- }
- }
-
- if (*delegation_id == '\0')
- {
- free(user_dn);
- return SOAP_ERR;
- }
-
- docroot = getenv("DOCUMENT_ROOT");
- asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE);
-
- if ((user_dn != NULL) &&
- (user_dn[0] != '\0') &&
- (delegation_id != NULL) &&
- (GRSTx509MakeProxyRequest(&request, proxydir,
- delegation_id, user_dn) == 0))
- {
- response->_renewProxyReqReturn = request;
-
- free(user_dn);
- return SOAP_OK;
- }
-
- free(user_dn);
- return SOAP_ERR;
-}
-
-int ns__getTerminationTime(struct soap *soap,
- char *delegation_id,
- struct ns__getTerminationTimeResponse *response)
-{
- char *p, *user_dn, *docroot, *proxydir;
- time_t start, finish;
-
- if ((user_dn = get_dn()) == NULL) return SOAP_ERR;
-
- delegation_id = GRSTx509MakeDelegationID();
-
- docroot = getenv("DOCUMENT_ROOT");
- asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE);
-
- if ((user_dn != NULL) &&
- (user_dn[0] != '\0') &&
- (delegation_id != NULL) &&
- (GRSTx509ProxyGetTimes(proxydir, delegation_id, user_dn,
- &start, &finish) == 0))
- {
- response->_getTerminationTimeReturn = finish;
-
- free(user_dn);
- return SOAP_OK;
- }
-
- free(user_dn);
- return SOAP_ERR;
-}
-
-int ns__destroy(struct soap *soap,
- char *delegation_id,
- struct ns__destroyResponse *response)
-{
- int fd, c, len = 0, i;
- char *docroot, *proxydir, *p, *client_dn, *user_dn;
-
- if ((user_dn = get_dn()) == NULL) return SOAP_ERR;
-
- if ((delegation_id == NULL) || (*delegation_id == '\0'))
- delegation_id = GRSTx509MakeDelegationID();
- else for (i=0; delegation_id[i] != '\0'; ++i)
- {
- if (!isalnum(delegation_id[i]) &&
- (delegation_id[i] != '.') &&
- (delegation_id[i] != ',') &&
- (delegation_id[i] != '_'))
- {
- delegation_id = NULL;
- break;
- }
- }
-
- docroot = getenv("DOCUMENT_ROOT");
- asprintf(&proxydir, "%s/%s", docroot, GRST_PROXYCACHE);
-
- if ((user_dn == NULL) ||
- (user_dn[0] == '\0') ||
- (delegation_id == NULL) ||
- (GRSTx509ProxyDestroy(proxydir, delegation_id, user_dn)
- != GRST_RET_OK))
- {
- free(proxydir);
- free(user_dn);
- return SOAP_ERR;
- }
-
- free(proxydir);
- free(user_dn);
- return SOAP_OK;
-}
+++ /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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
- return;
- }
- else
- {
- vfile = makevfilename(filename, bufferused, dn);
- asprintf(&dir_path_vfile, "%s/%s", dir_path, vfile);
-
- fp = fopen(dir_path_vfile, "w");
- if (fp != NULL)
- {
- if ((fwrite(filebuffer,
- sizeof(char), bufferused, fp) == bufferused) &&
- (fclose(fp) == 0))
- {
- asprintf(&filepath, "%s/%s", dir_path, filename);
-
- unlink(filepath); /* this can fail ok */
-
- itworked = (link(dir_path_vfile, filepath) == 0);
- }
- }
- }
-
- free((void *) filebuffer);
- }
-
- if (itworked)
- {
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file);
- return;
- }
-
- puts("Status: 500 Failed trying to upload\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp, "<title>Failed to upload</title>\n");
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-void deletefileaction(char *dn, GRSTgaclPerm perm, char *help_uri,
- char *dir_path, char *file, char *dir_uri,
- char *admin_file)
-{
- int fd, numfiles;
- char *dir_path_file, *dir_path_vfile, *p, *vfile, *dnlistsuri,
- *fulluri, *server_name, *realfile;
- struct stat statbuf;
- GRSThttpBody bp;
- struct dirent *subdirfile_ent;
- DIR *subDIR;
-
- if (((strcmp(file, GRST_ACL_FILE) != 0) && !GRSTgaclPermHasWrite(perm)) ||
- ((strcmp(file, GRST_ACL_FILE) == 0) && !GRSTgaclPermHasAdmin(perm)))
- GRSThttpError("403 Forbidden");
-
- dnlistsuri = getenv("GRST_DN_LISTS_URI");
- if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI");
-
- if ((dnlistsuri != NULL) &&
- (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) == 0))
- realfile = GRSThttpUrlEncode(file);
- else if (index(file, '/') != NULL) GRSThttpError("403 Forbidden");
- else realfile = file;
-
- dir_path_file = malloc(strlen(dir_path) + strlen(realfile) + 2);
-
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, realfile);
-
- if ((stat(dir_path_file, &statbuf) == 0) && S_ISDIR(statbuf.st_mode))
- {
- subDIR = opendir(dir_path_file);
- if (subDIR == NULL) numfiles = 99; /* stop deletion */
- else
- {
- numfiles = 0;
- while ((subdirfile_ent = readdir(subDIR)) != NULL)
- if (subdirfile_ent->d_name[0] != '.') ++numfiles;
- else if (strncmp(subdirfile_ent->d_name,
- GRST_ACL_FILE,
- sizeof(GRST_ACL_FILE)) == 0) ++numfiles;
- closedir(subDIR);
- }
-
- if (numfiles == 0)
- {
- vfile = makevfilename(file, 0, dn);
- dir_path_vfile = malloc(strlen(dir_path) + strlen(vfile) + 2);
- strcpy(dir_path_vfile, dir_path);
- strcat(dir_path_vfile, "/");
- strcat(dir_path_vfile, vfile);
-
- if (rename(dir_path_file, dir_path_vfile) == 0)
- {
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file);
- return;
- }
- }
- }
- else if (unlink(dir_path_file) == 0)
- {
- if (strcmp(file, GRST_ACL_FILE) != 0)
- {
- vfile = makevfilename(file, 0, dn);
- dir_path_file = malloc(strlen(dir_path) + strlen(vfile) + 2);
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, vfile);
-
- fd = open(dir_path_file, O_WRONLY | O_CREAT);
- if (fd != -1) close(fd);
- }
-
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file);
-
- return;
- }
-
- puts("Status: 500 Failed trying to delete\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp, "<title>Error deleting %s%s</title>\n", dir_uri, file);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-void deletefileform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden");
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp, "<title>Delete %s</title>\n", file);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-void renameform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden");
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp, "<title>Rename %s</title>\n", file);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-void editfileaction(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- char *pagetext, *dir_path_file, *vfile, *dir_path_vfile,
- *dnlistsuri, *server_name, *fulluri, *realfile;
- FILE *fp;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasWrite(perm) || (strcmp(file, GRST_ACL_FILE) == 0))
- GRSThttpError("403 Forbidden");
-
- dnlistsuri = getenv("GRST_DN_LISTS_URI");
- if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI");
-
- if ((dnlistsuri != NULL) &&
- (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) == 0))
- {
- realfile = GRSThttpUrlEncode(file);
-
- if (realfile[0] == '.') GRSThttpError("403 Forbidden");
- }
- else if (index(file, '/') != NULL) GRSThttpError("403 Forbidden");
- else realfile = file;
-
- asprintf(&dir_path_file, "%s/%s", dir_path, realfile);
-
- pagetext = GRSThttpGetCGI("pagetext");
- vfile = makevfilename(file, strlen(pagetext), dn);
- asprintf(&dir_path_vfile, "%s/%s", dir_path, vfile);
-
- fp = fopen(dir_path_vfile, "w");
- if (fp == NULL)
- {
- puts("Status: 500 Failed trying to write\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Error writing %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
- return;
- }
-
- fwrite(pagetext, strlen(pagetext), sizeof(char), fp);
-
- fclose(fp);
-
- unlink(dir_path_file);
-
- if (link(dir_path_vfile,dir_path_file) != 0) GRSThttpError("403 Forbidden");
-
- if ((strlen(file) > 7) && (strcmp(&file[strlen(file) - 5], ".html") == 0))
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s\n\n", dir_uri, file);
- else printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file);
-}
-
-void create_acl(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- int fd;
- char *tmpgacl, *newgacl;
- GRSTgaclAcl *acl;
- FILE *fp;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError("403 Forbidden");
-
- asprintf(&tmpgacl, "%s/.tmp.XXXXXX", dir_path);
- asprintf(&newgacl, "%s/%s", dir_path, GRST_ACL_FILE);
-
- if (((acl = GRSTgaclAclLoadforFile(dir_path)) != NULL) &&
- ((fd = mkstemp(tmpgacl)) != -1) &&
- ((fp = fdopen(fd, "w+")) != NULL) &&
- GRSTgaclAclPrint(acl, fp) &&
- (fclose(fp) == 0) &&
- (rename(tmpgacl, newgacl) == 0))
- {
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file);
-
- free(tmpgacl);
- free(newgacl);
- return;
- }
-
- puts("Status: 500 Failed trying to create\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Error creating %s%s</title>\n", dir_uri,
- GRST_ACL_FILE);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-
- free(tmpgacl);
- free(newgacl);
-}
-
-void renameaction(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- int len;
- char *dir_path_file, *vfile, *dir_path_vfile,
- *dnlistsuri, *newfile, *dir_path_newfile;
- struct stat statbuf;
- FILE *fp;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasWrite(perm) || (strcmp(file, GRST_ACL_FILE) == 0))
- GRSThttpError("403 Forbidden");
-
- if (index(file, '/') != NULL) GRSThttpError("403 Forbidden");
-
- dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2);
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, file);
-
- if (stat(dir_path_file, &statbuf) != 0) GRSThttpError("404 Not Found");
-
- newfile = GRSThttpGetCGI("newfile");
-
- if ((strcmp(newfile, GRST_ACL_FILE) == 0) ||
- (strcmp(newfile, file) == 0)) GRSThttpError("403 Forbidden");
-
- dir_path_newfile = malloc(strlen(dir_path) + strlen(newfile) + 2);
- strcpy(dir_path_newfile, dir_path);
- strcat(dir_path_newfile, "/");
- strcat(dir_path_newfile, newfile);
-
- vfile = makevfilename(newfile, statbuf.st_size, dn);
- dir_path_vfile = malloc(strlen(dir_path) + strlen(vfile) + 2);
- strcpy(dir_path_vfile, dir_path);
- strcat(dir_path_vfile, "/");
- strcat(dir_path_vfile, vfile);
-
- unlink(dir_path_newfile); /* just in case */
-
- if ((link(dir_path_file, dir_path_vfile ) == 0) &&
- (link(dir_path_file, dir_path_newfile) == 0) &&
- (unlink(dir_path_file) == 0))
- {
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s\n\n", dir_uri);
- return;
- }
-
- puts("Status: 500 Failed trying to rename\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Error renaming %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-void newdirectory(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- int len;
- char *dir_path_file, *vfile, *dir_path_vfile, *filedup;
- FILE *fp;
- GRSThttpBody bp;
-
- if ((file[0] == '\0') ||
- !GRSTgaclPermHasWrite(perm) || (strcmp(file, GRST_ACL_FILE) == 0))
- GRSThttpError("403 Forbidden");
-
- filedup = strdup(file);
- if (filedup[strlen(filedup)-1] == '/') filedup[strlen(filedup)-1] = '\0';
- if (index(filedup, '/') != NULL) GRSThttpError("403 Forbidden");
-
- dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2);
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, file);
-
- if (mkdir(dir_path_file, 0751) == 0)
- {
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file);
- return;
- }
-
- puts("Status: 500 Failed trying to create\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Error create %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-void editdnlistaction(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- int numdn = 0, ifd, ofd, numdnlines = 0, i, found;
- char *dir_path_file, *dir_path_tmpfile, *realfile,
- *dnlistsuri, *server_name, *fulldiruri, *p, oneline[513],
- **dnlines, name[81], *add;
- FILE *ofp;
- struct stat statbuf;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden");
-
- dnlistsuri = getenv("GRST_DN_LISTS_URI");
- if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI");
-
- server_name = getenv("SERVER_NAME");
-
- if ((server_name == NULL) ||
- (dnlistsuri == NULL) ||
- (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) != 0))
- GRSThttpError("403 Forbidden");
-
- asprintf(&fulldiruri, "https://%s%s", server_name, dir_uri);
-
- if ((strncmp(fulldiruri, file, strlen(fulldiruri)) != 0) &&
- ((strncmp(fulldiruri, file, strlen(fulldiruri) - 1) != 0) ||
- (strlen(fulldiruri) - 1 != strlen(file))))
- {
- puts("Status: 403 Forbidden\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Error writing %s</title>\n", file);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
- return;
- }
-
- p = GRSThttpGetCGI("numdn");
- if ((p == NULL) || (sscanf(p, "%d", &numdn) != 1))
- GRSThttpError("500 No number of DNs");
-
- if (numdn > 0)
- {
- dnlines = malloc(sizeof(char *) * numdn);
-
- for (i=1; i <= numdn; ++i)
- {
- sprintf(name, "dn%d", i);
- p = GRSThttpGetCGI(name);
-
- if (*p != '\0')
- {
- dnlines[numdnlines] = p;
- ++numdnlines;
- }
- }
- }
-
- add = GRSThttpGetCGI("add");
-
- realfile = GRSThttpUrlEncode(file);
-
- dir_path_file = malloc(strlen(dir_path) + strlen(realfile) + 2);
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, realfile);
-
- dir_path_tmpfile = malloc(strlen(dir_path) + 13);
- strcpy(dir_path_tmpfile, dir_path);
- strcat(dir_path_tmpfile, "/.tmp.XXXXXX");
-
- if (((ofd = mkstemp(dir_path_tmpfile)) != -1) &&
- ((ofp = fdopen(ofd, "w")) != NULL))
- {
- if (*add != '\0')
- {
- fputs(add, ofp);
- fputc('\n', ofp);
- }
-
- for (i=0; i < numdnlines; ++i)
- {
- fputs(dnlines[i], ofp);
- fputc('\n', ofp);
- }
-
- if ((fclose(ofp) == 0) &&
- ((stat(dir_path_file, &statbuf) != 0) ||
- (unlink(dir_path_file) == 0)) &&
- (rename(dir_path_tmpfile, dir_path_file) == 0))
- {
- printf("Status: 302 Moved Temporarily\nContent-Length: 0\n"
- "Location: %s%s?cmd=managedir\n\n", dir_uri, admin_file);
- return;
- }
- }
-
- puts("Status: 500 Failed trying to write\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Error writing %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-
- /* try to clean up */
- if (stat(dir_path_tmpfile, &statbuf) == 0) unlink(dir_path_tmpfile);
-}
-
-void printfile(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- int c;
- char *dir_path_file;
- FILE *fp;
- struct stat statbuf;
-
- if (!GRSTgaclPermHasRead(perm)) GRSThttpError("403 Forbidden");
-
- if (index(file, '/') != NULL) GRSThttpError("403 Forbidden");
-
- dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2);
-
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, file);
-
- 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 (index(file, '/') != NULL) 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
- 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);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
- GRSThttpWriteOut(&bp);
-}
-
-void ziplist(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- char *shellcmd, *unzip, oneline[129];
- FILE *fp;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasRead(perm)) GRSThttpError("403 Forbidden");
-
- if (index(file, '/') != NULL) GRSThttpError("403 Forbidden");
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
- GRSThttpPrintf(&bp, "<title>Contents of %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
- 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);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
- GRSThttpWriteOut(&bp);
-}
-
-void unzipfile(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- char *shellcmd, *unzip, oneline[129];
- FILE *fp;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden");
-
- if (index(file, '/') != NULL) GRSThttpError("403 Forbidden");
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
- GRSThttpPrintf(&bp, "<title>Unzipping %s%s</title>\n", dir_uri, file);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
- 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);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
- GRSThttpWriteOut(&bp);
-}
-
-void editfileform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- int fd, rawpagesize, i, c;
- char *dir_path_file, *rawpage, *p;
- FILE *fp = NULL;
- struct stat statbuf;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasWrite(perm)) GRSThttpError("403 Forbidden");
-
- if (index(file, '/') != NULL) GRSThttpError("403 Forbidden");
-
- dir_path_file = malloc(strlen(dir_path) + strlen(file) + 2);
-
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, file);
-
- fd = open(dir_path_file, O_RDONLY);
- if (fd != -1)
- {
- fp = fdopen(fd, "r");
- if (fp == NULL) GRSThttpError("500 File open failed!");
-
- if ((fstat(fd, &statbuf) != 0) ||
- !S_ISREG(statbuf.st_mode)) GRSThttpError("500 Not a regular file!");
- }
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp, "<title>Edit file %s</title>\n", file);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
- GRSThttpWriteOut(&bp);
-}
-
-void editdnlistform(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *file, char *dir_uri, char *admin_file)
-{
- int fd, i, c, numdn = 0;
- char *dir_path_file, *rawpage, *p, *dnlistsuri, *server_name, *fulluri,
- *realfile, oneline[513];
- FILE *fp = NULL;
- struct stat statbuf;
- GRSThttpBody bp;
-
- dnlistsuri = getenv("GRST_DN_LISTS_URI");
- if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI");
-
- if (!GRSTgaclPermHasWrite(perm) ||
- (dnlistsuri == NULL) ||
- (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) != 0))
- GRSThttpError("403 Forbidden");
-
- realfile = GRSThttpUrlEncode(file);
-
- dir_path_file = malloc(strlen(dir_path) + strlen(realfile) + 2);
-
- strcpy(dir_path_file, dir_path);
- strcat(dir_path_file, "/");
- strcat(dir_path_file, realfile);
-
- fd = open(dir_path_file, O_RDONLY);
- if (fd != -1) /* we dont mind open failing, but it must work if it doesnt */
- {
- fp = fdopen(fd, "r");
- if (fp == NULL) GRSThttpError("500 File open failed!");
-
- if ((fstat(fd, &statbuf) != 0) ||
- !S_ISREG(statbuf.st_mode)) GRSThttpError("500 Not a regular file!");
- }
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp, "<title>Edit DN List %s</title>\n", file);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
- GRSThttpWriteOut(&bp);
-}
-
-void managedir(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *dir_uri, char *admin_file)
-{
- int n, is_dnlists_dir = 0, enclen, numfiles, encprefixlen;
- char *d_namepath, modified[99], *absaclpath, *editable, *p, *unzip,
- *dnlistsuri, *d_name, *server_name, *fulluri, *encfulluri,
- *encprefix, *dnlistsprefix;
- GRSThttpBody bp;
- struct tm mtime_tm;
- struct stat statbuf;
- struct dirent **namelist, *subdirfile_ent;
- DIR *subDIR;
-
- if (((!GRSTgaclPermHasWrite(perm)) &&
- (!GRSTgaclPermHasList(perm))) ||
- (stat(dir_path, &statbuf) != 0) || !S_ISDIR(statbuf.st_mode))
- GRSThttpError("403 Forbidden");
-
- editable = getenv("GRST_EDITABLE");
- if (editable == NULL) editable = getenv("REDIRECT_GRST_EDITABLE");
-
- unzip = getenv("GRST_UNZIP");
- if (unzip == NULL) unzip = getenv("REDIRECT_GRST_UNZIP");
-
- dnlistsuri = getenv("GRST_DN_LISTS_URI");
- if (dnlistsuri == NULL) dnlistsuri = getenv("REDIRECT_GRST_DN_LISTS_URI");
-
- if (dnlistsuri && (strncmp(dnlistsuri, dir_uri, strlen(dnlistsuri)) == 0))
- {
- is_dnlists_dir = 1;
- server_name = getenv("SERVER_NAME");
-
- asprintf(&fulluri, "https://%s%s", server_name, dir_uri);
- encfulluri = GRSThttpUrlEncode(fulluri);
- enclen = strlen(encfulluri);
-
- asprintf(&dnlistsprefix, "https://%s%s", server_name, dnlistsuri);
- encprefix = GRSThttpUrlEncode(dnlistsprefix);
- encprefixlen = strlen(encprefix);
- }
-
- printf("Status: 200 OK\nContent-Type: text/html\n");
-
- GRSThttpBodyInit(&bp);
-
- GRSThttpPrintf(&bp,"<title>Manage directory %s</title>\n", dir_uri);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- 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);
-
- if (!is_dnlists_dir)
- {
- 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);
- }
- else GRSThttpPrintf(&bp,
- "<tr><td>%s</td>"
- "<td align=right>%ld</td>%s\n",
- GRST_ACL_FILE,
- statbuf.st_size, modified);
-
- 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 if (is_dnlists_dir)
- {
- if ((strlen(namelist[n]->d_name) <= encprefixlen) ||
- (strncmp(namelist[n]->d_name, encprefix,
- encprefixlen) != 0)) continue;
-
- d_name = GRSThttpUrlDecode(namelist[n]->d_name);
-
- GRSThttpPrintf(&bp, "<tr><td><a href=\"%s\">%s</a></td>"
- "<td align=right>%ld</td>%s"
- "<td> </td>",
- d_name, d_name,
- statbuf.st_size, modified);
-
- if (GRSTgaclPermHasWrite(perm))
- GRSThttpPrintf(&bp, "<form action=\"%s%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",
- dir_uri, admin_file, d_name);
- else GRSThttpPrintf(&bp, "<td> </td>\n");
-
- if (GRSTgaclPermHasWrite(perm))
- GRSThttpPrintf(&bp, "<form action=\"%s%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",
- dir_uri, admin_file, d_name);
- else GRSThttpPrintf(&bp, "<td> </td>\n");
-
- GRSThttpPrintf(&bp, "<td> </td></tr>");
- }
- else /* regular directory, not DN Lists */
- {
- 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))
- {
- if (is_dnlists_dir)
- {
- GRSThttpPrintf(&bp, "<form method=post action=\"%s%s\">\n"
- "<tr><td colspan=4>New list name: "
- "<input type=text name=file value=\"%sNEW_LIST\" 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",
- dir_uri, admin_file, fulluri, strlen(fulluri)+8);
-
- GRSThttpPrintf(&bp, "<form method=post action=\"%s%s\">\n"
- "<tr><td colspan=4>New directory: "
- "<input type=text name=file>\n"
- "<td colspan=2 align=center><input type=submit name=button value=\"Create\"></td>\n"
- "<input type=hidden name=cmd value=edit></td></tr></form>\n",
- dir_uri, admin_file);
- }
- else
- {
- 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");
-
- if (!is_dnlists_dir) adminfooter(&bp, dn, help_uri, dir_uri, NULL);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
- GRSThttpWriteOut(&bp);
-}
-
+++ /dev/null
-/*
- Copyright (c) 2003-5, Shiv Kaushal, University of Manchester
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- o Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
- o Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*-----------------------------------------------------------*
-* This program is part of GridSite: http://www.gridsite.org/ *
-*------------------------------------------------------------*/
-
-#include <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, GRSTgaclNamevalue *namevalue, int cred_no, int entry_no, int admin, int timestamp, GRSThttpBody *bp, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file);
-void GRSTgaclCredTableEnd(GRSTgaclEntry* entry, int entry_no, int admin, int timestamp, GRSThttpBody *bp, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file);
-
-// ACL Manipulation functions
-int GACLentriesInAcl(GRSTgaclAcl *acl);
-int GRSTgaclCredsInEntry(GRSTgaclEntry *entry);
-void check_acl_save(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file, GRSTgaclUser* user, GRSTgaclAcl *acl, GRSThttpBody *bp);
-void GACLeditGetPerms(GRSTgaclEntry *entry);
-GRSTgaclEntry *GACLreturnEntry(GRSTgaclAcl *acl, int entry_no);
-GRSTgaclCred *GACLreturnCred(GRSTgaclEntry *entry, int cred_no);
-
-void StringHTMLEncode (char* string, GRSThttpBody *bp);
-
-void revert_acl(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file);
-
-/*****************************************/
-/********** FUNCTIONS FOLLOW *************/
-/*****************************************/
-
-void show_acl(int admin, GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Shows the contents of the ACL. Gives edit 'buttons' if (int admin) == 1
- GRSTgaclAcl *acl;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
- GRSTgaclNamevalue *namevalue;
- int entry_no, cred_no, allow, deny,timestamp;
- GRSThttpBody bp;
- char* AclFilename;
- struct stat file_info;
- int history_mode=0;
-
- if (admin==2){
- history_mode=1;
- admin=0;
- }
-
- /*double-check access permision*/
- if (!GRSTgaclPermHasAdmin(perm)) admin=0;
-
- StartHTML(&bp, dir_uri, dir_path);
-
- /* Load ACL from file and get timestamp*/
- if (history_mode==1) {
- AclFilename=malloc(strlen(dir_path)+strlen(file)+2);
- strcpy(AclFilename, dir_path);
- strcat(AclFilename, "/");
- strcat(AclFilename, file);
- }
- else AclFilename=GRSTgaclFileFindAclname(dir_path);
-
- if (AclFilename==NULL){
- GRSThttpPrintf ( &bp,"The ACL was not found !!!<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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
- 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){
- namevalue=cred->firstname;
- GRSTgaclCredTableAdd(user, entry, cred, namevalue, cred_no, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- // Change to next credential
- cred=cred->next;
- cred_no++;
- }
-
- GRSTgaclCredTableEnd (entry, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- // Change to next entry
- entry=entry->next;
- entry_no++;
- }
-
- if (!admin && GRSTgaclPermHasAdmin(perm) && !history_mode) //Print a link for admin mode, if not in admin mode but the user has admin permissions
- GRSThttpPrintf (&bp,"<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 && GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"), user)){
- 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);
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE); GRSThttpWriteOut(&bp); return;
-}
-
-
-void new_entry_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm,char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Presents the user with a form asking for details required to create a new entry
- GRSThttpBody bp;
- int timestamp=atol(GRSThttpGetCGI("timestamp"));
- GRSTgaclCred* cred;
- GRSTgaclEntry *entry;
- GRSTgaclNamevalue* namevalue;
-
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
- entry = GRSTgaclEntryNew();
- StartHTML(&bp, dir_uri, dir_path);
- StartForm(&bp, dir_uri, dir_path, admin_file, timestamp, "new_entry");
- GRSThttpPrintf (&bp, "<font size=\"4\"><b>NEW ENTRY IN ACL FOR %s </b></font></p>\n", dir_uri);
-
- GRSTgaclCredTableStart(&bp);
- GRSTgaclCredTableAdd(user, entry,cred, namevalue, 0, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- GRSTgaclCredTableEnd (entry, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
-
- /*Submit and reset buttons - submit button sends the data in the form back to the script & new_entry() to be called*/
- EndForm(&bp);
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp);
- return;
-}
-
-void new_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Processes the information entered into the form from new_entry_form() and adds a new entry to the ACL
- GRSTgaclAcl *acl;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
- char *type, *value;
- GRSThttpBody bp;
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- // Get new credential info and perform checks
- type=GRSThttpGetCGI("type");
- value=GRSThttpGetCGI("cred0_value");
-
- if (strcmp(type, "not_chosen")==0){
- GRSThttpError ("500 Invalid input - credential type not chosen");
- return;
- }
-
- // Create the credential
- cred=GRSTgaclCredNew(type);
- if (strcmp(type, "person")==0) GRSTgaclCredAddValue(cred,"dn", value);
- else if (strcmp(type, "dn-list")==0) GRSTgaclCredAddValue(cred, "url", value);
- else if (strcmp(type, "voms")==0) GRSTgaclCredAddValue(cred, "fqan", value);
- else if (strcmp(type, "dns")==0) GRSTgaclCredAddValue(cred, "hostname", value);
- else if (strcmp(type, "any-user")==0) {} // namevalue not entered for any-user credential
- else{
- GRSThttpError ("500 Invalid input - credential type not valid");
- return;
- }
-
- // Create and empty entry, add the credential and get permissions
- entry = GRSTgaclEntryNew();
- GRSTgaclEntryAddCred(entry, cred);
- GACLeditGetPerms(entry);
-
- // Load the ACL, add the entry and save
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));
- GRSTgaclAclAddEntry(acl, entry);
- check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp);
- return;
-}
-
-void del_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Deletes the entry denoted by the GCI variable "entry_no"*/
- int entry_no;
- GRSTgaclAcl *acl;
- GRSTgaclEntry *previous, *entry;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- // Load the ACL
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));
-
- // Get the number of the entry to be deleted and check okay to delete
- entry_no=atol(GRSThttpGetCGI("entry_no"));
- if(GACLentriesInAcl(acl)<=1){
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "ERROR: Cannot delete all entries from the ACL<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;
- GRSTgaclNamevalue *namevalue;
- // struct _GACLnamevalue *namevalue;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- // Load ACL from file
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));
-
- // Get pointer to the entry and check okay
- entry_no=atol(GRSThttpGetCGI("entry_no"));
- entry = GACLreturnEntry(acl, entry_no);
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "<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
- namevalue=cred->firstname;
- GRSTgaclCredTableAdd(user, entry, cred, namevalue, cred_no, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- // Change to next credential
- cred=cred->next;
- cred_no++;
- }
- GRSTgaclCredTableEnd (entry, entry_no, admin, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- EndForm(&bp);
-
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp);
- return;
-}
-
-
-void edit_entry(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- //Processes the information entered into the form from edit_entry_form() and updates the entry corresponding to entry_no*/
- int entry_no, cred_no, i;
- GRSTgaclAcl *acl;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
- GRSTgaclNamevalue *namevalue;
- char variable[30];
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- // Load the ACL
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));
-
- // Get pointer to the entry and perform checks
- entry_no=atol(GRSThttpGetCGI("entry_no"));
- entry = GACLreturnEntry(acl, entry_no);
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- // Start with the first credential and update each one
- cred=entry->firstcred;
- cred_no=1;
-
- while (cred!=NULL){
- if (strcmp(cred->type, "any-user")!=0){
- namevalue=cred->firstname;
- sprintf(variable, "cred%d_value", cred_no);
- namevalue->value=GRSThttpGetCGI(variable);
- }
- //Change to next credential*/
- cred=cred->next;
- cred_no++;
- }
-
- // Update permissions
- GACLeditGetPerms(entry);
- check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp);
- return;
-}
-
-
-void add_cred_form(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Presents the user with a form asking for details required to create a new credential in the entry denoted by entry_no
- GRSThttpBody bp;
- int timestamp=atol(GRSThttpGetCGI("timestamp")), entry_no=atol(GRSThttpGetCGI("entry_no"));
- GRSTgaclAcl *acl;
- GRSTgaclEntry* entry;
- GRSTgaclCred* cred;
- GRSTgaclNamevalue* namevalue;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path)); // Load the ACL
-
- //Get pointer to the entry and perform checks
- entry = GACLreturnEntry(acl, entry_no);
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
-
- if (strcmp(GRSThttpGetCGI("cmd"), "add_cred_form")==0){ //if not a new entry check to see if <any-user> cred exists
- cred=entry->firstcred;
- while (cred!=NULL) {
- if (strcmp (cred->type, "any-user")==0) {
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "ERROR: AND-ing \"any-user\" credential with other credential does not make sense <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, namevalue, 0, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- GRSTgaclCredTableEnd (entry, 0, 0, timestamp, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
-
- EndForm(&bp);
- admin_continue(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, &bp);
- return;
-}
-
-
-void add_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Processes the information entered into the form [add_cred_form()]and adds a new credential to the entry corresponding to entry_no
- int entry_no;
- GRSTgaclAcl *acl;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
- GRSThttpBody bp;
- char *type, *value;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));// Load the ACL
-
- // Get pointer to the entry and perform checks
- entry_no=atol(GRSThttpGetCGI("entry_no"));
- entry = GACLreturnEntry(acl, entry_no);
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl)){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- // Create new credential and add it to entry
- type=GRSThttpGetCGI("type");
- value=GRSThttpGetCGI("cred0_value");
- cred=GRSTgaclCredNew(type);
- if (strcmp(type, "person") ==0) GRSTgaclCredAddValue(cred,"dn", value);
- else if (strcmp(type, "dn-list") ==0) GRSTgaclCredAddValue(cred, "url", value);
- else if (strcmp(type, "voms") ==0) GRSTgaclCredAddValue(cred, "fqan", value);
- else if (strcmp(type, "dns") ==0) GRSTgaclCredAddValue(cred, "hostname", value);
- else if (strcmp(type, "any-user")==0) {}// namevalue not entered for any-user credential
- else{
- GRSThttpError ("500 Credential type not valid");
- return;
- }
- GRSTgaclEntryAddCred(entry, cred);
-
- check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp);
- return;
-}
-
-
-void del_cred(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Deletes the credential denoted by the GCI variable "cred_no", in the entry denoted by "entry_no"
- int entry_no, cred_no;
- GRSTgaclAcl *acl;
- GRSTgaclEntry *entry;
- GRSTgaclCred *previous, *cred;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));
-
- // Get pointer to the entry and perform checks
- entry_no=atol(GRSThttpGetCGI("entry_no"));
- entry = GACLreturnEntry(acl, entry_no);
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
- // Get pointer the the credential and perform checks
- cred_no=atol(GRSThttpGetCGI("cred_no"));
- cred=GACLreturnCred(entry, cred_no);
- if(entry==NULL || entry_no<1 || cred_no>GRSTgaclCredsInEntry(entry)){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
- // Get pointer to previous credential - if needed
- if (cred_no!=1) previous = GACLreturnCred(entry, cred_no-1);
-
- // Perform deletion from the list by changing pointers
- if (cred_no==1) entry->firstcred=cred->next;
- else if (cred_no==GRSTgaclCredsInEntry(entry)) previous->next=NULL;
- else previous->next=cred->next;
-
- check_acl_save(dn, perm, help_uri, dir_path, file, dir_uri, admin_file, user, acl, &bp);
- return;
-}
-
-void admin_continue(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file, GRSThttpBody *bp){
- // Single line printed out to forward users back to show_acl in admin mode
- // Should ALWAYS called from another function so no HTML header required
- // Should ALWAYS be the end of a page
- GRSThttpPrintf (bp, "\n<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);
- GRSThttpPrintHeaderFooter(bp, dir_path, GRST_FOOTFILE);
- GRSThttpWriteOut(bp);
- return;
-}
-
-
-void del_entry_sure(GRSTgaclUser *user, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Prints out entry denoted by entry_no and asks if the user really wants to delete it
- GRSTgaclAcl *acl;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
- GRSTgaclNamevalue *namevalue;
- int entry_no, cred_no, allow, deny, i, timestamp;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));// Load ACL from file
-
- if (acl==NULL){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- // Get pointer to the entry and check okay
- entry_no=atol(GRSThttpGetCGI("entry_no"));
- entry = GACLreturnEntry(acl, entry_no);
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "<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
- namevalue=cred->firstname;
- GRSTgaclCredTableAdd(user, entry, cred, namevalue, cred_no, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- // Change to next credential
- cred=cred->next;
- cred_no++;
- }
-
- GRSTgaclCredTableEnd (entry, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
-
- StartForm(&bp, dir_uri, dir_path, admin_file, atol(GRSThttpGetCGI("timestamp")), "del_entry");
- GRSThttpPrintf (&bp, "<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;
- GRSTgaclNamevalue *namevalue;
- int entry_no, cred_no, allow, deny, timestamp, i;
- GRSThttpBody bp;
-
- if (!GRSTgaclPermHasAdmin(perm)) GRSThttpError ("403 Forbidden");
-
- acl = GRSTgaclAclLoadFile(GRSTgaclFileFindAclname(dir_path));// Load ACL from file
-
- if (acl==NULL){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- // Get pointer to the entry and check okay
- entry_no=atol(GRSThttpGetCGI("entry_no"));
- entry = GACLreturnEntry(acl, entry_no);
- if(entry==NULL || entry_no<1 || entry_no>GACLentriesInAcl(acl) ){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- // Get pointer to the credential and check okay
- cred_no=atol(GRSThttpGetCGI("cred_no"));
- cred=GACLreturnCred(entry, cred_no);
- if(entry==NULL || entry_no<1 || cred_no>GRSTgaclCredsInEntry(entry)){
- GRSThttpError ("500 Unable to read from ACL file");
- return;
- }
-
- if(GRSTgaclCredsInEntry(entry)<=1){
- del_entry_sure(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- return;
- }
-
- StartHTML(&bp, dir_uri, dir_path);
- GRSThttpPrintf (&bp, "<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->firstname, cred_no, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- GRSTgaclCredTableEnd (entry, entry_no, 0, 0, &bp, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- GRSThttpPrintf (&bp,"<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);
- GRSThttpPrintHeaderFooter(bp, dir_path, GRST_HEADFILE);
- return;
-}
-void StartForm(GRSThttpBody *bp, char* dir_uri, char* dir_path, char* admin_file, int timestamp, char* target_function){
- // Starts an HTML form with gridsite admin as the target and target_function as the value of cmd.
- // Also inputs the dir_uri and the timestamp
- GRSThttpPrintf (bp, "<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=\"10%\"><b>Credential No.</td><td align=center width=\"15%\"><b>Type</td><td align=left width=\"75%\"><b>Value</td></tr>");
- return;
-}
-
-void GRSTgaclCredTableAdd(GRSTgaclUser *user, GRSTgaclEntry *entry, GRSTgaclCred *cred, GRSTgaclNamevalue *namevalue, int cred_no, int entry_no, int admin, int timestamp, GRSThttpBody *bp, char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path, char *file, char *dir_uri, char *admin_file){
- // Adds the credential "cred" to a table started byGRSTgaclCredTableStart allowing the user to edit if appropriate
- char* cmd = GRSThttpGetCGI("cmd");
- int edit_values=0, new_cred=0, allow_new_person=1;
- int site_admin=GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"), user);
-
- if (strcmp(cmd, "new_entry_form")==0 || strcmp(cmd, "add_cred_form")==0) new_cred=1;
- if (new_cred || strcmp(cmd, "edit_entry_form")==0) edit_values=1;
-
- if (new_cred) { /*Print out type and descriptor*/
- if (strcmp(cmd, "add_cred_form")==0){ /*if not a new entry check to see if <person> cred exists.*/
- cred=entry->firstcred;
- while (cred!=NULL) {if (strcmp (cred->type, "person")==0) allow_new_person=0; cred=cred->next;}
- }
- //create dummy credential for the user to edit
- cred=GRSTgaclCredNew("new");
- GRSTgaclCredAddValue(cred, "", "");
- namevalue=cred->firstname;
- //Drop down list of types
- GRSThttpPrintf(bp,"<tr><td align=center >New</td>");
- GRSThttpPrintf(bp,"<td align=center >");
- GRSThttpPrintf (bp, " <select size=\"1\" name=\"type\">\n");
- GRSThttpPrintf (bp, " <option selected value=\"not_chosen\">(choose)</option>\n");
- if (allow_new_person) GRSThttpPrintf (bp, " <option value=\"person\">Person <dn> </dn></option>\n");
- GRSThttpPrintf (bp, " <option value=\"dn-list\">DN-List <url> </url></option>\n");
- GRSThttpPrintf (bp, " <option value=\"dns\">DNS <hostname> </hostname></option>\n");
- GRSThttpPrintf (bp, " <option value=\"voms\">VOMS <fqan> </fqan></option>\n");
- // Only alow any-user credential to be chosen if it is new entry
- if (strcmp(cmd, "new_entry_form")==0) GRSThttpPrintf (bp, " <option value=\"any-user\">Any User</option>\n");
- GRSThttpPrintf (bp, " </select></td>");
- }
-
- 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><td align=center >%s ", cred->type);
- }
-
- if (strcmp(cred->type, "any-user")==0) GRSThttpPrintf (bp, "</td><td> "); /* Do not print out namevalue for any-user credential*/
- else{
- if (edit_values){ // Place namevalue in an editable box if appropriate
- GRSThttpPrintf (bp, "<td align=left><input type=\"text\" name=\"cred%d_value\"\n", cred_no);
- GRSThttpPrintf (bp, "size=\"50\" value=\"");
- StringHTMLEncode(namevalue->value, bp);
- GRSThttpPrintf (bp, "\">");
- }
- else if (strcmp(cred->type, "dn-list")==0){
- GRSThttpPrintf(bp, "<td align=left ><a href=\"");
- StringHTMLEncode(namevalue->value, bp);
- GRSThttpPrintf(bp, " \">");
- StringHTMLEncode(namevalue->value, bp);
- GRSThttpPrintf(bp, "</a>");
- }
- else { GRSThttpPrintf(bp, "<td align=left> "); StringHTMLEncode(namevalue->value, bp);}
-
- }
- //Print out warning symbol if cred being printed relates to current user - but NOT for users in site admin list
- if (GRSTgaclUserHasCred(user, cred) && !site_admin) GRSThttpPrintf(bp, "<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> </td><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 (!GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"), user))
- {
- new_perm = GRSTgaclAclTestUser(acl, user);
- if (new_perm != perm){
- StartHTML(bp, dir_uri, dir_path);
- if (!GRSTgaclPermHasAdmin(new_perm)){//Check that user still has Admin permissions - if not then exit without saving the new ACL
- GRSThttpPrintf (bp, "ERROR: CANNOT SAVE CHANGES\n\n<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);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_HEADFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-void justfooter(char *dn, GRSTgaclPerm perm, char *help_uri, char *dir_path,
- char *dir_uri, char *admin_file)
-{
- GRSThttpBody bp;
-
- puts("Status: 200 OK\nContent-Type: text/html");
-
- GRSThttpBodyInit(&bp);
-
- if (GRSTgaclPermHasList(perm) || GRSTgaclPermHasWrite(perm)
- || GRSTgaclPermHasAdmin(perm))
- adminfooter(&bp, dn, help_uri, dir_uri, admin_file);
-
- GRSThttpPrintHeaderFooter(&bp, dir_path, GRST_FOOTFILE);
-
- GRSThttpWriteOut(&bp);
-}
-
-int main()
-{
- int i, gsiproxylimit_i = 1;
- char *cmd, *dir_uri, *file, *dir_path, *admin_file, *dn = NULL,
- *help_uri, *p, *content_type, *request_uri, *button,
- *grst_cred_0, *gsiproxylimit, *dn_lists, buf[12];
- GRSTgaclCred *cred;
- GRSTgaclUser *user = NULL;
- GRSTgaclAcl *acl;
- GRSTgaclPerm perm = GRST_PERM_NONE;
-
- help_uri = getenv("REDIRECT_GRST_HELP_URI"); /* can be NULL */
- admin_file = getenv("REDIRECT_GRST_ADMIN_FILE");
- dir_path = getenv("REDIRECT_GRST_DIR_PATH");
- request_uri = getenv("REQUEST_URI");
-
- if ((dir_path == NULL) || (admin_file == NULL) || (request_uri == NULL))
- {
- puts("Status: 500 Internal Server Error\nContent-type: text/plain\n\n"
- "REDIRECT_GRST_DIR_PATH or REDIRECT_GRST_ADMIN_FILE "
- "or REQUEST_URI missing");
- return;
- }
-
- GRSTgaclInit();
-
- grst_cred_0 = getenv("GRST_CRED_0");
-
- if ((grst_cred_0 != NULL) && (cred = GRSTx509CompactToCred(grst_cred_0)))
- {
- gsiproxylimit = getenv("REDIRECT_GRST_GSIPROXY_LIMIT");
- if (gsiproxylimit != NULL) sscanf(gsiproxylimit, "%d", &gsiproxylimit_i);
-
- if (GRSTgaclCredGetDelegation(cred) <= gsiproxylimit_i)
- {
- user = GRSTgaclUserNew(cred);
-
- if ((p = index(grst_cred_0, ' ')) &&
- (p = index(++p, ' ')) &&
- (p = index(++p, ' ')) &&
- (p = index(++p, ' '))) dn = &p[1];
- }
- /* User has a cert so check for voms attributes */
- for(i=1; ; i++)
- {
- sprintf (buf, "GRST_CRED_%d", i);
-
-
- grst_cred_0 = getenv(buf);
- if (grst_cred_0==NULL) break;
-
- if (cred=GRSTx509CompactToCred(grst_cred_0))
- GRSTgaclUserAddCred(user, cred);
- }
- /* no more voms attributes found found */
- }
- else if ((dn = getenv("SSL_CLIENT_S_DN")) != NULL)
- {
- cred = GRSTgaclCredNew("person");
- GRSTgaclCredAddValue(cred, "dn", dn);
- user = GRSTgaclUserNew(cred);
- }
-
- dn_lists = getenv("REDIRECT_GRST_DN_LISTS");
- if (dn_lists == NULL) dn_lists = getenv("GRST_DN_LISTS");
- if (dn_lists != NULL) GRSTgaclUserSetDNlists(user, dn_lists);
-
- if (GRSTgaclDNlistHasUser(getenv("REDIRECT_GRST_ADMIN_LIST"),
- user)) perm = GRST_PERM_ALL;
- else
- {
- p = getenv("REMOTE_HOST");
- if (p != NULL)
- {
- cred = GRSTgaclCredNew("dns");
- GRSTgaclCredAddValue(cred, "hostname", p);
-
- if (user == NULL) user = GRSTgaclUserNew(cred);
- else GRSTgaclUserAddCred(user, cred);
- }
-
- acl = GRSTgaclAclLoadforFile(dir_path);
- if (acl != NULL) perm = GRSTgaclAclTestUser(acl, user);
- }
-
- /* we're relying on being a CGI with all this un-free()ed strdup()ing */
-
- dir_uri = strdup(request_uri);
- p = rindex(dir_uri, '?');
- if (p != NULL) *p = '\0';
- p = rindex(dir_uri, '/');
- if (p != NULL) p[1] = '\0';
-
- content_type = getenv("CONTENT_TYPE");
-
- if ((content_type != NULL) &&
- (GRSTstrCmpShort(content_type, "multipart/form-data; boundary=") == 0))
- {
- uploadfile(dn, perm, help_uri, dir_path, dir_uri, admin_file);
- return 0;
- }
-
- cmd = GRSThttpGetCGI("cmd");
- file = GRSThttpGetCGI("file");
- button = GRSThttpGetCGI("button");
-
- /* file and directory functions in grst_admin_file.c */
-
- if (strcmp(cmd, "header") == 0)
- justheader(dn, perm, help_uri, dir_path, dir_uri, admin_file);
- else if (strcmp(cmd, "footer") == 0)
- justfooter(dn, perm, help_uri, dir_path, dir_uri, admin_file);
- else if (strcmp(cmd, "managedir") == 0)
- managedir(dn, perm, help_uri, dir_path, dir_uri, admin_file);
- else if (strcmp(cmd, "print") == 0)
- printfile(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "history") == 0)
- filehistory(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "editdnlist") == 0)
- editdnlistform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "edit") == 0)
- {
- if ((strcasecmp(button, "new directory") == 0) ||
- (strcasecmp(button, "Create") == 0))
- newdirectory(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else
- editfileform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- }
- else if (strcmp(cmd, "editaction") == 0)
- editfileaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "editdnlistaction") == 0)
- editdnlistaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "delete") == 0)
- deletefileform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "deleteaction") == 0)
- deletefileaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "rename") == 0)
- renameform(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "renameaction") == 0)
- renameaction(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "ziplist") == 0)
- ziplist(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "unzipfile") == 0)
- unzipfile(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "create_acl") == 0)
- create_acl(dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
-
- /* GACL functions in grst_admin_gacl.c */
-
- else if (strcmp(cmd, "show_acl") == 0)
- show_acl(0, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "admin_acl") == 0)
- show_acl(1, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "acl_history") == 0)
- show_acl(2, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd, "revert_acl") == 0)
- revert_acl(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- //show_acl(2, user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"new_entry_form")==0)
- new_entry_form(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"new_entry")==0)
- new_entry(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"del_entry_sure")==0)
- del_entry_sure(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"del_entry")==0)
- del_entry(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"edit_entry_form")==0)
- edit_entry_form(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"edit_entry")==0)
- edit_entry(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"add_cred_form")==0)
- add_cred_form(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"add_cred")==0)
- add_cred(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"del_cred_sure")==0)
- del_cred_sure(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
- else if (strcmp(cmd,"del_cred")==0)
- del_cred(user, dn, perm, help_uri, dir_path, file, dir_uri, admin_file);
-
- /* you what? */
-
- else GRSThttpError("500 Internal Server Error");
-}
+++ /dev/null
-
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <string.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 "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 <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"
-
-/* *
- * Global variables, shared by all GACL functions but private to libgacl *
- * */
-
-char *grst_perm_syms[] = { "none",
- "read",
- "exec",
- "list",
- "write",
- "admin",
- NULL };
-
-GRSTgaclPerm grst_perm_vals[] = { GRST_PERM_NONE,
- GRST_PERM_READ,
- GRST_PERM_EXEC,
- GRST_PERM_LIST,
- GRST_PERM_WRITE,
- GRST_PERM_ADMIN,
- -1 };
-
-int GRSTgaclInit(void)
-{
- xmlInitParser();
-
- LIBXML_TEST_VERSION
-
- xmlKeepBlanksDefault(0);
-
- return 1;
-}
-
-/* declare these two private functions at the start */
-
-GRSTgaclAcl *GRSTgaclAclParse(xmlDocPtr, xmlNodePtr, GRSTgaclAcl *);
-GRSTgaclAcl *GRSTxacmlAclParse(xmlDocPtr, xmlNodePtr, GRSTgaclAcl *);
-
-/* *
- * Functions to manipulate GRSTgaclCred structures *
- * */
-
-GRSTgaclCred *GRSTgaclCredNew(char *type)
-/*
- GRSTgaclCredNew - allocate a new GRSTgaclCred structure, and return
- it's pointer or NULL on (malloc) error.
-*/
-{
- GRSTgaclCred *newcred;
-
- if (type == NULL) return NULL;
-
- newcred = malloc(sizeof(GRSTgaclCred));
- if (newcred == NULL) return NULL;
-
- newcred->type = strdup(type);
- newcred->delegation = 0;
- newcred->firstname = NULL;
- newcred->next = NULL;
-
- return newcred;
-}
-
-int GRSTgaclCredAddValue(GRSTgaclCred *cred, char *rawname, char *rawvalue)
-/*
- GRSTgaclCredAddValue - add a name/value pair to a GRSTgaclCred
-*/
-{
- int i;
- char *name, *value;
- GRSTgaclNamevalue *p;
-
- name = strdup(rawname);
-
- /* no leading or trailing space in value */
-
- value = rawvalue;
- while ((*value != '\0') && isspace(*value)) ++value;
-
- value = strdup(value);
-
- for (i=strlen(value) - 1; (i >= 0) && isspace(value[i]); --i) value[i]='\0';
-
- if (cred->firstname == NULL)
- {
- cred->firstname = malloc(sizeof (GRSTgaclNamevalue));
- (cred->firstname)->name = name;
- (cred->firstname)->value = value;
- (cred->firstname)->next = NULL;
- }
- else
- {
- p = cred->firstname;
-
- while (p->next != NULL) p = (GRSTgaclNamevalue *) p->next;
-
- p->next = malloc(sizeof(GRSTgaclNamevalue));
- ((GRSTgaclNamevalue *) p->next)->name = name;
- ((GRSTgaclNamevalue *) p->next)->value = value;
- ((GRSTgaclNamevalue *) p->next)->next = NULL;
- }
-
- return 1;
-}
-
-static int GRSTgaclNamevalueFree(GRSTgaclNamevalue *p)
-{
- if (p == NULL) return 1;
-
- if (p->next != NULL)
- GRSTgaclNamevalueFree((GRSTgaclNamevalue *) p->next);
- if (p->name != NULL) free(p->name);
- if (p->value != NULL) free(p->value);
- free(p);
-
- return 1;
-}
-
-int GRSTgaclCredFree(GRSTgaclCred *cred)
-/*
- GRSTgaclCredFree - free memory structures of a GRSTgaclCred,
- returning 1 always!
-*/
-{
- if (cred == NULL) return 1;
-
- GRSTgaclNamevalueFree(cred->firstname);
- if (cred->type != NULL) free(cred->type);
- free(cred);
-
- return 1;
-}
-
-static int GRSTgaclCredsFree(GRSTgaclCred *firstcred)
-/*
- GRSTgaclCredsFree - free a cred and all the creds in its *next chain
-*/
-{
- if (firstcred == NULL) return 0;
-
- if (firstcred->next != NULL) GRSTgaclCredsFree(firstcred->next);
-
- return GRSTgaclCredFree(firstcred);
-}
-
-static int GRSTgaclCredInsert(GRSTgaclCred *firstcred, GRSTgaclCred *newcred)
-/*
- GRSTgaclCredInsert - insert a cred in the *next chain of firstcred
-
- FOR THE MOMENT THIS JUST APPENDS!
-*/
-{
- if (firstcred == NULL) return 0;
-
- if (firstcred->next == NULL)
- {
- firstcred->next = newcred;
- return 1;
- }
-
- return GRSTgaclCredInsert(firstcred->next, newcred);
-}
-
-int GRSTgaclEntryAddCred(GRSTgaclEntry *entry, GRSTgaclCred *cred)
-/*
- GRSTaddCred - add a new credential to an existing entry, returning 1
- on success or 0 on error
-*/
-{
- if (entry == NULL) return 0;
-
- if (entry->firstcred == NULL)
- {
- entry->firstcred = cred;
- return 1;
- }
- else return GRSTgaclCredInsert(entry->firstcred, cred);
-}
-
-static int GRSTgaclCredRemoveCred(GRSTgaclCred *firstcred, GRSTgaclCred *oldcred)
-/*
- (Private)
-
- GRSTgaclCredRemoveCred - remove a cred in the *next chain of firstcred
- and relink the chain
-*/
-{
- if (firstcred == NULL) return 0;
-
-// yeah, I know
-}
-
-int GRSTgaclEntryDelCred(GRSTgaclEntry *entry, GRSTgaclCred *cred)
-/*
- GRSTgaclEntryDelCred - remove a new cred from an entry, returning 1
- on success (or absense) or 0 on error.
-*/
-{
- if (entry == NULL) return 0;
-
- return GRSTgaclCredRemoveCred(entry->firstcred, cred);
-}
-
-int GRSTgaclCredPrint(GRSTgaclCred *cred, FILE *fp)
-/*
- GRSTgaclCredPrint - print a credential and any name-value pairs is contains
-*/
-{
- char *q;
- GRSTgaclNamevalue *p;
-
- if (cred->firstname != NULL)
- {
- fprintf(fp, "<%s>\n", cred->type);
-
- p = cred->firstname;
-
- do {
- fprintf(fp, "<%s>", p->name);
-
- for (q=p->value; *q != '\0'; ++q)
- if (*q == '<') fputs("<", fp);
- else if (*q == '>') fputs(">", fp);
- else if (*q == '&') fputs("&" , fp);
- else if (*q == '\'') fputs("'", fp);
- else if (*q == '"') fputs(""", fp);
- else fputc(*q, fp);
-
- fprintf(fp, "</%s>\n", p->name);
-
- p = (GRSTgaclNamevalue *) p->next;
-
- } while (p != NULL);
-
- fprintf(fp, "</%s>\n", cred->type);
- }
- else fprintf(fp, "<%s/>\n", cred->type);
-
- return 1;
-}
-
-/* *
- * Functions to manipulate GRSTgaclEntry structures *
- * */
-
-GRSTgaclEntry *GRSTgaclEntryNew(void)
-/*
- GRSTgaclEntryNew - allocate space for a new entry, returning its pointer
- or NULL on failure.
-*/
-{
- GRSTgaclEntry *newentry;
-
- newentry = (GRSTgaclEntry *) malloc(sizeof(GRSTgaclEntry));
- if (newentry == NULL) return NULL;
-
- newentry->firstcred = NULL;
- newentry->allowed = 0;
- newentry->denied = 0;
- newentry->next = NULL;
-
- return newentry;
-}
-
-int GRSTgaclEntryFree(GRSTgaclEntry *entry)
-/*
- GRSTgaclEntryFree - free up space used by an entry (always returns 1)
-*/
-{
- int i;
-
- if (entry == NULL) return 1;
-
- GRSTgaclCredsFree(entry->firstcred);
-
- free(entry);
-
- return 1;
-}
-
-static int GRSTgaclEntriesFree(GRSTgaclEntry *entry)
-/*
- GRSTgaclEntriesFree - free up entry and all entries linked to in its *next
- chain
-*/
-{
- if (entry == NULL) return 0;
-
- if (entry->next != NULL) GRSTgaclEntriesFree(entry->next);
-
- return GRSTgaclEntryFree(entry);
-}
-
-static int GRSTgaclEntryInsert(GRSTgaclEntry *firstentry, GRSTgaclEntry *newentry)
-/*
- GRSTgaclEntryInsert - insert an entry in the *next chain of firstentry
-
- FOR THE MOMENT THIS JUST APPENDS
-*/
-{
- if (firstentry == NULL) return 0;
-
- if (firstentry->next == NULL)
- {
- firstentry->next = newentry;
- return 1;
- }
-
- return GRSTgaclEntryInsert(firstentry->next, newentry);
-}
-
-int GRSTgaclAclAddEntry(GRSTgaclAcl *acl, GRSTgaclEntry *entry)
-/*
- GRSTgaclAclAddEntry - add a new entry to an existing acl, returning 1
- on success or 0 on error
-*/
-{
- if (acl == NULL) return 0;
-
- if (acl->firstentry == NULL)
- {
- acl->firstentry = entry;
- return 1;
- }
- else return GRSTgaclEntryInsert(acl->firstentry, entry);
-}
-
-int GRSTgaclEntryPrint(GRSTgaclEntry *entry, FILE *fp)
-{
- GRSTgaclCred *cred;
- GRSTgaclPerm i;
-
- fputs("<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.0.1\">\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;
-
- cred = GRSTgaclCredNew((char *) cur->name);
-
- cred->firstname = NULL;
- cred->next = NULL;
-
- for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next)
- {
- if (!xmlIsBlankNode(cur2))
- GRSTgaclCredAddValue(cred, (char *) cur2->name,
- (char *) xmlNodeGetContent(cur2));
- }
-
- return cred;
-}
-
-static GRSTgaclEntry *GRSTgaclEntryParse(xmlNodePtr cur)
-/*
- GRSTgaclEntryParse - parse an entry stored in the libxml structure cur,
- returning it as a pointer or NULL on error.
-*/
-{
- int i;
- xmlNodePtr cur2;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
- GRSTgaclPerm perm;
-
- if (xmlStrcmp(cur->name, (const xmlChar *) "entry") != 0) return NULL;
-
- cur = cur->xmlChildrenNode;
-
- entry = GRSTgaclEntryNew();
-
- while (cur != NULL)
- {
- if (xmlIsBlankNode(cur))
- {
- cur=cur->next;
- continue;
- }
- else if (xmlStrcmp(cur->name, (const xmlChar *) "allow") == 0)
- {
- for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next)
- if (!xmlIsBlankNode(cur2))
- {
- for (i=0; grst_perm_syms[i] != NULL; ++i)
- if (xmlStrcmp(cur2->name,
- (const xmlChar *) grst_perm_syms[i]) == 0)
- GRSTgaclEntryAllowPerm(entry, grst_perm_vals[i]);
- }
- }
- else if (xmlStrcmp(cur->name, (const xmlChar *) "deny") == 0)
- {
- for (cur2 = cur->xmlChildrenNode; cur2 != NULL; cur2=cur2->next)
- if (!xmlIsBlankNode(cur2))
- {
- for (i=0; grst_perm_syms[i] != NULL; ++i)
- if (xmlStrcmp(cur2->name,
- (const xmlChar *) grst_perm_syms[i]) == 0)
- GRSTgaclEntryDenyPerm(entry, grst_perm_vals[i]);
- }
- }
- else if ((cred = GRSTgaclCredParse(cur)) != NULL)
- {
- if (!GRSTgaclEntryAddCred(entry, cred))
- {
- GRSTgaclCredFree(cred);
- GRSTgaclEntryFree(entry);
- return NULL;
- }
- }
- else /* I cannot parse this - give up rather than get it wrong */
- {
- GRSTgaclEntryFree(entry);
- return NULL;
- }
-
- cur=cur->next;
- }
-
- return entry;
-}
-
-GRSTgaclAcl *GRSTgaclAclLoadFile(char *filename)
-{
- xmlDocPtr doc;
- xmlNodePtr cur;
- GRSTgaclAcl *acl;
-
- GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile() starting");
-
- if (filename == NULL)
- {
- GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile() cannot open a NULL filename");
- return NULL;
- }
-
- doc = xmlParseFile(filename);
- if (doc == NULL)
- {
- GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile failed to open ACL file %s", filename);
- return NULL;
- }
-
- cur = xmlDocGetRootElement(doc);
- if (cur == NULL)
- {
- xmlFreeDoc(doc);
- GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile failed to parse root of ACL file %s", filename);
- return NULL;
- }
-
- if (!xmlStrcmp(cur->name, (const xmlChar *) "Policy"))
- {
- GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile parsing XACML");
- acl=GRSTxacmlAclParse(doc, cur, acl);
- }
- else if (!xmlStrcmp(cur->name, (const xmlChar *) "gacl"))
- {
- GRSTerrorLog(GRST_LOG_DEBUG, "GRSTgaclAclLoadFile parsing GACL");
- acl=GRSTgaclAclParse(doc, cur, acl);
- }
- else /* ACL format not recognised */
- {
- xmlFreeDoc(doc);
- return NULL;
- }
-
- xmlFreeDoc(doc);
- return acl;
-}
-
-GRSTgaclAcl *GRSTgaclAclParse(xmlDocPtr doc, xmlNodePtr cur, GRSTgaclAcl *acl)
-{
- GRSTgaclEntry *entry;
-
- cur = cur->xmlChildrenNode;
-
- acl = GRSTgaclAclNew();
-
- while (cur != NULL)
- {
- if (!xmlIsBlankNode(cur))
- {
- entry = GRSTgaclEntryParse(cur);
- if (entry == NULL)
- {
- GRSTgaclAclFree(acl);
-
- return NULL;
- }
-
- GRSTgaclAclAddEntry(acl, entry);
- }
-
- cur=cur->next;
- }
-
- return acl;
-}
-int GRSTgaclFileIsAcl(char *pathandfile)
-/* Return 1 if filename in *pathandfile starts GRST_ACL_FILE
- Return 0 otherwise. */
-{
- char *filename;
-
- filename = rindex(pathandfile, '/');
- if (filename == NULL) filename = pathandfile;
- else filename++;
-
- return (strncmp(filename, GRST_ACL_FILE, sizeof(GRST_ACL_FILE) - 1) == 0);
-}
-
-char *GRSTgaclFileFindAclname(char *pathandfile)
-/* Return malloc()ed ACL filename that governs the given file or directory
- (for directories, the ACL file is in the directory itself), or NULL if none
- can be found. */
-{
- int len;
- char *path, *file, *p;
- struct stat statbuf;
-
- len = strlen(pathandfile);
- if (len == 0) return NULL;
-
- path = malloc(len + sizeof(GRST_ACL_FILE) + 2);
- strcpy(path, pathandfile);
-
- if ((stat(path, &statbuf) == 0) &&
- S_ISDIR(statbuf.st_mode) &&
- (path[len-1] != '/'))
- {
- strcat(path, "/");
- ++len;
- }
-
- if (path[len-1] != '/')
- {
- p = rindex(pathandfile, '/');
- if (p != NULL)
- {
- file = &p[1];
- p = rindex(path, '/');
- sprintf(p, "/%s:%s", GRST_ACL_FILE, file);
-
- if (stat(path, &statbuf) == 0) return path;
-
- *p = '\0'; /* otherwise strip off any filename */
- }
- }
-
- while (path[0] != '\0')
- {
- strcat(path, "/");
- strcat(path, GRST_ACL_FILE);
-
- if (stat(path, &statbuf) == 0) return path;
-
- p = rindex(path, '/');
- *p = '\0'; /* strip off the / we added for ACL */
-
- p = rindex(path, '/');
- if (p == NULL) break; /* must start without / and we there now ??? */
-
- *p = '\0'; /* strip off another layer of / */
- }
-
- free(path);
- return NULL;
-}
-
-GRSTgaclAcl *GRSTgaclAclLoadforFile(char *pathandfile)
-/* Return ACL that governs the given file or directory (for directories,
- the ACL file is in the directory itself.) */
-{
- char *path;
- GRSTgaclAcl *acl;
-
- path = GRSTgaclFileFindAclname(pathandfile);
-
- if (path != NULL)
- {
- acl = GRSTgaclAclLoadFile(path);
- free(path);
- return acl;
- }
-
- return NULL;
-}
-
-/* *
- * Functions to create and query GACLuser *
- * */
-
-GRSTgaclUser *GRSTgaclUserNew(GRSTgaclCred *cred)
-{
- GRSTgaclUser *user;
-
- if (cred == NULL) return NULL;
-
- user = malloc(sizeof(GRSTgaclUser));
-
- if (user != NULL) user->firstcred = cred;
-
- user->dnlists = NULL;
-
- return user;
-}
-
-int GRSTgaclUserFree(GRSTgaclUser *user)
-{
- if (user == NULL) return 1;
-
- if (user->firstcred != NULL) GRSTgaclCredsFree(user->firstcred);
-
- if (user->dnlists != NULL) free(user->dnlists);
-
- free(user);
-
- return 1;
-}
-
-int GRSTgaclUserAddCred(GRSTgaclUser *user, GRSTgaclCred *cred)
-{
- GRSTgaclCred *crediter;
-
- if ((user == NULL) || (cred == NULL)) return 0;
-
- if (user->firstcred == NULL)
- {
- user->firstcred = cred;
- cred->next = NULL; /* so cannot be used to add whole lists */
- return 1;
- }
-
- crediter = user->firstcred;
-
- while (crediter->next != NULL) crediter = crediter->next;
-
- crediter->next = cred;
- cred->next = NULL; /* so cannot be used to add whole lists */
-
- return 1;
-}
-
-int GRSTgaclUserHasCred(GRSTgaclUser *user, GRSTgaclCred *cred)
-/* test if the user has the given credential */
-{
- GRSTgaclCred *crediter;
- GRSTgaclNamevalue *usernamevalue, *crednamevalue;
-
- if (cred == NULL) return 0;
-
- if (strcmp(cred->type, "any-user") == 0) return 1;
-
- if (user == NULL) return 0;
-
- if (strcmp(cred->type, "dn-list") == 0)
- {
- if ((cred->firstname == NULL) ||
- (strcmp((cred->firstname)->name, "url") != 0) ||
- ((cred->firstname)->next != NULL)) return 0;
-
- return GRSTgaclDNlistHasUser((cred->firstname)->value, user);
- }
-
- if (strcmp(cred->type, "dns") == 0)
- {
- if ((user->firstcred == NULL) ||
- ((user->firstcred)->firstname == NULL) ||
- (cred->firstname == NULL) ||
- (strcmp((cred->firstname)->name, "hostname") != 0) ||
- ((cred->firstname)->next != NULL)) return 0;
-
- for (crediter=user->firstcred;
- crediter != NULL;
- crediter = crediter->next)
- if (strcmp(crediter->type, "dns") == 0)
- {
- if ((crediter->firstname == NULL) ||
- (strcmp((crediter->firstname)->name, "hostname") != 0)) return 0;
-
- return (fnmatch((cred->firstname)->value,
- (crediter->firstname)->value, FNM_CASEFOLD) == 0);
- }
-
-
- return 0;
- }
-
- if (strcmp(cred->type, "auth-user") == 0)
- {
- if ((user->firstcred == NULL) ||
- ((user->firstcred)->firstname == NULL)) return 0;
-
- for (crediter=user->firstcred;
- crediter != NULL;
- crediter = crediter->next)
- if (strcmp(crediter->type, "person") == 0) return 1;
-
- return 0;
- }
-
- if (strcmp(cred->type, "level") == 0)
- {
- if ((user->firstcred == NULL) ||
- ((user->firstcred)->firstname == NULL)) return 0;
-
- for (crediter=user->firstcred;
- crediter != NULL;
- crediter = crediter->next)
- if (strcmp(crediter->type, "level") == 0)
- {
- if (atoi(user->firstcred->firstname->value)
- >= atoi(crediter->firstname->value)) return 1;
-
- return 0;
- }
-
- return 0;
- }
-
- for (crediter=user->firstcred; crediter != NULL; crediter = crediter->next)
- {
- if (strcmp(crediter->type, cred->type) != 0) continue;
-
- if ((crediter->firstname == NULL) &&
- (cred->firstname == NULL)) return 1;
-
- if ((crediter->firstname == NULL) ||
- (cred->firstname == NULL)) continue;
-
- usernamevalue = crediter->firstname;
- crednamevalue = cred->firstname;
-
- for (;;)
- {
- if (strcmp(usernamevalue->name,crednamevalue->name) != 0) break;
-
- if (strcmp(cred->type, "person") == 0)
- {
- if (GRSTx509NameCmp(usernamevalue->value,
- crednamevalue->value) != 0) break;
- }
-/*
- else if (strcmp(cred->type, "level") == 0)
- {
- if (atoi(usernamevalue->value)
- < atoi(crednamevalue->value)) break;
- }
-*/
- else if (strcmp(usernamevalue->value,
- crednamevalue->value) != 0) break;
-
- /* ok if cred list runs out before user's cred list */
- if (crednamevalue->next == NULL) return 1;
-
- /* but not ok if more names to match which user doesn't have */
- if (usernamevalue->next == NULL) break;
-
- crednamevalue = (GRSTgaclNamevalue *) crednamevalue->next;
- usernamevalue = (GRSTgaclNamevalue *) usernamevalue->next;
- }
- }
-
- return 0;
-}
-
-GRSTgaclCred *GRSTgaclUserFindCredtype(GRSTgaclUser *user, char *type)
-/* find the first credential of a given type for this user */
-{
- GRSTgaclCred *cred;
-
- if (user == NULL) return NULL;
-
- cred = user->firstcred;
-
- while (cred != NULL)
- {
- if (strcmp(cred->type, type) == 0) return cred;
-
- cred = cred->next;
- }
-
- return NULL;
-}
-
-int GRSTgaclUserSetDNlists(GRSTgaclUser *user, char *dnlists)
-{
- if ((user == NULL) || (dnlists == NULL)) return 0;
-
- if (user->dnlists != NULL) free(user->dnlists);
-
- user->dnlists = strdup(dnlists);
-
- return 1;
-}
-
-/* *
- * Functions to test for access perm of an individual *
- * */
-
-static char *recurse4file(char *dir, char *file, int recurse_level)
-/* try to find file[] in dir[]. try subdirs if not found.
- return full path to first found version or NULL on failure */
-{
- char *fullfilename, *fulldirname;
- struct stat statbuf;
- DIR *dirDIR;
- struct dirent *file_ent;
-
- /* try to find in current directory */
-
- asprintf(&fullfilename, "%s/%s", dir, file);
- if (stat(fullfilename, &statbuf) == 0) return fullfilename;
- free(fullfilename);
-
- /* maybe search in subdirectories */
-
- if (recurse_level >= GRST_RECURS_LIMIT) return NULL;
-
- dirDIR = opendir(dir);
-
- if (dirDIR == NULL) return NULL;
-
- while ((file_ent = readdir(dirDIR)) != NULL)
- {
- if (file_ent->d_name[0] == '.') continue;
-
- asprintf(&fulldirname, "%s/%s", dir, file_ent->d_name);
-
- if ((stat(fulldirname, &statbuf) == 0) &&
- S_ISDIR(statbuf.st_mode) &&
- ((fullfilename = recurse4file(fulldirname, file,
- recurse_level + 1)) != NULL))
- {
- closedir(dirDIR);
- return fullfilename;
- }
-
- free(fulldirname);
- }
-
- closedir(dirDIR);
-
- return NULL;
-}
-
-int GRSTgaclDNlistHasUser(char *listurl, GRSTgaclUser *user)
-{
- char *dn_lists_dirs, *dn_list_ptr, *enclisturl, *filename, *dirname,
- line[512], *p;
- FILE *fp;
- GRSTgaclCred *cred;
-
- if ((listurl == NULL) || (user == NULL)) return 0;
-
- enclisturl = GRSThttpUrlEncode(listurl);
-
- if (user->dnlists != NULL) p = user->dnlists;
- else p = getenv("GRST_DN_LISTS");
-
- if (p == NULL) p = GRST_DN_LISTS;
- dn_lists_dirs = strdup(p); /* we need to keep this for free() later! */
- dn_list_ptr = dn_lists_dirs; /* copy, for naughty function strsep() */
-
- while ((dirname = strsep(&dn_list_ptr, ":")) != NULL)
- {
- filename = recurse4file(dirname, enclisturl, 0);
- if (filename == NULL) continue;
-
- fp = fopen(filename, "r");
- free(filename);
-
- if (fp == NULL) continue;
-
- while (fgets(line, sizeof(line), fp) != NULL)
- {
- p = index(line, '\n');
- if (p != NULL) *p = '\0';
-
- cred = user->firstcred;
-
- while (cred != NULL)
- {
- if ((strcmp(cred->type, "person") == 0) &&
- (cred->firstname != NULL) &&
- (strcmp("dn", (cred->firstname)->name) == 0) &&
- (GRSTx509NameCmp(line, (cred->firstname)->value) == 0))
- {
- fclose(fp);
- free(dn_lists_dirs);
- free(enclisturl);
- return 1;
- }
-
- cred = cred->next;
- }
- }
-
- fclose(fp);
- }
-
- free(dn_lists_dirs);
- free(enclisturl);
-
- return 0;
-}
-
-GRSTgaclPerm GRSTgaclAclTestUser(GRSTgaclAcl *acl, GRSTgaclUser *user)
-/*
- GACLgaclAclTestUser - return bit fields depending on access perms user has
- for given acl. All zero for no access. If *user is
- NULL, matching to "any-user" will still work.
-*/
-{
- int flag, onlyanyuser;
- GRSTgaclPerm allowperms = 0, denyperms = 0, allowed;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred, *usercred;
-
- if (acl == NULL) return 0;
-
- for (entry = acl->firstentry; entry != NULL; entry = entry->next)
- {
- flag = 1; /* begin by assuming this entry applies to us */
- onlyanyuser = 1; /* begin by assuming just <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->type, "any-user") != 0) onlyanyuser = 0;
-
- if (!flag) continue; /* flag false if a subtest failed */
-
- /* does apply to us, so we remember this entry's perms */
-
- /* we dont allow Write or Admin on the basis of any-user alone */
-
- allowed = entry->allowed;
-
- if (onlyanyuser)
- allowed = entry->allowed & ~GRST_PERM_WRITE & ~GRST_PERM_ADMIN;
- else allowed = entry->allowed;
-
- allowperms = allowperms | allowed;
- denyperms = denyperms | entry->denied;
- }
-
- return (allowperms & (~ denyperms));
- /* for each perm type, any deny we saw kills any allow */
-}
-
-GRSTgaclPerm GRSTgaclAclTestexclUser(GRSTgaclAcl *acl, GRSTgaclUser *user)
-/*
- GRSTgaclAclTestexclUser -
- return bit fields depending on ALLOW perms OTHER users
- have for given acl. All zero if they have no access.
- (used for testing if a user has exclusive access)
-*/
-{
- int flag;
- GRSTgaclPerm perm = 0;
- GRSTgaclEntry *entry;
- GRSTgaclCred *cred;
-
- if (acl == NULL) return 0;
-
- for (entry = acl->firstentry; entry != NULL; entry = entry->next)
- {
- flag = 0; /* flag will be set if cred implies other users */
-
- for (cred = entry->firstcred; cred != NULL; cred = cred->next)
- {
- if (strcmp(cred->type, "person") != 0)
- /* if we ever add support for other person-specific credentials,
- they must also be recognised here */
- {
- flag = 1;
- break;
- }
-
- if (!GRSTgaclUserHasCred(user, cred))
- /* if user doesnt have this person credential, assume
- it refers to a different individual */
- {
- flag = 1;
- break;
- }
- }
-
- if (flag) perm = perm | entry->allowed;
- }
-
- return perm;
-}
-
-/*
- Wrapper functions for gridsite-gacl.h support of legacy API
-*/
-
-GRSTgaclEntry *GACLparseEntry(xmlNodePtr cur)
-{
- return GRSTgaclEntryParse(cur);
-}
+++ /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;
-}
-
-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-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 <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>
-
-#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>
-
-#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
-/**
- * Returning GRST_RET_OK if all of extensions are known to us or
- * OpenSSL; GRST_REF_FAILED otherwise.
- *
- * Since this function relies on functionality (X509_supported_extension)
- * introduced in 0.9.7, then we do nothing and report an error
- * (GRST_RET_FAILED) if one of the associated defines
- * (X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION) is absent.
- */
-
-int GRSTx509KnownCriticalExts(X509 *cert)
-{
- int i;
- char s[80];
- X509_EXTENSION *ex;
-
-#ifdef X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION
- for (i = 0; i < X509_get_ext_count(cert); ++i)
- {
- ex = X509_get_ext(cert, i);
-
- if (X509_EXTENSION_get_critical(ex) &&
- !X509_supported_extension(ex))
- {
- OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ex), 1);
-
- if (strcmp(s, GRST_PROXYCERTINFO_OID) != 0) return GRST_RET_FAILED;
- }
- }
-
- return GRST_RET_OK;
-#else
- return GRST_RET_FAILED;
-#endif
-}
-
-/// Check if certificate can be used as a CA to sign standard X509 certs
-/*
- * Return GRST_RET_OK if true; GRST_RET_FAILED if not.
- */
-
-int GRSTx509IsCA(X509 *cert)
-{
- int idret, purpose_id;
-
- purpose_id = X509_PURPOSE_get_by_sname("sslclient");
-
- /* final argument to X509_check_purpose() is whether to check for CAness */
-
- if (X509_check_purpose(cert, purpose_id + X509_PURPOSE_MIN, 1))
- return GRST_RET_OK;
- else return GRST_RET_FAILED;
-}
-
-int GRSTx509ChainFree(GRSTx509Chain *chain)
-{
- GRSTx509Cert *grst_cert, *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
-/*
- * Returns GRST_RET_OK if signature is ok, other values if not.
- */
-
-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)
-{
- 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
-/*
- * Returns GRST_RET_OK if signature is ok, other values if not.
- */
-
-static int GRSTx509VerifyVomsSig(time_t *time1_time, time_t *time2_time,
- unsigned char *asn1string,
- struct GRSTasn1TagList taglist[],
- int lasttag,
- char *vomsdir, int acnumber)
-{
-#define GRST_ASN1_COORDS_VOMS_DN "-1-1-%d-1-3-1-1-1-%%d-1-%%d"
-#define GRST_ASN1_COORDS_VOMS_INFO "-1-1-%d-1"
-#define GRST_ASN1_COORDS_VOMS_SIG "-1-1-%d-3"
- int ret, isig, iinfo;
- char *certpath, *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
-/*
- * Add any VOMS credentials found into the chain. Always returns GRST_RET_OK
- * - even for invalid credentials, which are flagged in errors field
- */
-
-static int GRSTx509ChainVomsAdd(GRSTx509Cert **grst_cert,
- time_t time1_time, time_t time2_time,
- X509_EXTENSION *ex,
- char *ucuserdn, char *vomsdir)
-{
-#define MAXTAG 500
-#define GRST_ASN1_COORDS_FQAN "-1-1-%d-1-7-1-2-1-2-%d"
-#define GRST_ASN1_COORDS_USER_DN "-1-1-%d-1-2-1-1-1-1-%%d-1-%%d"
-#define GRST_ASN1_COORDS_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;
- GRSTx509Cert *new_grst_cert;
-
- 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)->start = time1_time;
- (*grst_cert)->finish = 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.
-/**
- * Returns GRST_RET_OK if valid; OpenSSL X509 errors otherwise.
- *
- * The GridSite version handles old and new style Globus proxies, and
- * proxies derived from user certificates issued with "X509v3 Basic
- * Constraints: CA:FALSE" (eg UK e-Science CA)
- *
- * TODO: we do not yet check ProxyCertInfo and ProxyCertPolicy extensions
- * (although via GRSTx509KnownCriticalExts() we can accept them.)
- */
-
-int GRSTx509ChainLoadCheck(GRSTx509Chain **chain,
- STACK_OF(X509) *certstack, X509 *lastcert,
- char *capath, char *vomsdir)
-{
- 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");
- }
-
- *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 */
-
- 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 */
-
- 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->start = GRSTasn1TimeToTimeT(
- ASN1_STRING_data(X509_get_notBefore(cert)), 0);
- new_grst_cert->finish = GRSTasn1TimeToTimeT(
- ASN1_STRING_data(X509_get_notAfter(cert)), 0);
-
- /* we check times and record if invalid */
-
- if (now < new_grst_cert->start)
- new_grst_cert->errors |= GRST_CERT_BAD_TIME;
-
- if (now > new_grst_cert->finish)
- 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;
- }
- }
- 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! */
- }
-
- 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->start,
- new_grst_cert->finish,
- ex,
- ucuserdn,
- vomsdir);
- }
- }
-
- }
- }
-
-
- } /* end of for loop */
-
- if (cacert != NULL) X509_free(cacert);
-
- return GRST_RET_OK;
-}
-
-/// Check certificate chain for GSI proxy acceptability.
-/**
- * Returns X509_V_OK/GRST_RET_OK if valid; OpenSSL X509 errors otherwise.
- *
- * Inspired by GSIcheck written by Mike Jones, SVE, Manchester Computing,
- * The University of Manchester.
- *
- * The GridSite version handles old and new style Globus proxies, and
- * proxies derived from user certificates issued with "X509v3 Basic
- * Constraints: CA:FALSE" (eg UK e-Science CA)
- *
- * We do not check chain links between certs here: this is done by
- * GRST_check_issued/X509_check_issued in mod_ssl's ssl_engine_init.c
- *
- * TODO: we do not yet check ProxyCertInfo and ProxyCertPolicy extensions
- * (although via GRSTx509KnownCriticalExts() we can accept them.)
- */
-
-int GRSTx509CheckChain(int *first_non_ca, X509_STORE_CTX *ctx)
-{
- STACK_OF(X509) *certstack; /* Points to the client's cert chain */
- X509 *cert; /* Points to the client's cert */
- int depth; /* Depth of cert chain */
- size_t len,len2; /* Lengths of issuer and cert DN */
- int IsCA; /* Holds whether cert is allowed to sign */
- int prevIsCA; /* Holds whether previous cert in chain is
- allowed to sign */
- int prevIsLimited; /* previous cert was proxy and limited */
- int i,j; /* Iteration variables */
- char *cert_DN; /* Pointer to current-certificate-in-chain's
- DN */
- char *issuer_DN; /* Pointer to
- issuer-of-current-cert-in-chain's DN */
- char *proxy_part_DN; /* Pointer to end part of current-cert-in-chain
- maybe eg "/CN=proxy" */
- time_t now;
-
- time(&now);
-
- *first_non_ca = 0; /* set to something predictable if things fail */
-
- /* Check for context */
- if (!ctx) return X509_V_ERR_INVALID_CA;
- /* Can't GSI-verify if there is no context. Here and throughout this
- function we report all errors as X509_V_ERR_INVALID_CA. */
-
- /* Set necessary preliminary values */
- IsCA = TRUE; /* =prevIsCA - start from a CA */
- prevIsLimited = 0;
-
- /* Get the client cert chain */
- certstack = X509_STORE_CTX_get_chain(ctx); /* Get the client's chain */
- depth = sk_X509_num(certstack); /* How deep is that chain? */
-
- /* Check the client chain */
- for (i=depth-1; i >= 0; --i)
- /* loop through client-presented chain starting at CA end */
- {
- prevIsCA=IsCA;
-
- /* Check for X509 certificate and point to it with 'cert' */
- if (cert = sk_X509_value(certstack, i))
- {
- /* we check times and reject immediately if invalid */
-
- if (now <
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0))
- return X509_V_ERR_INVALID_CA;
-
- if (now >
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0))
- return X509_V_ERR_INVALID_CA;
-
- /* If any forebear certificate is not allowed to sign we must
- assume all decendents are proxies and cannot sign either */
- if (prevIsCA)
- {
- /* always treat the first cert (from the CA files) as a CA */
- if (i == depth-1) IsCA = TRUE;
- /* check if this cert is valid CA for signing certs */
- else IsCA = (GRSTx509IsCA(cert) == GRST_RET_OK);
-
- if (!IsCA) *first_non_ca = i;
- }
- else
- {
- IsCA = FALSE;
- /* Force proxy check next iteration. Important because I can
- sign any CA I create! */
- }
-
- cert_DN = X509_NAME_oneline(X509_get_subject_name(cert),NULL,0);
- issuer_DN = X509_NAME_oneline(X509_get_issuer_name(cert),NULL,0);
- len = strlen(cert_DN);
- len2 = strlen(issuer_DN);
-
- /* issuer didn't have CA status, so this is (at best) a proxy:
- check for bad proxy extension*/
-
- if (!prevIsCA)
- {
- if (prevIsLimited) /* we reject proxies of limited proxies! */
- return X509_V_ERR_INVALID_CA;
-
- /* User not allowed to sign shortened DN */
- if (len2 > len) return X509_V_ERR_INVALID_CA;
-
- /* Proxy subject must begin with issuer. */
- if (strncmp(cert_DN, issuer_DN, len2) != 0)
- return X509_V_ERR_INVALID_CA;
-
- /* Set pointer to end of base DN in cert_DN */
- proxy_part_DN = &cert_DN[len2];
-
- /* First attempt at support for Old and New style GSI
- proxies: /CN=anything is ok for now */
- if (strncmp(proxy_part_DN, "/CN=", 4) != 0)
- return X509_V_ERR_INVALID_CA;
-
- if ((strncmp(proxy_part_DN, "/CN=limited proxy", 17) == 0) &&
- (i > 0)) prevIsLimited = 1; /* ready for next cert ... */
- }
- }
- }
-
- /* Check cert whose private key is being used by client. If previous in
- chain is not allowed to be a CA then need to check this final cert for
- valid proxy-icity too */
- if (!prevIsCA)
- {
- if (prevIsLimited) return X509_V_ERR_INVALID_CA;
- /* we do not accept proxies signed by limited proxies */
-
- if (cert = sk_X509_value(certstack, 0))
- {
- /* Load DN & length of DN and either its issuer or the
- first-bad-issuer-in-chain */
- cert_DN = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0);
- issuer_DN = X509_NAME_oneline(X509_get_issuer_name(cert), NULL, 0);
- len = strlen(cert_DN);
- len2 = strlen(issuer_DN);
-
- /* issuer didn't have CA status, check for bad proxy extension */
-
- if (len2 > len) return X509_V_ERR_INVALID_CA;
- /* User not allowed to sign shortened DN */
-
- if (strncmp(cert_DN, issuer_DN, len2) != 0)
- return X509_V_ERR_INVALID_CA;
- /* Proxy subject must begin with issuer. */
-
- proxy_part_DN = &cert_DN[len2];
- /* Set pointer to end of DN base in cert_DN */
-
- /* Remander of subject must be either "/CN=proxy" or
- "/CN=limited proxy" (or /CN=XYZ for New style GSI) */
-
- /* First attempt at support for Old and New style GSI
- proxies: /CN=anything is ok for now. */
- if (strncmp(proxy_part_DN, "/CN=", 4) != 0)
- return X509_V_ERR_INVALID_CA;
- }
- }
-
- return X509_V_OK; /* this is also GRST_RET_OK, of course - by choice */
-}
-
-/// Example VerifyCallback routine
-
-/**
- *
- */
-
-int GRSTx509VerifyCallback (int ok, X509_STORE_CTX *ctx)
-{
- int errnum = X509_STORE_CTX_get_error(ctx);
- int errdepth = X509_STORE_CTX_get_error_depth(ctx);
- int first_non_ca;
-
-#ifndef X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION
-#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34
-#endif
-
- if (errnum == X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION)
- {
- if (GRSTx509KnownCriticalExts(X509_STORE_CTX_get_current_cert(ctx))
- == GRST_RET_OK)
- {
- ok = TRUE;
- errnum = X509_V_OK;
- X509_STORE_CTX_set_error(ctx, errnum);
- }
- }
- else if ((errdepth == 0) &&
- (errnum == X509_V_OK) &&
- (GRSTx509CheckChain(&first_non_ca, ctx) != X509_V_OK)) ok = FALSE;
-
-
- return ok;
-
-// check this
-
-// if (ok) return GRST_RET_OK;
-// else return GRST_RET_FAILED;
-}
-
-/// Get the VOMS attributes in the given extension
-/*
- * Puts any VOMS credentials found into the Compact Creds string array
- * starting at *creds. Always returns GRST_RET_OK - even for invalid
- * credentials, which are just ignored.
- */
-
-int GRSTx509ParseVomsExt(int *lastcred, int maxcreds, size_t credlen,
- char *creds, time_t time1_time, time_t time2_time,
- X509_EXTENSION *ex, char *ucuserdn, char *vomsdir)
-{
-#define MAXTAG 500
-#define GRST_ASN1_COORDS_FQAN "-1-1-%d-1-7-1-2-1-2-%d"
-#define GRST_ASN1_COORDS_USER_DN "-1-1-%d-1-2-1-1-1-1-%%d-1-%%d"
-#define GRST_ASN1_COORDS_TIME1 "-1-1-%d-1-6-1"
-#define GRST_ASN1_COORDS_TIME2 "-1-1-%d-1-6-2"
- ASN1_OCTET_STRING *asn1data;
- char *asn1string, acuserdn[200], acvomsdn[200],
- dn_coords[200], fqan_coords[200], time1_coords[200],
- time2_coords[200];
- long asn1length;
- int lasttag=-1, itag, i, acnumber = 1;
- struct GRSTasn1TagList taglist[MAXTAG+1];
- time_t actime1, actime2, time_now;
-
- asn1data = X509_EXTENSION_get_data(ex);
- asn1string = ASN1_STRING_data(asn1data);
- asn1length = ASN1_STRING_length(asn1data);
-
- GRSTasn1ParseDump(NULL, asn1string, asn1length, taglist, MAXTAG, &lasttag);
-
- for (acnumber = 1; ; ++acnumber) /* go through ACs one by one */
- {
- snprintf(dn_coords, sizeof(dn_coords), GRST_ASN1_COORDS_USER_DN, acnumber);
- if (GRSTasn1GetX509Name(acuserdn, sizeof(acuserdn), dn_coords,
- asn1string, taglist, lasttag) != GRST_RET_OK) break;
-
- if (GRSTx509NameCmp(ucuserdn, acuserdn) != 0) continue;
-
- if (GRSTx509VerifyVomsSig(&time1_time, &time2_time,
- asn1string, taglist, lasttag, vomsdir, acnumber)
- != GRST_RET_OK) continue;
-
- snprintf(time1_coords, sizeof(time1_coords), GRST_ASN1_COORDS_TIME1, acnumber);
- itag = GRSTasn1SearchTaglist(taglist, lasttag, time1_coords);
- actime1 = GRSTasn1TimeToTimeT(&asn1string[taglist[itag].start+
- taglist[itag].headerlength],
- taglist[itag].length);
- if (actime1 > time1_time) time1_time = actime1;
-
- snprintf(time2_coords, sizeof(time2_coords), GRST_ASN1_COORDS_TIME2, acnumber);
- itag = GRSTasn1SearchTaglist(taglist, lasttag, time2_coords);
- actime2 = GRSTasn1TimeToTimeT(&asn1string[taglist[itag].start+
- taglist[itag].headerlength],
- taglist[itag].length);
- if (actime2 < time2_time) time2_time = actime2;
-
- time(&time_now);
- if ((time1_time > time_now + 300) || (time2_time < time_now))
- continue; /* expiration isnt invalidity ...? */
-
- for (i=1; ; ++i)
- {
- snprintf(fqan_coords, sizeof(fqan_coords), GRST_ASN1_COORDS_FQAN, acnumber, i);
- itag = GRSTasn1SearchTaglist(taglist, lasttag, fqan_coords);
-
- if (itag > -1)
- {
- if (*lastcred < maxcreds - 1)
- {
- ++(*lastcred);
- snprintf(&creds[*lastcred * (credlen + 1)], credlen+1,
- "VOMS %010lu %010lu 0 %.*s",
- time1_time, time2_time,
- taglist[itag].length,
- &asn1string[taglist[itag].start+
- taglist[itag].headerlength]);
- }
- }
- else break;
- }
- }
-
- return GRST_RET_OK;
-}
-
-/// Get the VOMS attributes in the extensions to the given cert stack
-/*
- * Puts any VOMS credentials found into the Compact Creds string array
- * starting at *creds. Always returns GRST_RET_OK.
- */
-
-int GRSTx509GetVomsCreds(int *lastcred, int maxcreds, size_t credlen,
- char *creds, X509 *usercert, STACK_OF(X509) *certstack,
- char *vomsdir)
-{
- int i, j;
- char s[80];
- unsigned char *ucuser;
- X509_EXTENSION *ex;
- ASN1_STRING *asn1str;
- X509 *cert;
- time_t time1_time = 0, time2_time = 0, uctime1_time, uctime2_time;
-
- uctime1_time =
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(usercert)),0);
- uctime2_time =
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(usercert)),0);
- ucuser =
- X509_NAME_oneline(X509_get_subject_name(usercert), NULL, 0);
-
- for (j=sk_X509_num(certstack)-1; j >= 0; --j)
- {
- cert = sk_X509_value(certstack, j);
-
- time1_time =
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0);
- uctime1_time = (time1_time > uctime1_time) ? time1_time:uctime1_time;
-
- time2_time =
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0);
- uctime2_time = (time2_time < uctime2_time) ? time2_time:uctime2_time;
-
- for (i=0; i < X509_get_ext_count(cert); ++i)
- {
- ex = X509_get_ext(cert, i);
- OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ex), 1);
-
- if (strcmp(s, GRST_VOMS_OID) == 0) /* a VOMS extension */
- {
- GRSTx509ParseVomsExt(lastcred, maxcreds, credlen, creds,
- uctime1_time, uctime2_time,
- ex, ucuser, vomsdir);
- }
- }
- }
-
- return GRST_RET_OK;
-}
-
-/// Turn a Compact Cred line into a GRSTgaclCred object
-/**
- * Returns pointer to created GRSTgaclCred or NULL or failure.
- */
-
-GRSTgaclCred *GRSTx509CompactToCred(char *grst_cred)
-{
- int delegation;
- char *p;
- time_t now, notbefore, notafter;
- GRSTgaclCred *cred = NULL;
-
- time(&now);
-
- if (grst_cred == NULL) return NULL; /* just in case */
-
- if (strncmp(grst_cred, "X509USER ", 9) == 0)
- {
- if ((sscanf(grst_cred, "X509USER %lu %lu %d",
- ¬before, ¬after, &delegation) == 3)
- && (now >= notbefore)
- && (now <= notafter)
- && (p = index(grst_cred, ' '))
- && (p = index(++p, ' '))
- && (p = index(++p, ' '))
- && (p = index(++p, ' ')))
- {
- cred = GRSTgaclCredNew("person");
- GRSTgaclCredSetDelegation(cred, delegation);
- GRSTgaclCredAddValue(cred, "dn", &p[1]);
- }
-
- return cred;
- }
-
- if (strncmp(grst_cred, "VOMS ", 5) == 0)
- {
- if ((sscanf(grst_cred, "VOMS %lu %lu %d",
- ¬before, ¬after, &delegation) == 3)
- && (now >= notbefore)
- && (now <= notafter)
- && (p = index(grst_cred, ' '))
- && (p = index(++p, ' '))
- && (p = index(++p, ' '))
- && (p = index(++p, ' ')))
- {
- /* include /VO/group/subgroup/Role=role/Capability=cap */
-
- if (p[1] != '/') return NULL; /* must begin with / */
-
- cred = GRSTgaclCredNew("voms");
- GRSTgaclCredSetDelegation(cred, delegation);
- GRSTgaclCredAddValue(cred, "fqan", &p[1]);
- }
-
- return cred;
- }
-
- return NULL; /* dont recognise this credential type */
-}
-
-/// Get the credentials in an X509 cert/GSI proxy, including any VOMS
-/**
- * Credentials are placed in Compact Creds string array at *creds.
- *
- * Function returns GRST_RET_OK on success, or GRST_RET_FAILED if
- * some inconsistency found in certificate.
- */
-
-int GRSTx509CompactCreds(int *lastcred, int maxcreds, size_t credlen,
- char *creds, STACK_OF(X509) *certstack, char *vomsdir,
- X509 *peercert)
-{
- int i, j, delegation = 0;
- char credtemp[credlen+1];
- X509 *cert, *usercert = NULL, *gsiproxycert = NULL;
-
- *lastcred = -1;
-
- for (i = sk_X509_num(certstack) - 1; i >= 0; --i)
- {
- cert = sk_X509_value(certstack, i);
-
- if (usercert != NULL)
- { /* found a (GSI proxy) cert after the user cert */
- gsiproxycert = cert;
- ++delegation;
- }
-
- if ((usercert == NULL) &&
- (i < sk_X509_num(certstack) - 1) &&
- (GRSTx509IsCA(cert) != GRST_RET_OK)) usercert = cert;
- /* found the 1st non-CA cert */
- }
-
- if (peercert != NULL)
- {
- if (usercert != NULL) /* found a (GSI proxy) cert after user cert */
- {
- gsiproxycert = peercert;
- ++delegation;
- }
-
- if ((usercert == NULL) &&
- (GRSTx509IsCA(peercert) != GRST_RET_OK)) usercert = peercert;
- /* found the 1st non-CA cert */
- }
-
- if ((usercert == NULL) /* if no usercert ("EEC"), we're not interested */
- ||
- (snprintf(credtemp, credlen+1, "X509USER %010lu %010lu %d %s",
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(usercert)),0),
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(usercert)),0),
- delegation,
- X509_NAME_oneline(X509_get_subject_name(usercert), NULL, 0)) >= credlen+1)
- ||
- (*lastcred >= maxcreds-1))
- {
- *lastcred = -1; /* just in case the caller looks at it */
- return GRST_RET_FAILED; /* tell caller that things didn't work out */
- }
-
- ++(*lastcred);
- strcpy(&creds[*lastcred * (credlen + 1)], credtemp);
-
- if ((gsiproxycert != NULL)
- &&
- (snprintf(credtemp, credlen+1, "GSIPROXY %010lu %010lu %d %s",
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(gsiproxycert)),0),
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(gsiproxycert)),0),
- delegation,
- X509_NAME_oneline(X509_get_subject_name(gsiproxycert), NULL, 0)) < credlen+1)
- &&
- (*lastcred < maxcreds-1))
- {
- ++(*lastcred);
- strcpy(&creds[*lastcred * (credlen + 1)], credtemp);
-
- GRSTx509GetVomsCreds(lastcred, maxcreds, credlen, creds,
- usercert, certstack, vomsdir);
-
- }
-
- return GRST_RET_OK;
-}
-
-/// Find proxy file name of the current user
-/**
- * Return a string with the proxy file name or NULL if not present.
- * This function does not check if the proxy has expired.
- */
-
-char *GRSTx509FindProxyFileName(void)
-{
- char *p;
-
- p = getenv("X509_USER_PROXY");
-
- if (p != NULL) return strdup(p);
-
- p = malloc(sizeof("/tmp/x509up_uXYYYXXXYYY"));
-
- sprintf(p, "/tmp/x509up_u%d", getuid());
-
- return p;
-}
-
-static void mpcerror(FILE *debugfp, char *msg)
-{
- if (debugfp != NULL)
- {
- fputs(msg, debugfp);
- ERR_print_errors_fp(debugfp);
- }
-}
-
-/// Make a GSI Proxy chain from a request, certificate and private key
-/**
- * The proxy chain is returned in *proxychain. If debugfp is non-NULL,
- * errors are output to that file pointer. The proxy will expired in
- * the given number of minutes starting from the current time.
- */
-
-int GRSTx509MakeProxyCert(char **proxychain, FILE *debugfp,
- char *reqtxt, char *cert, char *key, int minutes)
-{
- char *ptr, *certchain;
- int i, subjAltName_pos, ncerts;
- long serial = 2796, ptrlen;
- EVP_PKEY *pkey, *CApkey;
- const EVP_MD *digest;
- X509 *certs[GRST_MAX_CHAIN_LEN];
- X509_REQ *req;
- X509_NAME *name, *CAsubject, *newsubject;
- X509_NAME_ENTRY *ent;
- X509V3_CTX ctx;
- X509_EXTENSION *subjAltName;
- STACK_OF (X509_EXTENSION) * req_exts;
- FILE *fp;
- BIO *reqmem, *certmem;
- time_t notAfter;
-
- /* read in the request */
- reqmem = BIO_new(BIO_s_mem());
- BIO_puts(reqmem, reqtxt);
-
- if (!(req = PEM_read_bio_X509_REQ(reqmem, NULL, NULL, NULL)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error reading request from BIO memory\n");
- BIO_free(reqmem);
- return GRST_RET_FAILED;
- }
-
- BIO_free(reqmem);
-
- /* verify signature on the request */
- if (!(pkey = X509_REQ_get_pubkey (req)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error getting public key from request\n");
- return GRST_RET_FAILED;
- }
-
- if (X509_REQ_verify(req, pkey) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error verifying signature on certificate\n");
- return GRST_RET_FAILED;
- }
-
- /* read in the signing certificate */
- if (!(fp = fopen(cert, "r")))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error opening signing certificate file\n");
- return GRST_RET_FAILED;
- }
-
- for (ncerts = 1; ncerts < GRST_MAX_CHAIN_LEN; ++ncerts)
- if (!(certs[ncerts] = PEM_read_X509(fp, NULL, NULL, NULL))) break;
-
- if (ncerts == 1) /* zeroth cert with be new proxy cert */
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error reading signing certificate file\n");
- return GRST_RET_FAILED;
- }
-
- fclose(fp);
-
- CAsubject = X509_get_subject_name(certs[1]);
-
- /* read in the CA private key */
- if (!(fp = fopen(key, "r")))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error reading signing private key file\n");
- return GRST_RET_FAILED;
- }
-
- if (!(CApkey = PEM_read_PrivateKey (fp, NULL, NULL, NULL)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error reading signing private key in file\n");
- return GRST_RET_FAILED;
- }
-
- fclose(fp);
-
- /* get subject name */
- if (!(name = X509_REQ_get_subject_name (req)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error getting subject name from request\n");
- return GRST_RET_FAILED;
- }
-
- /* create new certificate */
- if (!(certs[0] = X509_new ()))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error creating X509 object\n");
- return GRST_RET_FAILED;
- }
-
- /* set version number for the certificate (X509v3) and the serial number
- need 3 = v4 for GSI proxy?? */
- if (X509_set_version (certs[0], 3L) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting certificate version\n");
- return GRST_RET_FAILED;
- }
-
- ASN1_INTEGER_set (X509_get_serialNumber (certs[0]), serial++);
-
- if (!(name = X509_get_subject_name(certs[1])))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error getting subject name from CA certificate\n");
- return GRST_RET_FAILED;
- }
-
- if (X509_set_issuer_name (certs[0], name) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting issuer name of certificate\n");
- return GRST_RET_FAILED;
- }
-
- /* set issuer and subject name of the cert from the req and the CA */
- ent = X509_NAME_ENTRY_create_by_NID(NULL, OBJ_txt2nid("commonName"),
- MBSTRING_ASC, "proxy", -1);
-
- newsubject = X509_NAME_dup(CAsubject);
-
- X509_NAME_add_entry(newsubject, ent, -1, 0);
-
- if (X509_set_subject_name(certs[0], newsubject) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting subject name of certificate\n");
- return GRST_RET_FAILED;
- }
-
- /* set public key in the certificate */
- if (X509_set_pubkey(certs[0], pkey) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting public key of the certificate\n");
- return GRST_RET_FAILED;
- }
-
- /* set duration for the certificate */
- if (!(X509_gmtime_adj (X509_get_notBefore(certs[0]), -GRST_BACKDATE_SECONDS)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting beginning time of the certificate\n");
- return GRST_RET_FAILED;
- }
-
- if (!(X509_gmtime_adj (X509_get_notAfter(certs[0]), 60 * minutes)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error setting ending time of the certificate\n");
- return GRST_RET_FAILED;
- }
-
- /* go through chain making sure this proxy is not longer lived */
-
- notAfter =
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(certs[0])), 0);
-
- for (i=1; i < ncerts; ++i)
- if (notAfter >
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(certs[i])),
- 0))
- {
- notAfter =
- GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(certs[i])),
- 0);
-
- ASN1_UTCTIME_set(X509_get_notAfter(certs[0]), notAfter);
- }
-
- /* sign the certificate with the signing private key */
- if (EVP_PKEY_type (CApkey->type) == EVP_PKEY_RSA)
- digest = EVP_md5();
- else
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error checking signing private key for a valid digest\n");
- return GRST_RET_FAILED;
- }
-
- if (!(X509_sign (certs[0], CApkey, digest)))
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error signing certificate\n");
- return GRST_RET_FAILED;
- }
-
- /* store the completed certificate chain */
-
- certchain = strdup("");
-
- for (i=0; i < ncerts; ++i)
- {
- certmem = BIO_new(BIO_s_mem());
-
- if (PEM_write_bio_X509(certmem, certs[i]) != 1)
- {
- mpcerror(debugfp,
- "GRSTx509MakeProxyCert(): error writing certificate to memory BIO\n");
- return GRST_RET_FAILED;
- }
-
- ptrlen = BIO_get_mem_data(certmem, &ptr);
-
- certchain = realloc(certchain, strlen(certchain) + ptrlen + 1);
-
- strncat(certchain, ptr, ptrlen);
-
- BIO_free(certmem);
- }
-
- *proxychain = certchain;
-
- return GRST_RET_OK;
-}
-
-/// Find a proxy file in the proxy cache
-/**
- * Returns the full path and file name of proxy file associated
- * with given delegation ID and user DN.
- */
-
-char *GRSTx509CachedProxyFind(char *proxydir, char *delegation_id,
- char *user_dn)
-/*
- Return a pointer to a malloc'd string with the full path of the
- proxy file corresponding to the given delegation_id, or NULL
- if not found.
-*/
-{
- char *user_dn_enc, *proxyfile;
- struct stat statbuf;
-
- user_dn_enc = GRSThttpUrlEncode(user_dn);
-
- asprintf(&proxyfile, "%s/%s/%s/userproxy.pem",
- proxydir, user_dn_enc, delegation_id);
-
- free(user_dn_enc);
-
- if ((stat(proxyfile, &statbuf) != 0) || !S_ISREG(statbuf.st_mode))
- {
- free(proxyfile);
- return NULL;
- }
-
- return proxyfile;
-}
-
-/// Find a temporary proxy private key file in the proxy cache
-/**
- * Returns the full path and file name of the private key file associated
- * with given delegation ID and user DN.
- */
-
-char *GRSTx509CachedProxyKeyFind(char *proxydir, char *delegation_id,
- char *user_dn)
-/*
- Return a pointer to a malloc'd string with the full path of the
- private proxy key corresponding to the given delegation_id, or NULL
- if not found.
-*/
-{
- char *user_dn_enc, *prvkeyfile;
- struct stat statbuf;
-
- user_dn_enc = GRSThttpUrlEncode(user_dn);
-
- asprintf(&prvkeyfile, "%s/cache/%s/%s/userkey.pem",
- proxydir, user_dn_enc, delegation_id);
-
- free(user_dn_enc);
-
- if ((stat(prvkeyfile, &statbuf) != 0) || !S_ISREG(statbuf.st_mode))
- {
- free(prvkeyfile);
- return NULL;
- }
-
- return prvkeyfile;
-}
-
-static void mkdir_printf(mode_t mode, char *fmt, ...)
-{
- int ret;
- char *path;
- va_list ap;
-
- va_start(ap, fmt);
- vasprintf(&path, fmt, ap);
- va_end(ap);
-
- ret = mkdir(path, mode);
-
- free(path);
-}
-
-/// Create a X.509 request for a GSI proxy and its private key
-/**
- * Returns GRST_RET_OK on success, non-zero otherwise. Request string
- * and private key are PEM encoded strings
- */
-
-int GRSTx509CreateProxyRequest(char **reqtxt, char **keytxt, char *ocspurl)
-{
- int i;
- char *ptr;
- size_t ptrlen;
- RSA *keypair;
- X509_NAME *subject;
- X509_NAME_ENTRY *ent;
- EVP_PKEY *pkey;
- X509_REQ *certreq;
- BIO *reqmem, *keymem;
- const EVP_MD *digest;
- struct stat statbuf;
-
- /* create key pair and put it in a PEM string */
-
- if ((keypair = RSA_generate_key(GRST_KEYSIZE, 65537, NULL, NULL)) == NULL)
- return 1;
-
- keymem = BIO_new(BIO_s_mem());
- if (!PEM_write_bio_RSAPrivateKey(keymem, keypair, NULL, NULL, 0, NULL, NULL))
- {
- BIO_free(keymem);
- return 3;
- }
-
- ptrlen = BIO_get_mem_data(keymem, &ptr);
-
- *keytxt = malloc(ptrlen + 1);
- memcpy(*keytxt, ptr, ptrlen);
- (*keytxt)[ptrlen] = '\0';
-
- BIO_free(keymem);
-
- /* now create the certificate request */
-
- certreq = X509_REQ_new();
-
- OpenSSL_add_all_algorithms();
-
- pkey = EVP_PKEY_new();
- EVP_PKEY_assign_RSA(pkey, keypair);
-
- X509_REQ_set_pubkey(certreq, pkey);
-
- subject = X509_NAME_new();
- ent = X509_NAME_ENTRY_create_by_NID(NULL, OBJ_txt2nid("organizationName"),
- MBSTRING_ASC, "Dummy", -1);
- X509_NAME_add_entry (subject, ent, -1, 0);
- X509_REQ_set_subject_name (certreq, subject);
-
- digest = EVP_md5();
- X509_REQ_sign(certreq, pkey, digest);
-
- reqmem = BIO_new(BIO_s_mem());
- PEM_write_bio_X509_REQ(reqmem, certreq);
- ptrlen = BIO_get_mem_data(reqmem, &ptr);
-
- *reqtxt = malloc(ptrlen + 1);
- memcpy(*reqtxt, ptr, ptrlen);
- (*reqtxt)[ptrlen] = '\0';
-
- BIO_free(reqmem);
-
- X509_REQ_free(certreq);
-
- return 0;
-}
-
-/// Make and store a X.509 request for a GSI proxy
-/**
- * Returns GRST_RET_OK on success, non-zero otherwise. Request string
- * is PEM encoded, and the key is stored in the temporary cache under
- * proxydir
- */
-
-int GRSTx509MakeProxyRequest(char **reqtxt, char *proxydir,
- char *delegation_id, char *user_dn)
-{
- int i;
- char *docroot, *prvkeyfile, *ptr, *user_dn_enc;
- size_t ptrlen;
- FILE *fp;
- RSA *keypair;
- X509_NAME *subject;
- X509_NAME_ENTRY *ent;
- EVP_PKEY *pkey;
- X509_REQ *certreq;
- BIO *reqmem;
- const EVP_MD *digest;
- struct stat statbuf;
-
- if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED;
-
- user_dn_enc = GRSThttpUrlEncode(user_dn);
-
- /* create directories if necessary */
-
- mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR,
- "%s/cache", proxydir);
- mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR,
- "%s/cache/%s", proxydir, user_dn_enc);
- mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR,
- "%s/cache/%s/%s", proxydir, user_dn_enc, delegation_id);
-
- /* make the new proxy private key */
-
- asprintf(&prvkeyfile, "%s/cache/%s/%s/userkey.pem",
- proxydir, user_dn_enc, delegation_id);
-
- if (prvkeyfile == NULL)
- {
- free(user_dn_enc);
- return GRST_RET_FAILED;
- }
-
- if ((keypair = RSA_generate_key(GRST_KEYSIZE, 65537, NULL, NULL)) == NULL)
- return 1;
-
- if ((fp = fopen(prvkeyfile, "w")) == NULL) return 2;
-
- chmod(prvkeyfile, S_IRUSR | S_IWUSR);
- free(prvkeyfile);
- free(user_dn_enc);
-
- if (!PEM_write_RSAPrivateKey(fp, keypair, NULL, NULL, 0, NULL, NULL))
- return 3;
-
- if (fclose(fp) != 0) return 4;
-
- /* now create the certificate request */
-
- certreq = X509_REQ_new();
- if (certreq == NULL) return 5;
-
- OpenSSL_add_all_algorithms();
-
- pkey = EVP_PKEY_new();
- EVP_PKEY_assign_RSA(pkey, keypair);
-
- X509_REQ_set_pubkey(certreq, pkey);
-
- subject = X509_NAME_new();
- ent = X509_NAME_ENTRY_create_by_NID(NULL, OBJ_txt2nid("organizationName"),
- MBSTRING_ASC, "Dummy", -1);
- X509_NAME_add_entry (subject, ent, -1, 0);
- X509_REQ_set_subject_name (certreq, subject);
-
- digest = EVP_md5();
- X509_REQ_sign(certreq, pkey, digest);
-
- reqmem = BIO_new(BIO_s_mem());
- PEM_write_bio_X509_REQ(reqmem, certreq);
- ptrlen = BIO_get_mem_data(reqmem, &ptr);
-
- *reqtxt = malloc(ptrlen + 1);
- memcpy(*reqtxt, ptr, ptrlen);
- (*reqtxt)[ptrlen] = '\0';
-
- BIO_free(reqmem);
-
- X509_REQ_free(certreq);
-
- return 0;
-}
-
-/// Destroy stored GSI proxy files
-/**
- * Returns GRST_RET_OK on success, non-zero otherwise.
- * (Including GRST_RET_NO_SUCH_FILE if the private key or cert chain
- * were not found.)
- */
-
-int GRSTx509ProxyDestroy(char *proxydir, char *delegation_id, char *user_dn)
-{
- int ret = GRST_RET_OK;
- char *docroot, *filename, *user_dn_enc;
-
- if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED;
-
- user_dn_enc = GRSThttpUrlEncode(user_dn);
-
- /* proxy file */
-
- asprintf(&filename, "%s/%s/%s/userproxy.pem",
- proxydir, user_dn_enc, delegation_id);
-
- if (filename == NULL)
- {
- free(user_dn_enc);
- return GRST_RET_FAILED;
- }
-
- if (unlink(filename) != 0) ret = GRST_RET_NO_SUCH_FILE;
- free(filename);
-
- /* voms file */
-
- asprintf(&filename, "%s/%s/%s/voms.attributes",
- proxydir, user_dn_enc, delegation_id);
-
- if (filename == NULL)
- {
- free(user_dn_enc);
- return GRST_RET_FAILED;
- }
-
- unlink(filename);
- free(filename);
-
- return ret;
-}
-
-/// Get start and finish validity times of stored GSI proxy file
-/**
- * Returns GRST_RET_OK on success, non-zero otherwise.
- * (Including GRST_RET_NO_SUCH_FILE if the cert chain was not found.)
- */
-
-int GRSTx509ProxyGetTimes(char *proxydir, char *delegation_id, char *user_dn,
- time_t *start, time_t *finish)
-{
- char *docroot, *filename, *user_dn_enc;
- FILE *fp;
- X509 *cert;
-
- if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED;
-
- user_dn_enc = GRSThttpUrlEncode(user_dn);
-
- asprintf(&filename, "%s/%s/%s/userproxy.pem",
- proxydir, user_dn_enc, delegation_id);
-
- free(user_dn_enc);
-
- if (filename == NULL) return GRST_RET_FAILED;
-
- fp = fopen(filename, "r");
- free(filename);
-
- if (fp == NULL) return GRST_RET_NO_SUCH_FILE;
-
- cert = PEM_read_X509(fp, NULL, NULL, NULL); /* first cert is X.509 PC */
-
- fclose(fp);
-
- *start = GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notBefore(cert)),0);
- *finish = GRSTasn1TimeToTimeT(ASN1_STRING_data(X509_get_notAfter(cert)),0);
-
- X509_free(cert);
-
- return GRST_RET_OK;
-}
-
-/// Create a stack of X509 certificate from a PEM-encoded string
-/**
- * Creates a dynamically allocated stack of X509 certificate objects
- * by walking through the PEM-encoded X509 certificates.
- *
- * Returns GRST_RET_OK on success, non-zero otherwise.
- *
- */
-
-int GRSTx509StringToChain(STACK_OF(X509) **certstack, char *certstring)
-{
- STACK_OF(X509_INFO) *sk=NULL;
- BIO *certbio;
- X509_INFO *xi;
-
- *certstack = sk_X509_new_null();
- if (*certstack == NULL) return GRST_RET_FAILED;
-
- certbio = BIO_new_mem_buf(certstring, -1);
-
- if (!(sk=PEM_X509_INFO_read_bio(certbio, NULL, NULL, NULL)))
- {
- BIO_free(certbio);
- sk_X509_INFO_free(sk);
- sk_X509_free(*certstack);
- return GRST_RET_FAILED;
- }
-
- while (sk_X509_INFO_num(sk))
- {
- xi=sk_X509_INFO_shift(sk);
- if (xi->x509 != NULL)
- {
- sk_X509_push(*certstack, xi->x509);
- xi->x509=NULL;
- }
- X509_INFO_free(xi);
- }
-
- if (!sk_X509_num(*certstack))
- {
- BIO_free(certbio);
- sk_X509_INFO_free(sk);
- sk_X509_free(*certstack);
- return GRST_RET_FAILED;
- }
-
- BIO_free(certbio);
- sk_X509_INFO_free(sk);
-
- return GRST_RET_OK;
-}
-
-/// Returns a Delegation ID based on hash of GRST_CRED_0, ...
-/**
- * Returns a malloc'd string with Delegation ID made by SHA1-hashing the
- * values of the compact credentials exported by mod_gridsite
- */
-
-char *GRSTx509MakeDelegationID(void)
-{
- unsigned char hash_delegation_id[EVP_MAX_MD_SIZE];
- int size_needed = 0, i, delegation_id_len;
- char cred_name[14], *cred_value, *delegation_id;
- const EVP_MD *m;
- EVP_MD_CTX ctx;
-
- OpenSSL_add_all_digests();
-
- m = EVP_sha1();
- if (m == NULL) return NULL;
-
- EVP_DigestInit(&ctx, m);
-
- for (i=0; i <= 999; ++i)
- {
- snprintf(cred_name, sizeof(cred_name), "GRST_CRED_%d", i);
- if ((cred_value = getenv(cred_name)) == NULL) break;
-
- EVP_DigestUpdate(&ctx, cred_value, strlen(cred_value));
- }
-
- EVP_DigestFinal(&ctx, hash_delegation_id, &delegation_id_len);
-
- delegation_id = malloc(17);
-
- for (i=0; i <=7; ++i)
- sprintf(&delegation_id[i*2], "%02x", hash_delegation_id[i]);
-
- delegation_id[16] = '\0';
-
- return delegation_id;
-}
-
-#if 0
-/// Return the short file name for the given delegation_id and user_dn
-/**
- * Returns a malloc'd string with the short file name (no paths) that
- * derived from the hashed delegation_id and user_dn
- *
- * File name is SHA1_HASH(DelegationID)+"-"+SHA1_HASH(DN) where DN
- * is DER encoded version of user_dn with any trailing CN=proxy removed
- * Hashes are the most significant 8 bytes, in lowercase hexadecimal.
- */
-
-char *GRSTx509MakeProxyFileName(char *delegation_id,
- STACK_OF(X509) *certstack)
-{
- int i, depth, prevIsCA = 1, IsCA, hash_name_len, delegation_id_len,
- der_name_len;
- unsigned char *der_name, *buf, hash_name[EVP_MAX_MD_SIZE],
- hash_delegation_id[EVP_MAX_MD_SIZE],
- filename[34];
- X509_NAME *subject_name;
- X509 *cert;
- const EVP_MD *m;
- EVP_MD_CTX ctx;
-
- depth = sk_X509_num(certstack);
-
- for (i=depth-1; i >= 0; --i)
- /* loop through the proxy chain starting at CA end */
- {
- if (cert = sk_X509_value(certstack, i))
- {
- IsCA = (GRSTx509IsCA(cert) == GRST_RET_OK);
-
- if (prevIsCA && !IsCA) /* the full certificate of the user */
- {
- break;
- }
- }
- }
-
- if (i < 0) return NULL; /* not found: something wrong with the chain */
-
- if ((subject_name = X509_get_subject_name(cert)) == NULL) return NULL;
-
- der_name_len = i2d_X509_NAME(X509_get_subject_name(cert), NULL);
- if (der_name_len == 0) return NULL;
-
- buf = OPENSSL_malloc(der_name_len);
- der_name = buf;
-
-
- if (!i2d_X509_NAME(X509_get_subject_name(cert), &der_name))
- {
- OPENSSL_free(der_name);
- return NULL;
- }
-
- OpenSSL_add_all_digests();
-
- m = EVP_sha1();
- if (m == NULL)
- {
- OPENSSL_free(der_name);
- return NULL;
- }
-
-
- EVP_DigestInit(&ctx, m);
- EVP_DigestUpdate(&ctx, delegation_id, strlen(delegation_id));
- EVP_DigestFinal(&ctx, hash_delegation_id, &delegation_id_len);
-
- /* lots of nasty hard coded numbers:
- "8bytes/16chars delegation ID" + "-" + "8bytes/16chars DN" */
-
- for (i=0; i <=7; ++i)
- sprintf(&filename[i*2], "%02x", hash_delegation_id[i]);
-
- filename[16] = '-';
-
- EVP_DigestInit(&ctx, m);
- EVP_DigestUpdate(&ctx, buf, der_name_len);
- EVP_DigestFinal(&ctx, hash_name, &hash_name_len);
-
- for (i=0; i <=7; ++i)
- sprintf(&filename[17 + i*2], "%02x", hash_name[i]);
-
- return strdup(filename);
-}
-#endif
-
-/// Store a GSI proxy chain in the proxy cache, along with the private key
-/**
- * Returns GRST_RET_OK on success, non-zero otherwise. The existing
- * private key with the same delegation ID and user DN is moved out of
- * the temporary cache.
- */
-
-int GRSTx509CacheProxy(char *proxydir, char *delegation_id,
- char *user_dn, char *proxychain)
-{
- int c, len = 0, i, ret;
- char *user_dn_enc, *p, *ptr, *prvkeyfile, *proxyfile;
- STACK_OF(X509) *certstack;
- BIO *certmem;
- X509 *cert;
- long ptrlen;
- FILE *ifp, *ofp;
-
- if (strcmp(user_dn, "cache") == 0) return GRST_RET_FAILED;
-
- /* find the existing private key file */
-
- prvkeyfile = GRSTx509CachedProxyKeyFind(proxydir, delegation_id, user_dn);
-
- if (prvkeyfile == NULL)
- {
- return GRST_RET_FAILED;
- }
-
- /* open it ready for later */
-
- if ((ifp = fopen(prvkeyfile, "r")) == NULL)
- {
- free(prvkeyfile);
- return GRST_RET_FAILED;
- }
-
- /* get the X509 stack */
-
- if (GRSTx509StringToChain(&certstack, proxychain) != GRST_RET_OK)
- {
- fclose(ifp);
- free(prvkeyfile);
- return GRST_RET_FAILED;
- }
-
- /* create directories if necessary, and set proxy filename */
-
- user_dn_enc = GRSThttpUrlEncode(user_dn);
-
- mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR,
- "%s/%s", proxydir, user_dn_enc);
- mkdir_printf(S_IRUSR | S_IWUSR | S_IXUSR,
- "%s/%s/%s", proxydir, user_dn_enc, delegation_id);
-
- asprintf(&proxyfile, "%s/%s/%s/userproxy.pem",
- proxydir, user_dn_enc, delegation_id);
-
- free(user_dn_enc);
-
- /* set up to write proxy file */
-
- ofp = fopen(proxyfile, "w");
- chmod(proxyfile, S_IRUSR | S_IWUSR);
- free(proxyfile);
-
- if (ofp == NULL)
- {
- fclose(ifp);
- free(prvkeyfile);
- return GRST_RET_FAILED;
- }
-
- /* write out the most recent proxy by itself */
-
- if (cert = sk_X509_value(certstack, 0))
- {
- certmem = BIO_new(BIO_s_mem());
- if (PEM_write_bio_X509(certmem, cert) == 1)
- {
- ptrlen = BIO_get_mem_data(certmem, &ptr);
- fwrite(ptr, 1, ptrlen, ofp);
- }
-
- BIO_free(certmem);
- }
-
- /* insert proxy private key, read from private key file */
-
- while ((c = fgetc(ifp)) != EOF) fputc(c, ofp);
- unlink(prvkeyfile);
- free(prvkeyfile);
-
- for (i=1; i <= sk_X509_num(certstack) - 1; ++i)
- /* loop through the proxy chain starting at 2nd most recent proxy */
- {
- if (cert = sk_X509_value(certstack, i))
- {
- certmem = BIO_new(BIO_s_mem());
- if (PEM_write_bio_X509(certmem, cert) == 1)
- {
- ptrlen = BIO_get_mem_data(certmem, &ptr);
- fwrite(ptr, 1, ptrlen, ofp);
- }
-
- BIO_free(certmem);
- }
- }
-
- sk_X509_free(certstack);
-
- if (fclose(ifp) != 0) return GRST_RET_FAILED;
- if (fclose(ofp) != 0) return GRST_RET_FAILED;
-
- return GRST_RET_OK;
-}
+++ /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->firstname = NULL;
- cred->next = NULL;
-
- //Assumed that there is only one name/value pair per credential
- GRSTgaclCredAddValue(cred, (char *) xmlNodeGetContent(attr_des->properties->next->children),
- (char *) xmlNodeGetContent(attr_val));
- }
-
- return cred;
-}
-
-static GRSTgaclEntry *GRSTxacmlEntryParse(xmlNodePtr cur)
-/*
- GRSTxacmlEntryParse - parse an entry stored in the libxml structure cur,
- returning it as a pointer or NULL on error. Also checks to see if the following
- <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;
- GRSTgaclNamevalue *p;
-
- if (cred->firstname != NULL)
- {
-
- p = cred->firstname;
-
- do {
-
- 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=p->value; *q != '\0'; ++q)
- if (*q == '<') fputs("<", fp);
- else if (*q == '>') fputs(">", fp);
- else if (*q == '&') fputs("&" , fp);
- else if (*q == '\'') fputs("'", fp);
- else if (*q == '"') fputs(""", fp);
- else fputc(*q, fp);
-
-
- fputs("</AttributeValue>\n", fp);
-
- fputs("\t\t\t\t\t\t<SubjectAttributeDesignator\n", fp);
- fputs("\t\t\t\t\t\t\tAttributeId=", fp);
- fprintf(fp, "\"%s\"\n", cred->type);
- fputs("\t\t\t\t\t\t\tDataType=", fp);
- fprintf(fp, "\"%s\"/>\n", p->name);
- fputs("\t\t\t\t\t</SubjectMatch>\n", fp);
- fputs("\t\t\t\t</Subject>\n", fp);
- p = (GRSTgaclNamevalue *) p->next;
- } while (p != NULL);
-
- }
- 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-6, Andrew McNab, University of Manchester
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- o Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
- o Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*---------------------------------------------------------------*
- * For more about GridSite: http://www.gridsite.org/ *
- *---------------------------------------------------------------*/
-
-#ifndef VERSION
-#define VERSION "0.0.0"
-#endif
-
-#define _GNU_SOURCE
-
-#include <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;
- CURL *easyhandle;
- const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
- char *s;
- struct grst_index_blob rawindex;
- struct grst_dir_list *list;
- struct grst_header_data header_data;
- struct tm modified_tm;
- time_t now;
-
- time(&now);
-
- header_data.common_data = common_data;
-
- easyhandle = curl_easy_init();
-
- curl_easy_setopt(easyhandle, CURLOPT_USERAGENT, common_data->useragent);
- if (common_data->verbose > 1)
- curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1);
-
- curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, &header_data);
- curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, headers_callback);
-
- curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, common_data->errorbuf);
-
- set_std_opts(easyhandle, common_data);
-
- for (isrc=0; sources[isrc] != NULL; ++isrc)
- {
- if (common_data->verbose > 0)
- fprintf(stderr, "Listing %s\n", sources[isrc]);
-
- if (sources[1] != NULL) printf("\n%s:\n", sources[isrc]);
-
- curl_easy_setopt(easyhandle, CURLOPT_URL, sources[isrc]);
-
- if (sources[isrc][strlen(sources[isrc])-1] == '/')
- {
- isdir = 1;
- curl_easy_setopt(easyhandle,CURLOPT_WRITEFUNCTION,rawindex_callback);
- curl_easy_setopt(easyhandle,CURLOPT_WRITEDATA,(void *) &rawindex);
- curl_easy_setopt(easyhandle,CURLOPT_NOBODY,0);
- rawindex.text = NULL;
- rawindex.used = 0;
- rawindex.allocated = 0;
- }
- else
- {
- isdir = 0;
- curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, NULL);
- curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, NULL);
- curl_easy_setopt(easyhandle, CURLOPT_NOBODY, 1);
- }
-
- header_data.gridhttppasscode = NULL;
- header_data.length_set = 0;
- header_data.modified_set = 0;
- header_data.retcode = 0;
- thiserror = curl_easy_perform(easyhandle);
-
- if ((thiserror != 0) ||
- (header_data.retcode >= 300))
- {
- fprintf(stderr, "... curl error: %s (%d), HTTP error: %d\n",
- common_data->errorbuf, thiserror, header_data.retcode);
-
- if (thiserror != 0) anyerror = thiserror;
- else anyerror = header_data.retcode;
- }
- else if (isdir)
- {
- if (common_data->verbose > 0)
- fprintf(stderr, "... OK (%d)\n", header_data.retcode);
-
- rawindex.text[rawindex.used] = '\0';
-
- list = index_to_dir_list(rawindex.text, sources[isrc]);
- ilast = -1;
-
- for (i=0; list[i].filename != NULL; ++i)
- {
- if (list[i].filename[0] == '.') continue;
-
- if (strncmp(list[i].filename, "mailto:", 7) == 0) continue;
-
- if ((ilast >= 0) &&
- (strcmp(list[i].filename, list[ilast].filename) == 0))
- continue;
- ilast=i;
-
- if (islonglist)
- {
- if (!list[i].length_set || !list[i].modified_set)
- {
- curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION,
- NULL);
- curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, NULL);
- curl_easy_setopt(easyhandle, CURLOPT_NOBODY, 1);
-
- asprintf(&s, "%s%s", sources[isrc], list[i].filename);
- curl_easy_setopt(easyhandle, CURLOPT_URL, s);
-
- header_data.gridhttppasscode = NULL;
- header_data.length_set = 0;
- header_data.modified_set = 0;
- header_data.retcode = 0;
- thiserror = curl_easy_perform(easyhandle);
- free(s);
-
- if ((thiserror == 0) &&
- (header_data.retcode >= 200) &&
- (header_data.retcode <= 299))
- {
- if (header_data.length_set)
- {
- list[i].length_set = 1;
- list[i].length = header_data.length;
- }
-
- if (header_data.modified_set)
- {
- list[i].modified_set = 1;
- list[i].modified = header_data.modified;
- }
- }
- }
-
- if (list[i].length_set) printf("%10ld ", list[i].length);
- else fputs(" ? ", stdout);
-
- if (list[i].modified_set)
- {
- localtime_r(&(list[i].modified), &modified_tm);
-
- if (list[i].modified < now - 15552000)
- printf("%s %2d %4d ",
- months[modified_tm.tm_mon],
- modified_tm.tm_mday,
- modified_tm.tm_year + 1900);
- else printf("%s %2d %02d:%02d ",
- months[modified_tm.tm_mon],
- modified_tm.tm_mday,
- modified_tm.tm_hour,
- modified_tm.tm_min);
- }
- else fputs(" ? ? ? ", stdout);
- }
-
- puts(list[i].filename);
- }
- }
- else
- {
- if (islonglist)
- {
- printf("%10ld ", header_data.length);
-
- localtime_r(&(header_data.modified), &modified_tm);
-
- if (header_data.modified < now - 15552000)
- printf("%s %2d %4d ",
- months[modified_tm.tm_mon],
- modified_tm.tm_mday,
- modified_tm.tm_year + 1900);
- else printf("%s %2d %02d:%02d ",
- months[modified_tm.tm_mon],
- modified_tm.tm_mday,
- modified_tm.tm_hour,
- modified_tm.tm_min);
- }
-
- puts(sources[isrc]);
- }
- }
-
- curl_easy_cleanup(easyhandle);
-
- return anyerror;
-}
-
-#if (LIBCURL_VERSION_NUM < 0x070908)
-char *make_tmp_ca_roots(char *dir)
-/* libcurl before 7.9.8 doesnt support CURLOPT_CAPATH and the directory,
- so we make a temporary file with the concatenated CA root certs: that
- is, all the files in that directory which end in .0 */
-{
- int ofd, ifd, c;
- size_t size;
- char tmp_ca_roots[] = "/tmp/.ca-roots-XXXXXX", buffer[4096], *s;
- DIR *rootsDIR;
- struct dirent *root_ent;
-
- if ((rootsDIR = opendir(dir)) == NULL) return NULL;
-
- if ((ofd = mkstemp(tmp_ca_roots)) == -1)
- {
- closedir(rootsDIR);
- return NULL;
- }
-
- while ((root_ent = readdir(rootsDIR)) != NULL)
- {
- if ((root_ent->d_name[0] != '.') &&
- (strlen(root_ent->d_name) > 2) &&
- (strncmp(&(root_ent->d_name[strlen(root_ent->d_name)-2]),
- ".0", 2) == 0))
- {
- asprintf(&s, "%s/%s", dir, root_ent->d_name);
- ifd = open(s, O_RDONLY);
- free(s);
-
- if (ifd != -1)
- {
- while ((size = read(ifd, buffer, sizeof(buffer))) > 0)
- write(ofd, buffer, size);
- close(ifd);
- }
- }
- }
-
- closedir(rootsDIR);
-
- if (close(ofd) == 0) return strdup(tmp_ca_roots);
-
- unlink(tmp_ca_roots); /* try to clean up */
-
- return NULL;
-}
-#endif
-
-void printsyntax(char *argv0)
-{
- char *p;
-
- p = rindex(argv0, '/');
- if (p != NULL) ++p;
- else p = argv0;
-
- fprintf(stderr, "%s [options] Source-URL[s] [Destination URL]\n"
- "%s is one of a set of clients to fetch files or directory listings\n"
-"from remote servers using HTTP or HTTPS, or to put or delete files or\n"
-"directories onto remote servers using HTTPS. htcp is similar to scp(1)\n"
-"but uses HTTP/HTTPS rather than ssh as its transfer protocol.\n"
-"See the htcp(1) or http://www.gridsite.org/ for details.\n"
-"(Version: %s)\n", p, p, VERSION);
-}
-
-struct option long_options[] = { {"verbose", 0, 0, 'v'},
- {"cert", 1, 0, 0},
- {"key", 1, 0, 0},
- {"capath", 1, 0, 0},
- {"delete", 0, 0, 0},
- {"list", 0, 0, 0},
- {"long-list", 0, 0, 0},
- {"mkdir", 0, 0, 0},
- {"no-verify", 0, 0, 0},
- {"anon", 0, 0, 0},
- {"grid-http", 0, 0, 0},
- {"move", 0, 0, 0},
- {"ping", 0, 0, 0},
- {"groups", 1, 0, 0},
- {"timeout", 1, 0, 0},
- {"sitecast", 0, 0, 0},
- {"domain", 1, 0, 0},
- {"find", 0, 0, 0},
- {"rmtcp", 0, 0, 0},
- {"conf", 1, 0, 0},
- {0, 0, 0, 0} };
-
-int update_common_data(struct grst_stream_data *, int, char *);
-
-void parse_conf(struct grst_stream_data *common_data_ptr, char *conf_file)
-{
- int option_index;
- char line[1001], *p;
- FILE *fp;
-
- fp = fopen(conf_file, "r");
- if (fp == NULL)
- {
- if (common_data_ptr->verbose)
- fprintf(stderr, "Failed to open configuration file %s\n", conf_file);
- return;
- }
-
- if (common_data_ptr->verbose)
- fprintf(stderr, "Opened configuration file %s\n", conf_file);
-
- while (fgets(line, sizeof(line), fp) != NULL)
- {
- if ((p = index(line, '\n')) != NULL) *p = '\0';
-
- for (option_index=0;
- long_options[option_index].name != NULL; ++option_index)
- {
- if (long_options[option_index].has_arg &&
- (strncmp(line, long_options[option_index].name,
- strlen(long_options[option_index].name)) == 0) &&
- (line[strlen(long_options[option_index].name)] == '='))
- {
- update_common_data(common_data_ptr, option_index,
- strdup(&line[strlen(long_options[option_index].name) + 1]));
- break;
- }
-
- if (!long_options[option_index].has_arg &&
- (strcmp(line, long_options[option_index].name) == 0))
- {
- update_common_data(common_data_ptr, option_index, "");
- break;
- }
- }
- }
-
- fclose(fp);
-}
-
-int update_common_data(struct grst_stream_data *common_data_ptr,
- int option_index, char *optarg)
-{
- if (option_index == 1) common_data_ptr->cert = optarg;
- else if (option_index == 2) common_data_ptr->key = optarg;
- else if (option_index == 3) common_data_ptr->capath = optarg;
- else if (option_index == 4) common_data_ptr->method = HTCP_DELETE;
- else if (option_index == 5) common_data_ptr->method = HTCP_LIST;
- else if (option_index == 6) common_data_ptr->method = HTCP_LONGLIST;
- else if (option_index == 7) common_data_ptr->method = HTCP_MKDIR;
- else if (option_index == 8) common_data_ptr->noverify = 1;
- else if (option_index == 9) common_data_ptr->anonymous = 1;
- else if (option_index ==10) common_data_ptr->gridhttp = 1;
- else if (option_index ==11) common_data_ptr->method = HTCP_MOVE;
- else if (option_index ==12) common_data_ptr->method = HTCP_PING;
- else if (option_index ==13) common_data_ptr->groups = optarg;
- else if (option_index ==14) common_data_ptr->timeout = atoi(optarg);
- else if (option_index ==15) common_data_ptr->sitecast = 1;
- else if (option_index ==16) { common_data_ptr->sitecast = 1;
- common_data_ptr->domain = optarg; }
- else if (option_index ==17) common_data_ptr->method = HTCP_FIND;
- else if (option_index ==18) { printf("OK\n");common_data_ptr->method = HTCP_RMTCP;}
- /* option_index == 19 is used by the --conf command line-only option */
- else return GRST_RET_FAILED;
-
- return GRST_RET_OK;
-}
-
-int main(int argc, char *argv[])
-{
- char **sources, *destination = NULL, *executable, *p, *htcp_conf;
- int c, i, option_index, anyerror;
- struct stat statbuf;
- struct grst_stream_data common_data;
- struct passwd *userpasswd;
-
-#if (LIBCURL_VERSION_NUM < 0x070908)
- char *tmp_ca_roots = NULL;
-#endif
-
- if (argc == 1)
- {
- printsyntax(argv[0]);
- return 0;
- }
-
- common_data.cert = NULL;
- common_data.key = NULL;
- common_data.capath = NULL;
- common_data.method = 0;
- common_data.errorbuf = malloc(CURL_ERROR_SIZE);
- asprintf(&(common_data.useragent),
- "htcp/%s (http://www.gridsite.org/)", VERSION);
- common_data.verbose = 0;
- common_data.noverify = 0;
- common_data.anonymous = 0;
- common_data.gridhttp = 0;
-
- common_data.groups = NULL;
- common_data.timeout = 0;
- common_data.sitecast = 0;
- common_data.domain = NULL;
-
- if ((argc > 1) && ((strcmp(argv[1], "--verbose") == 0) ||
- (strcmp(argv[1], "-v") == 0))) common_data.verbose = 1;
-
- /* examine any configuration files */
-
- parse_conf(&common_data, HTCP_HOST_CONF);
-
- userpasswd = getpwuid(geteuid());
- asprintf(&htcp_conf, "%s/%s", userpasswd->pw_dir, HTCP_USER_CONF);
- parse_conf(&common_data, htcp_conf);
- free(htcp_conf);
-
- htcp_conf = getenv("HTCP_CONF");
- if (htcp_conf != NULL) parse_conf(&common_data, htcp_conf);
-
- common_data.verbose = 0;
-
- while (1)
- {
- option_index = 0;
-
- c = getopt_long(argc, argv, "v", long_options, &option_index);
-
- if (c == -1) break;
- else if (c == 0)
- {
- if (option_index == 19) parse_conf(&common_data, optarg);
- else update_common_data(&common_data, option_index, optarg);
- }
- else if (c == 'v') ++(common_data.verbose);
- }
-
- if (common_data.verbose > 0)
- {
- p = rindex(argv[0], '/');
- if (p != NULL) ++p;
- else p = argv[0];
- fprintf(stderr, "%s version %s\n", p, VERSION);
- }
-
- if (common_data.anonymous) /* prevent any use of user certs */
- {
- common_data.cert = NULL;
- common_data.key = NULL;
- }
- else if ((common_data.cert == NULL) && (common_data.key != NULL))
- common_data.cert = common_data.key;
- else if ((common_data.cert != NULL) && (common_data.key == NULL))
- common_data.key = common_data.cert;
- else if ((common_data.cert == NULL) && (common_data.key == NULL))
- {
- common_data.cert = getenv("X509_USER_PROXY");
- if (common_data.cert != NULL) common_data.key = common_data.cert;
- else
- {
- asprintf(&(common_data.cert), "/tmp/x509up_u%d", geteuid());
-
- /* one fine day, we will check the proxy file for expiry too ... */
-
- if (stat(common_data.cert, &statbuf) == 0)
- common_data.key = common_data.cert;
- else
- {
- common_data.cert = getenv("X509_USER_CERT");
- common_data.key = getenv("X509_USER_KEY");
-
- if ((common_data.cert == NULL) &&
- (userpasswd != NULL) &&
- (userpasswd->pw_dir != NULL))
- asprintf(&(common_data.cert), "%s/.globus/usercert.pem",
- userpasswd->pw_dir);
-
- if ((common_data.key == NULL) &&
- (userpasswd != NULL) &&
- (userpasswd->pw_dir != NULL))
- asprintf(&(common_data.key), "%s/.globus/userkey.pem",
- userpasswd->pw_dir);
- }
- }
- }
-
- if (common_data.capath == NULL) common_data.capath = getenv("X509_CERT_DIR");
-
- if (common_data.capath == NULL)
- common_data.capath = "/etc/grid-security/certificates";
-
-#if (LIBCURL_VERSION_NUM < 0x070908)
- /* libcurl before 7.9.8 doesnt support CURLOPT_CAPATH and the directory */
-
- if ((common_data.capath != NULL) &&
- (stat(common_data.capath, &statbuf) == 0) && S_ISDIR(statbuf.st_mode))
- {
- tmp_ca_roots = make_tmp_ca_roots(common_data.capath);
- common_data.capath = tmp_ca_roots;
- }
-#endif
-
- executable = rindex(argv[0], '/');
- if (executable != NULL) executable++;
- else executable = argv[0];
-
- if (common_data.method == 0) /* command-line options override exec name */
- {
- if (strcmp(executable,"htls")==0) common_data.method=HTCP_LIST;
- else if (strcmp(executable,"htll")==0) common_data.method=HTCP_LONGLIST;
- else if (strcmp(executable,"htrm")==0) common_data.method=HTCP_DELETE;
- else if (strcmp(executable,"htmkdir")==0) common_data.method=HTCP_MKDIR;
- else if (strcmp(executable,"htmv")==0) common_data.method=HTCP_MOVE;
- else if (strcmp(executable,"htping")==0) common_data.method=HTCP_PING;
- else if (strcmp(executable,"htfind")==0) common_data.method=HTCP_FIND;
- else if (strcmp(executable,"htrmtcp")==0) common_data.method=HTCP_RMTCP;
- }
-
- if (common_data.method == HTCP_PING)
- {
- if (common_data.groups != NULL) return do_ping(&common_data);
-
- fprintf(stderr, "Must specify at least one multicast group\n\n");
- printsyntax(argv[0]);
- return CURLE_FAILED_INIT;
- }
-
- if ((common_data.method == HTCP_DELETE) ||
- (common_data.method == HTCP_LIST) ||
- (common_data.method == HTCP_FIND) ||
- (common_data.method == HTCP_MKDIR) ||
- (common_data.method == HTCP_LONGLIST))
- {
- if (optind >= argc)
- {
- fprintf(stderr, "Must give at least 1 non-option argument\n\n");
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- sources = (char **) malloc(sizeof(char *) * (1 + argc - optind));
- for (i=0; i < argc - optind; ++i)
- {
- sources[i] = argv[optind + i];
-
- if ((common_data.method == HTCP_MKDIR) &&
- (sources[i][strlen(sources[i])-1] != '/'))
- {
- fprintf(stderr, "Argument \"%s\" is not a "
- "directory URL (no trailing /)\n\n", sources[i]);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
- }
-
- sources[i] = NULL;
-
- if (common_data.method == HTCP_DELETE)
- anyerror = do_deletes(sources, &common_data);
- else if (common_data.method == HTCP_MKDIR)
- anyerror = do_mkdirs(sources, &common_data);
- else if (common_data.method == HTCP_FIND)
- anyerror = do_finds(sources, &common_data, argc - optind);
- else if (common_data.method == HTCP_LONGLIST)
- anyerror = do_listings(sources, &common_data, 1);
- else anyerror = do_listings(sources, &common_data, 0);
-
- if (anyerror > 99) anyerror = CURLE_HTTP_RETURNED_ERROR;
-
- return anyerror;
- }
-
- if (common_data.method == HTCP_MOVE)
- {
- if (optind >= argc - 1)
- {
- fputs("Must give exactly 2 non-option arguments\n\n", stderr);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- anyerror = do_move(argv[optind], argv[optind + 1], &common_data);
-
- if (anyerror > 99) anyerror = CURLE_HTTP_RETURNED_ERROR;
-
- return anyerror;
- }
-
- if (optind >= argc - 1)
- {
- fputs("Must give at least 2 non-option arguments\n\n", stderr);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- sources = (char **) malloc(sizeof(char *) * (argc - optind));
-
- for (i=0; i < (argc - optind - 1); ++i)
- {
- if (strncmp(argv[optind + i], "file:", 5) == 0)
- sources[i] = strdup(&argv[optind + i][5]);
- else sources[i] = strdup(argv[optind + i]);
-
- if (sources[i][0] == '\0')
- {
- fprintf(stderr, "Source argument %d is empty\n\n", i + 1);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
- }
-
- sources[i] = NULL;
-
- if (strncmp(argv[optind+i], "file:", 5) == 0)
- {
- if ((argv[optind+i][strlen(argv[optind+i]) - 1] != '/') &&
- (stat(&argv[optind + i][5], &statbuf) == 0) &&
- S_ISDIR(statbuf.st_mode))
- asprintf(&destination, "%s/", &argv[optind + i][5]);
- else destination = strdup(&argv[optind + i][5]);
- }
- else if ((strncmp(argv[optind+i], "http://", 7) != 0) &&
- (strncmp(argv[optind+i], "https://", 8) != 0))
- {
- if ((argv[optind+i][strlen(argv[optind+i]) - 1] != '/') &&
- (stat(argv[optind+i], &statbuf) == 0) &&
- S_ISDIR(statbuf.st_mode))
- asprintf(&destination, "%s/", argv[optind+i]);
- else destination = strdup(argv[optind+i]);
- }
- else destination = strdup(argv[optind+i]);
-
- if (destination[0] == '\0')
- {
- fputs("Destination argument is empty\n\n", stderr);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- if ((argc - optind > 2) && (destination[strlen(destination)-1] != '/'))
- {
- fputs("For multiple sources, destination "
- "must be a directory (end in /)\n\n", stderr);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- // remote file copy
- if ( common_data.method == HTCP_RMTCP )
- {
- anyerror = do_rmtcp(sources, destination, &common_data);
- fprintf(stdout, "The file has been moved!\n");
- // printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- if ((strncmp(destination, "http://", 7) == 0) ||
- (strncmp(destination, "https://", 8) == 0))
- common_data.method = HTCP_PUT;
- else common_data.method = HTCP_GET;
-
- for (i=0; sources[i] != NULL; ++i)
- {
- if ((common_data.method == HTCP_PUT) &&
- ((strncmp(sources[i], "http://", 7) == 0) ||
- (strncmp(sources[i], "https://", 8) == 0)))
- {
- fputs("Cannot have both source and destination remote\n\n",stderr);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- if (common_data.method == HTCP_GET)
- {
- if ((strncmp(sources[i], "http://", 7) != 0) &&
- (strncmp(sources[i], "https://", 8) != 0))
- {
- fputs("Cannot have both source and "
- "destination local (for now)\n\n",stderr);
- printsyntax(argv[0]);
- return CURLE_URL_MALFORMAT;
- }
-
- if ((common_data.sitecast) &&
- ((common_data.domain == NULL) ||
-
- ((strncmp(sources[i], "http://", 7) == 0) &&
- (strncmp(&sources[i][7], common_data.domain,
- strlen(common_data.domain)) == 0) &&
- ((sources[i][7+strlen(common_data.domain)] == ':') ||
- (sources[i][7+strlen(common_data.domain)] == '/'))) ||
-
- ((strncmp(sources[i], "https://", 8) == 0) &&
- (strncmp(&sources[i][8], common_data.domain,
- strlen(common_data.domain)) == 0) &&
- ((sources[i][8+strlen(common_data.domain)] == ':') ||
- (sources[i][8+strlen(common_data.domain)] == '/')))))
- {
- translate_sitecast_url(&sources[i], &common_data);
- }
- }
- }
-
- anyerror = do_copies(sources, destination, &common_data);
- if (anyerror > 99) anyerror = CURLE_HTTP_RETURNED_ERROR;
-
- return anyerror;
-}
+++ /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)
- {
- if (GRSTx509CreateProxyRequest(&reqtxt, &keytxt, NULL) != GRST_RET_OK)
- {
- fprintf(stderr, "Failed to create internal proxy cert request\n");
- return 1;
- }
-
- if (GRSTx509MakeProxyCert(&proxychain, NULL, reqtxt, cert, key, minutes)
- != GRST_RET_OK)
- {
- fprintf(stderr, "Failed to sign internal proxy cert request\n");
- return 2;
- }
-
- if (GRSTx509StringToChain(&x509_certstack, proxychain) != GRST_RET_OK)
- {
- fprintf(stderr, "Failed to convert internal proxy chain\n");
- return 3;
- }
-
- if (x509_cert = sk_X509_value(x509_certstack, 0))
- {
- certmem = BIO_new(BIO_s_mem());
- if (PEM_write_bio_X509(certmem, x509_cert) == 1)
- {
- ptrlen = BIO_get_mem_data(certmem, &ptr);
- fwrite(ptr, 1, ptrlen, stdout);
- }
-
- BIO_free(certmem);
- }
-
- fputs(keytxt, stdout);
-
- for (i=1; i <= sk_X509_num(x509_certstack) - 1; ++i)
- /* loop through the proxy chain starting at 2nd most recent proxy */
- {
- if (x509_cert = sk_X509_value(x509_certstack, i))
- {
- certmem = BIO_new(BIO_s_mem());
- if (PEM_write_bio_X509(certmem, x509_cert) == 1)
- {
- ptrlen = BIO_get_mem_data(certmem, &ptr);
- fwrite(ptr, 1, ptrlen, stdout);
- }
-
- BIO_free(certmem);
- }
- }
-
- sk_X509_free(x509_certstack);
-
- return 0;
- }
- else if (method == HTPROXY_INFO)
- {
- if (cert != NULL)
- {
- if (verbose) fprintf(stderr, "Getting proxy info from %s\n", cert);
-
- ifp = fopen(cert, "r");
- if (ifp == NULL)
- {
- fprintf(stderr, "Failed to open proxy file\n");
- return 2;
- }
- }
- else
- {
- if (verbose) fprintf(stderr, "Getting proxy info from stdin\n");
- ifp = stdin;
- }
-
- ptrlen = 4096;
- ptr = malloc(ptrlen);
- i = 0;
-
- while ((c = fgetc(ifp)) != EOF)
- {
- ptr[i] = c;
- ++i;
-
- if (i >= ptrlen)
- {
- ptrlen += 4096;
- ptr = realloc(ptr, ptrlen);
- }
- }
-
- ptr[i] = '\0';
- if (cert != NULL) fclose(ifp);
-
- if ((GRSTx509StringToChain(&x509_certstack, ptr) != GRST_RET_OK) ||
- (x509_certstack == NULL))
- {
- fprintf(stderr, "Failed to parse proxy file for certificate chain\n");
- free(ptr);
- return 2;
- }
-
- 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->start)));
- printf(" Finish : %s", ctime(&(grst_cert->finish)));
-
- 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: 1%(sed 's/^\([A-Z]\)[^ ]* \([A-Z]\)[^0-9]*\([0-9][^ ]*\).*/\1\2\3/g' /etc/redhat-release | sed 's/[^A-Z,a-z,0-9]//g')
-Summary: GridSite
-License: Modified BSD
-Group: System Environment/Daemons
-Source: %{name}-%{version}.src.tar.gz
-Prefix: ${MYPREFIX:-/usr}
-URL: http://www.gridsite.org/
-Vendor: GridPP
-Requires: libxml2
-#Buildrequires: libxml2-devel,curl-ssl-devel,httpd-devel
-Packager: Andrew McNab <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
-
-%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} \
-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}/share/doc/gridsite-${MINOR_VERSION:-1.x}
-
-%files devel
-%attr(-, root, root) %{prefix}/include/gridsite.h
-%attr(-, root, root) %{prefix}/include/gridsite-gacl.h
-%attr(-, root, root) %{prefix}/lib/libgridsite.a
-%attr(-, root, root) %{prefix}/lib/libgridsite_globus.a
-
-%files apache
-%attr(-, root, root) %{prefix}/share/man/man8/mod_gridsite.8.gz
-%attr(-, root, root) %{prefix}/lib/httpd/modules/mod_gridsite.so
-%attr(-, root, root) %{prefix}/sbin/real-gridsite-admin.cgi
-%attr(-, root, root) %{prefix}/sbin/gridsite-copy.cgi
-
-%files commands
-%attr(-, root, root) %{prefix}/bin/htcp
-%attr(-, root, root) %{prefix}/bin/htls
-%attr(-, root, root) %{prefix}/bin/htll
-%attr(-, root, root) %{prefix}/bin/htrm
-%attr(-, root, root) %{prefix}/bin/htmkdir
-%attr(-, root, root) %{prefix}/bin/htmv
-%attr(-, root, root) %{prefix}/bin/htping
-%attr(-, root, root) %{prefix}/bin/htfind
-%attr(-, root, root) %{prefix}/bin/urlencode
-%attr(-, root, root) %{prefix}/bin/findproxyfile
-%attr(-, root, root) %{prefix}/share/man/man1/htcp.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/htrm.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/htls.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/htll.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/htmkdir.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/htmv.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/htping.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/htfind.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/urlencode.1.gz
-%attr(-, root, root) %{prefix}/share/man/man1/findproxyfile.1.gz
-
-%files gsexec
-%attr(4510, root, apache) %{prefix}/sbin/gsexec
-%attr(-, root, root) %{prefix}/share/man/man8/gsexec.8.gz
-EOF
-
-if [ $have_fuse ] ; then
-
-cat <<EOF >>gridsite.spec
-%package slashgrid
-Group: Applications/Internet
-Summary: slashgrid daemon
-Requires: curl,fuse,fuse-libs
-
-%description slashgrid
-SlashGrid daemon
-
-%post slashgrid
-mkdir -p /grid
-
-%preun slashgrid
-/sbin/service slashgrid stop ; :
-
-%files slashgrid
-%attr(0744, root, root) %{prefix}/sbin/slashgrid
-%attr(0744, root, root) /etc/rc.d/init.d/slashgrid
-%attr(0700, root, root) /var/spool/slashgrid
-%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-6, Andrew McNab, Shiv Kaushal, Joseph Dada,
- and Yibiao Li, University of Manchester. All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- o Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
- o Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
-
- This program includes code from dav_parse_range() from Apache mod_dav.c,
- and associated code contributed by David O Callaghan
-
- Copyright 2000-2005 The Apache Software Foundation or its licensors, as
- applicable.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*------------------------------------------------------------------*
- * This program is part of GridSite: http://www.gridsite.org/ *
- *------------------------------------------------------------------*/
-
-#ifndef VERSION
-#define VERSION "x.x.x"
-#endif
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#include <apr_strings.h>
-#include <apr_tables.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 envs;
- int format;
- int indexes;
- char *indexheader;
- int gridsitelink;
- char *adminfile;
- char *adminuri;
- char *helpuri;
- char *dnlists;
- char *dnlistsuri;
- char *adminlist;
- int gsiproxylimit;
- char *unzip;
- char *methods;
- char *editable;
- char *headfile;
- char *footfile;
- int gridhttp;
- char *aclformat;
- char *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 *make_admin_footer(request_rec *r, mod_gridsite_dir_cfg *conf,
- int isdirectory)
-/*
- make string holding last modified text and admin links
-*/
-{
- char *out, *https, *p, *dn = NULL, *file = NULL, *permstr = NULL,
- *temp, modified[99], *dir_uri, *grst_cred_0 = NULL;
- GRSTgaclPerm perm = GRST_PERM_NONE;
- struct tm mtime_tm;
- time_t mtime_time;
-
- https = (char *) apr_table_get(r->subprocess_env, "HTTPS");
-
- dir_uri = apr_pstrdup(r->pool, r->uri);
- p = rindex(dir_uri, '/');
-
- if (p == NULL) return "";
-
- file = apr_pstrdup(r->pool, &p[1]);
- p[1] = '\0';
- /* dir_uri always gets both a leading and a trailing slash */
-
- out = apr_pstrdup(r->pool, "<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->connection->notes != NULL)
- grst_cred_0 = (char *)
- apr_table_get(r->connection->notes, "GRST_CRED_0");
-
- if ((grst_cred_0 != NULL) &&
- (strncmp(grst_cred_0, "X509USER ", sizeof("X509USER")) == 0))
- {
- p = index(grst_cred_0, ' ');
- if (p != NULL)
- {
- p = index(++p, ' ');
- if (p != NULL)
- {
- p = index(++p, ' ');
- if (p != NULL)
- {
- p = index(++p, ' ');
- if (p != NULL) dn = p;
- }
- }
- }
- }
-
- if (dn != NULL)
- {
- temp = apr_psprintf(r->pool, "You are %s<br>\n", dn);
- out = apr_pstrcat(r->pool, out, temp, NULL);
-
- if (r->notes != NULL)
- permstr = (char *) apr_table_get(r->notes, "GRST_PERM");
-
- if ((permstr != NULL) &&
- (conf->adminuri != NULL) &&
- (conf->adminuri[0] != '\0') &&
- (conf->adminfile != NULL) &&
- (conf->adminfile[0] != '\0'))
- {
- sscanf(permstr, "%d", &perm);
-
- if (!isdirectory &&
- GRSTgaclPermHasWrite(perm) &&
- (strncmp(file, GRST_HIST_PREFIX,
- sizeof(GRST_HIST_PREFIX) - 1) != 0))
- {
- temp = apr_psprintf(r->pool,
- "<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);
- }
- }
- }
-
- 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->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 **** */
-
- /* first make a buffer big enough to hold path names we want to try */
- fd = -1;
- s = apr_palloc(r->pool,
- strlen(r->filename) + strlen(conf->headfile) + 1);
- strcpy(s, r->filename);
-
- for (;;)
- {
- p = rindex(s, '/');
- if (p == NULL) break; /* failed to find one */
- p[1] = '\0';
- strcat(p, conf->headfile);
-
- fd = open(s, O_RDONLY);
- if (fd != -1) break; /* found one */
-
- *p = '\0';
- }
-
- if (fd == -1) /* not found, so set up not to output one */
- {
- head_formatted = apr_pstrdup(r->pool, "");
- header_formatted = apr_pstrdup(r->pool, "");
- body_formatted = buf;
- }
- else /* found a header file, so set up head and body to surround it */
- {
- fstat(fd, &statbuf);
- header_formatted = apr_palloc(r->pool, statbuf.st_size + 1);
- read(fd, header_formatted, statbuf.st_size);
- header_formatted[statbuf.st_size] = '\0';
- close(fd);
-
- p = strstr(buf, "<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 **** */
-
- /* 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 set up empty default */
- {
- footer_formatted = apr_pstrdup(r->pool, "");
- }
- else /* found a footer, so set up to use it */
- {
- fstat(fd, &statbuf);
- footer_formatted = apr_palloc(r->pool, statbuf.st_size + 1);
- read(fd, footer_formatted, statbuf.st_size);
- footer_formatted[statbuf.st_size] = '\0';
- close(fd);
- }
-
- /* **** can now calculate the Content-Length and output headers **** */
-
- length = strlen(head_formatted) + strlen(header_formatted) +
- strlen(body_formatted) + strlen(admin_formatted) +
- strlen(footer_formatted);
-
- ap_set_content_length(r, length);
- ap_set_content_type(r, "text/html");
-
- /* ** output the HTTP body (HTML Head+Body) ** */
-
- ap_rputs(head_formatted, r);
- ap_rputs(header_formatted, r);
- ap_rputs(body_formatted, r);
- ap_rputs(admin_formatted, r);
- ap_rputs(footer_formatted, r);
-
- return OK;
-}
-
-int html_dir_list(request_rec *r, mod_gridsite_dir_cfg *conf)
-/*
- output HTML directory listing, with level of formatting controlled
- by GridSiteHtmlFormat/conf->format
-*/
-{
- int i, fd, n, nn;
- char *buf, *p, *s, *head_formatted, *header_formatted,
- *body_formatted, *admin_formatted, *footer_formatted, *temp,
- modified[99], *d_namepath, *indexheaderpath, *indexheadertext;
- size_t length;
- struct stat statbuf;
- struct tm mtime_tm;
- struct dirent **namelist;
-
- if (r->finfo.filetype == APR_NOFILE) return HTTP_NOT_FOUND;
-
- /* Put in Delegation service header if required */
- if (conf->delegationuri) delegation_header(r, conf);
-
- head_formatted = apr_psprintf(r->pool,
- "<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);
-
- 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",
- namelist[n]->d_name, statbuf.st_size, statbuf.st_mtime,
- namelist[n]->d_name,
- 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",
- namelist[n]->d_name, statbuf.st_size, statbuf.st_mtime,
- namelist[n]->d_name,
- statbuf.st_size, modified);
-
- body_formatted = apr_pstrcat(r->pool,body_formatted,temp,NULL);
- }
-
- free(namelist[n]);
- }
-
- free(namelist);
-
- body_formatted = apr_pstrcat(r->pool, body_formatted, "</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;
-}
-
-int http_gridhttp(request_rec *r, mod_gridsite_dir_cfg *conf)
-{
- int i;
- char *httpurl, *filetemplate, *cookievalue, *envname_i,
- *grst_cred_i, expires_str[APR_RFC822_DATE_LEN];
- apr_uint64_t gridauthcookie;
- apr_table_t *env;
- apr_time_t expires_time;
- apr_file_t *fp;
-
- /* create random cookie and gridauthcookie file */
-
- if (apr_generate_random_bytes((char *) &gridauthcookie,
- sizeof(gridauthcookie))
- != APR_SUCCESS) return HTTP_INTERNAL_SERVER_ERROR;
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Generated GridHTTP passcode %016llx", gridauthcookie);
-
- filetemplate = apr_psprintf(r->pool, "%s/passcode-%016llxXXXXXX",
- ap_server_root_relative(r->pool,
- sessionsdir),
- gridauthcookie);
-
- if (apr_file_mktemp(&fp,
- filetemplate,
- APR_CREATE | APR_WRITE | APR_EXCL,
- r->pool)
- != APR_SUCCESS) return HTTP_INTERNAL_SERVER_ERROR;
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Created passcode file %s", filetemplate);
-
- expires_time = apr_time_now() + apr_time_from_sec(300);
- /* passcode cookies are valid for only 5 mins! */
-
- apr_file_printf(fp,
- "expires=%lu\ndomain=%s\npath=%s\nonetime=yes\nmethod=%s\n",
- (time_t) apr_time_sec(expires_time),
- r->hostname, r->uri, r->method);
- /* above variables are evaluated in order and method= MUST be last! */
-
- for (i=0; ; ++i)
- {
- envname_i = apr_psprintf(r->pool, "GRST_CRED_%d", i);
- if (grst_cred_i = (char *)
- apr_table_get(r->connection->notes, envname_i))
- {
- apr_file_printf(fp, "%s=%s\n", envname_i, grst_cred_i);
- }
- else break; /* GRST_CRED_i are numbered consecutively */
- }
-
- if (apr_file_close(fp) != APR_SUCCESS)
- {
- apr_file_remove(filetemplate, r->pool); /* try to clean up */
- return HTTP_INTERNAL_SERVER_ERROR;
- }
-
- /* send redirection header back to client */
-
- cookievalue = rindex(filetemplate, '-');
- if (cookievalue != NULL) ++cookievalue;
- else cookievalue = filetemplate;
-
- apr_rfc822_date(expires_str, expires_time);
-
- apr_table_add(r->headers_out,
- apr_pstrdup(r->pool, "Set-Cookie"),
- apr_psprintf(r->pool,
- "GRIDHTTP_PASSCODE=%s; "
- "expires=%s; "
- "domain=%s; "
- "path=%s",
- cookievalue, expires_str, r->hostname, r->uri));
-
- if (gridhttpport != DEFAULT_HTTP_PORT)
- httpurl = apr_psprintf(r->pool, "http://%s:%d%s", r->hostname,
- gridhttpport, ap_escape_uri(r->pool, r->uri));
- else httpurl = apr_pstrcat(r->pool, "http://", r->hostname,
- ap_escape_uri(r->pool, r->uri), NULL);
-
- apr_table_setn(r->headers_out, apr_pstrdup(r->pool, "Location"), httpurl);
-
- r->status = HTTP_MOVED_TEMPORARILY;
- return OK;
-}
-
-int http_put_method(request_rec *r, mod_gridsite_dir_cfg *conf)
-{
- char buf[2048], *filename, *dirname, *basename;
- const char *p;
- size_t block_length, length_sent;
- int retcode, stat_ret;
- apr_file_t *fp;
- struct stat statbuf;
- int has_range = 0, is_done = 0;
- apr_off_t range_start, range_end, range_length, length_to_send, length = 0;
-
- /* *** check if directory creation: PUT /.../ *** */
-
- if ((r->unparsed_uri != NULL) &&
- (r->unparsed_uri[0] != '\0') &&
- (r->unparsed_uri[strlen(r->unparsed_uri) - 1] == '/'))
- {
- if (apr_dir_make(r->filename,
- conf->diskmode
- | APR_UEXECUTE | APR_GEXECUTE | APR_WEXECUTE,
- r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR;
-
- /* we force the permissions, rather than accept any existing ones */
-
- apr_file_perms_set(r->filename, conf->diskmode
- | APR_UEXECUTE | APR_GEXECUTE | APR_WEXECUTE);
-
- ap_set_content_length(r, 0);
- ap_set_content_type(r, "text/html");
- return OK;
- }
-
- /* *** otherwise assume trying to create a regular file *** */
-
- stat_ret = stat(r->filename, &statbuf);
-
- /* find if a range is specified */
-
- has_range = parse_content_range(r, &range_start, &range_end, &range_length);
-
- if (has_range)
- {
- if ((range_start == 0) && (range_end == 0)) /* truncate? */
- {
- if (stat_ret != 0) return HTTP_NOT_FOUND;
-
- if (truncate(r->filename, range_length) != 0)
- return HTTP_INTERNAL_SERVER_ERROR;
- else return OK;
- }
-
- filename = r->filename;
-
- if (apr_file_open(&fp, filename, APR_WRITE | APR_CREATE | APR_BUFFERED,
- conf->diskmode, r->pool) != 0) return HTTP_INTERNAL_SERVER_ERROR;
- }
- else /* use temporary file if not a partial transfer */
- {
- dirname = apr_pstrdup(r->pool, r->filename);
- basename = rindex(dirname, '/');
- if (basename == NULL) return HTTP_INTERNAL_SERVER_ERROR;
-
- *basename = '\0';
- ++basename;
-
- filename = apr_psprintf(r->pool,
- "%s/.grsttmp-%s-XXXXXX", dirname, basename);
-
- if (apr_file_mktemp(&fp, filename,
- APR_CREATE | APR_WRITE | APR_BUFFERED | APR_EXCL, r->pool)
- != APR_SUCCESS) return HTTP_INTERNAL_SERVER_ERROR;
-/*
- p = apr_table_get(r->headers_in, "Content-Length");
- if (p != NULL)
- {
- length = (apr_off_t) atol(p);
- if (length > 16384)
- {
- if (apr_file_seek(fp, APR_SET, &length) == 0)
- {
- block_length = 1;
- apr_file_write(fp, "0", &block_length);
- }
-
- apr_file_seek(fp, APR_SET, 0);
- }
- }
-*/
- }
-
- /* we force the permissions, rather than accept any existing ones */
-
- apr_file_perms_set(filename, conf->diskmode);
-
- if (has_range)
- {
- if (apr_file_seek(fp, APR_SET, &range_start) != 0)
- {
- retcode = HTTP_INTERNAL_SERVER_ERROR;
- return retcode;
- }
-
- length_to_send = range_end - range_start + 1;
- }
-
- retcode = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
- if (retcode == OK)
- {
- if (has_range) length_sent = 0;
-
- if (ap_should_client_block(r))
- while ((block_length = ap_get_client_block(r, buf, sizeof(buf))) > 0)
- {
- if (has_range && (length_sent + block_length > length_to_send))
- {
- block_length = length_to_send - length_sent;
- is_done = 1;
- }
-
- if (apr_file_write(fp, buf, &block_length) != 0)
- {
- retcode = HTTP_INTERNAL_SERVER_ERROR;
- break;
- }
-
- if (has_range)
- {
- if (is_done) break;
- else length_sent += block_length;
- }
- }
- ap_set_content_length(r, 0);
- ap_set_content_type(r, "text/html");
- }
-
- if ((apr_file_close(fp) != 0) || (retcode == HTTP_INTERNAL_SERVER_ERROR))
- {
- if (strcmp(filename, r->filename) != 0) remove(filename);
- return HTTP_INTERNAL_SERVER_ERROR;
- }
-
- if ((strcmp(filename, r->filename) != 0) &&
- (apr_file_rename(filename, r->filename, r->pool) != 0))
- return HTTP_FORBIDDEN; /* best guess as to the problem ... */
-
- if ((retcode == OK) && (stat_ret != 0))
- {
- retcode = HTTP_CREATED;
- ap_custom_response(r, HTTP_CREATED, "");
- }
-
- return retcode;
-}
-
-int http_delete_method(request_rec *r, mod_gridsite_dir_cfg *conf)
-{
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Try remove(%s)", r->filename);
-
- if (remove(r->filename) != 0) return HTTP_FORBIDDEN;
-
- ap_set_content_length(r, 0);
- ap_set_content_type(r, "text/html");
-
- return OK;
-}
-
-int http_move_method(request_rec *r, mod_gridsite_dir_cfg *conf)
-{
- char *destination_translated = NULL;
-
- if (r->notes != NULL) destination_translated =
- (char *) apr_table_get(r->notes, "GRST_DESTINATION_TRANSLATED");
-
- if (destination_translated == NULL) return HTTP_BAD_REQUEST;
-
- if (strcmp(r->filename, destination_translated) == 0)
- return HTTP_FORBIDDEN;
-
- if (apr_file_rename(r->filename, destination_translated, r->pool) != 0)
- return HTTP_FORBIDDEN;
-
- ap_set_content_length(r, 0);
- ap_set_content_type(r, "text/html");
-
- return OK;
-}
-
-static int mod_gridsite_dir_handler(request_rec *r, mod_gridsite_dir_cfg *conf)
-/*
- handler switch for directories
-*/
-{
- /* *** is this a write method? only possible if GridSiteAuth on *** */
-
- if (conf->auth)
- {
- if ((r->method_number == M_PUT) &&
- (conf->methods != NULL) &&
- (strstr(conf->methods, " PUT " ) != NULL))
- return http_put_method(r, conf);
-
- if ((r->method_number == M_DELETE) &&
- (conf->methods != NULL) &&
- (strstr(conf->methods, " DELETE ") != NULL))
- return http_delete_method(r, conf);
- }
-
- /* *** directory listing? *** */
- if ((r->method_number == M_GET) && (conf->indexes))
- return html_dir_list(r, conf); /* directory listing */
-
- return DECLINED; /* *** nothing to see here, move along *** */
-}
-
-static int mod_gridsite_nondir_handler(request_rec *r, mod_gridsite_dir_cfg *conf)
-/*
- one big handler switch for everything other than directories, since we
- might be responding to MIME * / * for local PUT, MOVE, COPY and DELETE,
- and GET inside ghost directories.
-*/
-{
- char *upgradeheader, *upgradespaced, *p;
- const char *https_env;
-
- /* *** is this a write method or GridHTTP HTTPS->HTTP redirection?
- only possible if GridSiteAuth on *** */
-
- if (conf->auth)
- {
- if ((conf->gridhttp) &&
- ((r->method_number == M_GET) ||
- ((r->method_number == M_PUT) &&
- (strstr(conf->methods, " PUT ") != NULL))) &&
- ((upgradeheader = (char *) apr_table_get(r->headers_in,
- "Upgrade")) != NULL) &&
- ((https_env=apr_table_get(r->subprocess_env,"HTTPS")) != NULL) &&
- (strcasecmp(https_env, "on") == 0))
- {
- upgradespaced = apr_psprintf(r->pool, " %s ", upgradeheader);
-
- for (p=upgradespaced; *p != '\0'; ++p)
- if ((*p == ',') || (*p == '\t')) *p = ' ';
-
-// TODO: what if we're pointing at a CGI or some dynamic content???
-
- if (strstr(upgradespaced, " GridHTTP/1.0 ") != NULL)
- return http_gridhttp(r, conf);
- }
-
- if ((r->method_number == M_PUT) &&
- (conf->methods != NULL) &&
- (strstr(conf->methods, " PUT " ) != NULL))
- return http_put_method(r, conf);
-
- if ((r->method_number == M_DELETE) &&
- (conf->methods != NULL) &&
- (strstr(conf->methods, " DELETE ") != NULL))
- return http_delete_method(r, conf);
-
- if ((r->method_number == M_MOVE) &&
- (conf->methods != NULL) &&
- (strstr(conf->methods, " MOVE ") != NULL))
- return http_move_method(r, conf);
- }
-
- /* *** check if a special ghost admin CGI *** */
-
- if (conf->adminfile && conf->adminuri &&
- (strlen(r->filename) > strlen(conf->adminfile) + 1) &&
- (strcmp(&(r->filename[strlen(r->filename) - strlen(conf->adminfile)]),
- conf->adminfile) == 0) &&
- (r->filename[strlen(r->filename)-strlen(conf->adminfile)-1] == '/') &&
- ((r->method_number == M_POST) ||
- (r->method_number == M_GET)))
- {
- ap_internal_redirect(conf->adminuri, r);
- return OK;
- }
-
- /* *** finally look for .html files that we should format *** */
-
- if ((conf->format) && /* conf->format set by GridSiteHtmlFormat on */
- (strlen(r->filename) > 5) &&
- (strcmp(&(r->filename[strlen(r->filename)-5]), ".html") == 0) &&
- (r->method_number == M_GET)) return html_format(r, conf);
-
- return DECLINED; /* *** nothing to see here, move along *** */
-}
-
-static void recurse4dirlist(char *dirname, time_t *dirs_time,
- char *fulluri, int fullurilen,
- char *encfulluri, int enclen,
- apr_pool_t *pool, char **body,
- int recurse_level)
-/* try to find DN Lists in dir[] and its subdirs that match the fulluri[]
- prefix. add blobs of HTML to body as they are found. */
-{
- char *unencname, modified[99], *oneline, *d_namepath;
- DIR *oneDIR;
- struct dirent *onedirent;
- struct tm mtime_tm;
- size_t length;
- struct stat statbuf;
-
- if ((stat(dirname, &statbuf) != 0) ||
- (!S_ISDIR(statbuf.st_mode)) ||
- ((oneDIR = opendir(dirname)) == NULL)) return;
-
- if (statbuf.st_mtime > *dirs_time) *dirs_time = statbuf.st_mtime;
-
- while ((onedirent = readdir(oneDIR)) != NULL)
- {
- if (onedirent->d_name[0] == '.') continue;
-
- d_namepath = apr_psprintf(pool, "%s/%s", dirname, onedirent->d_name);
- if (stat(d_namepath, &statbuf) != 0) continue;
-
- if (S_ISDIR(statbuf.st_mode) && (recurse_level < GRST_RECURS_LIMIT))
- recurse4dirlist(d_namepath, dirs_time, fulluri,
- fullurilen, encfulluri, enclen,
- pool, body, recurse_level + 1);
- else if ((strncmp(onedirent->d_name, encfulluri, enclen) == 0) &&
- (onedirent->d_name[strlen(onedirent->d_name) - 1] != '~'))
- {
- unencname = GRSThttpUrlDecode(onedirent->d_name);
-
- if (strncmp(unencname, fulluri, fullurilen) == 0)
- {
-
- if (statbuf.st_mtime > *dirs_time)
- *dirs_time = statbuf.st_mtime;
-
- localtime_r(&(statbuf.st_mtime), &mtime_tm);
- strftime(modified, sizeof(modified),
- "<td align=right>%R</td><td align=right>%e %b %y</td>",
- &mtime_tm);
-
- oneline = apr_psprintf(pool,
- "<tr><td><a href=\"%s\" "
- "content-length=\"%ld\" "
- "last-modified=\"%ld\">"
- "%s</a></td>"
- "<td align=right>%ld</td>%s</tr>\n",
- &unencname[fullurilen], statbuf.st_size,
- statbuf.st_mtime, unencname,
- statbuf.st_size, modified);
-
- *body = apr_pstrcat(pool, *body, oneline, NULL);
- }
-
- free(unencname); /* libgridsite doesnt use pools */
- }
- }
-
- closedir(oneDIR);
-}
-
-static int mod_gridsite_dnlistsuri_dir_handler(request_rec *r,
- mod_gridsite_dir_cfg *conf)
-/*
- virtual DN-list file lister: make all DN lists on the dn-lists
- path of this server appear to be in the dn-lists directory itself
- (ie where they appear in the DN lists path doesnt matter, as long
- as their name matches)
-*/
-{
- int enclen, fullurilen, fd;
- char *fulluri, *encfulluri, *dn_list_ptr, *dirname, *unencname,
- *body, *oneline, *p, *s,
- *head_formatted, *header_formatted, *footer_formatted,
- *permstr = NULL;
- struct stat statbuf;
- size_t length;
- time_t dirs_time = 0;
- GRSTgaclPerm perm = GRST_PERM_NONE;
-
- if (r->notes != NULL)
- permstr = (char *) apr_table_get(r->notes, "GRST_PERM");
-
- if (permstr != NULL) sscanf(permstr, "%d", &perm);
-
- fulluri = apr_psprintf(r->pool, "https://%s%s",
- ap_get_server_name(r), conf->dnlistsuri);
- fullurilen = strlen(fulluri);
-
- encfulluri = GRSThttpUrlEncode(fulluri);
- enclen = strlen(encfulluri);
-
- if (conf->dnlists != NULL) p = conf->dnlists;
- else p = getenv("GRST_DN_LISTS");
-
- if (p == NULL) p = GRST_DN_LISTS;
- dn_list_ptr = apr_pstrdup(r->pool, p);
-
- head_formatted = apr_psprintf(r->pool,
- "<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 = 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->pool, &body, 0);
-
- if ((stat(r->filename, &statbuf) == 0) &&
- S_ISDIR(statbuf.st_mode) &&
- GRSTgaclPermHasWrite(perm))
- {
- oneline = apr_psprintf(r->pool,
- "<form action=\"%s%s\" method=post>\n"
- "<input type=hidden name=cmd value=managedir>"
- "<tr><td colspan=4 align=center><small><input type=submit "
- "value=\"Manage directory\"></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 **** */
-
- /* first make a buffer big enough to hold path names we want to try */
- fd = -1;
- s = malloc(strlen(r->filename) + strlen(conf->footfile));
- strcpy(s, r->filename);
-
- for (;;)
- {
- p = rindex(s, '/');
- if (p == NULL) break; /* failed to find one */
-
- p[1] = '\0';
- strcat(p, conf->footfile);
-
- fd = open(s, O_RDONLY);
- if (fd != -1) break; /* found one */
-
- *p = '\0';
- }
-
- free(s);
-
- if (fd == -1) /* failed to find a footer, so use standard default */
- {
- footer_formatted = apr_pstrdup(r->pool, "</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;
- }
-
- fulluri = apr_psprintf(r->pool, "https://%s%s",
- ap_get_server_name(r), r->uri);
-
- encfulluri = GRSThttpUrlEncode(fulluri);
-
- if (conf->dnlists != NULL) p = conf->dnlists;
- else p = getenv("GRST_DN_LISTS");
-
- if (p == NULL) p = GRST_DN_LISTS;
- dn_list_ptr = apr_pstrdup(r->pool, p);
-
- while ((dirname = strsep(&dn_list_ptr, ":")) != NULL)
- {
- filename = recurse4file(dirname, encfulluri, r->pool, 0);
-
- if (filename == NULL) continue;
-
- fd = open(filename, O_RDONLY);
-
- if (fd == -1) continue;
-
- fstat(fd, &statbuf);
- ap_set_content_length(r, (apr_off_t) statbuf.st_size);
- r->mtime = apr_time_from_sec(statbuf.st_mtime);
- ap_set_content_type(r, "text/plain");
- ap_set_last_modified(r);
-
- buf = apr_palloc(r->pool, statbuf.st_size + 1);
- read(fd, buf, statbuf.st_size);
- buf[statbuf.st_size] = '\0';
-
- ap_rputs(buf, r);
-
- close(fd);
-
- return OK;
- }
-
- return HTTP_NOT_FOUND;
-}
-
-static void *create_gridsite_srv_config(apr_pool_t *p, server_rec *s)
-{
- int i;
-
- /* only run once (in base server) */
- if (!(s->is_virtual) && (gridhttpport == 0))
- {
- gridhttpport = GRST_HTTP_PORT;
-
- sessionsdir = apr_pstrdup(p, GRST_SESSIONS_DIR);
- /* GridSiteSessionsDir dir-path */
-
- sitecastdnlists = NULL;
-
- sitecastgroups[0].quad1 = 0;
- sitecastgroups[0].quad2 = 0;
- sitecastgroups[0].quad3 = 0;
- sitecastgroups[0].quad4 = 0;
- sitecastgroups[0].port = GRST_HTCP_PORT;
- /* GridSiteCastUniPort udp-port */
-
- for (i=1; i <= GRST_SITECAST_GROUPS; ++i)
- {
- sitecastgroups[i].port = 0; /* GridSiteCastGroup mcast-list */
- }
-
- for (i=1; i <= GRST_SITECAST_ALIASES; ++i)
- {
- sitecastaliases[i].sitecast_url = NULL;
- sitecastaliases[i].port = 0;
- sitecastaliases[i].scheme = NULL;
- sitecastaliases[i].local_path = NULL;
- sitecastaliases[i].local_hostname = NULL;
- } /* GridSiteCastAlias url path */
- }
-
- return NULL;
-}
-
-static void *create_gridsite_dir_config(apr_pool_t *p, char *path)
-{
- mod_gridsite_dir_cfg *conf = apr_palloc(p, sizeof(*conf));
-
- if (path == NULL) /* set up document root defaults */
- {
- conf->auth = 0; /* GridSiteAuth on/off */
- conf->envs = 1; /* GridSiteEnvs on/off */
- conf->format = 0; /* GridSiteHtmlFormat on/off */
- conf->indexes = 0; /* GridSiteIndexes on/off */
- conf->indexheader = NULL; /* GridSiteIndexHeader File-value */
- conf->gridsitelink = 1; /* GridSiteLink on/off */
- conf->adminfile = apr_pstrdup(p, GRST_ADMIN_FILE);
- /* GridSiteAdminFile File-value */
- conf->adminuri = NULL; /* GridSiteAdminURI URI-value */
- conf->helpuri = NULL; /* GridSiteHelpURI URI-value */
- conf->dnlists = NULL; /* GridSiteDNlists Search-path */
- conf->dnlistsuri = NULL; /* GridSiteDNlistsURI URI-value */
- conf->adminlist = NULL; /* GridSiteAdminList URI-value */
- conf->gsiproxylimit = 1; /* GridSiteGSIProxyLimit number */
- conf->unzip = NULL; /* GridSiteUnzip file-path */
-
- conf->methods = apr_pstrdup(p, " GET ");
- /* GridSiteMethods methods */
-
- conf->editable = apr_pstrdup(p, " txt shtml html htm css js php jsp ");
- /* GridSiteEditable types */
-
- conf->headfile = apr_pstrdup(p, GRST_HEADFILE);
- conf->footfile = apr_pstrdup(p, GRST_FOOTFILE);
- /* GridSiteHeadFile and GridSiteFootFile file name */
-
- conf->gridhttp = 0; /* GridSiteGridHTTP on/off */
- conf->aclformat = apr_pstrdup(p, "GACL");
- /* GridSiteACLFormat gacl/xacml */
- conf->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->envs = UNSET; /* GridSiteEnvs on/off */
- conf->format = UNSET; /* GridSiteHtmlFormat on/off */
- conf->indexes = UNSET; /* GridSiteIndexes on/off */
- conf->indexheader = NULL; /* GridSiteIndexHeader File-value */
- conf->gridsitelink = UNSET; /* GridSiteLink on/off */
- conf->adminfile = NULL; /* GridSiteAdminFile File-value */
- conf->adminuri = NULL; /* GridSiteAdminURI URI-value */
- conf->helpuri = NULL; /* GridSiteHelpURI URI-value */
- conf->dnlists = NULL; /* GridSiteDNlists Search-path */
- conf->dnlistsuri = NULL; /* GridSiteDNlistsURI URI-value */
- conf->adminlist = NULL; /* GridSiteAdminList URI-value */
- conf->gsiproxylimit = UNSET; /* GridSiteGSIProxyLimit number */
- conf->unzip = NULL; /* GridSiteUnzip file-path */
- conf->methods = NULL; /* GridSiteMethods methods */
- conf->editable = NULL; /* GridSiteEditable types */
- conf->headfile = NULL; /* GridSiteHeadFile file name */
- conf->footfile = NULL; /* GridSiteFootFile file name */
- conf->gridhttp = UNSET; /* GridSiteGridHTTP on/off */
- conf->aclformat = NULL; /* GridSiteACLFormat gacl/xacml */
- conf->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->envs != UNSET) conf->envs = direct->envs;
- else conf->envs = server->envs;
-
- if (direct->format != UNSET) conf->format = direct->format;
- else conf->format = server->format;
-
- if (direct->indexes != UNSET) conf->indexes = direct->indexes;
- else conf->indexes = server->indexes;
-
- if (direct->gridsitelink != UNSET) conf->gridsitelink=direct->gridsitelink;
- else conf->gridsitelink=server->gridsitelink;
-
- if (direct->indexheader != NULL) conf->indexheader = direct->indexheader;
- else conf->indexheader = server->indexheader;
-
- if (direct->adminfile != NULL) conf->adminfile = direct->adminfile;
- else conf->adminfile = server->adminfile;
-
- if (direct->adminuri != NULL) conf->adminuri = direct->adminuri;
- else conf->adminuri = server->adminuri;
-
- if (direct->helpuri != NULL) conf->helpuri = direct->helpuri;
- else conf->helpuri = server->helpuri;
-
- if (direct->dnlists != NULL) conf->dnlists = direct->dnlists;
- else conf->dnlists = server->dnlists;
-
- if (direct->dnlistsuri != NULL) conf->dnlistsuri = direct->dnlistsuri;
- else conf->dnlistsuri = server->dnlistsuri;
-
- if (direct->adminlist != NULL) conf->adminlist = direct->adminlist;
- else conf->adminlist = server->adminlist;
-
- if (direct->gsiproxylimit != UNSET)
- conf->gsiproxylimit = direct->gsiproxylimit;
- else conf->gsiproxylimit = server->gsiproxylimit;
-
- if (direct->unzip != NULL) conf->unzip = direct->unzip;
- else conf->unzip = server->unzip;
-
- if (direct->methods != NULL) conf->methods = direct->methods;
- else conf->methods = server->methods;
-
- if (direct->editable != NULL) conf->editable = direct->editable;
- else conf->editable = server->editable;
-
- if (direct->headfile != NULL) conf->headfile = direct->headfile;
- else conf->headfile = server->headfile;
-
- if (direct->footfile != NULL) conf->footfile = direct->footfile;
- else conf->footfile = server->footfile;
-
- if (direct->gridhttp != UNSET) conf->gridhttp = direct->gridhttp;
- else conf->gridhttp = server->gridhttp;
-
- if (direct->aclformat != NULL) conf->aclformat = direct->aclformat;
- else conf->aclformat = server->aclformat;
-
- if (direct->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, "GridSiteGridHTTPport") == 0)
- {
- gridhttpport = atoi(parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteCastDNlists") == 0)
- {
- if (a->server->is_virtual)
- return "GridSiteDNlists cannot be used inside a virtual server";
-
- sitecastdnlists = apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteCastUniPort") == 0)
- {
- if (a->server->is_virtual)
- return "GridSiteCastUniPort cannot be used inside a virtual server";
-
- if (sscanf(parm, "%d", &(sitecastgroups[0].port)) != 1)
- return "Failed parsing GridSiteCastUniPort numeric value";
- }
- else if (strcasecmp(a->cmd->name, "GridSiteCastGroup") == 0)
- {
- if (a->server->is_virtual)
- return "GridSiteCastGroup cannot be used inside a virtual server";
-
- for (i=1; i <= GRST_SITECAST_GROUPS; ++i)
- {
- if (sitecastgroups[i].port == 0) /* a free slot */
- {
- sitecastgroups[i].port = GRST_HTCP_PORT;
-
- if (sscanf(parm, "%d.%d.%d.%d:%d",
- &(sitecastgroups[i].quad1),
- &(sitecastgroups[i].quad2),
- &(sitecastgroups[i].quad3),
- &(sitecastgroups[i].quad4),
- &(sitecastgroups[i].port)) < 4)
- return "Failed parsing GridSiteCastGroup nnn.nnn.nnn.nnn[:port]";
-
- break;
- }
- }
-
- if (i > GRST_SITECAST_GROUPS)
- return "Maximum GridSiteCastGroup groups reached";
- }
- else if (strcasecmp(a->cmd->name, "GridSiteAdminFile") == 0)
- {
- if (index(parm, '/') != NULL)
- return "/ not permitted in GridSiteAdminFile";
-
- ((mod_gridsite_dir_cfg *) cfg)->adminfile =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteAdminURI") == 0)
- {
- if (*parm != '/') return "GridSiteAdminURI must begin with /";
-
- ((mod_gridsite_dir_cfg *) cfg)->adminuri =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteHelpURI") == 0)
- {
- if (*parm != '/') return "GridSiteHelpURI must begin with /";
-
- ((mod_gridsite_dir_cfg *) cfg)->helpuri =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteDNlists") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->dnlists =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteDNlistsURI") == 0)
- {
- if (*parm != '/') return "GridSiteDNlistsURI must begin with /";
-
- if ((*parm != '\0') && (parm[strlen(parm) - 1] == '/'))
- ((mod_gridsite_dir_cfg *) cfg)->dnlistsuri =
- apr_pstrdup(a->pool, parm);
- else
- ((mod_gridsite_dir_cfg *) cfg)->dnlistsuri =
- apr_pstrcat(a->pool, parm, "/", NULL);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteAdminList") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->adminlist =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteGSIProxyLimit") == 0)
- {
- n = -1;
-
- if ((sscanf(parm, "%d", &n) == 1) && (n >= 0))
- ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit = n;
- else return "GridSiteGSIProxyLimit must be a number >= 0";
- }
- else if (strcasecmp(a->cmd->name, "GridSiteUnzip") == 0)
- {
- if (*parm != '/') return "GridSiteUnzip must begin with /";
-
- ((mod_gridsite_dir_cfg *) cfg)->unzip =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteMethods") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->methods =
- apr_psprintf(a->pool, " %s ", parm);
-
- for (p = ((mod_gridsite_dir_cfg *) cfg)->methods;
- *p != '\0';
- ++p) if (*p == '\t') *p = ' ';
- }
- else if (strcasecmp(a->cmd->name, "GridSiteOCSP") == 0)
- {
- ocspmodes = apr_psprintf(a->pool, " %s ", parm);
-
- for (p = ocspmodes; *p != '\0'; ++p)
- if (*p == '\t') *p = ' ';
- else *p = tolower(*p);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteEditable") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->editable =
- apr_psprintf(a->pool, " %s ", parm);
-
- for (p = ((mod_gridsite_dir_cfg *) cfg)->editable;
- *p != '\0';
- ++p) if (*p == '\t') *p = ' ';
- }
- else if (strcasecmp(a->cmd->name, "GridSiteHeadFile") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->headfile =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteFootFile") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->footfile =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteIndexHeader") == 0)
- {
- if (index(parm, '/') != NULL)
- return "/ not permitted in GridSiteIndexHeader";
-
- ((mod_gridsite_dir_cfg *) cfg)->indexheader =
- apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "GridSiteACLFormat") == 0)
- {
- if ((strcasecmp(parm,"GACL") != 0) &&
- (strcasecmp(parm,"XACML") != 0))
- return "GridsiteACLFormat must be either GACL or XACML";
-
- ((mod_gridsite_dir_cfg *) cfg)->aclformat = apr_pstrdup(a->pool, parm);
- }
- else if (strcasecmp(a->cmd->name, "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;
-
- if (strcasecmp(a->cmd->name, "GridSiteUserGroup") == 0)
- {
- if (!(unixd_config.suexec_enabled))
- return "Using GridSiteUserGroup will "
- "require rebuilding Apache with suexec support!";
-
- /* NB ap_uname2id/ap_gname2id are NOT thread safe - but OK
- as long as not used in .htaccess, just at server start time */
-
- ((mod_gridsite_dir_cfg *) cfg)->execugid.uid = ap_uname2id(parm1);
- ((mod_gridsite_dir_cfg *) cfg)->execugid.gid = ap_gname2id(parm2);
- ((mod_gridsite_dir_cfg *) cfg)->execugid.userdir = 0;
- }
- else if (strcasecmp(a->cmd->name, "GridSiteDiskMode") == 0)
- {
- if ((strcasecmp(parm1, "GroupNone" ) != 0) &&
- (strcasecmp(parm1, "GroupRead" ) != 0) &&
- (strcasecmp(parm1, "GroupWrite") != 0))
- return "First parameter of GridSiteDiskMode must be "
- "GroupNone, GroupRead or GroupWrite!";
-
- if ((strcasecmp(parm2, "WorldNone" ) != 0) &&
- (strcasecmp(parm2, "WorldRead" ) != 0))
- return "Second parameter of GridSiteDiskMode must be "
- "WorldNone or WorldRead!";
-
- ((mod_gridsite_dir_cfg *) cfg)->diskmode =
- APR_UREAD | APR_UWRITE
- | ( APR_GREAD * (strcasecmp(parm1, "GroupRead") == 0))
- | ((APR_GREAD | APR_GWRITE) * (strcasecmp(parm1, "GroupWrite") == 0))
- | ((APR_GREAD | APR_WREAD) * (strcasecmp(parm2, "WorldRead") == 0));
- }
- else if (strcasecmp(a->cmd->name, "GridSiteCastAlias") == 0)
- {
- for (i=0; i < GRST_SITECAST_ALIASES; ++i) /* look for free slot */
- {
- if (sitecastaliases[i].sitecast_url == NULL)
- {
- sitecastaliases[i].scheme = apr_pstrdup(a->pool, parm1);
-
- if (((p = index(sitecastaliases[i].scheme, ':')) == NULL)
- || (p[1] != '/') || (p[2] != '/'))
- return "GridSiteCastAlias URL must begin with scheme (http/https/gsiftp/...) and ://";
-
- *p = '\0';
- ++p;
- while (*p == '/') ++p;
-
- if ((q = index(p, '/')) == NULL)
- return "GridSiteCastAlias URL must be of form scheme://domain:port/dirs";
-
- *q = '\0';
-
- p = index(p, ':');
- if (p == NULL)
- {
- return "GridSiteCastAlias URL must include the port number";
- }
-
- if (sscanf(p, ":%d", &(sitecastaliases[i].port)) != 1)
- return "Unable to parse numeric port number in GridSiteCastAlias";
-
- sitecastaliases[i].sitecast_url = apr_pstrdup(a->pool, parm1);
- sitecastaliases[i].local_path = apr_pstrdup(a->pool, parm2);
- sitecastaliases[i].local_hostname = apr_pstrdup(a->pool,
- a->server->server_hostname);
-
- break;
- }
- }
- }
-
- return NULL;
-}
-
-static const char *mod_gridsite_flag_cmds(cmd_parms *a, void *cfg,
- int flag)
-{
- if (strcasecmp(a->cmd->name, "GridSiteAuth") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->auth = flag;
- }
- else if (strcasecmp(a->cmd->name, "GridSiteEnvs") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->envs = flag;
- }
- else if (strcasecmp(a->cmd->name, "GridSiteHtmlFormat") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->format = flag;
- }
- else if (strcasecmp(a->cmd->name, "GridSiteIndexes") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->indexes = flag;
- }
- else if (strcasecmp(a->cmd->name, "GridSiteLink") == 0)
- {
- ((mod_gridsite_dir_cfg *) cfg)->gridsitelink = flag;
- }
- else if (strcasecmp(a->cmd->name, "GridSiteGridHTTP") == 0)
- {
-// TODO: return error if try this on non-HTTPS virtual server
-
- ((mod_gridsite_dir_cfg *) cfg)->gridhttp = flag;
- }
-
- return NULL;
-}
-
-static const command_rec mod_gridsite_cmds[] =
-{
-// TODO: need to check and document valid contexts for each command!
-
- AP_INIT_FLAG("GridSiteAuth", mod_gridsite_flag_cmds,
- NULL, OR_FILEINFO, "on or off"),
- AP_INIT_FLAG("GridSiteEnvs", mod_gridsite_flag_cmds,
- NULL, OR_FILEINFO, "on or off"),
- AP_INIT_FLAG("GridSiteHtmlFormat", mod_gridsite_flag_cmds,
- NULL, OR_FILEINFO, "on or off"),
- AP_INIT_FLAG("GridSiteIndexes", mod_gridsite_flag_cmds,
- NULL, OR_FILEINFO, "on or off"),
- AP_INIT_FLAG("GridSiteLink", mod_gridsite_flag_cmds,
- NULL, OR_FILEINFO, "on or off"),
-
- AP_INIT_TAKE1("GridSiteAdminFile", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "Ghost per-directory admin CGI"),
- AP_INIT_TAKE1("GridSiteAdminURI", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "URI of real gridsite-admin.cgi"),
- AP_INIT_TAKE1("GridSiteHelpURI", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "URI of Website Help pages"),
- AP_INIT_TAKE1("GridSiteDNlists", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "DN Lists directories search path"),
- AP_INIT_TAKE1("GridSiteDNlistsURI", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "URI of published DN lists"),
- AP_INIT_TAKE1("GridSiteAdminList", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "URI of admin DN List"),
- AP_INIT_TAKE1("GridSiteGSIProxyLimit", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "Max level of GSI proxy validity"),
- AP_INIT_TAKE1("GridSiteUnzip", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "Absolute path to unzip command"),
-
- AP_INIT_RAW_ARGS("GridSiteMethods", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "permitted HTTP methods"),
- AP_INIT_RAW_ARGS("GridSiteOCSP", mod_gridsite_take1_cmds,
- NULL, RSRC_CONF, "Set OCSP lookups"),
- AP_INIT_RAW_ARGS("GridSiteEditable", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "editable file extensions"),
- AP_INIT_TAKE1("GridSiteHeadFile", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "filename of HTML header"),
- AP_INIT_TAKE1("GridSiteFootFile", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "filename of HTML footer"),
- AP_INIT_TAKE1("GridSiteIndexHeader", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "filename of directory header"),
-
- AP_INIT_FLAG("GridSiteGridHTTP", mod_gridsite_flag_cmds,
- NULL, OR_FILEINFO, "on or off"),
- AP_INIT_TAKE1("GridSiteGridHTTPport", mod_gridsite_take1_cmds,
- NULL, RSRC_CONF, "GridHTTP port"),
- AP_INIT_TAKE1("GridSiteSessionsDir", mod_gridsite_take1_cmds,
- NULL, RSRC_CONF, "directory with GridHTTP passcodes and SSL session creds"),
-/* GridSiteOnetimesDir is deprecated in favour of GridSiteSessionsDir */
- AP_INIT_TAKE1("GridSiteOnetimesDir", mod_gridsite_take1_cmds,
- NULL, RSRC_CONF, "directory with GridHTTP passcodes"),
-
- AP_INIT_TAKE1("GridSiteCastDNlists", mod_gridsite_take1_cmds,
- NULL, RSRC_CONF, "DN Lists directories search path for SiteCast"),
- AP_INIT_TAKE1("GridSiteCastUniPort", mod_gridsite_take1_cmds,
- NULL, RSRC_CONF, "UDP port for unicast/replies"),
- AP_INIT_TAKE1("GridSiteCastGroup", mod_gridsite_take1_cmds,
- NULL, RSRC_CONF, "multicast group[:port] to listen for HTCP on"),
- AP_INIT_TAKE2("GridSiteCastAlias", mod_gridsite_take2_cmds,
- NULL, RSRC_CONF, "URL and local path mapping"),
-
- AP_INIT_TAKE1("GridSiteACLFormat", mod_gridsite_take1_cmds,
- NULL, OR_FILEINFO, "format to save access control lists in"),
- AP_INIT_TAKE1("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], *sessionfile = NULL,
- line[512], *p;
- apr_file_t *fp = NULL;
- int i;
-
- if (GRST_get_session_id(ssl, session_id, sizeof(session_id)) != GRST_RET_OK)
- return GRST_RET_FAILED;
-
- sessionfile = apr_psprintf(conn->pool, "%s/sslcreds-%s",
- ap_server_root_relative(conn->pool, sessionsdir),
- session_id);
-
- if (apr_file_open(&fp, sessionfile, APR_READ, 0, conn->pool) != APR_SUCCESS)
- return GRST_RET_FAILED;
-
- while (apr_file_gets(line, sizeof(line), fp) == APR_SUCCESS)
- {
- if (sscanf(line, "GRST_CRED_%d=", &i) == 1)
- {
- p = index(line, '=');
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_%d", i),
- apr_pstrdup(conn->pool, &p[1]));
- }
- else if (sscanf(line, "GRST_OCSP_URL_%d=", &i) == 1)
- {
- p = index(line, '=');
-
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_OCSP_URL_%d", i),
- apr_pstrdup(conn->pool, &p[1]));
- }
- }
-
- apr_file_close(fp);
-
- /* connection notes created by GRST_save_ssl_creds() are now reloaded */
- apr_table_set(conn->notes, "GRST_save_ssl_creds", "yes");
-
- return GRST_RET_OK;
-}
-
-/*
- Save result of GRSTx509CompactCreds() into connection notes, and
- write out in an SSL session creds file.
-*/
-
-void GRST_save_ssl_creds(conn_rec *conn,
- STACK_OF(X509) *certstack, X509 *peercert)
-{
- int i, lastcred;
- const int maxcreds = 99;
- const size_t credlen = 1024;
- char creds[maxcreds][credlen+1], envname[14], *tempfile = NULL,
- *sessionfile, session_id[(SSL_MAX_SSL_SESSION_ID_LENGTH+1)*2];
- apr_file_t *fp = NULL;
- SSL *ssl;
- SSLConnRec *sslconn;
-
- /* check if already done */
-
- if ((certstack != NULL) && (conn->notes != NULL) &&
- (apr_table_get(conn->notes, "GRST_save_ssl_creds") != NULL)) return;
-
- /* we at least need to say we've been run */
-
- apr_table_set(conn->notes, "GRST_save_ssl_creds", "yes");
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server,
- "set GRST_save_ssl_creds");
-
- sslconn = (SSLConnRec *)ap_get_module_config(conn->conn_config,&ssl_module);
-
- if ((sslconn != NULL) &&
- ((ssl = sslconn->ssl) != NULL) &&
- (GRST_get_session_id(ssl,session_id,sizeof(session_id)) == GRST_RET_OK))
- {
- sessionfile = apr_psprintf(conn->pool, "%s/sslcreds-%s",
- ap_server_root_relative(conn->pool, sessionsdir),
- session_id);
-
- tempfile = apr_pstrcat(conn->pool,
- ap_server_root_relative(conn->pool, sessionsdir),
- "/tmp-XXXXXX", NULL);
-
- if ((tempfile != NULL) && (tempfile[0] != '\0'))
- apr_file_mktemp(&fp, tempfile,
- APR_CREATE | APR_WRITE | APR_EXCL, conn->pool);
- }
-
- if (GRSTx509CompactCreds(&lastcred, maxcreds, credlen, (char *) creds,
- certstack, GRST_VOMS_DIR, peercert) == GRST_RET_OK)
- {
- for (i=0; i <= lastcred; ++i)
- {
- apr_table_setn(conn->notes,
- apr_psprintf(conn->pool, "GRST_CRED_%d", i),
- apr_pstrdup(conn->pool, creds[i]));
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server,
- "store GRST_CRED_%d=%s", i, creds[i]);
-
- if (fp != NULL) apr_file_printf(fp, "GRST_CRED_%d=%s\n",
- i, creds[i]);
- }
-
- /* free remaining dup'd certs? */
- }
-
- /* this needs to be merged into compactcreds in grst_x509? */
-
- if (ocspmodes != NULL)
- {
- int j;
- const char *ex_sn;
- char s[80];
- X509 *cert;
- X509_EXTENSION *ex;
-
- for (j=sk_X509_num(certstack)-1; j >= 0; --j)
- {
- cert = sk_X509_value(certstack, j);
-
- for (i=0; i < X509_get_ext_count(cert); ++i)
- {
- ex = X509_get_ext(cert, i);
-
- OBJ_obj2txt(s, sizeof(s), X509_EXTENSION_get_object(ex), 0);
-
- if (strcmp(s, "authorityInfoAccess") == 0) /* OCSP */
- {
- apr_table_setn(conn->notes, "GRST_OCSP_URL",
- (const char *) X509_EXTENSION_get_data(ex));
-
- /* strategy is to remove what has been checked,
- for this connnection */
- apr_table_set(conn->notes, "GRST_OCSP_UNCHECKED",
- ocspmodes);
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, conn->base_server,
- "store GRST_OCSP_URL_%d=%s", i, X509_EXTENSION_get_data(ex));
-
- if (fp != NULL) apr_file_printf(fp, "GRST_OCSP_URL_%d=%s\n",
- i, X509_EXTENSION_get_data(ex));
- }
- }
- }
- }
-
- /* end of bit that needs to go into grst_x509 */
-
- if (fp != NULL)
- {
- apr_file_close(fp);
- apr_file_rename(tempfile, sessionfile, conn->pool);
- }
-}
-
-static 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, n, file_is_acl = 0,
- destination_is_acl = 0, proxylevel, ishttps = 0;
- char *dn, *p, envname[14], *grst_cred_0 = NULL, *dir_path,
- *remotehost, s[99], *grst_cred_i, *cookies, *file, *https,
- *gridauthpasscode = NULL, *cookiefile, oneline[1025], *key_i,
- *destination = NULL, *destination_uri = NULL, *querytmp,
- *destination_prefix = NULL, *destination_translated = NULL,
- *aclpath = NULL;
- char *vomsAttribute = NULL, *loa;
- const char *content_type;
- time_t now, notbefore, notafter;
- apr_table_t *env;
- apr_finfo_t cookiefile_info;
- apr_file_t *fp;
- request_rec *destreq;
- GRSTgaclCred *cred = NULL, *cred_0 = NULL;
- GRSTgaclUser *user = NULL;
- GRSTgaclPerm perm = GRST_PERM_NONE, destination_perm = GRST_PERM_NONE;
- GRSTgaclAcl *acl = NULL;
- mod_gridsite_dir_cfg *cfg;
- SSLConnRec *sslconn;
- STACK_OF(X509) *certstack;
- X509 *peercert;
-
- cfg = (mod_gridsite_dir_cfg *)
- ap_get_module_config(r->per_dir_config, &gridsite_module);
-
- if (cfg == NULL) return DECLINED;
-
- if ((cfg->auth == 0) &&
- (cfg->envs == 0))
- return DECLINED; /* if not turned on, look invisible */
-
- env = r->subprocess_env;
-
- /* Get the user's attributes from Shibboleth and set up user credential
- based on the attributes if authentication has been carried out using
- a Shibboleth Identity Provider.*/
-
- /* Get DN from a Shibboleth attribute */
-
- dn = (char *) apr_table_get(r->headers_in, "User-Distinguished-Name");
-#if 0
- if ((dn == NULL) || (*dn == '\0'))
- dn = (char *) apr_table_get(r->headers_in, "User-Distinguished-Name-2");
-#endif
-
- if ((dn != NULL) && (*dn == '\0')) dn = NULL;
-
- if (dn != NULL) ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "DN: %s", dn);
-
- /* Get the NIST LoA attribute */
- loa = (char *) apr_table_get(r->headers_in, "nist-loa");
-
- if ((loa == NULL) || (*loa == '\0'))
- loa = (char *) apr_table_get(r->headers_in, "loa");
-
- if ((loa != NULL) && (*loa == '\0')) loa = NULL;
-
- if (loa != NULL) ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "nist-loa: %s", loa);
-
- /* Set up user credential based on the DN and LoA attributes */
-
- if (dn != NULL)
- {
- cred = GRSTgaclCredNew("person");
- GRSTgaclCredAddValue(cred, "dn", dn);
- user = GRSTgaclUserNew(cred);
- cred = GRSTgaclCredNew("level");
-
- if (loa != NULL) GRSTgaclCredAddValue(cred, "nist-loa", loa);
- else GRSTgaclCredAddValue(cred, "nist-loa", "2");
-
- GRSTgaclUserAddCred(user, cred);
- }
-
- /* Set up user credential based on VOMS Attribute from Shibboleth? */
-
- vomsAttribute = (char *) apr_table_get(r->headers_in, "VOMS-Attribute");
- if (vomsAttribute != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "VOMS-Attribute: %s", vomsAttribute);
-
- cred = GRSTgaclCredNew("voms");
- GRSTgaclCredAddValue(cred, "fqan", vomsAttribute);
- if (user == NULL) user = GRSTgaclUserNew(cred);
- else GRSTgaclUserAddCred(user, cred);
- }
-
- p = (char *) apr_table_get(r->subprocess_env, "HTTPS");
- if ((p != NULL) && (strcmp(p, "on") == 0)) ishttps = 1;
-
- /* reload per-connection (SSL) cred variables? */
-
- sslconn = (SSLConnRec *) ap_get_module_config(r->connection->conn_config,
- &ssl_module);
- if ((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");
- }
-
- proxylevel = ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit + 1;
-
- if ((user == NULL) &&
- (r->connection->notes != NULL) &&
- ((grst_cred_0 = (char *)
- apr_table_get(r->connection->notes, "GRST_CRED_0")) != NULL) &&
- (sscanf(grst_cred_0, "X509USER %*d %*d %d ", &proxylevel) == 1) &&
- (proxylevel <= ((mod_gridsite_dir_cfg *) cfg)->gsiproxylimit))
- {
- apr_table_setn(env, "GRST_CRED_0", grst_cred_0);
-
- cred_0 = GRSTx509CompactToCred(grst_cred_0);
- if (cred_0 != NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Using identity %s from SSL/TLS", grst_cred_0);
-
- user = GRSTgaclUserNew(cred_0);
-
- /* check for VOMS GRST_CRED_i too */
-
- for (i=1; ; ++i)
- {
- snprintf(envname, sizeof(envname), "GRST_CRED_%d", i);
- if (grst_cred_i = (char *)
- apr_table_get(r->connection->notes,envname))
- {
- if (((mod_gridsite_dir_cfg *) cfg)->envs)
- apr_table_setn(env,
- apr_pstrdup(r->pool, envname),
- grst_cred_i);
-
- if (cred = GRSTx509CompactToCred(grst_cred_i))
- GRSTgaclUserAddCred(user, cred);
- }
- else break; /* GRST_CRED_i are numbered consecutively */
- }
-
- cred = GRSTgaclCredNew("level");
- if (proxylevel == 0) GRSTgaclCredAddValue(cred, "nist-loa", "3");
- else GRSTgaclCredAddValue(cred, "nist-loa", "2");
- GRSTgaclUserAddCred(user, cred);
- }
- }
-
- if ((user != NULL) && ((mod_gridsite_dir_cfg *) cfg)->dnlists)
- GRSTgaclUserSetDNlists(user, ((mod_gridsite_dir_cfg *) cfg)->dnlists);
-
- /* add DNS credential */
-
- remotehost = (char *) ap_get_remote_host(r->connection,
- r->per_dir_config, REMOTE_DOUBLE_REV, NULL);
- if ((remotehost != NULL) && (*remotehost != '\0'))
- {
- cred = GRSTgaclCredNew("dns");
- GRSTgaclCredAddValue(cred, "hostname", remotehost);
-
- if (user == NULL) user = GRSTgaclUserNew(cred);
- else GRSTgaclUserAddCred(user, cred);
- }
-
- /* check for Destination: header and evaluate if present */
-
- if ((destination = (char *) apr_table_get(r->headers_in,
- "Destination")) != NULL)
- {
- 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;
- }
- }
- }
-
- /* this checks for NULL arguments itself */
- if (GRSTgaclDNlistHasUser(((mod_gridsite_dir_cfg *) cfg)->adminlist, user))
- {
- perm = GRST_PERM_ALL;
- if (destination_translated != NULL) destination_perm = GRST_PERM_ALL;
- }
- else
- {
- 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 acl = GRSTgaclAclLoadforFile(r->filename);
-
- if (acl != NULL) perm = GRSTgaclAclTestUser(acl, user);
- GRSTgaclAclFree(acl);
-
- if (destination_translated != NULL)
- {
- acl = GRSTgaclAclLoadforFile(destination_translated);
- if (acl != NULL) destination_perm = GRSTgaclAclTestUser(acl, user);
- GRSTgaclAclFree(acl);
-
- apr_table_setn(r->notes, "GRST_DESTINATION_PERM",
- apr_psprintf(r->pool, "%d", destination_perm));
-
- if (((mod_gridsite_dir_cfg *) cfg)->envs)
- apr_table_setn(env, "GRST_DESTINATION_PERM",
- apr_psprintf(r->pool, "%d", destination_perm));
- }
- }
-
- /* first look for GRIDHTTP_PASSCODE cookie */
-
- if ((p = (char *) apr_table_get(r->headers_in, "Cookie")) != NULL)
- {
- cookies = apr_pstrcat(r->pool, " ", p, NULL);
- gridauthpasscode = strstr(cookies, " GRIDHTTP_PASSCODE=");
-
- if (gridauthpasscode != NULL)
- {
- gridauthpasscode = &gridauthpasscode[19];
-
- for (p = gridauthpasscode;
- (*p != '\0') && (*p != ';'); ++p)
- if (!isalnum(*p)) *p = '\0';
- }
- }
-
- /* then look for GRIDHTTP_PASSCODE in QUERY_STRING ie after ? */
-
- if (gridauthpasscode == NULL)
- {
- if ((r->parsed_uri.query != NULL) && (r->parsed_uri.query[0] != '\0'))
- {
- querytmp = apr_pstrcat(r->pool,"&",r->parsed_uri.query,"&",NULL);
-
- gridauthpasscode = strstr(querytmp, "&GRIDHTTP_PASSCODE=");
-
- if (gridauthpasscode != NULL)
- {
- gridauthpasscode = &gridauthpasscode[19];
-
- for (p = gridauthpasscode;
- (*p != '\0') && (*p != '&'); ++p)
- if (!isalnum(*p)) *p = '\0';
- }
- }
- }
-
- if ((gridauthpasscode != NULL) && (gridauthpasscode[0] != '\0'))
- {
- cookiefile = apr_psprintf(r->pool, "%s/passcode-%s",
- ap_server_root_relative(r->pool,
- sessionsdir),
- gridauthpasscode);
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Opening GridHTTP passcode file %s", cookiefile);
-
- if ((apr_stat(&cookiefile_info, cookiefile,
- APR_FINFO_TYPE, r->pool) == APR_SUCCESS) &&
- (cookiefile_info.filetype == APR_REG) &&
- (apr_file_open(&fp, cookiefile, APR_READ, 0, r->pool)
- == APR_SUCCESS))
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "Reading GridHTTP passcode file %s", cookiefile);
-
- while (apr_file_gets(oneline,
- sizeof(oneline), fp) == APR_SUCCESS)
- {
- p = index(oneline, '\n');
- if (p != NULL) *p = '\0';
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "%s: %s", cookiefile, oneline);
-
- if ((strncmp(oneline, "expires=", 8) == 0) &&
- (apr_time_from_sec(atoll(&oneline[8])) <
- apr_time_now()))
- break;
- else if ((strncmp(oneline, "domain=", 7) == 0) &&
- (strcmp(&oneline[7], r->hostname) != 0))
- break; /* exact needed in the version */
- else if ((strncmp(oneline, "path=", 5) == 0) &&
- (strcmp(&oneline[5], r->uri) != 0))
- break;
- else if ((strncmp(oneline, "onetime=yes", 11) == 0)
- && !ishttps)
- apr_file_remove(cookiefile, r->pool);
- else if (strncmp(oneline, "method=PUT", 10) == 0)
- perm |= GRST_PERM_WRITE;
- else if (strncmp(oneline, "method=GET", 10) == 0)
- perm |= GRST_PERM_READ;
- }
-
- apr_file_close(fp);
- }
- }
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "After GACL/Onetime evaluation, GRST_PERM=%d", perm);
-
- /* set permission and GACL environment variables */
-
- apr_table_setn(r->notes, "GRST_PERM", apr_psprintf(r->pool, "%d", perm));
-
- if (((mod_gridsite_dir_cfg *) cfg)->envs)
- {
- apr_table_setn(env, "GRST_PERM", apr_psprintf(r->pool, "%d", perm));
-
- if (((dir_path = apr_pstrdup(r->pool, r->filename)) != NULL) &&
- ((p = rindex(dir_path, '/')) != NULL))
- {
- *p = '\0';
- apr_table_setn(env, "GRST_DIR_PATH", dir_path);
- }
-
- if (((mod_gridsite_dir_cfg *) cfg)->helpuri != NULL)
- apr_table_setn(env, "GRST_HELP_URI",
- ((mod_gridsite_dir_cfg *) cfg)->helpuri);
-
- if (((mod_gridsite_dir_cfg *) cfg)->adminfile != NULL)
- apr_table_setn(env, "GRST_ADMIN_FILE",
- ((mod_gridsite_dir_cfg *) cfg)->adminfile);
-
- if (((mod_gridsite_dir_cfg *) cfg)->editable != NULL)
- apr_table_setn(env, "GRST_EDITABLE",
- ((mod_gridsite_dir_cfg *) cfg)->editable);
-
- if (((mod_gridsite_dir_cfg *) cfg)->headfile != NULL)
- apr_table_setn(env, "GRST_HEAD_FILE",
- ((mod_gridsite_dir_cfg *) cfg)->headfile);
-
- if (((mod_gridsite_dir_cfg *) cfg)->footfile != NULL)
- apr_table_setn(env, "GRST_FOOT_FILE",
- ((mod_gridsite_dir_cfg *) cfg)->footfile);
-
- if (((mod_gridsite_dir_cfg *) cfg)->dnlists != NULL)
- apr_table_setn(env, "GRST_DN_LISTS",
- ((mod_gridsite_dir_cfg *) cfg)->dnlists);
-
- if (((mod_gridsite_dir_cfg *) cfg)->dnlistsuri != NULL)
- apr_table_setn(env, "GRST_DN_LISTS_URI",
- ((mod_gridsite_dir_cfg *) cfg)->dnlistsuri);
-
- if (((mod_gridsite_dir_cfg *) cfg)->adminlist != NULL)
- apr_table_setn(env, "GRST_ADMIN_LIST",
- ((mod_gridsite_dir_cfg *) cfg)->adminlist);
-
- apr_table_setn(env, "GRST_GSIPROXY_LIMIT",
- apr_psprintf(r->pool, "%d",
- ((mod_gridsite_dir_cfg *)cfg)->gsiproxylimit));
-
- if (((mod_gridsite_dir_cfg *) cfg)->unzip != NULL)
- apr_table_setn(env, "GRST_UNZIP",
- ((mod_gridsite_dir_cfg *) cfg)->unzip);
-
- if (!(((mod_gridsite_dir_cfg *) cfg)->gridsitelink))
- apr_table_setn(env, "GRST_NO_LINK", "1");
-
- if (((mod_gridsite_dir_cfg *) cfg)->aclformat != NULL)
- apr_table_setn(env, "GRST_ACL_FORMAT",
- ((mod_gridsite_dir_cfg *) cfg)->aclformat);
-
- if (((mod_gridsite_dir_cfg *) cfg)->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 (!(ctx->flags & X509_V_FLAG_CB_ISSUER_CHECK)) return 0;
-
- ctx->error = ret;
- ctx->current_cert = x;
- ctx->current_issuer = issuer;
- return ctx->verify_cb(0, ctx);
-}
-
-/* Later OpenSSL versions add a second pointer ... */
-int GRST_verify_cert_wrapper(X509_STORE_CTX *ctx, void *p)
-
-/* Earlier ones have a single argument ... */
-// int GRST_verify_cert_wrapper(X509_STORE_CTX *ctx)
-
-/* Before 0.9.7 we cannot change the check_issued callback directly in
- the X509_STORE, so we must insert it in another callback that gets
- called early enough */
-{
- ctx->check_issued = GRST_X509_check_issued_wrapper;
-
- return X509_verify_cert(ctx);
-}
-
-int GRST_callback_SSLVerify_wrapper(int ok, X509_STORE_CTX *ctx)
-{
- SSL *ssl = (SSL *) X509_STORE_CTX_get_app_data(ctx);
- conn_rec *conn = (conn_rec *) SSL_get_app_data(ssl);
- server_rec *s = conn->base_server;
- SSLConnRec *sslconn =
- (SSLConnRec *) ap_get_module_config(conn->conn_config, &ssl_module);
- int errnum = X509_STORE_CTX_get_error(ctx);
- int errdepth = X509_STORE_CTX_get_error_depth(ctx);
- int returned_ok;
- int first_non_ca;
- STACK_OF(X509) *certstack;
-
- /*
- * GSI Proxy user-cert-as-CA handling:
- * we skip Invalid CA errors at this stage, since we will check this
- * again at errdepth=0 for the full chain using GRSTx509CheckChain
- */
- if (errnum == X509_V_ERR_INVALID_CA)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
- "Skip Invalid CA error in case a GSI Proxy");
-
- sslconn->verify_error = NULL;
- ok = TRUE;
- errnum = X509_V_OK;
- X509_STORE_CTX_set_error(ctx, errnum);
- }
-
- /*
- * New style GSI Proxy handling, with critical ProxyCertInfo
- * extension: we use GRSTx509KnownCriticalExts() to check this
- */
-#ifndef X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION
-#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34
-#endif
- if (errnum == X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION)
- {
- if (GRSTx509KnownCriticalExts(X509_STORE_CTX_get_current_cert(ctx))
- == GRST_RET_OK)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
- "GRSTx509KnownCriticalExts() accepts previously "
- "Unhandled Critical Extension (GSI Proxy?)");
-
- sslconn->verify_error = NULL;
- ok = TRUE;
- errnum = X509_V_OK;
- X509_STORE_CTX_set_error(ctx, errnum);
- }
- }
-
- returned_ok = ssl_callback_SSLVerify(ok, ctx);
-
- /* in case ssl_callback_SSLVerify changed it */
- errnum = X509_STORE_CTX_get_error(ctx);
-
- if ((errdepth == 0) && (errnum == X509_V_OK))
- /*
- * We've now got the last certificate - the identity being used for
- * this connection. At this point we check the whole chain for valid
- * CAs or, failing that, GSI-proxy validity using GRSTx509CheckChain.
- */
- {
- errnum = GRSTx509CheckChain(&first_non_ca, ctx);
-
- if (errnum != X509_V_OK)
- {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
- "Invalid certificate chain reported by "
- "GRSTx509CheckChain()");
-
- sslconn->verify_error = X509_verify_cert_error_string(errnum);
- ok = FALSE;
- }
- else
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Valid certificate"
- " chain reported by GRSTx509CheckChain()");
-
- /* Put result of GRSTx509CompactCreds() into connection notes */
- if ((certstack =
- (STACK_OF(X509) *) X509_STORE_CTX_get_chain(ctx)) != NULL)
- GRST_save_ssl_creds(conn, certstack, NULL);
- }
- }
-
- return returned_ok;
-}
-
-void sitecast_handle_NOP_request(server_rec *main_server,
- GRSThtcpMessage *htcp_mesg, int igroup,
- struct sockaddr_in *client_addr_ptr)
-{
- int outbuf_len;
- char *outbuf;
-
- if (GRSThtcpNOPresponseMake(&outbuf, &outbuf_len,
- htcp_mesg->trans_id) == GRST_RET_OK)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast sends NOP response from port %d to %s:%d",
- sitecastgroups[0].port, inet_ntoa(client_addr_ptr->sin_addr),
- ntohs(client_addr_ptr->sin_port));
-
- sendto(sitecastgroups[0].socket, outbuf, outbuf_len, 0,
- client_addr_ptr, sizeof(struct sockaddr_in));
-
- free(outbuf);
- }
-}
-
-void sitecast_handle_TST_GET(server_rec *main_server,
- GRSThtcpMessage *htcp_mesg, int igroup,
- struct sockaddr_in *client_addr_ptr)
-{
- int i, outbuf_len, ialias;
- char *filename, *outbuf, *location, *local_uri = NULL;
- struct stat statbuf;
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast responder received TST GET with uri %s",
- htcp_mesg->uri->text, GRSThtcpCountstrLen(htcp_mesg->uri));
-
- /* find if any GridSiteCastAlias lines match */
-
- for (ialias=0; ialias < GRST_SITECAST_ALIASES ; ++ialias)
- {
- if (sitecastaliases[ialias].sitecast_url == NULL) return; /* no match */
-
- if ((strlen(sitecastaliases[ialias].sitecast_url)
- <= GRSThtcpCountstrLen(htcp_mesg->uri)) &&
- (strncmp(sitecastaliases[ialias].sitecast_url,
- htcp_mesg->uri->text,
- strlen(sitecastaliases[ialias].sitecast_url))==0)) break;
- }
-
- if (ialias == GRST_SITECAST_ALIASES)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast responder does not handle %*s requested by %s:%d",
- GRSThtcpCountstrLen(htcp_mesg->uri),
- htcp_mesg->uri->text,
- inet_ntoa(client_addr_ptr->sin_addr),
- ntohs(client_addr_ptr->sin_port));
-
- return; /* no match */
- }
-
- /* convert URL to filename, using alias mapping */
-
- asprintf(&filename, "%s%*s",
- sitecastaliases[ialias].local_path,
- GRSThtcpCountstrLen(htcp_mesg->uri)
- - strlen(sitecastaliases[ialias].sitecast_url),
- &(htcp_mesg->uri->text[strlen(sitecastaliases[ialias].sitecast_url)]) );
-
- if (stat(filename, &statbuf) == 0) /* found file */
- {
- asprintf(&location, "Location: %s://%s:%d/%s\r\n",
- sitecastaliases[ialias].scheme,
- sitecastaliases[ialias].local_hostname,
- sitecastaliases[ialias].port,
- &(htcp_mesg->uri->text[strlen(sitecastaliases[ialias].sitecast_url)]) );
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast finds %*s at %s, redirects with %s",
- GRSThtcpCountstrLen(htcp_mesg->uri),
- htcp_mesg->uri->text, filename, location);
-
- if (GRSThtcpTSTresponseMake(&outbuf, &outbuf_len,
- htcp_mesg->trans_id,
- location, "", "") == GRST_RET_OK)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast sends TST response from port %d to %s:%d",
- sitecastgroups[0].port, inet_ntoa(client_addr_ptr->sin_addr),
- ntohs(client_addr_ptr->sin_port));
-
- sendto(sitecastgroups[0].socket, outbuf, outbuf_len, 0,
- client_addr_ptr, sizeof(struct sockaddr_in));
-
- free(outbuf);
- }
-
- free(location);
- }
-
- free(filename);
-}
-
-void sitecast_handle_request(server_rec *main_server,
- char *reqbuf, int reqbuf_len, int igroup,
- struct sockaddr_in *client_addr_ptr)
-{
- GRSThtcpMessage htcp_mesg;
-
- if (GRSThtcpMessageParse(&htcp_mesg,reqbuf,reqbuf_len) != GRST_RET_OK)
- {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server,
- "SiteCast responder rejects format of UDP message from %s:%d",
- inet_ntoa(client_addr_ptr->sin_addr),
- ntohs(client_addr_ptr->sin_port));
- return;
- }
-
- if (htcp_mesg.rr != 0) /* ignore HTCP responses: we just do requests */
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast responder ignores HTCP response from %s:%d",
- inet_ntoa(client_addr_ptr->sin_addr),
- ntohs(client_addr_ptr->sin_port));
- return;
- }
-
- if (htcp_mesg.opcode == GRSThtcpNOPop)
- {
- sitecast_handle_NOP_request(main_server, &htcp_mesg,
- igroup, client_addr_ptr);
- return;
- }
-
- if (htcp_mesg.opcode == GRSThtcpTSTop)
- {
- if (((GRSThtcpCountstrLen(htcp_mesg.method) == 3) &&
- (strncmp(htcp_mesg.method->text, "GET", 3) == 0)) ||
- ((GRSThtcpCountstrLen(htcp_mesg.method) == 4) &&
- (strncmp(htcp_mesg.method->text, "HEAD", 4) == 0)))
- {
- sitecast_handle_TST_GET(main_server, &htcp_mesg,
- igroup, client_addr_ptr);
- return;
- }
-
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server,
- "SiteCast responder rejects method %*s in TST message from %s:%d",
- GRSThtcpCountstrLen(htcp_mesg.method), htcp_mesg.method->text,
- inet_ntoa(client_addr_ptr->sin_addr),
- ntohs(client_addr_ptr->sin_port));
- return;
- }
-
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server,
- "SiteCast does not implement HTCP op-code %d in message from %s:%d",
- htcp_mesg.opcode,
- inet_ntoa(client_addr_ptr->sin_addr),
- ntohs(client_addr_ptr->sin_port));
-}
-
-void sitecast_responder(server_rec *main_server)
-{
-#define GRST_SITECAST_MAXBUF 8192
- char reqbuf[GRST_SITECAST_MAXBUF], *p;
- int n, reqbuf_len, i, j, igroup,
- quad1, quad2, quad3, quad4, port, retval, client_addr_len;
- struct sockaddr_in srv, client_addr;
- struct ip_mreq mreq;
- fd_set readsckts;
- struct hostent *server_hostent;
-
- strcpy((char *) main_server->process->argv[0], "GridSiteCast UDP responder");
-
- /* initialise unicast/replies socket first */
-
- bzero(&srv, sizeof(srv));
- srv.sin_family = AF_INET;
- srv.sin_port = htons(sitecastgroups[0].port);
-
- if ((server_hostent = gethostbyname(main_server->server_hostname)) == NULL)
- {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server,
- "SiteCast UDP Responder fails to look up servername %s",
- main_server->server_hostname);
- return;
- }
-
- srv.sin_addr.s_addr = (u_int32_t) (server_hostent->h_addr_list[0][0]);
-
- if (((sitecastgroups[0].socket
- = socket(AF_INET, SOCK_DGRAM, 0)) < 0) ||
- (bind(sitecastgroups[0].socket,
- (struct sockaddr *) &srv, sizeof(srv)) < 0))
- {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server,
- "mod_gridsite: sitecast responder fails on unicast bind (%s)",
- strerror(errno));
- return;
- }
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast UDP unicast/replies on %d.%d.%d.%d:%d",
- server_hostent->h_addr_list[0][0],
- server_hostent->h_addr_list[0][1],
- server_hostent->h_addr_list[0][2],
- server_hostent->h_addr_list[0][3],
- sitecastgroups[0].port);
-
- /* initialise multicast listener sockets next */
-
- for (i=1; (i <= GRST_SITECAST_GROUPS) &&
- (sitecastgroups[i].port != 0); ++i)
- {
- bzero(&srv, sizeof(srv));
- srv.sin_family = AF_INET;
- srv.sin_port = htons(sitecastgroups[i].port);
- srv.sin_addr.s_addr = htonl(sitecastgroups[i].quad1*0x1000000
- + sitecastgroups[i].quad2*0x10000
- + sitecastgroups[i].quad3*0x100
- + sitecastgroups[i].quad4);
-
- if (((sitecastgroups[i].socket
- = socket(AF_INET, SOCK_DGRAM, 0)) < 0) ||
- (bind(sitecastgroups[i].socket,
- (struct sockaddr *) &srv, sizeof(srv)) < 0))
- {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server,
- "SiteCast UDP Responder fails on multicast bind (%s)",
- strerror(errno));
- return;
- }
-
- bzero(&mreq, sizeof(mreq));
- mreq.imr_multiaddr.s_addr = srv.sin_addr.s_addr;
- mreq.imr_interface.s_addr = htonl(INADDR_ANY);
-
- if (setsockopt(sitecastgroups[i].socket, IPPROTO_IP,
- IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
- {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_server,
- "SiteCast UDP Responder fails on setting multicast (%s)",
- strerror(errno));
- return;
- }
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast UDP Responder listening on %d.%d.%d.%d:%d",
- sitecastgroups[i].quad1, sitecastgroups[i].quad2,
- sitecastgroups[i].quad3, sitecastgroups[i].quad4,
- sitecastgroups[i].port);
- }
-
- for (i=0; (i < GRST_SITECAST_ALIASES) &&
- (sitecastaliases[i].sitecast_url != NULL) ; ++i)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast alias for %s (%s,%d) to %s (%s)",
- sitecastaliases[i].sitecast_url,
- sitecastaliases[i].scheme,
- sitecastaliases[i].port,
- sitecastaliases[i].local_path,
- sitecastaliases[i].local_hostname);
- }
-
- while (1) /* **** main listening loop **** */
- {
- /* set up bitmasks for select */
-
- FD_ZERO(&readsckts);
-
- n = 0;
- for (i=0; (i <= GRST_SITECAST_GROUPS) &&
- (sitecastgroups[i].port != 0); ++i) /* reset bitmask */
- {
- FD_SET(sitecastgroups[i].socket, &readsckts);
- if (sitecastgroups[i].socket > n) n = sitecastgroups[i].socket;
- }
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast UDP Responder waiting for requests");
-
- if ((retval = select(n + 1, &readsckts, NULL, NULL, NULL)) < 1)
- continue; /* < 1 on timeout or error */
-
- for (igroup=0; (igroup <= GRST_SITECAST_GROUPS) &&
- (sitecastgroups[igroup].port != 0); ++igroup)
- {
- if (FD_ISSET(sitecastgroups[igroup].socket, &readsckts))
- {
- client_addr_len = sizeof(client_addr);
-
- if ((reqbuf_len = recvfrom(sitecastgroups[igroup].socket,
- reqbuf, GRST_SITECAST_MAXBUF, 0,
- (struct sockaddr *) &client_addr, &client_addr_len)) >= 0)
- {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "SiteCast receives UDP message from %s:%d "
- "to %d.%d.%d.%d:%d",
- inet_ntoa(client_addr.sin_addr),
- ntohs(client_addr.sin_port),
- sitecastgroups[igroup].quad1,
- sitecastgroups[igroup].quad2,
- sitecastgroups[igroup].quad3,
- sitecastgroups[igroup].quad4,
- sitecastgroups[igroup].port);
-
- sitecast_handle_request(main_server, reqbuf,
- reqbuf_len, igroup,
- &client_addr);
- }
- }
- }
-
- } /* **** end of main listening loop **** */
-}
-
-static int mod_gridsite_server_post_config(apr_pool_t *pPool,
- apr_pool_t *pLog, apr_pool_t *pTemp, server_rec *main_server)
-{
- SSL_CTX *ctx;
- SSLSrvConfigRec *sc;
- server_rec *this_server;
- apr_proc_t *procnew = NULL;
- apr_status_t status;
- char *path;
- const char *userdata_key = "sitecast_init";
-
- apr_pool_userdata_get((void **) &procnew, userdata_key,
- main_server->process->pool);
-
- /* we only fork responder if one not already forked and we have at
- least one GridSiteCastAlias defined. This means it is possible
- to run a responder with no groups - listening on unicast only! */
-
- if ((procnew == NULL) &&
- (sitecastaliases[0].sitecast_url != NULL))
- {
- /* UDP multicast responder required but not yet started */
-
- procnew = apr_pcalloc(main_server->process->pool, sizeof(*procnew));
- apr_pool_userdata_set((const void *) procnew, userdata_key,
- apr_pool_cleanup_null, main_server->process->pool);
-
- status = apr_proc_fork(procnew, pPool);
-
- if (status < 0)
- {
- ap_log_error(APLOG_MARK, APLOG_CRIT, status, main_server,
- "mod_gridsite: Failed to spawn SiteCast responder process");
- return HTTP_INTERNAL_SERVER_ERROR;
- }
- else if (status == APR_INCHILD)
- {
- ap_log_error(APLOG_MARK, APLOG_NOTICE, status, main_server,
- "mod_gridsite: Spawning SiteCast responder process");
- sitecast_responder(main_server);
- exit(-1);
- }
-
- apr_pool_note_subprocess(main_server->process->pool,
- procnew, APR_KILL_AFTER_TIMEOUT);
- }
-
- /* continue with normal HTTP/HTTPS servers */
-
- ap_add_version_component(pPool,
- apr_psprintf(pPool, "mod_gridsite/%s", VERSION));
-
- for (this_server = main_server;
- this_server != NULL;
- this_server = this_server->next)
- {
- /* we do some GridSite OpenSSL magic for HTTPS servers */
-
- sc = ap_get_module_config(this_server->module_config, &ssl_module);
-
- if ((sc != NULL) &&
- (sc->enabled) &&
- (sc->server != NULL) &&
- (sc->server->ssl_ctx != NULL))
- {
- ctx = sc->server->ssl_ctx;
-
- /* in 0.9.7 we could set the issuer-checking callback directly */
-// ctx->cert_store->check_issued = GRST_X509_check_issued_wrapper;
-
- /* but in case 0.9.6 we do it indirectly with another wrapper */
- SSL_CTX_set_cert_verify_callback(ctx,
- GRST_verify_cert_wrapper,
- (void *) NULL);
-
- /* whatever version, we can set the SSLVerify wrapper properly */
- SSL_CTX_set_verify(ctx, ctx->verify_mode,
- GRST_callback_SSLVerify_wrapper);
-
- if (main_server->loglevel >= APLOG_DEBUG)
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, main_server,
- "Set mod_ssl verify callbacks to GridSite wrappers");
- }
- }
-
- /* create sessions directory if necessary */
-
- path = ap_server_root_relative(pPool, sessionsdir);
- apr_dir_make_recursive(path, APR_UREAD | APR_UWRITE | APR_UEXECUTE, pPool);
- chown(path, unixd_config.user_id, unixd_config.group_id);
-
- return OK;
-}
-
-static void mod_gridsite_child_init(apr_pool_t *pPool, server_rec *pServer)
-{
- apr_time_t cutoff_time;
- apr_dir_t *dir;
- char *filename;
- apr_finfo_t finfo;
- SSLSrvConfigRec *sc = ap_get_module_config(pServer->module_config,
- &ssl_module);
- GRSTgaclInit();
-
- /* expire old ssl creds files */
-
- if (sc != NULL)
- {
- cutoff_time = apr_time_now()
- - apr_time_from_sec(sc->session_cache_timeout);
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, pServer,
- "Cutoff time for ssl creds cache: %ld",
- (long) apr_time_sec(cutoff_time));
-
- if (apr_dir_open(&dir,
- ap_server_root_relative(pPool, sessionsdir), pPool) == APR_SUCCESS)
- {
- while (apr_dir_read(&finfo,
- APR_FINFO_CTIME | APR_FINFO_NAME, dir) == APR_SUCCESS)
- {
- if ((finfo.ctime < cutoff_time) &&
- (strncmp(finfo.name, "sslcreds-", 9) == 0))
- {
- filename = apr_pstrcat(pPool,
- ap_server_root_relative(pPool, sessionsdir),
- "/", finfo.name, NULL);
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, pServer,
- "Remove %s from ssl creds cache", filename);
-
- apr_file_remove(filename, pPool);
- }
- }
-
- apr_dir_close(dir);
- }
- }
-}
-
-static int mod_gridsite_handler(request_rec *r)
-{
- mod_gridsite_dir_cfg *conf;
-
- conf = (mod_gridsite_dir_cfg *)
- ap_get_module_config(r->per_dir_config, &gridsite_module);
-
- if ((conf->dnlistsuri != NULL) &&
- (strncmp(r->uri, conf->dnlistsuri, strlen(conf->dnlistsuri)) == 0))
- {
- if (strcmp(r->uri, conf->dnlistsuri) == 0)
- return mod_gridsite_dnlistsuri_dir_handler(r, conf);
-
- return mod_gridsite_dnlistsuri_handler(r, conf);
- }
-
- if (strcmp(r->handler, DIR_MAGIC_TYPE) == 0)
- return mod_gridsite_dir_handler(r, conf);
-
- return mod_gridsite_nondir_handler(r, conf);
-}
-
-static ap_unix_identity_t *mod_gridsite_get_suexec_id_doer(const request_rec *r)
-{
- mod_gridsite_dir_cfg *conf;
-
- conf = (mod_gridsite_dir_cfg *)
- ap_get_module_config(r->per_dir_config, &gridsite_module);
-
- if ((conf->execugid.uid != UNSET) &&
- (conf->execmethod != NULL))
- {
-
- /* also push GRST_EXEC_DIRECTORY into request environment here too */
-
- return &(conf->execugid);
- }
-
- return NULL;
-}
-
-static void register_hooks(apr_pool_t *p)
-{
- /* config and handler stuff */
-
- ap_hook_post_config(mod_gridsite_server_post_config, NULL, NULL,
- APR_HOOK_LAST);
- ap_hook_child_init(mod_gridsite_child_init, NULL, NULL, APR_HOOK_MIDDLE);
-
- ap_hook_check_user_id(mod_gridsite_check_user_id, NULL, NULL,
- APR_HOOK_REALLY_FIRST);
-
- ap_hook_fixups(mod_gridsite_first_fixups,NULL,NULL,APR_HOOK_FIRST);
-
- ap_hook_fixups(mod_gridsite_perm_handler,NULL,NULL,APR_HOOK_REALLY_LAST);
-
- ap_hook_handler(mod_gridsite_handler, NULL, NULL, APR_HOOK_FIRST);
-
- ap_hook_get_suexec_identity(mod_gridsite_get_suexec_id_doer,
- NULL, NULL, APR_HOOK_MIDDLE);
-}
-
-module AP_MODULE_DECLARE_DATA gridsite_module =
-{
- STANDARD20_MODULE_STUFF,
- create_gridsite_dir_config, /* dir config creater */
- merge_gridsite_dir_config, /* dir merger */
- create_gridsite_srv_config, /* create server config */
- NULL, /* merge server config */
- mod_gridsite_cmds, /* command apr_table_t */
- register_hooks /* register hooks */
-};
+++ /dev/null
-/*
- Copyright (c) 2003-4, Andrew McNab, University of Manchester
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- o Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
- o Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*
-
- Portions of this code are derived from Apache mod_ssl, and are covered
- by the Apache Software License:
-
- * Copyright 2001-2004 The Apache Software Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*------------------------------------------------------------------*
- * This program is part of GridSite: http://www.gridsite.org/ *
- *------------------------------------------------------------------*/
-
-
-/*
- * After 2.0.49, Apache mod_ssl has most of the mod_ssl structures defined
- * in ssl_private.h, which is not installed along with httpd-devel (eg in
- * the FC2 RPM.) This include file provides SIMPLIFIED structures for use
- * by mod_gridsite: for example, pointers to unused structures are replaced
- * by void * and some of the structures are truncated when only the early
- * members are used.
- *
- * CLEARLY, THIS WILL BREAK IF THERE ARE MAJOR CHANGES TO ssl_private.h!!!
- */
-
-#include <openssl/ssl.h>
-
-typedef enum {
- SSL_SHUTDOWN_TYPE_UNSET,
- SSL_SHUTDOWN_TYPE_STANDARD,
- SSL_SHUTDOWN_TYPE_UNCLEAN,
- SSL_SHUTDOWN_TYPE_ACCURATE
-} ssl_shutdown_type_e;
-
-typedef struct {
- SSL *ssl;
- const char *client_dn;
- X509 *client_cert;
- ssl_shutdown_type_e shutdown_type;
- const char *verify_info;
- const char *verify_error;
- int verify_depth;
- int is_proxy;
- int disabled;
- int non_ssl_request;
-} SSLConnRec;
-
-typedef struct {
- void *sc; /* pointer back to server config */
- SSL_CTX *ssl_ctx;
-} modssl_ctx_t;
-
-typedef struct {
- void *mc;
- unsigned int enabled;
- unsigned int proxy_enabled;
- const char *vhost_id;
- int vhost_id_len;
- int session_cache_timeout;
- modssl_ctx_t *server;
- modssl_ctx_t *proxy;
-} SSLSrvConfigRec;
-
-extern module AP_MODULE_DECLARE_DATA ssl_module;
+++ /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-6, Andrew McNab,
- University of Manchester. All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, are permitted provided that the following
- conditions are met:
-
- o Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
- o Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*------------------------------------------------------------------*
- * This program is part of GridSite: http://www.gridsite.org/ *
- *------------------------------------------------------------------*/
-
-#define _GNU_SOURCE
-#define _XOPEN_SOURCE
-
-#include <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 <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_HEADERS "/var/spool/slashgrid/headers"
-#define GRST_SLASH_BLOCKS "/var/spool/slashgrid/blocks"
-#define GRST_SLASH_TMP "/var/spool/slashgrid/tmp"
-#define GRST_SLASH_DIRFILE "::DIR::"
-
-#define GRST_SLASH_HEAD 0
-#define GRST_SLASH_GET 1
-#define GRST_SLASH_PUT 2
-#define GRST_SLASH_DELETE 3
-#define GRST_SLASH_MOVE 4
-#define GRST_SLASH_TRUNC 5
-
-#define GRST_SLASH_HEADERS_EXPIRE 60
-#define GRST_SLASH_BLOCK_SIZE 4096
-#define GRST_SLASH_MAX_HANDLES 16
-
-#define GRST_SLASH_MAX_LOCATION 1024
-
-/* maximum number of SiteCast groups */
-#define GRST_SLASH_MAX_GROUPS 10
-
-#define GRST_SLASH_HTCP_PORT 777
-
-#ifndef CURLOPT_WRITEDATA
-#define CURLOPT_WRITEDATA CURLOPT_FILE
-#endif
-
-#ifndef CURLOPT_READDATA
-#define CURLOPT_READDATA CURLOPT_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;
- time_t last_used;
- } handles[GRST_SLASH_MAX_HANDLES];
-
-int debugmode = 0;
-int number_of_tries = 1, sitecast_domain_len = 0;
-char *sitecast_domain = NULL, *sitecast_groups = NULL, *local_root = NULL,
- *gridmapdir = NULL;
-uid_t local_uid = 0;
-gid_t local_gid = 0;
-
-size_t headers_callback(void *ptr, size_t size, size_t nmemb, void *p)
-/* Find the values of the return code, Content-Length, Last-Modified
- and Location headers */
-{
- float f;
- char *s, *q;
- size_t realsize;
- struct tm modified_tm;
- struct grst_request *request_data = (struct grst_request *) p;
-
- realsize = size * nmemb;
- s = malloc(realsize + 1);
- memcpy(s, ptr, realsize);
- s[realsize] = '\0';
-
- if (sscanf(s, "Content-Length: %d", &(request_data->length)) == 1)
- request_data->length_set = 1;
- else if (sscanf(s, "HTTP/%f %d ", &f, &(request_data->retcode)) == 2) ;
- else if (strncmp(s, "Location: ", 10) == 0)
- {
- strncpy(request_data->location, &s[10], GRST_SLASH_MAX_LOCATION);
- /* the location string is 1 byte longer and zeroed before use */
-
- for (q=request_data->location; *q != '\0'; ++q)
- if ((*q == '\r') || (*q == '\n')) *q = '\0';
- }
- else if (strncmp(s, "Last-Modified: ", 15) == 0)
- {
- /* follow RFC 2616: first try RFC 822 (kosher), then RFC 850 and
- asctime() formats too. Must be GMT whatever the format. */
-
- if (strptime(&s[15], "%a, %d %b %Y %T GMT", &modified_tm) != NULL)
- {
- request_data->modified = mktime(&modified_tm);
- request_data->modified_set = 1;
- }
- else if (strptime(&s[15], "%a, %d-%b-%y %T GMT", &modified_tm) != NULL)
- {
- request_data->modified = mktime(&modified_tm);
- request_data->modified_set = 1;
- }
- else if (strptime(&s[15], "%a %b %d %T %Y", &modified_tm) != NULL)
- {
- request_data->modified = mktime(&modified_tm);
- request_data->modified_set = 1;
- }
- }
-
- free(s);
- return realsize;
-}
-
-int debug_callback(CURL *handle, curl_infotype infotype,
- char *rawmesg, size_t size, void *i)
-{
- int n;
- char *mesg;
-
- if ((infotype == CURLINFO_DATA_IN) ||
- (infotype == CURLINFO_DATA_OUT)) return 0;
-
- mesg = malloc(size + 1);
-
- for (n=0; n < size; ++n)
- {
- if ((rawmesg[n] == '\r') && (n >= size - 2)) mesg[n] = '\0';
- else if (((rawmesg[n] == '\r') || (rawmesg[n] == '\n')) &&
- (infotype == CURLINFO_HEADER_IN)) mesg[n] = '<';
- else if (((rawmesg[n] == '\r') || (rawmesg[n] == '\n')) &&
- (infotype == CURLINFO_HEADER_OUT)) mesg[n] = '>';
- else if ((rawmesg[n] < ' ') || (rawmesg[n] >= 127)) mesg[n] = '.';
- else mesg[n] = rawmesg[n];
- }
-
- mesg[n] = '\0';
-
- syslog(LOG_DEBUG, "%d %s%s%s%s",
- *((int *) i),
- (infotype == CURLINFO_HEADER_IN ) ? "<<" : "",
- (infotype == CURLINFO_HEADER_OUT) ? ">>" : "",
- (infotype == CURLINFO_TEXT ) ? "**" : "",
- mesg);
-
- free(mesg);
- return 0;
-}
-
-
-int translate_sitecast_url(char **sitecast_url, char *raw_url)
-{
- int request_length, response_length, i, ret, s, igroup;
- struct sockaddr_in srv, from;
- socklen_t fromlen;
-#define MAXBUF 8192
- char *request, response[MAXBUF], *p;
- GRSThtcpMessage msg;
- struct timeval start_timeval, wait_timeval;
- struct grst_sitecast_group
- { unsigned char quad1; unsigned char quad2;
- unsigned char quad3; unsigned char quad4;
- int port; int timewait; int ttl; } groups[GRST_SLASH_MAX_GROUPS];
- fd_set readsckts;
-
- p = sitecast_groups;
- igroup = -1;
-
- for (igroup=-1; igroup+1 < GRST_SLASH_MAX_GROUPS;)
- {
- /* defaults for when sscanf fails to find all parameters */
-
- groups[igroup+1].port = GRST_SLASH_HTCP_PORT;
- groups[igroup+1].timewait = 1;
- groups[igroup+1].ttl = 1;
-
- ret = sscanf(p, "%d.%d.%d.%d:%d:%d:%d",
- &(groups[igroup+1].quad1),
- &(groups[igroup+1].quad2),
- &(groups[igroup+1].quad3),
- &(groups[igroup+1].quad4),
- &(groups[igroup+1].port),
- &(groups[igroup+1].ttl),
- &(groups[igroup+1].timewait));
-
- if (ret == 0) break; /* end of list ? */
-
- if (ret < 5)
- {
- syslog(LOG_WARNING,
- "Failed parsing multicast group parameter %s\n", p);
- return GRST_RET_FAILED;
- }
-
- ++igroup;
-
- if ((p = index(p, ',')) == NULL) break;
- ++p;
- }
-
- if (igroup == -1)
- {
- syslog(LOG_WARNING, "Failed parsing multicast group parameter %s\n", p);
- return GRST_RET_FAILED;
- }
-
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- {
- syslog(LOG_WARNING, "Failed to open SiteCast UDP socket\n");
- return GRST_RET_FAILED;
- }
-
- /* loop through multicast groups since we need to take each
- ones timewait into account */
-
- gettimeofday(&start_timeval, NULL);
-
- for (i=0; i <= igroup; ++i)
- {
- if (debugmode)
- syslog(LOG_DEBUG, "Querying multicast group %d.%d.%d.%d:%d:%d:%d\n",
- groups[i].quad1, groups[i].quad2,
- groups[i].quad3, groups[i].quad4,
- groups[i].port, groups[i].ttl,
- groups[i].timewait);
-
- bzero(&srv, sizeof(srv));
- srv.sin_family = AF_INET;
- srv.sin_port = htons(groups[i].port);
- srv.sin_addr.s_addr = htonl(groups[i].quad1*0x1000000
- + groups[i].quad2*0x10000
- + groups[i].quad3*0x100
- + groups[i].quad4);
-
- /* send off queries, one for each source file */
-
- GRSThtcpTSTrequestMake(&request, &request_length,
- (int) (start_timeval.tv_usec),
- "GET", raw_url, "");
-
- sendto(s, request, request_length, 0,
- (struct sockaddr *) &srv, sizeof(srv));
-
- free(request);
-
- /* reusing wait_timeval is a Linux-specific feature of select() */
- wait_timeval.tv_usec = 0;
- wait_timeval.tv_sec = groups[i].timewait;
-
- while ((wait_timeval.tv_sec > 0) || (wait_timeval.tv_usec > 0))
- {
- FD_ZERO(&readsckts);
- FD_SET(s, &readsckts);
-
- ret = select(s + 1, &readsckts, NULL, NULL, &wait_timeval);
-
- if (ret > 0)
- {
- response_length = recvfrom(s, response, MAXBUF,
- 0, &from, &fromlen);
-
- if ((GRSThtcpMessageParse(&msg, response, response_length)
- == GRST_RET_OK) &&
- (msg.opcode == GRSThtcpTSTop) && (msg.rr == 1) &&
- (msg.trans_id == (int) start_timeval.tv_usec) &&
- (msg.resp_hdrs != NULL) &&
- (GRSThtcpCountstrLen(msg.resp_hdrs) > 12))
- {
- /* found one */
-
- if (debugmode)
- syslog(LOG_DEBUG, "Sitecast %s -> %.*s\n",
- raw_url,
- GRSThtcpCountstrLen(msg.resp_hdrs) - 12,
- &(msg.resp_hdrs->text[10]));
-
- asprintf(sitecast_url, "%.*s",
- GRSThtcpCountstrLen(msg.resp_hdrs) - 12,
- &(msg.resp_hdrs->text[10]));
-
- return GRST_RET_OK;
- }
- }
- }
- }
-
- return GRST_RET_FAILED;
-}
-
-char *check_x509_user_proxy(pid_t pid)
-{
- int fd;
- char file[80], *proxyfile = NULL, *pid_environ, *p;
- struct stat statbuf1, statbuf2;
-
- snprintf(file, sizeof(file), "/proc/%d/environ", (int) pid);
-
- if ((fd = open(file, O_RDONLY)) == -1) return NULL;
-
- if (debugmode) syslog(LOG_DEBUG, "Opened for %d environ in %s", (int) pid, file);
-
- fstat(fd, &statbuf1);
-
- pid_environ = malloc(statbuf1.st_size + 1);
-
- read(fd, pid_environ, statbuf1.st_size);
-
- close(fd);
-
- pid_environ[statbuf1.st_size] = '\0';
-
- for (p = pid_environ; p < pid_environ + statbuf1.st_size; p += (strlen(p) + 1))
- {
- if (debugmode) syslog(LOG_DEBUG, "Examine %s in environ", p);
-
- if (strncmp(p, "X509_USER_PROXY=", 16) == 0)
- {
- if ((p[16] != '\0') &&
- (stat(&p[16], &statbuf2) == 0)) proxyfile = strdup(&p[16]);
- break;
- }
- }
-
- free(pid_environ);
-
- return proxyfile;
-}
-
-char *mapdir_uid_to_dn(uid_t uid)
-{
- int ret;
- char *firstlinkpath, *otherlinkpath, *dn, *buf = NULL;
- struct dirent *mapdirentry;
- DIR *mapdirstream;
- ino_t firstinode;
- long buflen;
- struct stat statbuf;
- struct passwd pw, *pwp;
-
- if (gridmapdir == NULL) return NULL;
-
- buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
- buf = malloc(buflen);
-
- if ((buflen <= 0) ||
- (getpwuid_r(uid, &pw, buf, buflen, &pwp) != 0) ||
- (pw.pw_name == NULL))
- {
- if (buf != NULL) free(buf);
- return NULL;
- }
-
- asprintf(&firstlinkpath, "%s/%s", gridmapdir, pw.pw_name);
- ret = stat(firstlinkpath, &statbuf);
-
- free(firstlinkpath);
-
- if ((ret != 0) || (statbuf.st_nlink != 2))
- {
- free(buf);
- return NULL;
- }
-
- firstinode = statbuf.st_ino; /* save for comparisons */
-
- mapdirstream = opendir(gridmapdir);
-
- if (mapdirstream != NULL)
- {
- while ((mapdirentry = readdir(mapdirstream)) != NULL)
- {
- if (strcmp(mapdirentry->d_name, pw.pw_name) == 0) continue;
-
- if (mapdirentry->d_ino == firstinode)
- {
- asprintf(&otherlinkpath, "%s/%s", gridmapdir,
- mapdirentry->d_name);
-
- utime(otherlinkpath, (struct utimbuf *) NULL);
- free(otherlinkpath);
-
- dn = GRSThttpUrlDecode(mapdirentry->d_name);
-
- if (debugmode) syslog(LOG_DEBUG, "mapdir_uid_to_dn "
- "maps %s(%d) to %s", pw.pw_name, uid, dn);
-
- closedir(mapdirstream);
- free(buf);
- return dn;
- }
- }
-
- closedir(mapdirstream);
- }
-
- free(buf);
- return NULL;
-}
-
-
-int perform_request(struct grst_request *request_data,
- struct fuse_context *fuse_ctx)
-{
- int ret, i, j, itry, ishttps = 0;
- char *proxyfile = NULL, *range_header = NULL, *url;
- struct stat statbuf;
- struct curl_slist *headers_list = NULL;
-
- if (strncmp(request_data->url, "https://", 8) == 0) /* HTTPS options */
- {
-// check for X509_USER_PROXY in that PID's environ too
- ishttps = 1;
-
- if ((proxyfile = check_x509_user_proxy(fuse_ctx->pid)) == NULL)
- {
- asprintf(&proxyfile, "/tmp/x509up_u%d", fuse_ctx->uid);
- /* if proxyfile is used, it will be referenced by handles[].proxyfile
- and freed when this handle is eventually freed */
-
- if ((stat(proxyfile, &statbuf) != 0) ||
- (statbuf.st_uid != fuse_ctx->uid))
- {
- free(proxyfile);
- proxyfile = NULL;
- }
- }
- }
-
- if (debugmode && (proxyfile != NULL))
- syslog(LOG_DEBUG, "Using proxy file %s", proxyfile);
-
- /* try to find an existing handle for this uid/proxyfile */
-
- for (i=0; i < GRST_SLASH_MAX_HANDLES; ++i)
- {
- if ((handles[i].curl_handle != NULL) &&
- (handles[i].uid == fuse_ctx->uid) &&
- (((handles[i].proxyfile == NULL) && (proxyfile == NULL)) ||
- ((handles[i].proxyfile != NULL) && (proxyfile != NULL) &&
- (strcmp(handles[i].proxyfile, proxyfile) == 0))))
- {
- break;
- }
- }
-
- if (i >= GRST_SLASH_MAX_HANDLES) /* no existing match found */
- {
- i=0;
-
- for (j=0; j < GRST_SLASH_MAX_HANDLES; ++j)
- {
- if (handles[j].curl_handle == NULL) /* unused slot */
- {
- i = j;
- break;
- }
-
- if (handles[j].last_used < handles[i].last_used) i = j;
- }
- }
-
- /* now lock this handle and recheck settings inside the mutex lock */
-
- pthread_mutex_lock(&(handles[i].mutex)); /* unlock just before return */
-
- if ((handles[i].curl_handle == NULL) ||
- (handles[i].uid != fuse_ctx->uid) ||
- (((handles[i].proxyfile != NULL) || (proxyfile != NULL)) &&
- ((handles[i].proxyfile == NULL) || (proxyfile == NULL) ||
- (strcmp(handles[i].proxyfile, proxyfile) != 0))))
- {
- /* we do need to initialise this handle */
-
- handles[i].uid = fuse_ctx->uid;
-
- if (handles[i].curl_handle != NULL)
- curl_easy_cleanup(handles[i].curl_handle);
- handles[i].curl_handle = curl_easy_init();
-
- if (handles[i].proxyfile != NULL) free(handles[i].proxyfile);
- handles[i].proxyfile = proxyfile; /* proxyfile might be NULL itself */
-
- if (handles[i].proxyfile != NULL)
- {
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERTTYPE, "PEM");
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERT,
- handles[i].proxyfile);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLKEYTYPE, "PEM");
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLKEY,
- handles[i].proxyfile);
- }
- else
- {
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLKEYTYPE, "ENG");
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERTTYPE, "ENG");
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSLCERT, NULL);
- }
-
- if (debugmode)
- {
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_VERBOSE, 1);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_DEBUGFUNCTION,
- debug_callback);
- }
-
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_USERAGENT,
- "SlashGrid http://www.gridsite.org/slashgrid/");
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_FOLLOWLOCATION, 0);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_HEADERFUNCTION, headers_callback);
-
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_CAPATH,
- "/etc/grid-security/certificates");
-
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSL_VERIFYPEER, 2);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
- }
-
- 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);
-
-/* Move to higher up
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_READFUNCTION, request_data->readfunction);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_READDATA, request_data->readdata);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_WRITEFUNCTION, request_data->writefunction);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_WRITEDATA, request_data->writedata);
-*/
- if ((request_data->start >= 0) &&
- (request_data->finish >= request_data->start))
- {
- if (request_data->method == GRST_SLASH_PUT)
- asprintf(&range_header, "Content-Range: bytes %ld-%ld/*",
- (long) request_data->start, (long) request_data->finish);
- else if (request_data->method == GRST_SLASH_TRUNC)
- asprintf(&range_header, "Content-Range: bytes *-*/%ld",
- (long) request_data->finish);
- else asprintf(&range_header, "Range: bytes=%ld-%ld",
- (long) request_data->start, (long) request_data->finish);
-
- headers_list = curl_slist_append(headers_list, range_header);
- curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPHEADER, headers_list);
- }
- else curl_easy_setopt(handles[i].curl_handle, CURLOPT_HTTPHEADER, NULL);
-
- /* retry loop */
-
- for (itry=1; itry <= number_of_tries; ++itry)
- {
- request_data->length_set = 0;
- request_data->modified_set = 0;
- request_data->retcode = 0;
- request_data->location[0] = '\0';
-
- if ((sitecast_domain != NULL) &&
- (sitecast_groups != NULL) &&
-
- ((request_data->method == GRST_SLASH_HEAD) ||
- (request_data->method == GRST_SLASH_GET)) &&
-
- ((!ishttps &&
- (strncmp(&(request_data->url[7]), sitecast_domain,
- sitecast_domain_len) == 0) &&
- ((request_data->url[7+sitecast_domain_len] == ':') ||
- (request_data->url[7+sitecast_domain_len] == '/')) )
- ||
- (ishttps &&
- (strncmp(&(request_data->url[8]), sitecast_domain,
- sitecast_domain_len) == 0) &&
- ((request_data->url[8+sitecast_domain_len] == ':') ||
- (request_data->url[8+sitecast_domain_len] == '/')) ) ) )
- {
- if (debugmode)
- syslog(LOG_DEBUG, "Apply SiteCast to URL %s", request_data->url);
-
- if (translate_sitecast_url(&url, request_data->url) ==
- GRST_RET_OK)
- {
- curl_easy_setopt(handles[i].curl_handle,
- CURLOPT_URL, url);
- ret = curl_easy_perform(handles[i].curl_handle);
-
- free(url);
- }
- else
- {
- ret = 1;
- request_data->retcode = 404; /* HTTP not found */
- }
- }
- else
- {
- curl_easy_setopt(handles[i].curl_handle,
- CURLOPT_URL, request_data->url);
- ret = curl_easy_perform(handles[i].curl_handle);
- }
-
-// tests on whether to retry due to server error / timeout go here...
- break;
- }
-
- if (headers_list != NULL) curl_slist_free_all(headers_list);
- if (range_header != NULL) free(range_header);
-
- pthread_mutex_unlock(&(handles[i].mutex));
-
- return ret;
-}
-
-size_t rawbody_callback(void *ptr, size_t size, size_t nmemb, void *data)
-{
- if ( ((struct grst_body_text *) data)->used + size * nmemb >=
- ((struct grst_body_text *) data)->allocated )
- {
- ((struct grst_body_text *) data)->allocated =
- ((struct grst_body_text *) data)->used + size * nmemb + 4096;
-
- ((struct grst_body_text *) data)->text =
- realloc( ((struct grst_body_text *) data)->text,
- ((struct grst_body_text *) data)->allocated );
- }
-
- memcpy( &( ((struct grst_body_text *)
- data)->text[((struct grst_body_text *) data)->used] ),
- ptr, size * nmemb);
-
- ((struct grst_body_text *) data)->used += size * nmemb;
-
- return size * nmemb;
-}
-
-size_t null_callback(void *ptr, size_t size, size_t nmemb, void *data)
-{
- return size * nmemb;
-}
-
-size_t read_data_callback(void *ptr, size_t size, size_t nmemb, void *data)
-{
- size_t sent;
-
- if (((struct grst_read_data *) data)->sent
- >= ((struct grst_read_data *) data)->maxsent) return 0;
-
- if (size * nmemb + ((struct grst_read_data *) data)->sent
- >= ((struct grst_read_data *) data)->maxsent)
- {
- sent = ((struct grst_read_data *) data)->maxsent
- - ((struct grst_read_data *) data)->sent;
- }
- else sent = size * nmemb;
-
- memcpy(ptr,
- ((struct grst_read_data *) data)->buf +
- ((struct grst_read_data *) data)->sent,
- sent);
-
- ((struct grst_read_data *) data)->sent += sent;
-
- return sent;
-}
-
-char *canonicalise(char *link, char *source)
-{
- int i, j, srclen;
- char *s;
-
- srclen = strlen(source);
-
- if ((strncmp(link, "https://", 8) == 0) ||
- (strncmp(link, "http://", 7) == 0))
- {
- if (strncmp(link, source, srclen) != 0) return NULL; /* other site */
-
- if (link[srclen] == '\0') return NULL; /* we dont self-link! */
-
- for (i=0; link[srclen + i] != '\0'; ++i)
- if (link[srclen + i] == '/')
- {
- if (link[srclen + i + 1] != '\0') return NULL; /* no subdirs */
- else return strdup(&link[srclen]); /* resolves to this dir */
- }
- }
- else if (link[0] != '/') /* relative link - need to check for subsubdirs */
- {
- for (i=0; link[i] != '\0'; ++i)
- if ((link[i] == '/') && (link[i+1] != '\0')) return NULL;
-
- s = strdup(link);
-
- for (i=0; s[i] != '\0'; ++i)
- if (s[i] == '#')
- {
- s[i] = '\0';
- break;
- }
-
- return s;
- }
-
- /* absolute link on this server, starting / */
-
- for (i=8; source[i] != '\0'; ++i) if (source[i] == '/') break;
-
- if (strncmp(link, &source[i], srclen - i) != 0) return NULL;
-
- for (j = srclen - i; link[j] != '\0'; ++j)
- if ((link[j] == '/') && (link[j+1] != '\0')) return NULL;
-
- s = strdup(&link[srclen - i]);
-
- for (i=0; s[i] != '\0'; ++i)
- if (s[i] == '#')
- {
- s[i] = '\0';
- break;
- }
-
- if (s[0] == '\0') /* on second thoughts... */
- {
- free(s);
- return NULL;
- }
-
- return s;
-}
-
-int grst_dir_list_cmp(const void *a, const void *b)
-{
- return strcmp( ((struct grst_dir_list *) a)->filename,
- ((struct grst_dir_list *) b)->filename);
-}
-
-struct grst_dir_list *index_to_dir_list(char *text, char *source)
-{
- int taglevel = 0, wordnew = 1, i, namestart, used = 0,
- allocated = 256;
- char *p, *s;
- struct grst_dir_list *list;
-
- list = (struct grst_dir_list *)
- malloc(allocated * sizeof(struct grst_dir_list));
-
- list[0].filename = NULL;
- list[0].length = 0;
- list[0].length_set = 0;
- list[0].modified = 0;
- list[0].modified_set = 0;
-
- for (p=text; *p != '\0'; ++p)
- {
- if (*p == '<')
- {
- ++taglevel;
-
- if ((taglevel == 1) && (list[used].filename != NULL))
- {
- ++used;
- if (used >= allocated)
- {
- allocated += 256;
- list = (struct grst_dir_list *)
- realloc((void *) list,
- allocated * sizeof(struct grst_dir_list));
- }
-
- list[used].filename = NULL;
- list[used].length = 0;
- list[used].length_set = 0;
- list[used].modified = 0;
- list[used].modified_set = 0;
- }
-
- wordnew = 1;
- continue;
- }
-
- if (*p == '>')
- {
- --taglevel;
- wordnew = 1;
- continue;
- }
-
- if (isspace(*p))
- {
- wordnew = 1;
- continue;
- }
-
- if ((wordnew) && (taglevel == 1))
- {
- if (((*p == 'h') || (*p == 'H')) &&
- (strncasecmp(p, "href=", 5) == 0))
- {
- if (p[5] == '"') { namestart = 6;
- for (i=namestart; (p[i] != '\0') &&
- (p[i] != '"' ) &&
- (p[i] != '\n') &&
- (p[i] != '\t') &&
- (p[i] != '>' ) ; ++i) ; }
- else { namestart = 5;
- for (i=namestart; (p[i] != '\0') &&
- (p[i] != '"' ) &&
- (p[i] != ' ' ) &&
- (p[i] != '\n') &&
- (p[i] != '\t') &&
- (p[i] != ')' ) &&
- (p[i] != '>' ) ; ++i) ; }
- if (i > namestart)
- {
- s = malloc(1 + i - namestart);
- memcpy(s, &p[namestart], i - namestart);
- s[i - namestart] = '\0';
-
- list[used].filename = canonicalise(s, source);
- free(s);
-
- if ((list[used].filename != NULL) &&
- ((list[used].filename[0] == '\0') ||
- (strcmp(list[used].filename, "/") == 0)))
- {
- free(list[used].filename);
- list[used].filename = NULL;
- }
- }
-
- p = &p[i-1]; /* -1 since continue results in ++i */
- continue;
- }
-
- if (((*p == 'c') || (*p == 'C')) &&
- (strncasecmp(p, "content-length=", 15) == 0))
- {
- list[used].length = 0;
- list[used].length_set = 1;
-
- if (p[15] == '"') list[used].length = atoi(&p[16]);
- else list[used].length = atoi(&p[15]);
-
- p = &p[15];
- continue;
- }
-
- if (((*p == 'l') || (*p == 'L')) &&
- (strncasecmp(p, "last-modified=", 14) == 0))
- {
- list[used].modified = 0;
- list[used].modified_set = 1;
-
- if (p[14] == '"') list[used].modified = atoi(&p[15]);
- else list[used].modified = atoi(&p[14]);
-
- p = &p[14];
- continue;
- }
- }
-
- wordnew = 0;
- }
-
- qsort((void *) list, used, sizeof(struct grst_dir_list), grst_dir_list_cmp);
-
- return list;
-}
-
-#if 0
-static char *GRSThttpUrlMildencode(char *in)
-/* Return a pointer to a malloc'd string holding a partially URL-encoded
- version of *in. "Partially" means that A-Z a-z 0-9 . = - _ @ and /
- are passed through unmodified. (DN's processed by GRSThttpUrlMildencode()
- can be used as valid Unix paths+filenames if you are prepared to
- create or simulate the resulting /X=xyz directories.) */
-{
- char *out, *p, *q;
-
- out = malloc(3*strlen(in) + 1);
-
- p = in;
- q = out;
-
- while (*p != '\0')
- {
- if (isalnum(*p) || (*p == '.') || (*p == '=') || (*p == '-')
- || (*p == '/') || (*p == '@') || (*p == '_'))
- {
- *q = *p;
- ++q;
- }
- else if (*p == ' ')
- {
- *q = '+';
- ++q;
- }
- else
- {
- sprintf(q, "%%%2X", *p);
- q = &q[3];
- }
-
- ++p;
- }
-
- *q = '\0';
- return out;
-}
-#endif
-
-GRSTgaclPerm get_gaclPerm(struct fuse_context *fuse_ctx, char *path)
-{
- GRSTgaclPerm perm = GRST_PERM_NONE;
- GRSTgaclCred *cred;
- GRSTgaclUser *user = NULL;
- GRSTgaclAcl *acl;
- char *dn = NULL;
-
-// eventually want a UID cache here...
-
-/*
-// want root to be able to read anything, and to write to anything under
-// local_root - need to test if talking about a symbolic link??
- if (fuse_ctx->uid == 0)
- {
- if (debugmode) syslog(LOG_DEBUG,
- "get_gaclPerm returns perm=%d for root user", GRST_PERM_ALL);
- return GRST_PERM_ALL;
- }
-*/
- dn = mapdir_uid_to_dn(fuse_ctx->uid);
-
- if (dn != NULL)
- {
- cred = GRSTgaclCredNew("person");
- GRSTgaclCredAddValue(cred, "dn", dn);
- user = GRSTgaclUserNew(cred);
- free(dn);
- }
-
- acl = GRSTgaclAclLoadforFile(path);
- perm = GRSTgaclAclTestUser(acl, user);
- GRSTgaclAclFree(acl);
- GRSTgaclUserFree(user);
-
- if (strstr(path, GRST_ACL_FILE) != NULL) perm &= ~GRST_PERM_WRITE;
-
- if (debugmode) syslog(LOG_DEBUG, "get_gaclPerm returns perm=%d", perm);
-
- return perm;
-}
-
-int read_headers_from_cache(struct fuse_context *fuse_ctx, char *filename,
- off_t *length, time_t *modified)
-{
- char *encoded_filename, *disk_filename;
- int len;
- long content_length, last_modified;
- FILE *fp;
- struct stat statbuf;
- time_t now;
-
- encoded_filename = GRSThttpUrlMildencode(filename);
-
- len = strlen(encoded_filename);
-
- if (encoded_filename[len - 1] == '/') /* a directory */
- asprintf(&disk_filename, "%s/%d%s%s",
- GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename, GRST_SLASH_DIRFILE);
- else asprintf(&disk_filename, "%s/%d%s%s",
- GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
-
- free(encoded_filename);
-
-// Change to fstat for the benefit of multiple threads:
-
- if (stat(disk_filename, &statbuf) != 0) /* no cache file to read */
- {
- free(disk_filename);
- return 0;
- }
-
- time(&now);
-
- if (statbuf.st_mtime < now - GRST_SLASH_HEADERS_EXPIRE)
- {
- unlink(disk_filename); /* tidy up expired cache file */
- free(disk_filename);
- return 0;
- }
-
- last_modified = 0;
- content_length = 0;
-
- if (debugmode) syslog(LOG_DEBUG, "Opening %s from cache", disk_filename);
-
- fp = fopen(disk_filename, "r");
- free(disk_filename);
-
- if (fp != NULL)
- {
- fscanf(fp, "content-length=%ld last-modified=%ld ",
- &content_length, &last_modified);
- fclose(fp);
-
- if (debugmode) syslog(LOG_DEBUG, "content-length=%ld last-modified=%ld",
- content_length, last_modified);
-
- *length = (off_t) content_length;
- *modified = (time_t) last_modified;
-
- return 1;
- }
-
- return 0;
-}
-
-int write_headers_to_cache(struct fuse_context *fuse_ctx, char *filename,
- off_t length, time_t modified)
-{
- int fd, len;
- char *tempfile, *headline, *encoded_filename, *p, *newdir,
- *new_filename;
- struct stat statbuf;
-
- asprintf(&tempfile, "%s/headers-XXXXXX", GRST_SLASH_TMP);
- fd = mkstemp(tempfile);
-
- if (fd == -1)
- {
- free(tempfile);
- return 0;
- }
-
- asprintf(&headline, "content-length=%ld last-modified=%ld \n",
- (long) length, (long) modified);
-
- if ((write(fd, headline, strlen(headline)) == -1) ||
- (close(fd) == -1))
- {
- free(tempfile);
- free(headline);
- return 0;
- }
-
- free(headline);
-
- encoded_filename = GRSThttpUrlMildencode(filename);
-
-// need to protect against .. ?
-
- for (p = encoded_filename; *p != '\0'; ++p)
- {
- if (*p != '/') continue;
-
- *p = '\0';
- asprintf(&newdir, "%s/%d%s", GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
- *p = '/';
-
- if (stat(newdir, &statbuf) == 0)
- {
- if (!S_ISDIR(statbuf.st_mode)) /* exists already - not a directory! */
- {
- unlink(newdir);
- mkdir(newdir, S_IRUSR | S_IWUSR | S_IXUSR);
- }
- /* else it already exists as a directory - so ok */
- }
- else mkdir(newdir, S_IRUSR | S_IWUSR | S_IXUSR);
-
- free(newdir);
- }
-
- len = strlen(encoded_filename);
-
- if (encoded_filename[len - 1] == '/') /* a directory */
- asprintf(&new_filename, "%s/%d%s%s",
- GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename, GRST_SLASH_DIRFILE);
- else asprintf(&new_filename, "%s/%d%s",
- GRST_SLASH_HEADERS, fuse_ctx->uid, encoded_filename);
-
- free(encoded_filename);
-
- if ((stat(new_filename, &statbuf) == 0) && S_ISDIR(statbuf.st_mode))
- {
-// need change this to do it recursively in case any files/subdirs too
- rmdir(new_filename);
- }
-
- rename(tempfile, new_filename);
-
- if (debugmode) syslog(LOG_DEBUG, "Added %s to cache (%ld %ld)\n",
- new_filename, length, modified);
-
- free(tempfile);
- free(new_filename);
-
- return 1;
-}
-
-static int slashgrid_readdir(const char *path, void *buf,
- fuse_fill_dir_t filler,
- off_t offset, struct fuse_file_info *fi)
-{
- (void) offset;
- (void) fi;
-
- int anyerror = 0, thiserror, i, ilast, len, isdir;
- const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
- char *s, *url, errorbuffer[CURL_ERROR_SIZE+1] = "", *dirname, *p;
- struct grst_body_text rawindex;
- struct grst_dir_list *list;
- struct grst_request request_data;
- struct tm modified_tm;
- struct stat stat_tmp;
- time_t now;
- struct fuse_context fuse_ctx;
- struct dirent **dirlist;
- GRSTgaclPerm perm;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if (debugmode) syslog(LOG_DEBUG, "in slashgrid_readdir");
-
- if (strcmp(path, "/") == 0)
- {
- filler(buf, ".", NULL, 0);
- filler(buf, "..", NULL, 0);
- filler(buf, "http", NULL, 0);
- filler(buf, "https", NULL, 0);
- return 0;
- }
-
- if ((strcmp(path, "/http") == 0) || (strcmp(path, "/https") == 0))
- {
- filler(buf, ".", NULL, 0);
- filler(buf, "..", NULL, 0);
-
- asprintf(&dirname, "%s/%d%s", GRST_SLASH_HEADERS, fuse_ctx.uid, path);
- ilast = scandir(dirname, &dirlist, 0, alphasort) - 1;
-
- for (i=0; i <= ilast; ++i)
- {
- if (dirlist[i]->d_name[0] != '.')
- filler(buf, dirlist[i]->d_name, NULL, 0);
- free(dirlist[i]);
- }
-
- if (ilast >= 0) free(dirlist);
- free(dirname);
-
- return 0;
- }
- else if ((local_root != NULL) &&
- ((strcmp(path, "/local") == 0) ||
- (strncmp(path, "/local/", 7) == 0)))
- {
- asprintf(&dirname, "%s%s/", local_root, &path[6]);
-
- perm = get_gaclPerm(&fuse_ctx, dirname);
-
- if (!GRSTgaclPermHasList(perm))
- {
- free(dirname);
- return -EACCES;
- }
-
- ilast = scandir(dirname, &dirlist, 0, alphasort) - 1;
- free(dirname);
-
- if (ilast < 0) return -ENOENT;
-
-// filler(buf, ".", NULL, 0);
-// filler(buf, "..", NULL, 0);
-
- for (i=0; i <= ilast; ++i)
- {
-// if (dirlist[i]->d_name[0] != '.')
- filler(buf, dirlist[i]->d_name, NULL, 0);
- free(dirlist[i]);
- }
-
- free(dirlist);
-
- return 0;
- }
- else if (strncmp(path, "/http/", 6) == 0)
- asprintf(&url, "http://%s/", &path[6]);
- else if (strncmp(path, "/https/", 7) == 0)
- asprintf(&url, "https://%s/", &path[7]);
- else return -ENOENT;
-
- rawindex.text = NULL;
- rawindex.used = 0;
- rawindex.allocated = 0;
-
- bzero(&request_data, sizeof(struct grst_request));
- request_data.writefunction = rawbody_callback;
- request_data.writedata = (void *) &rawindex;
- request_data.errorbuffer = errorbuffer;
- request_data.url = url;
- request_data.method = GRST_SLASH_GET;
- request_data.start = -1;
- request_data.finish = -1;
-
- if (debugmode) syslog(LOG_DEBUG, "Get directory listing from URL %s", url);
-
- thiserror = perform_request(&request_data, &fuse_ctx);
-
- if ((thiserror != 0) ||
- (request_data.retcode < 200) ||
- (request_data.retcode >= 300))
- {
- if (debugmode)
- syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
- errorbuffer, thiserror, request_data.retcode);
-
- if (thiserror != 0) anyerror = thiserror;
- else anyerror = request_data.retcode;
-
- if (request_data.retcode == 403) return -EACCES;
- else return -ENOENT;
-/* memory clean up still needed here!!!!!! */
- }
- else
- {
- time(&now);
-
- filler(buf, ".", NULL, 0);
- filler(buf, "..", NULL, 0);
-
- rawindex.text[rawindex.used] = '\0';
-
-// we need to get this out of headers cache instead iff still valid
-
- list = index_to_dir_list(rawindex.text, url);
- ilast = -1;
-
- for (i=0; list[i].filename != NULL; ++i)
- {
- if (debugmode) syslog(LOG_DEBUG,
- "in slashgrid_readdir, list[%d].filename=%s",
- i, list[i].filename);
-
- if (strncmp(list[i].filename, "mailto:", 7) == 0) continue;
-
- len = strlen(list[i].filename);
- if (list[i].filename[len-1] == '/')
- {
- isdir = 1;
- list[i].filename[len-1] = '\0';
- }
- else
- {
- isdir = 0;
-
- if ((p = index(list[i].filename, '?')) != NULL) *p = '\0';
- }
-
- /* skip over duplicates */
-
- if ((ilast >= 0) &&
- (strcmp(list[i].filename, list[ilast].filename) == 0))
- continue;
- ilast=i; /* last distinct entry */
-
- if (debugmode) syslog(LOG_DEBUG,
- "in slashgrid_readdir, list[%d].filename=%s not dup",
- i, list[i].filename);
-
- asprintf(&s, "%s/%s", path, list[i].filename);
- write_headers_to_cache(&fuse_ctx, s, list[i].length,
- list[i].modified);
- free(s);
-
- bzero(&stat_tmp, sizeof(struct stat));
-
- stat_tmp.st_size = list[i].length;
- stat_tmp.st_mtime = list[i].modified;
- stat_tmp.st_ctime = list[i].modified;
- stat_tmp.st_atime = now;
- stat_tmp.st_mode = isdir ? 0777 : 0666;
- filler(buf, list[i].filename, &stat_tmp, 0);
-
- if (debugmode) syslog(LOG_DEBUG,
- "in slashgrid_readdir, filler list[%d].filename=%s %lu %lu",
- i, list[i].filename, stat_tmp.st_size, stat_tmp.st_mtime);
- }
- }
-
- if (debugmode) syslog(LOG_DEBUG,
- "in slashgrid_readdir, return 0");
- return 0;
-}
-
-static int slashgrid_getattr(const char *rawpath, struct stat *stbuf)
-{
- int anyerror = 0, thiserror, i, ilast, len, ret;
- char *s, *url, *path, errorbuffer[CURL_ERROR_SIZE+1] = "", *p;
- struct grst_dir_list *list;
- struct grst_request request_data;
- struct tm modified_tm;
- struct stat stat_tmp;
- time_t now;
- GRSTgaclPerm dirperm, perm;
-
- struct fuse_context fuse_ctx;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if (debugmode) syslog(LOG_DEBUG,
- "in slashgrid_getattr, rawpath=%s UID=%d\n",
- rawpath, fuse_ctx.uid);
-
- memset(stbuf, 0, sizeof(struct stat));
- stbuf->st_mode = S_IFREG | 0755;
- stbuf->st_nlink = 1;
-
- if ((strcmp(rawpath, "/") == 0) ||
- (strcmp(rawpath, "/http") == 0) ||
- (strcmp(rawpath, "/https") == 0) ||
- ((local_root != NULL) && (strcmp(rawpath, "/local") == 0)))
- {
- stbuf->st_mode = S_IFDIR | 0755;
-
- return 0; /* Empty top level directories: OK */
- }
- else if (strncmp(rawpath, "/http/", 6) == 0)
- {
- if (index(&rawpath[6], '/') == NULL) /* top directory for remote server */
- {
- stbuf->st_mode = S_IFDIR | 0755;
-
- asprintf(&url, "http://%s/", &rawpath[6]);
- asprintf(&path, "%s/", rawpath);
- }
- else
- {
- asprintf(&url, "http://%s", &rawpath[6]);
- path = strdup(rawpath);
- }
- }
- else if (strncmp(rawpath, "/https/", 7) == 0)
- {
- if (index(&rawpath[7], '/') == NULL) /* top directory for remote server */
- {
- stbuf->st_mode = S_IFDIR | 0755;
-
- asprintf(&url, "https://%s/", &rawpath[7]);
- asprintf(&path, "%s/", rawpath);
- }
- else
- {
- asprintf(&url, "https://%s", &rawpath[7]);
- path = strdup(rawpath);
- }
- }
- else if ((local_root != NULL) && (strncmp(rawpath, "/local/", 7) == 0))
- {
- asprintf(&path, "%s/%s", local_root, &rawpath[7]);
-
- ret = stat(path, &stat_tmp);
-
- if (debugmode) syslog(LOG_DEBUG, "path=%s ret=%d", path, ret);
-
- if ((ret == 0) && S_ISDIR(stat_tmp.st_mode))
- {
- dirperm = get_gaclPerm(&fuse_ctx, path);
-
- p = rindex(path, '/');
- if (p != NULL) *p = '\0';
- /* strip off directory name itself if a directory,
- so get the GACL of the parent directory */
-
- perm = get_gaclPerm(&fuse_ctx, path);
- }
- else
- {
- perm = get_gaclPerm(&fuse_ctx, path);
- dirperm = perm;
- }
-
- if (!GRSTgaclPermHasRead(perm)) ret = -EACCES;
- else if (ret == 0)
- {
- stbuf->st_nlink = 1;
- stbuf->st_uid = fuse_ctx.uid;
- stbuf->st_gid = fuse_ctx.gid;
- stbuf->st_size = stat_tmp.st_size;
- stbuf->st_blksize = stat_tmp.st_blksize;
- stbuf->st_blocks = stat_tmp.st_blocks;
- stbuf->st_atime = stat_tmp.st_atime;
- stbuf->st_mtime = stat_tmp.st_mtime;
- stbuf->st_ctime = stat_tmp.st_ctime;
-
- if (S_ISDIR(stat_tmp.st_mode))
- {
- stbuf->st_mode = S_IFDIR;
-
- if (GRSTgaclPermHasWrite(dirperm))
- stbuf->st_mode |= S_IWUSR;
-
- if (GRSTgaclPermHasList(dirperm))
- stbuf->st_mode |= S_IRUSR | S_IXUSR;
- }
- else
- {
- stbuf->st_mode = S_IFREG;
-
- if (GRSTgaclPermHasWrite(perm))
- stbuf->st_mode |= S_IWUSR;
-
- if (GRSTgaclPermHasRead(perm))
- stbuf->st_mode |= S_IRUSR;
- }
-
-
- }
- else ret = -ENOENT;
-
- free(path);
-
- if (debugmode) syslog(LOG_DEBUG, "slashgrid_getattr returns %d for %s",
- ret, rawpath);
- return ret;
- }
- else return -ENOENT;
-
- time(&now);
-
- if (read_headers_from_cache(&fuse_ctx, path,
- &(stbuf->st_size), &(stbuf->st_mtime)))
- {
- if (debugmode) syslog(LOG_DEBUG,
- "Retrieving details for %s from cache (%ld %ld)\n", url,
- (long) stbuf->st_mtime, (long) stbuf->st_size);
-
- stbuf->st_ctime = stbuf->st_mtime;
- stbuf->st_atime = now;
-
- free(url);
- free(path);
- return 0;
- }
-
- 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);
-
- rename(tempfile, new_filename);
-
- if (debugmode) syslog(LOG_DEBUG, "Added %s to block cache", new_filename);
-
- free(tempfile);
- free(new_filename);
-
- return 0;
-}
-
-int drop_cache_blocks(struct fuse_context *fuse_ctx, char *filename)
-/* drop ALL the blocks cached for this file, and delete the directory in
- the blocks cache for this file */
-{
- int ret;
- char *encoded_filename, *dirname, *blockname;
- DIR *blocksDIR;
- struct dirent *blocks_ent;
-
- encoded_filename = GRSThttpUrlMildencode(filename);
-
- asprintf(&dirname, "%s/%d%s",
- GRST_SLASH_BLOCKS, fuse_ctx->uid, encoded_filename);
-
- free(encoded_filename);
-
- blocksDIR = opendir(dirname);
-
- if (blocksDIR == NULL) /* no directory to delete (probably) */
- {
- free(dirname);
- return 1;
- }
-
- while ((blocks_ent = readdir(blocksDIR)) != NULL)
- {
- asprintf(&blockname, "%s/%s", dirname, blocks_ent->d_name);
- remove(blockname);
- free(blockname);
- }
-
- closedir(blocksDIR);
-
- ret = rmdir(dirname);
- free(dirname);
-
- return ret ? 1 : 0; /* return 1 on error, 0 on rmdir() success */
-}
-
-static int slashgrid_read(const char *path, char *buf,
- size_t size, off_t offset,
- struct fuse_file_info *fi)
-{
- (void) offset;
- (void) fi;
-
- int anyerror = 0, thiserror, i, ilast, fd;
- char *s, *url, *disk_filename, *encoded_filename, *localpath;
- off_t block_start, block_finish, block_i, len;
- struct grst_body_text rawbody;
- struct grst_request request_data;
- struct tm modified_tm;
- struct stat statbuf;
- time_t now;
- GRSTgaclPerm perm;
- struct fuse_context fuse_ctx;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if (debugmode) syslog(LOG_DEBUG, "in slashgrid_read size=%ld offset=%ld",
- (long) size, (long) offset);
-
- if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
- {
- asprintf(&localpath, "%s/%s", local_root, &path[7]);
-
- perm = get_gaclPerm(&fuse_ctx, localpath);
-
- if (GRSTgaclPermHasRead(perm))
- {
- fd = open(localpath, O_RDONLY);
-
- if (lseek(fd, offset, SEEK_SET) < 0) size = -1;
- else size = read(fd, buf, size);
-
- close(fd);
- }
- else size = -1;
-
- free(localpath);
-
- return size;
- }
-
- if ((strncmp(path, "/http/", 6) != 0) &&
- (strncmp(path, "/https/", 7) != 0)) return -ENOENT;
-
- block_start = GRST_SLASH_BLOCK_SIZE * (offset / GRST_SLASH_BLOCK_SIZE);
- block_finish = GRST_SLASH_BLOCK_SIZE *
- ((offset + size - 1) / GRST_SLASH_BLOCK_SIZE);
-
- encoded_filename = GRSThttpUrlMildencode((char *) path);
- time(&now);
-
- for (block_i = block_start; block_i <= block_finish; block_i += GRST_SLASH_BLOCK_SIZE)
- {
- asprintf(&disk_filename, "%s/%d%s/%ld-%ld",
- GRST_SLASH_BLOCKS, fuse_ctx.uid, encoded_filename,
- (long) block_i, (long) (block_i + GRST_SLASH_BLOCK_SIZE - 1));
-
- if (debugmode) syslog(LOG_DEBUG, "disk_filename=%s", disk_filename);
-
- if ((stat(disk_filename, &statbuf) != 0) ||
- (statbuf.st_mtime < now - GRST_SLASH_HEADERS_EXPIRE))
- {
- write_block_to_cache(&fuse_ctx, (char *) path,
- block_i, block_i + GRST_SLASH_BLOCK_SIZE - 1);
- }
-
-// need to worry about cached copy being deleted (invalidated by a writing
-// thread?) between write_block_to_cache() and these reads?
-// maybe return fd from write_block_to_cache() itself???
-// the initial stat() needs to be part of this too
-
- if ((fd = open(disk_filename, O_RDONLY)) != -1)
- {
- if (block_i == block_start)
- {
- lseek(fd, offset - block_start, SEEK_SET);
- read(fd, buf,
- (offset - block_start + size < GRST_SLASH_BLOCK_SIZE)
- ? size : GRST_SLASH_BLOCK_SIZE - offset + block_start);
- }
- else if (block_i == block_finish)
- {
- read(fd, buf + (block_i - block_start),
- offset + size - block_i);
- }
- else
- {
- read(fd, buf + (block_i - block_start),
- GRST_SLASH_BLOCK_SIZE);
- }
-
- close(fd);
- }
- else syslog(LOG_ERR, "Failed to open %s in cache", disk_filename);
- }
-
- free(disk_filename);
- free(encoded_filename);
-
- return size;
-}
-
-static int slashgrid_write(const char *path, const char *buf,
- size_t size, off_t offset,
- struct fuse_file_info *fi)
-{
- int anyerror = 0, thiserror, i, fd;
- char *s, *url, *p, errorbuffer[CURL_ERROR_SIZE+1] = "", *localpath;
- GRSTgaclPerm perm;
-
- struct grst_read_data read_data;
- struct grst_request request_data;
- struct fuse_context fuse_ctx;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if (debugmode) syslog(LOG_DEBUG, "in slashgrid_write, path=%s, UID=%d\n",
- path, fuse_ctx.uid);
-
- if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
- {
- asprintf(&localpath, "%s/%s", local_root, &path[7]);
- perm = get_gaclPerm(&fuse_ctx, localpath);
-
- if (GRSTgaclPermHasWrite(perm))
- {
- fd = open(localpath, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
-
- if (lseek(fd, offset, SEEK_SET) < 0) size = -1;
- else size = write(fd, buf, size);
-
- fchown(fd, local_uid, local_gid);
- close(fd);
- }
- else size = -1;
-
- free(localpath);
-
- return size;
- }
-
- if (strncmp(path, "/http/", 6) == 0)
- asprintf(&url, "http://%s", &path[6]);
- else if (strncmp(path, "/https/", 7) == 0)
- asprintf(&url, "https://%s", &path[7]);
- else return -ENOENT;
-
- read_data.buf = buf;
- read_data.sent = 0;
- read_data.maxsent = size;
-
- if (debugmode) syslog(LOG_DEBUG, "Put block %ld-%ld to URL %s",
- (long) offset, (long) offset+size-1, url);
-
- drop_cache_blocks(&fuse_ctx, (char *) path); /* we drop all read-cache blocks first */
-
- bzero(&request_data, sizeof(struct grst_request));
- request_data.writefunction = null_callback;
- request_data.readfunction = read_data_callback;
- request_data.readdata = &read_data;
- request_data.infilesize = size;
- request_data.errorbuffer = errorbuffer;
- request_data.url = url;
- request_data.method = GRST_SLASH_PUT;
- request_data.start = offset;
- request_data.finish = (off_t) (offset + size - 1);
-
- thiserror = perform_request(&request_data, &fuse_ctx);
-
- free(url);
-
- if ((thiserror != 0) ||
- (request_data.retcode < 200) ||
- (request_data.retcode >= 300))
- {
- if (debugmode)
- syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
- errorbuffer, thiserror, request_data.retcode);
-
- if (thiserror != 0) anyerror = thiserror;
- else anyerror = request_data.retcode;
-
- if (request_data.retcode == 403) return -EACCES;
- else return -ENOENT;
-/* memory clean up still needed here!!!!!! */
- }
-
- return size;
-}
-
-int slashgrid_rename(const char *oldpath, const char *newpath)
-{
- int anyerror = 0, thiserror, i, fd, ret;
- char *s, *url, *p, *destination, errorbuffer[CURL_ERROR_SIZE+1] = "",
- *oldlocalpath, *newlocalpath;
-
- struct grst_read_data read_data;
- struct fuse_context fuse_ctx;
- struct grst_request request_data;
- GRSTgaclPerm oldperm, newperm;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if ((local_root != NULL) &&
- ((strncmp(oldpath, "/local/", 7) == 0) ||
- (strncmp(newpath, "/local/", 7) == 0)))
- {
- if (strncmp(oldpath, newpath, 7) != 0)
- {
- return -EXDEV; /* not on same filesystem */
- }
-
- asprintf(&oldlocalpath, "%s/%s", local_root, &oldpath[7]);
- asprintf(&newlocalpath, "%s/%s", local_root, &newpath[7]);
-
- oldperm = get_gaclPerm(&fuse_ctx, oldlocalpath);
- newperm = get_gaclPerm(&fuse_ctx, newlocalpath);
-
- if (GRSTgaclPermHasWrite(oldperm) &&
- GRSTgaclPermHasWrite(newperm))
- {
- ret = rename(oldlocalpath, newlocalpath);
- free(oldlocalpath);
- free(newlocalpath);
-
- return (ret == 0) ? 0 : -errno;
- }
-
- free(oldlocalpath);
- free(newlocalpath);
- return -EACCES;
- }
- else if (strncmp(oldpath, "/http/", 6) == 0)
- {
- if (strncmp(newpath, "/http/", 6) != 0) return -EXDEV;
-
- asprintf(&url, "http://%s", &oldpath[6]);
- asprintf(&destination, "http://%s", &newpath[6]);
- }
- else if (strncmp(oldpath, "/https/", 7) == 0)
- {
- if (strncmp(newpath, "/https/", 7) != 0) return -EXDEV;
-
- asprintf(&url, "https://%s", &oldpath[7]);
- asprintf(&destination, "https://%s", &newpath[7]);
- }
- else return -ENOENT;
-
- read_data.buf = "";
- read_data.sent = 0;
- read_data.maxsent = 0;
-
- if (debugmode) syslog(LOG_DEBUG, "MOVE URL %s to %s", url, destination);
-
- bzero(&request_data, sizeof(struct grst_request));
- request_data.writefunction = null_callback;
- request_data.readfunction = read_data_callback;
- request_data.readdata = &read_data;
- request_data.errorbuffer = errorbuffer;
- request_data.url = url;
- request_data.method = GRST_SLASH_MOVE;
- request_data.destination = destination;
-
- thiserror = perform_request(&request_data, &fuse_ctx);
-
- free(url);
- free(destination);
-
- if ((thiserror != 0) ||
- (request_data.retcode < 200) ||
- (request_data.retcode >= 300))
- {
- if (debugmode)
- syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
- errorbuffer, thiserror, request_data.retcode);
-
- if (thiserror != 0) anyerror = thiserror;
- else anyerror = request_data.retcode;
-
- if (request_data.retcode == 403) return -EACCES;
- else return -ENOENT;
-/* memory clean up still needed here!!!!!! */
- }
-
- return 0;
-}
-
-int slashgrid_unlink(const char *path)
-{
- int anyerror = 0, thiserror, i, fd, ret;
- char *s, *url, *p, errorbuffer[CURL_ERROR_SIZE+1] = "",
- *localpath;
-
- struct grst_read_data read_data;
- struct fuse_context fuse_ctx;
- struct grst_request request_data;
- GRSTgaclPerm perm;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if (debugmode) syslog(LOG_DEBUG, "slashgrid_unlink called for %s", path);
-
- if (strncmp(path, "/http/", 6) == 0)
- asprintf(&url, "http://%s", &path[6]);
- else if (strncmp(path, "/https/", 7) == 0)
- asprintf(&url, "https://%s", &path[7]);
- else if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
- {
- asprintf(&localpath, "%s/%s", local_root, &path[7]);
-
- perm = get_gaclPerm(&fuse_ctx, localpath);
-
- if (GRSTgaclPermHasWrite(perm))
- {
- ret = remove(localpath);
- free(localpath);
-
- return (ret == 0) ? 0 : -errno;
- }
-
- free(localpath);
- return -EACCES;
- }
- else return -ENOENT;
-
- read_data.buf = "";
- read_data.sent = 0;
- read_data.maxsent = 0;
-
- if (debugmode) syslog(LOG_DEBUG, "DELETE URL %s", url);
-
- bzero(&request_data, sizeof(struct grst_request));
- request_data.writefunction = null_callback;
- request_data.readfunction = read_data_callback;
- request_data.readdata = &read_data;
- request_data.errorbuffer = errorbuffer;
- request_data.url = url;
- request_data.method = GRST_SLASH_DELETE;
-
- thiserror = perform_request(&request_data, &fuse_ctx);
-
- free(url);
-
- if ((thiserror != 0) ||
- (request_data.retcode < 200) ||
- (request_data.retcode >= 300))
- {
- if (debugmode)
- syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
- errorbuffer, thiserror, request_data.retcode);
-
- if (thiserror != 0) anyerror = thiserror;
- else anyerror = request_data.retcode;
-
- if (request_data.retcode == 403) return -EACCES;
- else return -ENOENT;
-/* memory clean up still needed here!!!!!! */
- }
-
- return 0;
-}
-
-int slashgrid_rmdir(const char *path)
-{
- int ret;
- char *pathwithslash, *localpath;
-
- asprintf(&pathwithslash, "%s/", path);
- ret = slashgrid_unlink(pathwithslash);
- free(pathwithslash);
-
-/* error on GridSite side still??? */
-
- return ret;
-}
-
-int slashgrid_mknod(const char *path, mode_t mode, dev_t dev)
-{
- int ret;
-
- if (debugmode) syslog(LOG_DEBUG, "slashgrid_mknod called for %s", path);
-
- ret = slashgrid_write(path, "", 0, 0, NULL);
-
- return (ret < 0) ? ret : 0;
-}
-
-int slashgrid_mkdir(const char *path, mode_t mode)
-{
- int ret;
- char *pathwithslash, *localpath;
- struct fuse_context fuse_ctx;
- GRSTgaclPerm perm;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if (debugmode) syslog(LOG_DEBUG, "slashgrid_mkdir, for %s", path);
-
- if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
- {
- asprintf(&localpath, "%s/%s", local_root, &path[7]);
-
- perm = get_gaclPerm(&fuse_ctx, localpath);
-
- if (GRSTgaclPermHasWrite(perm))
- {
- ret = mkdir(localpath, S_IRUSR | S_IWUSR | S_IXUSR);
- chown(localpath, local_uid, local_gid);
- free(localpath);
-
- return (ret == 0) ? 0 : -errno;
- }
-
- free(localpath);
- return -EACCES;
- }
-
- asprintf(&pathwithslash, "%s/", path);
- ret = slashgrid_write(pathwithslash, "", 0, 0, NULL);
- free(pathwithslash);
-
- return (ret < 0) ? ret : 0;
-}
-
-int slashgrid_chown(const char *path, uid_t uid, gid_t gid)
-{
- if (debugmode) syslog(LOG_DEBUG, "slashgrid_chown - NOP");
- return 0;
-}
-
-int slashgrid_chmod(const char *path, mode_t mode)
-{
- if (debugmode) syslog(LOG_DEBUG, "slashgrid_chmod - NOP");
- return 0;
-}
-
-int slashgrid_truncate(const char *path, off_t offset)
-{
- int anyerror = 0, thiserror, i, fd, ret;
- char *s, *url, *p, errorbuffer[CURL_ERROR_SIZE+1] = "", *localpath;
- GRSTgaclPerm perm;
-
- struct grst_read_data read_data;
- struct fuse_context fuse_ctx;
- struct grst_request request_data;
-
- memcpy(&fuse_ctx, fuse_get_context(), sizeof(struct fuse_context));
-
- if (debugmode) syslog(LOG_DEBUG, "slashgrid_truncate, for %s (%d)",
- path, offset);
-
- if (strncmp(path, "/http/", 6) == 0)
- asprintf(&url, "http://%s", &path[6]);
- else if (strncmp(path, "/https/", 7) == 0)
- asprintf(&url, "https://%s", &path[7]);
- else if ((local_root != NULL) && (strncmp(path, "/local/", 7) == 0))
- {
- asprintf(&localpath, "%s/%s", local_root, &path[7]);
-
- perm = get_gaclPerm(&fuse_ctx, localpath);
-
- if (GRSTgaclPermHasWrite(perm))
- {
- ret = truncate(localpath, offset);
- free(localpath);
-
- return (ret == 0) ? 0 : -errno;
- }
-
- free(localpath);
- return -EACCES;
- }
- else return -ENOENT;
-
- read_data.buf = "";
- read_data.sent = 0;
- read_data.maxsent = 0;
-
- if (debugmode) syslog(LOG_DEBUG, "Truncate URL %s to %ld\n",
- url, (long) offset);
-
- bzero(&request_data, sizeof(struct grst_request));
- request_data.writefunction = null_callback;
- request_data.readfunction = read_data_callback;
- request_data.readdata = &read_data;
- request_data.errorbuffer = errorbuffer;
- request_data.url = url;
- request_data.method = GRST_SLASH_TRUNC;
- request_data.finish = offset;
-
- thiserror = perform_request(&request_data, &fuse_ctx);
-
- free(url);
-
- if ((thiserror != 0) ||
- (request_data.retcode < 200) ||
- (request_data.retcode >= 300))
- {
- if (debugmode)
- syslog(LOG_DEBUG, "... curl error: %s (%d), HTTP error: %d\n",
- errorbuffer, thiserror, request_data.retcode);
-
- if (thiserror != 0) anyerror = thiserror;
- else anyerror = request_data.retcode;
-
- if (request_data.retcode == 403) return -EACCES;
- else return -ENOENT;
-/* memory clean up still needed here!!!!!! */
- }
-
- return 0;
-}
-
-int slashgrid_statfs(const char *path, struct statfs *fs)
-{
- /* statfs() on /local not used in practice, since not mounted separately */
-
- if ((strncmp(path, "/local/", 7) == 0) ||
- (strcmp(path, "/local") == 0))
- return statfs(local_root, fs);
- else return statfs(GRST_SLASH_BLOCKS, fs);
-}
-
-void *slashgrid_init(void)
-{
- FILE *fp;
- 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);
- }
-
- return NULL;
-}
-
-void slashgrid_destroy(void *p)
-{
- unlink(GRST_SLASH_PIDFILE);
-}
-
-static struct fuse_operations slashgrid_oper = {
- .getattr = slashgrid_getattr,
- .chown = slashgrid_chown,
- .chmod = slashgrid_chmod,
- .truncate = slashgrid_truncate,
- .readdir = slashgrid_readdir,
- .write = slashgrid_write,
- .read = slashgrid_read,
- .mknod = slashgrid_mknod,
- .mkdir = slashgrid_mkdir,
- .unlink = slashgrid_unlink,
- .rmdir = slashgrid_rmdir,
- .rename = slashgrid_rename,
- .statfs = slashgrid_statfs,
- .init = slashgrid_init,
- .destroy = slashgrid_destroy
-};
-
-void slashgrid_logfunc(char *file, int line, int level, char *fmt, ...)
-{
- char *mesg;
- va_list ap;
-
- va_start(ap, fmt);
- vasprintf(&mesg, fmt, ap);
- va_end(ap);
-
- syslog(level, "%s(%d) %s", file, line, mesg);
-
- free(mesg);
-}
-
-int main(int argc, char *argv[])
-{
- char *fuse_argv[] = { "slashgrid", "/grid", "-o", "allow_other",
- "-s", "-d" };
- int i, ret, fuse_argc = 4; /* by default, ignore the final 2 args */
- struct passwd *pw;
-
- for (i=1; i < argc; ++i)
- {
- if (strcmp(argv[i], "--debug") == 0)
- {
- debugmode = 1;
- }
- else if (strcmp(argv[i], "--foreground") == 0)
- {
- debugmode = 1;
- fuse_argc = 6;
- }
- else if ((strcmp(argv[i], "--domain") == 0) && (i + 1 < argc))
- {
- sitecast_domain = argv[i+1];
- sitecast_domain_len = strlen(sitecast_domain);
- ++i;
- }
- else if ((strcmp(argv[i], "--groups") == 0) && (i + 1 < argc))
- {
- sitecast_groups = argv[i+1];
- ++i;
- }
- else if ((strcmp(argv[i], "--local-root") == 0) && (i + 1 < argc))
- {
- local_root = argv[i+1];
- ++i;
- }
- else if ((strcmp(argv[i], "--local-user") == 0) && (i + 1 < argc))
- {
- if ((pw = getpwnam(argv[i+1])) == NULL)
- {
- fprintf(stderr, "unable to find user %s\n", argv[i+1]);
- return 1;
- }
-
- local_uid = pw->pw_uid;
- local_gid = pw->pw_gid;
- ++i;
- }
- else if ((strcmp(argv[i], "--gridmapdir") == 0) && (i + 1 < argc))
- {
- gridmapdir = argv[i+1];
- ++i;
- }
- else
- {
- fprintf(stderr, "argument %s not recognised\n", argv[i]);
- return 1;
- }
- }
-
- if ((local_root != NULL) &&
- ((local_uid == 0) || (local_gid == 0)))
- {
- fprintf(stderr, "if --local-root is given, "
- "--local-user must be given too and not be the root user\n");
- return 1;
- }
-
- openlog("slashgrid", 0, LOG_DAEMON);
-
- umount("/grid"); /* in case of previous crash - will fail if still busy */
-
- for (i=0; i < GRST_SLASH_MAX_HANDLES; ++i)
- {
- pthread_mutex_init(&(handles[i].mutex), NULL);
- handles[i].curl_handle = NULL;
- handles[i].proxyfile = NULL;
- handles[i].last_used = 0;
- }
-
-// GRSTerrorLogFunc = slashgrid_logfunc;
-
- GRSTgaclInit();
-
- ret = fuse_main(fuse_argc, fuse_argv, &slashgrid_oper);
-
- 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;
-}
-